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