루트가 아닌 사용자로 Bluetooth LE를 스캔하시겠습니까?

루트가 아닌 사용자로 Bluetooth LE를 스캔하시겠습니까?

블루투스 LE 장치 검색을 수행하려면hcitool분명히 루트 권한이 필요합니다. 일반 사용자의 경우 출력은 다음과 같습니다.

$ hcitool lescan
Set scan parameters failed: Operation not permitted

왜?hcitoolLE 스캔을 위해 루트 권한이 필요합니까?

루트가 아닌 사용자로 LE 스캔을 수행할 수 있습니까?

답변1

Linux용 Bluetooth 프로토콜 스택은 두 가지 기능을 확인합니다. 기능은 일부 권한을 관리하는 아직 일반적인 시스템이 아닙니다. 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

좋아, 적어도 나는 그 이유를 부분적으로 알아냈어hcitoolLE 스캔에는 루트 권한이 필요하지만 일반 스캔에는 루트 권한이 필요하지 않습니다. 부분적으로는 일반 사용자로 LE 스캔을 실행할 때 권한 부족으로 인해 실패한 시스템 호출을 찾았음을 의미합니다.

"작업이 허용되지 않습니다" 오류는 다음에 의해 생성됩니다.쓰기다음과 같이 호출 스택을 잠그는 시스템 호출(모든 함수는hci.c, bluez 소스 코드 참조):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

일반 스캔("hcitool 스캔")은 분명히 컨트롤러에 요청을 보낼 필요가 없지만 전용 스캔을 사용합니다.ioctl요청, 전화:

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

Bluetooth 컨트롤러에 대한 쓰기 액세스가 제한된 것 같습니다. 그런데 왜 이를 비활성화할 수 있습니까?

답변3

저는 이것을 설치하지 않았지만 잘 작성된 장치 하위 시스템에는 일반적으로 이와 관련된 그룹이 있습니다. 그룹에 사용자를 추가하면 장치에 액세스할 수 있습니다(예: disk그룹은 원시 하드 드라이브 액세스를 허용합니다). 이것을 확인하려면 ls -l들어가 십시오 . /dev그렇지 않고 장치가 root그룹에 속해 있는 경우 감지 시 하드웨어에 대한 이름 지정, 권한 및 작업을 제어하는 ​​규칙을 조정하여 이를 변경할 수 있습니다 udev(방법은 묻지 마세요).

이는 이 경우 필요할 수 있는 직접 장치 액세스에 적용됩니다. 블루투스의 일반적인 기능은 일반적으로 자체 구성, 그룹, 권한 등을 갖춘 데몬을 통해 처리됩니다. 배포 문서를 확인하세요. 그룹은 약간 다를 수 있습니다.

관련 정보