Erteilen Sie einem Gerät bestimmte Benutzerberechtigungen, ohne anderen Benutzern Zugriff zu gewähren

18

Ich habe einen Kartenleser angeschlossen /dev/sdb.

Ich erteile dem Eigentümer, der Gruppe und dem Rest der Welt alle Berechtigungen, indem ich Folgendes verwende:

sudo chmod 777 /dev/sdb

Kann ich einfach eine andere Kombination verwenden, sodass nur der Besitzer (ich) den Kartenleser verwenden kann?

Es gibt nur ein Benutzerkonto.

Mohamed Ahmed
quelle
Können Sie bitte laufen ls -l /dev/sdb. Ich vermute, dass dies von root gehört, aber es wäre gut, dies sicherzustellen.
Warwick
Es heißt: "brw-rw ---- 1 root"
Mohamed Ahmed

Antworten:

28

Es gibt mehrere Möglichkeiten, dies zu erreichen.

1. Fügen Sie Ihren Benutzer der Gruppe hinzu, der das Gerät gehört

In den meisten Distributionen gehören Blockgeräte einer bestimmten Gruppe. Sie müssen lediglich Ihren Benutzer zu dieser Gruppe hinzufügen.

Zum Beispiel auf meinem System:

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

Daher muss ich meinen Benutzer zur diskGruppe hinzufügen .

# usermod -a -G disk patrick

 

2. Ändern Sie die Berechtigungen des Geräts

Die Idee ist, eine udev-Regel zu erstellen, um einen Befehl auszuführen, wenn das Gerät erkannt wird.

Zuerst müssen Sie einen Weg finden, um das Gerät zu identifizieren. Sie verwenden udevadmdafür. Beispielsweise:

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

Dann eine neue Datei in erstellen /etc/udev/rules.d, wie zum Beispiel 99-cardreader.rules:

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

Hier habe ich die Ausgabe des udevadm infoBefehls verwendet, um einige identifizierende Informationen für das Gerät zu finden. Ich habe den SUBSYSTEM="block"Eintrag für den allerersten Eintrag verwendet und dann die ATTRSWerte ab dem 6. Eintrag. Dies findet im Grunde das USB-Gerät mit diesem Produkt und der Seriennummer und dann das Blockgerät, das von diesem USB-Gerät stammt.

Der RUNBefehl ändert die Berechtigungen auf dem Gerät auf 777. Ich halte dies jedoch nicht für eine sehr gute Lösung, da dies das Gerät für die Welt öffnet. Stattdessen könnte eine bessere Lösung sein:

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

Dadurch erhält der Benutzer patrickLese- / Schreibzugriff auf das Gerät.

Hinweis: Beachten Sie, dass Sie beim Schreiben von udev-Regeln nur Parameter vom obersten Gerät und von einem anderen Gerät in der Kette verwenden können. Somit kann ich den SUBSYSTEM="block"Parameter und die ATTRSParameter verwenden. Aber ich konnte keine Parameter von einem anderen Gerät in der Kette verwenden, oder die Regel würde nicht übereinstimmen.

Noch ein Hinweis: (da das System mehr als 6 Zeichen für eine Bearbeitung benötigt und ich keinen Ruf habe, einen Kommentar hinzuzufügen) udev matching muss den Gleichheitsoperator ( ==) verwenden, nicht assign ( =)! Diese Antwort hatte vorher SUBSYSTEM="block"was nicht funktioniert ( invalid SUBSYSTEM operation).

Patrick
quelle
Zumindest in systemd 219 können Sie mit udev MODE = "777" anstelle von RUN + = "/ bin / chmod 777 / dev / $ name" verwenden. Ich glaube jedoch nicht, dass es eine Alternative zum expliziten Ausführen von setfacl gibt.
Doshea
1
was steht $namein der schriftlichen regel sollte ich ersetzen Sie es durch sdb?
Marecky
2
@Marecky freedesktop.org/software/systemd/man/udev.html#%24name "Der aktuelle Name des Geräts. Wenn nicht durch eine Regel geändert, ist dies der Name des Kernelgeräts." Sie ersetzen es nicht durch irgendetwas, Sie belassen es wie es ist.
Patrick
Vielen Dank, ich habe gerade Ihre Antwort auf mein spezielles Problem angewendet, das nicht ausreichte, um als Boot-Disk für Gast-Windows 7 unter VirtalBox konfigurierte Raw-Festplatten zuzugreifen.
Marecky