蓝牙LE扫描为非root用户?


13

要对蓝牙LE设备执行扫描,hcitool显然需要root特权。对于普通用户,输出如下:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

为什么hcitool需要root特权才能进行LE扫描?

是否可以以非root用户身份执行LE扫描?

Answers:


21

用于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...

这样做,继续并按设备上的按钮。


1
感谢四个指出缺少的功能。它还帮助我在运行Raspbian Stretch的Raspberry Pi上以bluetoothctl作为非root用户使用!但就我而言,我将该功能添加到了/lib/systemd/system/bluetooth.service中。
Stefan Wegener

7

好的,至少我部分地发现了为什么hcitool要求LE扫描具有root特权而不是正常扫描。从某种意义上说,我找到了以普通用户身份运行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);

似乎对蓝牙控制器的写访问受到限制,但是为什么以及如何禁用它?


0

我没有安装此程序,但是写得好的设备子系统通常有一个与之关联的组。将用户添加到该组,即可访问设备(例如,disk组允许原始硬盘驱动器访问)。只要做到ls -l/dev检查这一点。如果不是这种情况,并且设备属于root组,则可以通过调整udev在检测时控制硬件的命名,权限和操作的规则来更改此设置(不要问我如何做)。

这种情况下,您可能需要直接访问设备。蓝牙的正常功能通常是通过具有自己的配置,组,权限等的守护程序来处理的。检查您的发行文档,各组可能会略有不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.