2010-09-17 23 views
10

Gần đây tôi đã chơi đùa với PyUSB và thấy rằng nó hoạt động tốt trên Linux (Ubuntu có libusb 0.1 và 1.0, cũng như OpenUSB) ... nhưng chỉ khi tôi chạy chương trình với quyền ưu tiên gốc (với sudo, khóa học).Tại sao PyUSB/libusb yêu cầu quyền root (sudo) trên Linux?

Bất cứ ai có thể cho tôi biết lý do tại sao nó đòi hỏi đặc quyền nâng cao và quan trọng hơn, nếu tôi có thể thay đổi quyền bằng cách nào đó để làm cho nó hoạt động cho tài khoản người dùng bình thường?

Trả lời

5

libusb cho phép bạn thao tác các thiết bị USB tùy ý theo các cách tùy ý. Bạn có thể định dạng một ổ đĩa cứng USB bên ngoài, ví dụ.

Nói chung, tất cả quyền truy cập phần cứng trực tiếp yêu cầu đặc quyền root, mặc dù tôi cho rằng không cần các đặc quyền đầy đủ root, bạn chỉ nên sử dụng CAP_SYS_RAWIO.

+0

Điều đó có ý nghĩa rất nhiều. Tôi sẽ thử ... – ewall

+0

Làm cách nào để đặt CAP_SYS_RAWIO bằng PyUSB? – jedierikb

+0

'CAP_SYS_RAWIO' có thể được thừa hưởng tầm thường để có được toàn bộ thư mục gốc, do đó bạn không đạt được bất kỳ thứ gì bằng cách sử dụng khả năng đó thay thế. – caf

10

Bạn có thể thay đổi quyền của nút thiết bị usb bằng cách tạo quy tắc udev. ví dụ: Tôi đã thêm dòng sau vào một tập tin trong /etc/udev/rules.d/

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="usbusers" 

này đặt chủ sở hữu của các nút thiết bị để root:usbusers hơn root:root

Sau khi thêm bản thân mình vào nhóm usbusers, tôi có thể truy cập vào thiết bị.

+0

Cool ... sẽ sớm dùng thử! – ewall

1

Xem câu trả lời mà tôi đã ở đây:
How can I comunicate with this device using pyusb?

Cụ thể:
Thiết lập một udev nộp quy tắc cho các thiết bị cụ thể mà bạn muốn người dùng bình thường để có thể truy cập. Điều này sẽ xác định id nhà cung cấp, id sản phẩm và nhóm.
Có thể tìm thấy ID nhà cung cấp và sản phẩm bằng lệnh lsusb.

1. Tạo một quy tắc udev nộp

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="171b", ATTRS{idProduct}=="2001", MODE="660", GROUP="plugdev" 

Đặt điều này trong một tập tin gọi (ví dụ) /lib/udev/rules.d/50-YourSoftwareName.rules (đào xung quanh trong con người udev cho quy tắc đặt tên tệp)
LƯU Ý: Quy ước đặt tên cũ được sử dụng /etc/udev/rules.d/filename.rules, đã thay đổi.

2. thêm tên người dùng vào nhóm plugdev

adduser username plugdev

3. lực hệ thống udev để xem thay đổi của bạn

sudo udevadm control --reload (có nghĩa là trừ trừ đi tải lại)
sudo udevadm trigger

4. rút phích cắm và lắp lại bộ lọc ce hoặc khởi động lại máy của bạn

Kết quả cuối cùng là tất cả thành viên của nhóm plugdev giờ đây sẽ có thể truy cập thiết bị.

EDIT: Lưu ý rằng trên một số hệ thống, nhóm plugdev có thể không phải là nhóm mà bạn cần. Nó cũng có thể là nhóm input theo kinh nghiệm của tôi, tùy thuộc vào những gì bạn đang cắm.

1

Có một câu trả lời trước đó của @ rolf-of-saxony giải thích rất nhiều về cách tạo quy tắc udev nhưng đề xuất cài đặt quy tắc trong thư mục sai. Câu trả lời của tôi được dựa trên đó nhưng does not mess with the systems folder structure:

được deviceId VendorID của bạn bằng cách gọi

lsusb 

cho một Logitech G203 Chuột và K120 Bàn phím kết quả này trong $

lsusb | grep Logitech 
Bus 004 Device 003: ID 046d:c31c Logitech, Inc. Keyboard K120 
Bus 003 Device 008: ID 046d:c084 Logitech, Inc. 

đây: VendorID là 046d cho cả hai thiết bị USB. Chuột deviceID là c084

Bây giờ tạo ra các quy tắc trong của bạn thư mục thiết lập /etc/udev/rules.d (chỉnh sửa idVendor và idProduct cho điện thoại của bạn!

sudo echo 'ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c084", MODE="660", GROUP="plugdev"' > /etc/udev/rules.d/90-logitechG203.rules 

séc mà người dùng của bạn là ở nhóm plugdev bằng cách gọi

groups | grep plugdev 

và thêm người dùng của bạn vào nhóm đó nếu không, bằng cách gọi

sudo adduser $USER plugdev 

tải lại udev

sudo udevadm control --reload (that is minus minus reload) 
sudo udevadm trigger 

rút phích cắm điện và replug thiết bị của bạn để thay đổi có hiệu lực.

Các vấn đề liên quan