Сканирование Bluetooth LE без прав root?

Сканирование Bluetooth LE без прав root?

Чтобы выполнить сканирование на наличие устройств Bluetooth LEhcitoolвидимо требуются права root. Для обычных пользователей вывод следующий:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Почемуhcitoolнужны права root для LE-сканирования?

Можно ли как-то выполнить LE-сканирование, не будучи пользователем root?

решение1

Стек протокола Bluetooth для Linux проверяет две возможности. Возможности — это пока не распространенная система управления некоторыми привилегиями. Они могут обрабатываться модулем PAM или через расширенные атрибуты файлов. (см.https://elixir.bootlin.com/linux/v5.8.10/source/net/bluetooth/hci_sock.c#L1307)

 $> sudo apt-get install libcap2-bin

устанавливает инструменты управления возможностями Linux.

 $> sudo setcap 'cap_net_raw,cap_net_admin+eip' `which hcitool`

устанавливает отсутствующие возможности исполняемого файла так же, как бит setuid.

 $> getcap !$
 getcap `which hcitool`
 /usr/bin/hcitool = cap_net_admin,cap_net_raw+eip

Итак, мы готовы приступить к работе:

$>hcitool -i hci0 lescan
Set scan parameters failed: Input/output error

Да, ваш адаптер BT не поддерживает BLE

$>hcitool -i hci1 lescan
LE Scan...

В этом случае — нажмите кнопку на своем устройстве.

решение2

Хорошо, по крайней мере я частично понял, почемуhcitoolтребует привилегий root для сканирования LE, но не для обычного сканирования. Частично означает, что я обнаружил системный вызов, который не удается из-за недостаточных привилегий при запуске сканирования LE от имени обычного пользователя.

Ошибка «Операция не разрешена» генерируетсянаписатьvсистемный вызов, с блокировкой стека вызовов следующим образом (все функции реализованы вhci.c, см. исходный код bluez):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

Обычное сканирование («сканирование hcitool»), по-видимому, не требует отправки каких-либо запросов контроллеру, а использует выделенныйioctlзапрос, вызов:

ioctl(dd, HCIINQUIRY, (unsigned long) buf);

Похоже, что доступ на запись к контроллеру Bluetooth ограничен, но почему и как это отключить?

решение3

У меня это не установлено, но хорошо написанная подсистема устройств обычно имеет связанную с ней группу. Добавьте пользователя в группу, и вы сможете получить доступ к устройству (например, diskгруппа разрешает прямой доступ к жесткому диску). Просто выполните команду ls -lin, /devчтобы проверить это. Если это не так и устройство принадлежит rootгруппе, вы можете изменить это, настроив udevправила, которые управляют именованием, разрешениями и действиями на оборудовании при обнаружении (не спрашивайте меня, как).

Это касается прямого доступа к устройству, который вам, вероятно, нужен в этом случае. Обычная функциональность Bluetooth обычно обрабатывается через демон с собственной конфигурацией, группами, разрешениями и т. д. Проверьте документацию по дистрибутиву, группы могут немного отличаться.

Связанный контент