다른 사용자에게 액세스 권한을 부여하지 않고 장치에 특정 사용자 권한 부여


18

에 카드 리더기가 붙어 있습니다 /dev/sdb.

내가하는 일은 다음을 사용하여 소유자, 그룹 및 기타 국가에 모든 권한을 부여하는 것입니다.

sudo chmod 777 /dev/sdb

소유자 (나) 만 카드 리더기를 사용할 수 있도록 다른 조합을 사용할 수 있습니까?

하나의 사용자 계정 만 있습니다.


당신은 실행할 수 있습니다 ls -l /dev/sdb. 나는 이것이 루트가 소유하고 있다고 추측하고 있지만 확인하는 것이 좋습니다.
Warwick

"brw-rw ---- 1 root"
Mohamed Ahmed

답변:


28

이를 달성하는 방법에는 여러 가지가 있습니다.

1. 장치를 소유 한 그룹에 사용자를 추가하십시오.

일반적으로 대부분의 배포판에서 블록 장치는 특정 그룹이 소유합니다. 사용자를 해당 그룹에 추가하기 만하면됩니다.

예를 들어, 내 시스템에서 :

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

따라서 사용자를 disk그룹 에 추가해야합니다 .

# usermod -a -G disk patrick

 

2. 장치의 권한을 변경

아이디어는 장치가 감지 될 때 명령을 실행하기위한 udev 규칙을 작성하는 것입니다.

먼저 장치를 식별하는 방법을 찾아야합니다. 당신 udevadm은 이것을 위해 사용 합니다. 예를 들면 다음과 같습니다.

# 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==""

그런 다음 /etc/udev/rules.d과 같은 새 파일을 만듭니다 99-cardreader.rules.

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

여기서는 udevadm info명령 의 출력을 사용 하여 장치에 대한 식별 정보를 찾았습니다. SUBSYSTEM="block"첫 번째 항목에 항목을 사용한 다음 ATTRS6 번째 항목 의 값을 사용했습니다. 기본적으로 해당 제품 및 일련 번호가있는 USB 장치를 찾은 다음 해당 USB 장치에서 발생하는 블록 장치를 찾습니다.

RUN명령은 장치의 권한을로 변경합니다 777. 그러나 이것이 장치를 세상에 열어주기 때문에 이것이 좋은 해결책이라고 생각하지 않습니다. 대신 더 나은 해결책은 다음과 같습니다.

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

이렇게하면 사용자에게 patrick장치에 대한 읽기 / 쓰기 액세스 권한이 부여 됩니다.

참고 : udev 규칙을 작성할 때 최상위 디바이스와 체인의 다른 디바이스의 매개 변수 만 사용할 수 있다는 점을 기억해야합니다. 따라서 SUBSYSTEM="block"매개 변수와 매개 변수 를 사용할 수 있습니다 ATTRS. 그러나 체인의 다른 장치에서 매개 변수를 사용할 수 없거나 규칙이 일치하지 않습니다.

또 다른 참고 사항 : (시스템에는 편집을 위해 6 자 이상이 필요하고 주석을 추가 할 평판이 없기 때문에) udev 일치는 ==할당 ( =)이 아닌 항등 연산자 ( )를 사용해야합니다 ! 이 답변은 이전에는 SUBSYSTEM="block"작동하지 않았습니다 ( invalid SUBSYSTEM operation).


시스템 219에서 udev를 사용하면 RUN + = "/ bin / chmod 777 / dev / $ name"대신 MODE = "777"을 사용할 수 있습니다. 그래도 setfacl을 명시 적으로 실행하는 것에 대한 대안이 있다고 생각하지 않습니다.
doshea

1
$name서면 규칙에는 무엇이 있습니까? 나는 그것을 대체해야 sdb합니까?
Marecky

2
@Marecky freedesktop.org/software/systemd/man/udev.html#%24name "장치의 현재 이름입니다. 규칙에 의해 변경되지 않으면 커널 장치의 이름입니다." 당신은 아무것도 그것을 대체하지 않고 그대로 둡니다.
Patrick

감사합니다. 방금 특정 문제에 대한 답변을 적용했습니다. 일반 사용자에게는 VirtalBox에서 실행되는 게스트 Windows 7의 부팅 디스크로 구성된 원시 하드 디스크에 액세스 할 수있는 권한이 충분하지 않았습니다.
Marecky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.