将原始图像安全地写入 U 盘

mog*_*gul 7 linux permissions usb dd devices

在各种硬件上尝试了许多不同的 Linux 发行版,我发现自己经常输入这样的命令:

sudo dd if=xubuntu-13.10-desktop-amd64.iso of=/dev/sdc bs=10240
Run Code Online (Sandbox Code Playgroud)

不用说,迟早我会输错目的地并擦除硬盘驱动器而不是预期的 USB 驱动器。我不想sudo每次都用在这里。

在我的系统上,一个相当现代的 Ubuntu,权限/dev/sdc如下:(当存在棒时):

$ ls -al /dev/sdc*
brw-rw---- 1 root disk 8, 32 Apr  6 22:10 /dev/sdc
Run Code Online (Sandbox Code Playgroud)

我如何授予我的普通用户对随机 USB 记忆棒的写访问权限,而不是我系统中存在的其他磁盘?

slm*_*slm 11

我认为您可以使用 UDEV 来做您想做的事。创建一个规则文件,例如/etc/udev/rules.d/99-thumbdrives.rules您只需添加一个规则,该规则将允许 Unix 组或用户访问任意 USB 拇指驱动器。

KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="<user>", GROUP="<group>", MODE="0660"
Run Code Online (Sandbox Code Playgroud)

将使用 user<user>和 group创建设备<group>

例子

  1. 将此行添加到我的系统后。

    KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="saml", GROUP="saml", MODE="0660"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 并重新加载我的规则:

    $ sudo udevadm control --reload-rules
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果我现在将拇指驱动器插入我的系统,我的/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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在检查下的设备文件/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
    
    Run Code Online (Sandbox Code Playgroud)

所以它似乎奏效了。

更明确

以上将起作用,但可能会将这些规则应用于每个不是我们想要的块设备。为了稍微缩小其重点,您可以使用ATTRS{..}==...属性规则将应用程序限制为特定硬件。就我而言,我只想将它应用于单个 USB 拇指驱动器。

第 1 步 - 唯一标识设备

所以一开始,我们可以在安装特定的拇指驱动器后使用这个命令,以便我们可以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"
Run Code Online (Sandbox Code Playgroud)

注意: 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"
Run Code Online (Sandbox Code Playgroud)

第 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
Run Code Online (Sandbox Code Playgroud)

但是,如果我插入一个完全不同的设备:

$ 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
Run Code Online (Sandbox Code Playgroud)

参考