藍牙 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(不要問我如何操作)。

這適用於在這種情況下您可能需要的直接設備存取。藍牙的正常功能通常透過具有自己的配置、群組、權限等的守護程序來處理。檢查您的發行版文檔,這些組可能略有不同。

相關內容