Cho phép người dùng không phải root đọc / ghi / phát tệp


8

Trong /devthư mục của tôi , tôi muốn các tệp sau đây có thể được người dùng đọc và ghi được:

/dev/ttyUSB0
/dev/gpib0

Làm thế nào để tôi làm điều này mà không sử dụng chgrp? Tôi có thể chỉnh sửa /etc/udev/rules.dnhưng tôi không biết cú pháp.


1
Tại sao bạn muốn cấp quyền đọc / ghi cho những điều này?
slm

Tôi đang sử dụng PC này làm bộ điều khiển cho một số thiết bị kiểm tra & thiết bị (máy hiện sóng, đồng hồ đo điện, v.v.) Tất cả việc đọc / ghi sẽ được thực hiện bởi các tập lệnh và thư viện Python. Không có việc đọc / ghi ở mức độ thấp sẽ được thực hiện bởi chính người dùng. Hãy giả sử rằng hệ thống này là an toàn vô cùng. Tôi muốn tạo điều kiện thuận lợi cho các đồng nghiệp trong phòng thí nghiệm của mình để viết kịch bản cho các nhạc cụ.
Bộ

3
Tại sao không chỉ cung cấp cho các đồng nghiệp sudo truy cập thay thế?
slm

Câu trả lời:


11

Làm thế nào các quy tắc udev được cấu trúc

Đối với các thiết bị rơi vào hệ thống con tty, bạn có thể đặt nhóm của chúng như sau:

SUBSYSTEM=="tty", GROUP="dialout"

Lưu ý rằng, giống như trong lập trình thông thường, ==là một bài kiểm tra cho sự bình đẳng trong khi =là một bài tập. Vì vậy, câu lệnh trên có nghĩa là "nếu SUBSYSTEM=="tty"sau đó gán GROUP="dialout". Một câu lệnh có thể có nhiều phép thử, được ghép và ghép với nhau và nhiều phép gán.

Nếu bạn muốn thay đổi quyền đọc-ghi-thực thi, thì hãy gán MODE thay vì NHÓM trong đó MODE tuân theo ký hiệu bát phân Unix thông thường, ví dụ: MODE="0660"cấp cho chủ sở hữu và quyền đọc-ghi của nhóm. man udevcó tất cả các chi tiết.

Bạn có thể tìm thấy nhiều ví dụ về các quy tắc như vậy trong /lib/udev/rules.d/91-permissions.rules

Cách thêm quy tắc udev vào hệ thống của bạn

Một khi bạn đã giải quyết được những gì bạn muốn quy tắc của mình, nó đủ đơn giản để thêm nó. Trên hệ thống có nguồn gốc từ debian, hãy vào thư mục /etc/udev/rules.dvà tạo một tệp. Các tập tin được chạy theo thứ tự sắp xếp. Vì vậy, để làm cho tệp quy tắc của bạn cuối cùng được đọc, ghi đè lên các quy tắc trước đó, hãy thử một tên như thế nào 99-instruments.rules. Sau đó đặt quy tắc của bạn trong tệp đó, mỗi dòng trên một dòng. (Nếu cần bởi, các dòng có thể được mở rộng bằng cách đặt dấu gạch chéo ngược ở cuối dòng, giống như trong shell.)

Vì vậy, nếu bạn muốn thay đổi nhóm và quyền trên các thiết bị tty, tệp của bạn /etc/udev/rules.d/99-instruments.rulescó thể bao gồm một dòng duy nhất:

SUBSYSTEM=="tty", GROUP="dialout", MODE="0660"

Để đảm bảo rằng tệp mới của bạn có các quyền thông thường:

sudo chown root:root /etc/udev/rules.d/99-instruments.rules
sudo chmod 0644 /etc/udev/rules.d/99-instruments.rules

Sau khi bạn đã tạo tệp của mình, udevd có thể tự động đọc nó. Nếu không, bạn có thể buộc nó đọc lại các tệp của nó bằng:

udevadm control --reload-rules

Tìm hiểu thêm về cách udev phân loại thiết bị

Nếu bạn muốn có được quyền kiểm soát tốt hơn đối với thiết bị nào đáp ứng quy tắc nào, bạn có thể tìm hiểu thêm về cách udev nhìn thấy thiết bị của mình bằng cách đọc / sys /. Tại thời điểm này, tôi không có quyền truy cập vào một máy có ttyUSB hoặc HPIB, vì vậy hãy làm ví dụ về sda đĩa. Chạy:

udevadm info --attribute-walk --path=/sys/block/sda

Điều này cung cấp rất nhiều thông tin trông giống như:

. . . .
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="0"
. . . .

Các dòng này đều ở dạng thích hợp để sử dụng như ifcác mệnh đề trong các quy tắc. Vì vậy, ví dụ, để thay đổi quyền sở hữu trên tất cả các thiết bị khối được đánh dấu là không thể tháo rời, chúng tôi sẽ sử dụng quy tắc:

SUBSYSTEM=="block", ATTR{removable}=="0", OWNER=john1024

Với thông tin từ udevadm, người ta có thể phát triển các quy tắc có thể nhắm mục tiêu cụ thể các thiết bị quan tâm.


Ví dụ đầu tiên phải có dấu phẩy, không phải dấu chấm, trước MODE =
Jim Hunziker

1
@JimHunziker Cảm ơn vì điều đó. Lỗi đánh máy bây giờ đã được sửa.
John1024

4

Tôi nghĩ rằng tôi sẽ đề nghị đưa ra quy tắc hạn chế hơn một chút so với John. Ví dụ: tạo một tệp như /etc/udev/rules.d/99-tty-dialout.rules:

SUBSYSTEM=="tty", KERNEL=="ttyUSB0", GROUP="dialout", MODE="0660"

Bạn có thể sử dụng udevadmđể xác định một thiết bị SUBSYSTEM==KERNEL==giá trị. Ví dụ:

$ udevadm info -a -n /dev/tty0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/virtual/tty/tty0':
    KERNEL=="tty0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{active}=="tty1"
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.