Linux

將原始圖像安全寫入 U 盤

  • March 13, 2018

在各種硬體上嘗試了許多不同的 Linux 發行版,我發現自己經常輸入這樣的命令:

sudo dd if=xubuntu-13.10-desktop-amd64.iso of=/dev/sdc bs=10240

不用說,遲早我會打錯目的地並擦除硬碟驅動器而不是預期的 USB 驅動器。我不想sudo每次都在這裡使用。

在我的系統上,一個相當現代的 Ubuntu,權限/dev/sdc如下:(當存在棒時):

$ ls -al /dev/sdc*
brw-rw---- 1 root disk 8, 32 Apr  6 22:10 /dev/sdc

如何授予我的普通使用者對隨機 USB 記憶棒的寫入權限,但不授予我係統中存在的其他磁碟的權限?

我認為你可以使用 UDEV 來做你想做的事。創建一個規則文件,例如/etc/udev/rules.d/99-thumbdrives.rules您只需添加一個允許 Unix 組或使用者訪問任意 USB 拇指驅動器的規則。

KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="<user>", GROUP="<group>", MODE="0660"

將使用 user<user>和 group創建設備<group>

例子

  1. 將此行添加到我的系統後。
KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="saml", GROUP="saml", MODE="0660"
  1. 並重新載入我的規則:
$ sudo udevadm control --reload-rules
  1. 如果我現在將拇指驅動器插入我的系統,我的/var/log/messages顯示如下:
