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

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

Bluetooth LE 장치 검색인간-기계 도구당연히 루트 액세스가 필요합니다. 일반 사용자의 경우 출력은 다음과 같습니다.

$ hcitool lescan
Set scan parameters failed: Operation not permitted

인간-기계 도구LE 스캐닝에는 루트 권한이 필요합니까?

루트가 아닌 사용자로 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

글쎄, 적어도 나는 그 이유를 부분적으로 발견했습니다.인간-기계 도구LE 스캔에는 루트 권한이 필요하지만 일반 스캔에는 루트 권한이 필요하지 않습니다. 부분적으로 이것은 일반 사용자로 LE 스캔을 실행할 때 권한 부족으로 인해 실패한 시스템 호출을 발견했음을 의미했습니다.

"작업이 허용되지 않습니다" 오류는 다음으로 인해 발생합니다.v를 쓰다시스템 호출, 호출 스택은 다음과 같이 잠깁니다(모든 함수는hci.c, bluez 소스 코드 참조):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

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

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

블루투스 컨트롤러에 대한 쓰기 접근이 제한되어 있는 것 같은데, 비활성화하는 이유와 방법은 무엇입니까?

답변3

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

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

관련 정보