Scansione Bluetooth LE come non root?


13

Per eseguire una scansione dei dispositivi Bluetooth LE, hcitool apparentemente richiede i privilegi di root. Per gli utenti normali l'output è il seguente:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Perché hcitool necessita dei privilegi di root per una scansione LE?

È possibile in qualche modo eseguire una scansione LE come non root?

Risposte:


21

Lo stack di protocollo Bluetooth per Linux controlla due funzionalità. Le funzionalità non sono ancora un sistema comune per gestire alcuni privilegi. Potrebbero essere gestiti da un modulo PAM o tramite attributi di file estesi. (vedi http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619 )

 $> sudo apt-get install libcap2-bin

installa strumenti di manipolazione delle capacità di linux.

 $> sudo setcap 'cap_net_raw,cap_net_admin+eip' `which hcitool`

imposta le capacità mancanti sull'eseguibile in modo simile al bit setuid.

 $> getcap !$
 getcap `which hcitool`
 /usr/bin/hcitool = cap_net_admin,cap_net_raw+eip

quindi siamo a posto:

$>hcitool -i hci0 lescan
Set scan parameters failed: Input/output error

Sì, l'adattatore BT non supporta BLE

$>hcitool -i hci1 lescan
LE Scan...

Questo lo fa, vai avanti e premi un pulsante sul tuo dispositivo.


1
Grazie quattro sottolineando le capacità mancanti. Mi ha anche aiutato a usare bluetoothctl come utente non root su un Raspberry Pi con Raspbian Stretch! ma nel mio caso ho aggiunto la possibilità a /lib/systemd/system/bluetooth.service.
Stefan Wegener,

7

Ok, almeno ho parzialmente scoperto perché hcitool richiede i privilegi di root per una scansione LE ma non per una scansione normale. In parte significa che ho individuato la chiamata di sistema che non riesce a causa di privilegi insufficienti durante l'esecuzione della scansione LE come utente normale.

L'errore "Operazione non consentita" viene generato da una chiamata di sistema writeev , con lo stack di chiamate bloccato come segue (tutte le funzioni implementate in hci.c , vedere il codice sorgente bluez):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

La scansione normale ("scansione hcitool") apparentemente non ha bisogno di inviare alcuna richiesta al controller, ma utilizza una richiesta ioctl dedicata , chiamando:

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

Sembra che l'accesso in scrittura al controller bluetooth sia limitato, ma perché e come posso disattivarlo?


0

Non ho installato questo, ma di solito un sottosistema di dispositivi ben scritto ha un gruppo associato. Aggiungi un utente al gruppo e puoi accedere al dispositivo (ad esempio il diskgruppo consente l'accesso al disco rigido non elaborato). Basta fare ls -lin /devcontrollare questo. In caso contrario e il dispositivo appartiene al rootgruppo, è possibile modificarlo modificando le udevregole che regolano la denominazione, le autorizzazioni e le azioni sull'hardware al rilevamento (non chiedermi come).

Questo vale per l'accesso diretto al dispositivo che probabilmente ti servirà in questo caso. La normale funzionalità del bluetooth è di solito gestita attraverso un demone con la propria configurazione, gruppi, autorizzazioni e così via. Controlla la documentazione di distribuzione, i gruppi possono variare leggermente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.