Bluetooth LE сканирует как не рут?

13

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

$ hcitool lescan
Set scan parameters failed: Operation not permitted

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

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

kassiopeia
источник

Ответы:

21

Стек протоколов Bluetooth для Linux проверяет две возможности. Возможности - это еще не распространенная система управления некоторыми привилегиями. Они могут обрабатываться модулем PAM или через расширенные атрибуты файла. (см. http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619 )

 $> 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...

Это делает, продолжайте и нажмите кнопку на вашем устройстве.

schnippe
источник
1
Спасибо четыре, указывая на недостающие возможности. Это также помогло мне использовать bluetoothctl в качестве пользователя без полномочий root на Raspberry Pi с Raspbian Stretch! но в моем случае я добавил возможность в /lib/systemd/system/bluetooth.service.
Стефан Вегенер
7

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

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

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

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

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

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

kassiopeia
источник
0

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

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

Орион
источник