$ sudo tail -f /var/log/messages
Apr 13 11:48:45 greeneggs udisksd[2249]: Mounted /dev/sdb1 at /run/media/saml/HOLA on behalf of uid 1000
Apr 13 11:51:18 greeneggs udisksd[2249]: Cleaning up mount point /run/media/saml/HOLA (device 8:17 is not mounted)
Apr 13 11:51:18 greeneggs udisksd[2249]: Unmounted /dev/sdb1 on behalf of uid 1000
Apr 13 11:51:18 greeneggs kernel: [171038.843969] sdb: detected capacity change from 32768000 to 0
Apr 13 11:51:39 greeneggs kernel: [171058.964358] usb 2-1.2: USB disconnect, device number 15
Apr 13 11:51:46 greeneggs kernel: [171066.053922] usb 2-1.2: new full-speed USB device number 16 using ehci-pci
Apr 13 11:51:46 greeneggs kernel: [171066.134401] usb 2-1.2: New USB device found, idVendor=058f, idProduct=9380
Apr 13 11:51:46 greeneggs kernel: [171066.134407] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Apr 13 11:51:46 greeneggs kernel: [171066.134410] usb 2-1.2: Product: USBDrive
Apr 13 11:51:46 greeneggs kernel: [171066.134412] usb 2-1.2: Manufacturer: JMTek
Apr 13 11:51:46 greeneggs kernel: [171066.135470] usb-storage 2-1.2:1.0: USB Mass Storage device detected
Apr 13 11:51:46 greeneggs kernel: [171066.136121] scsi17 : usb-storage 2-1.2:1.0
Apr 13 11:51:46 greeneggs mtp-probe: checking bus 2, device 16: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2"
Apr 13 11:51:46 greeneggs mtp-probe: bus: 2, device: 16 was not an MTP device
Apr 13 11:51:47 greeneggs kernel: [171067.139462] scsi 17:0:0:0: Direct-Access     JMTek    USBDrive         7.77 PQ: 0 ANSI: 2
Apr 13 11:51:47 greeneggs kernel: [171067.140251] sd 17:0:0:0: Attached scsi generic sg2 type 0
Apr 13 11:51:47 greeneggs kernel: [171067.142105] sd 17:0:0:0: [sdb] 64000 512-byte logical blocks: (32.7 MB/31.2 MiB)
Apr 13 11:51:47 greeneggs kernel: [171067.144236] sd 17:0:0:0: [sdb] Write Protect is off
Apr 13 11:51:47 greeneggs kernel: [171067.145988] sd 17:0:0:0: [sdb] No Caching mode page found
Apr 13 11:51:47 greeneggs kernel: [171067.145998] sd 17:0:0:0: [sdb] Assuming drive cache: write through
Apr 13 11:51:47 greeneggs kernel: [171067.153721] sd 17:0:0:0: [sdb] No Caching mode page found
Apr 13 11:51:47 greeneggs kernel: [171067.153728] sd 17:0:0:0: [sdb] Assuming drive cache: write through
Apr 13 11:51:47 greeneggs kernel: [171067.159028]  sdb: sdb1
Apr 13 11:51:47 greeneggs kernel: [171067.164760] sd 17:0:0:0: [sdb] No Caching mode page found
Apr 13 11:51:47 greeneggs kernel: [171067.164768] sd 17:0:0:0: [sdb] Assuming drive cache: write through
Apr 13 11:51:47 greeneggs kernel: [171067.164775] sd 17:0:0:0: [sdb] Attached SCSI removable disk
Apr 13 11:51:47 greeneggs kernel: [171067.635474] FAT-fs (sdb1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
Apr 13 11:51:47 greeneggs udisksd[2249]: Mounted /dev/sdb1 at /run/media/saml/HOLA on behalf of uid 1000
  1. 現在檢查下/dev顯示的設備文件如下:
$ ls -l /dev/sd*
brw-rw----. 1 root disk 8,  0 Apr 13 09:17 /dev/sda
brw-rw----. 1 root disk 8,  1 Apr 13 09:17 /dev/sda1
brw-rw----. 1 root disk 8,  2 Apr 13 09:17 /dev/sda2
brw-rw----. 1 saml saml 8, 16 Apr 13 11:51 /dev/sdb
brw-rw----. 1 root disk 8, 17 Apr 13 11:51 /dev/sdb1

所以它似乎奏效了。

更明確

以上將起作用,但可能會將這些規則應用於並非我們想要的每個塊設備。為了稍微縮小它的焦點,您可以使用ATTRS{..}==...屬性規則將應用程序限制在特定的硬體上。就我而言,我只希望它應用於單個 USB 拇指驅動器。

步驟 #1 - 唯一 id 設備

因此,一旦我們安裝了特定的拇指驅動器,我們就可以開始使用這個命令,這樣我們就可以udevadm用來檢查它,摸索它的特定屬性。

在這裡,我將重點關注“製造商”和“產品”屬性。

$ udevadm info -a -p $(udevadm info -q path -n /dev/sdb)|grep -iE "manufacturer|product"
   ATTRS{manufacturer}=="JMTek"
   ATTRS{idProduct}=="9380"
   ATTRS{product}=="USBDrive"
   ATTRS{idProduct}=="0020"
   ATTRS{manufacturer}=="Linux 3.13.7-100.fc19.x86_64 ehci_hcd"
   ATTRS{idProduct}=="0002"
   ATTRS{product}=="EHCI Host Controller"

注意: ATTRS{..}==..屬性是該設備的設備文件最終派生的層次結構中父設備的屬性。所以在我們的例子中,被添加的塊設備/dev/sdb來自一個 USB 父設備,所以我們正在尋找這個父設備的屬性,ATTRS{manufacturer}=...例如。

所以在這個例子中,我選擇了製造商“JMTek”和產品“USBDrive”。

步驟 #2 - 修改 .rules fly

因此,有了這些額外的位,讓我們將它們添加到我們的原始.rules文件中。

KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ATTRS{manufacturer}=="JMTek", ATTRS{product}=="USBDrive", OWNER="saml", GROUP="saml", MODE="0660"

第 3 步 - 嘗試一下

現在,當我們重新載入規則並再次解除安裝/刪除/重新插入 USB 拇指驅動器時,我們會得到以下規則:

$ ls -l /dev/sdb*
brw-rw----. 1 saml saml 8, 16 Apr 13 12:29 /dev/sdb
brw-rw----. 1 root disk 8, 17 Apr 13 12:29 /dev/sdb1

但是,如果我插入一個完全不同的設備:

$ ls -l /dev/sdb*
brw-rw----. 1 root disk 8, 16 Apr 13 12:41 /dev/sdb
brw-rw----. 1 root disk 8, 17 Apr 13 12:41 /dev/sdb1

參考

引用自:https://unix.stackexchange.com/questions/124540