Bluetooth LE сканування як некоренне?


13

Для здійснення сканування пристроїв Bluetooth LE hcitool, очевидно, вимагає кореневих привілеїв. Для звичайних користувачів вихід такий:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Чому hcitool потребує кореневих привілеїв для сканування LE?

Чи можна якось виконати сканування LE як некореневого?

Відповіді:


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`

встановлює відсутні функції на виконуваному файлі, як би встановлений біт.

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

Це потрібно, продовжуйте і натискайте кнопку на своєму пристрої.


1
Дякую чотирма, що вказують на відсутні можливості. Це також допомогло мені використовувати bluetoothctl як некористувальників на Raspberry Pi, що працює з Raspbian Stretch! але в моєму випадку я додав можливість /lib/systemd/system/bluetooth.service.
Стефан Вегенер

7

Добре, принаймні я частково виявив, чому hcitool вимагає кореневих привілеїв для сканування 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 обмежений, але чому і як це можна деактивувати?


0

У мене цього немає, але добре написана підсистема пристрою зазвичай має з нею пов’язану групу. Додайте користувача до групи, і ви можете отримати доступ до пристрою (наприклад, diskгрупа дозволяє отримати доступ до жорсткого диска). Просто зробіть ls -lв /devщоб перевірити це. Якщо це не так, і пристрій належить до rootгрупи, ви можете змінити це, відрегулювавши udevправила, які регулюють іменування, дозволи та дії на апаратне забезпечення при виявленні (не запитуйте мене як).

Це стосується прямого доступу до пристроїв, який вам, мабуть, потрібен у цьому випадку. Звичайна функціональність Bluetooth зазвичай обробляється через демон із власною конфігурацією, групами, дозволами тощо. Перевірте свою розповсюджувальну документацію, групи можуть дещо відрізнятися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.