蓝牙 LE 以非 root 身份扫描?

蓝牙 LE 以非 root 身份扫描?

扫描蓝牙 LE 设备人机工具显然需要root权限。对于普通用户,输出如下:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

为什么人机工具LE 扫描需要 root 权限吗?

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

答案1

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

好吧,至少我部分地发现了原因人机工具LE 扫描需要 root 权限,但普通扫描不需要。部分意味着,我找到了以普通用户身份运行 LE 扫描时由于权限不足而失败的系统调用。

“不允许操作”错误是由写v系统调用,调用堆栈锁定如下(所有函数都在hci.c,参见bluez源代码):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

普通扫描(“hcitool scan”)显然不需要向控制器发送任何请求,而是使用专用的读写控制请求,调用:

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

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

答案3

我没有安装这个,但是一个编写良好的设备子系统通常有一个与之关联的组。将用户添加到组中,您就可以访问设备(例如disk组允许原始硬盘驱动器访问)。只需ls -l进去/dev检查一下即可。如果情况并非如此,并且设备属于root组,您可以通过调整管理检测时硬件上的命名、权限和操作的规则来更改此设置udev(不要问我如何操作)。

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

相关内容