
Чтобы выполнить сканирование на наличие устройств 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 -l
in, /dev
чтобы проверить это. Если это не так и устройство принадлежит root
группе, вы можете изменить это, настроив udev
правила, которые управляют именованием, разрешениями и действиями на оборудовании при обнаружении (не спрашивайте меня, как).
Это касается прямого доступа к устройству, который вам, вероятно, нужен в этом случае. Обычная функциональность Bluetooth обычно обрабатывается через демон с собственной конфигурацией, группами, разрешениями и т. д. Проверьте документацию по дистрибутиву, группы могут немного отличаться.