अन्य उपयोगकर्ताओं को एक्सेस दिए बिना डिवाइस के लिए एक विशिष्ट उपयोगकर्ता अनुमति दें


18

मेरे पास कार्ड रीडर है /dev/sdb

मैं क्या कर रहा हूँ, स्वामी, समूह और शेष विश्व को सभी अनुमतियाँ दे रहा हूँ:

sudo chmod 777 /dev/sdb

क्या मैं सिर्फ एक अन्य संयोजन का उपयोग कर सकता हूं, जिससे केवल स्वामी (मुझे) कार्ड रीडर का उपयोग करने की अनुमति मिलती है?

केवल एक उपयोगकर्ता खाता है।


आप चलाने कृपया कर सकते ls -l /dev/sdb। मैं अनुमान लगा रहा हूं कि यह रूट के स्वामित्व में है, लेकिन यह सुनिश्चित करने के लिए अच्छा होगा।
वार्विक

यह कहता है: "brw-rw ---- 1 रूट"
मोहम्मद अहमद

जवाबों:


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. डिवाइस की अनुमति बदलें

डिवाइस का पता चलने पर कमांड चलाने के लिए एक udv नियम बनाने का विचार है।

सबसे पहले आपको डिवाइस की पहचान करने का एक तरीका खोजने की आवश्यकता है। आप इसके लिए उपयोग 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 वीं प्रविष्टि से मान। यह मूल रूप से उस उत्पाद और सीरियल नंबर के साथ यूएसबी डिवाइस को ढूंढेगा, और फिर उस यूएसबी डिवाइस से ब्लॉक डिवाइस को ढूंढें।

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 में, कम से कम, udv आपको RUN + = "/ bin / chmod 777 / dev / $ नाम" के बजाय MODE = "777" का उपयोग करने देता है। मुझे विश्वास नहीं है कि यह स्पष्ट रूप से सेटफैक्ल चलाने का एक विकल्प है, हालांकि।
doshea

1
$nameलिखित नियम में क्या है ? क्या मुझे इसे बदल देना चाहिए sdb?
6

2
@Marecky freedesktop.org/software/systemd/man/udev.html#%24name "डिवाइस का वर्तमान नाम। यदि किसी नियम से नहीं बदला गया है, तो यह कर्नेल डिवाइस का नाम है।" आप इसे किसी भी चीज़ से प्रतिस्थापित नहीं करते हैं, जैसा आप छोड़ते हैं।
पैट्रिक

धन्यवाद, मैंने सिर्फ अपने विशिष्ट मुद्दे पर आपके उत्तर को लागू किया, जो कि वर्चुअलबॉक्स में चल रहे अतिथि विंडोज 7 के लिए बूट-डिस्क के रूप में कॉन्फ़िगर की गई कच्ची हार्ड डिस्क तक पहुंचने के लिए नियमित उपयोगकर्ता के लिए अपर्याप्त अधिकार था।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.