Cấp quyền người dùng cụ thể cho thiết bị mà không cấp quyền truy cập cho người dùng khác


18

Tôi có một đầu đọc thẻ kèm theo /dev/sdb.

Những gì tôi làm là cung cấp tất cả các quyền cho chủ sở hữu, nhóm và phần còn lại của thế giới, sử dụng:

sudo chmod 777 /dev/sdb

Tôi có thể chỉ sử dụng kết hợp khác, chỉ cho phép chủ sở hữu (tôi) sử dụng đầu đọc thẻ không?

Chỉ có một tài khoản người dùng.


Bạn có thể vui lòng chạy ls -l /dev/sdb. Tôi đoán rằng cái này thuộc sở hữu của root, nhưng sẽ tốt để đảm bảo.
Warwick

Nó nói: "brw-rw ---- 1 root"
Mohamed Ahmed

Câu trả lời:


28

Có nhiều cách để thực hiện điều này.

1. Thêm người dùng của bạn vào nhóm sở hữu thiết bị

Nói chung trong hầu hết các bản phát hành, các thiết bị khối được sở hữu bởi một nhóm cụ thể. Tất cả bạn cần làm là thêm người dùng của bạn vào nhóm đó.

Ví dụ: trên hệ thống của tôi:

# ls -l /dev/sdb
brw-rw---- 1 root disk 8, 16 2014/07/07-21:32:25 /dev/sdb

Vì vậy, tôi cần thêm người dùng của mình vào disknhóm.

# usermod -a -G disk patrick

 

2. Thay đổi quyền của thiết bị

Ý tưởng là tạo ra một quy tắc udev để chạy lệnh khi phát hiện thấy thiết bị.

Đầu tiên bạn cần tìm cách xác định thiết bị. Bạn sử dụng udevadmcho việc này. Ví dụ:

# udevadm info -a -n /dev/sdb

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/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0/host6/target6:0:0/6:0:0:0/block/sdb':
    KERNEL=="sdb"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="31116288"
    ATTR{stat}=="     279      219     3984     1182        0        0        0        0        0      391     1182"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{events}=="media_change"
    ATTR{ext_range}=="256"
    ATTR{events_poll_msecs}=="-1"
    ATTR{alignment_offset}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="1"
    ATTR{capability}=="51"
    ATTR{events_async}==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0/host6/target6:0:0/6:0:0:0':
    KERNELS=="6:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="0207"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="0"
    ATTRS{model}=="STORAGE DEVICE  "
    ATTRS{state}=="running"
    ATTRS{queue_type}=="none"
    ATTRS{iodone_cnt}=="0x184"
    ATTRS{iorequest_cnt}=="0x184"
    ATTRS{device_busy}=="0"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{max_sectors}=="240"
    ATTRS{ioerr_cnt}=="0x2"
    ATTRS{queue_depth}=="1"
    ATTRS{vendor}=="Generic "
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{device_blocked}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{iocounterbits}=="32"
    ATTRS{eh_timeout}=="10"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0/host6/target6:0:0':
    KERNELS=="target6:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0/host6':
    KERNELS=="host6"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3:1.0':
    KERNELS=="1-1.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3':
    KERNELS=="1-1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="1.3"
    ATTRS{idVendor}=="05e3"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="5"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="500mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0207"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="000000000207"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="1115"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Generic"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0727"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="USB Storage"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{devpath}=="1"
    ATTRS{idVendor}=="8087"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="2"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="6"
    ATTRS{bcdDevice}=="0000"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="61"
    ATTRS{ltm_capable}=="no"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0024"
    ATTRS{bDeviceClass}=="09"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="0"
    ATTRS{idVendor}=="1d6b"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{authorized_default}=="1"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="3"
    ATTRS{bcdDevice}=="0313"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="26"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 3.13.6-gentoo ehci_hcd"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0002"
    ATTRS{bDeviceClass}=="09"
    ATTRS{product}=="EHCI Host Controller"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci-pci"
    ATTRS{irq}=="23"
    ATTRS{subsystem_vendor}=="0x144d"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x0c0320"
    ATTRS{companion}==""
    ATTRS{enabled}=="1"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="0f"
    ATTRS{device}=="0x1e26"
    ATTRS{uframe_periodic_max}=="100"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-3"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0xc0d3"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Sau đó tạo một tệp mới /etc/udev/rules.d, chẳng hạn như 99-cardreader.rules:

SUBSYSTEM=="block", ATTRS{idProduct}=="0727", ATTRS{serial}=="000000000207", ACTION=="add", RUN+="/bin/chmod 777 /dev/$name"

Ở đây tôi đã sử dụng đầu ra từ udevadm infolệnh để tìm một số thông tin nhận dạng cho thiết bị. Tôi đã sử dụng SUBSYSTEM="block"mục nhập cho mục đầu tiên, và sau đó là các ATTRSgiá trị từ mục thứ 6. Về cơ bản, điều này sẽ tìm thiết bị USB có số sê-ri & sản phẩm đó, sau đó tìm thiết bị chặn kết quả từ thiết bị USB đó.

Các RUNlệnh sẽ thay đổi các điều khoản trên thiết bị để 777. Tuy nhiên tôi không coi đây là một giải pháp rất tốt vì điều này sẽ mở thiết bị ra thế giới. Thay vào đó, một giải pháp tốt hơn có thể là:

SUBSYSTEM=="block", ATTRS{idProduct}=="0727", ATTRS{serial}=="000000000207", ACTION=="add", RUN+="/bin/setfacl -m u:patrick:rw- /dev/$name"

Điều này sẽ cấp cho người dùng patrickquyền truy cập đọc / ghi vào thiết bị.

Lưu ý: Điều quan trọng cần nhớ là khi viết quy tắc udev, bạn chỉ có thể sử dụng các tham số từ thiết bị hàng đầu và một thiết bị khác trong chuỗi. Do đó tôi có thể sử dụng SUBSYSTEM="block"tham số và ATTRStham số. Nhưng tôi không thể sử dụng bất kỳ tham số nào từ bất kỳ thiết bị nào khác trong chuỗi, hoặc quy tắc sẽ không khớp.

Một lưu ý khác: (vì hệ thống yêu cầu nhiều hơn 6 ký tự cho một chỉnh sửa và tôi không có tiếng tăm để thêm nhận xét) kết hợp udev phải sử dụng toán tử đẳng thức ( ==), không được gán ( =)! Câu trả lời này trước đây SUBSYSTEM="block"không có tác dụng ( invalid SUBSYSTEM operation).


Trong systemd 219, ít nhất, udev cho phép bạn sử dụng MODE = "777" thay vì RUN + = "/ bin / chmod 777 / dev / $ name". Tuy nhiên, tôi không tin rằng nó có một giải pháp thay thế cho việc chạy setfacl một cách rõ ràng.
doshea

1
những gì $nametrong quy tắc bằng văn bản? Tôi có nên thay thế nó bằng sdb?
Marecky

2
@Marecky freedesktop.org/software/systemd/man/udev.html#%24name "Tên hiện tại của thiết bị. Nếu không thay đổi theo quy tắc, đó là tên của thiết bị kernel.". Bạn không thay thế nó bằng bất cứ điều gì, bạn để lại như vậy.
Patrick

Cảm ơn, tôi vừa áp dụng câu trả lời của bạn cho vấn đề cụ thể của tôi, đó là không đủ quyền cho người dùng thông thường truy cập vào đĩa cứng thô được định cấu hình là đĩa khởi động cho khách Windows 7 đang chạy trong VirtalBox.
Marecky
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.