Bluetooth LE quét như không root?


12

Để thực hiện quét các thiết bị bluetooth LE, hcitool rõ ràng cần có quyền root. Đối với người dùng bình thường, đầu ra như sau:

$ hcitool lescan
Set scan parameters failed: Operation not permitted

Tại sao hcitool cần quyền root để quét LE?

Có thể bằng cách nào đó thực hiện quét LE là không root?

Câu trả lời:


21

Ngăn xếp giao thức Bluetooth cho Linux kiểm tra hai khả năng. Khả năng là một hệ thống chưa phổ biến để quản lý một số đặc quyền. Chúng có thể được xử lý bởi mô-đun PAM hoặc thông qua các thuộc tính tệp mở rộng. (xem http://lxr.free-electrons.com/source/net/bluetooth/hci_sock.c#L619 )

 $> sudo apt-get install libcap2-bin

cài đặt các công cụ thao tác khả năng của linux.

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

thiết lập các khả năng còn thiếu trên tệp thực thi khá giống với bit setuid.

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

vì vậy chúng tôi rất tốt để đi:

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

Vâng, bộ điều hợp BT của bạn không hỗ trợ BLE

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

Cái này không, tiếp tục và nhấn một nút trên thiết bị của bạn.


Cảm ơn bốn chỉ ra các khả năng còn thiếu. Nó cũng giúp tôi sử dụng bluetoothctl với tư cách là người dùng không root trên Raspberry Pi chạy Raspbian Stretch! nhưng trong trường hợp của tôi, tôi đã thêm khả năng vào /lib/systemd/system/bluetooth.service.
Stefan Wegener

7

Ok, ít nhất tôi đã phát hiện ra một phần lý do tại sao hcitool yêu cầu quyền root cho quét LE nhưng không phải quét thông thường. Một phần có nghĩa là tôi đã tìm thấy cuộc gọi hệ thống bị lỗi do không đủ đặc quyền khi chạy quét LE như một người dùng bình thường.

Lỗi " Thao tác không được phép" được tạo bởi lệnh gọi hệ thống writev , với khóa ngăn xếp cuộc gọi như sau (tất cả các chức năng được triển khai trong hci.c , xem mã nguồn bluez):

hci_le_set_scan_parameters -> hci_send_req -> hci_send_cmd -> writev

Quét bình thường ("quét hcitool") dường như không cần gửi bất kỳ yêu cầu nào đến bộ điều khiển, nhưng sử dụng một yêu cầu ioctl chuyên dụng , gọi:

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

Có vẻ như quyền truy cập ghi vào bộ điều khiển bluetooth bị hạn chế, nhưng tại sao và làm cách nào tôi có thể tắt chức năng đó?


0

Tôi chưa cài đặt cái này, nhưng một hệ thống con thiết bị được viết tốt thường có một nhóm liên kết với nó. Thêm người dùng vào nhóm và bạn có thể truy cập thiết bị (ví dụ: disknhóm cho phép truy cập ổ cứng thô). Chỉ cần làm ls -ltrong /devđể kiểm tra này. Nếu đó không phải là trường hợp và thiết bị thuộc rootnhóm, bạn có thể thay đổi điều này bằng cách điều chỉnh các udevquy tắc chi phối việc đặt tên, quyền và hành động trên phần cứng khi phát hiện (đừng hỏi tôi làm thế nào).

Điều này đi để truy cập thiết bị trực tiếp mà bạn có thể cần trong trường hợp này. Chức năng thông thường của bluetooth thường được xử lý thông qua một daemon với cấu hình, nhóm, quyền riêng, v.v. Kiểm tra tài liệu phân phối của bạn, các nhóm có thể thay đổi một chút.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.