使 USB 设备对 root 以外的用户可写

使 USB 设备对 root 以外的用户可写

我有一个 USB 设备,格式为 FAT32(为了尽可能广泛的兼容性),插入运行 CentOS 5 的系统(是的,我知道它已经过时了)。

插入它的全部目的是接收从其他两个系统发送的备份文件。

但由于(显然)UDEV 默认行为,它(及其子目录)安装为“drwxr-xr-x 5 root root”,拒绝接受发送给它的任何内容,并拒绝任何“chown”(带有错误消息)或“chmod”(悄然失败)。

有没有办法更改 USB FAT32 设备的默认安装行为?我会注意到此框中的 /etc/udev/rules.d 包含:

05-udev-early.rules  60-pcmcia.rules         90-alsa.rules
40-multipath.rules   60-raw.rules            90-dm.rules
50-udev.rules        60-wacom.rules          90-hal.rules
51-hotplug.rules     61-uinput-stddev.rules  95-pam-console.rules
60-libsane.rules     61-uinput-wacom.rules   98-kexec.rules
60-net.rules         85-pcscd_ccid.rules     bluetooth.rules

注意这里的对象是特别避免必须明确地安装该血腥的东西(并且不是每次插入不同的设备时都必须添加新的 fstab 条目)!

我找到了“udevmonitor”(没有“udevadm”),当我插入设备时:

UEVENT[1618003563.847325] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5
UEVENT[1618003563.847392] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/usbdev1.4_ep00
UEVENT[1618003563.849089] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0
UEVENT[1618003563.849130] add@/class/scsi_host/host4
UEVENT[1618003563.849155] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/usbdev1.4_ep8b
UEVENT[1618003563.849180] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/usbdev1.4_ep0a
UEVENT[1618003563.849203] add@/class/usb_device/usbdev1.4
UDEV  [1618003563.850150] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5
UDEV  [1618003564.062789] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/usbdev1.4_ep00
UDEV  [1618003564.186813] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0
UDEV  [1618003564.298705] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/usbdev1.4_ep8b
UDEV  [1618003564.298769] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/usbdev1.4_ep0a
UDEV  [1618003564.308695] add@/class/scsi_host/host4
UDEV  [1618003564.614084] add@/class/usb_device/usbdev1.4
UEVENT[1618003569.124366] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host4/target4:0:0/4:0:0:0
UEVENT[1618003569.124416] add@/class/scsi_disk/4:0:0:0
UEVENT[1618003569.179432] add@/block/sda
UEVENT[1618003569.179466] add@/block/sda/sda1
UEVENT[1618003569.179485] add@/block/sda/sda2
UEVENT[1618003569.179508] add@/class/scsi_device/4:0:0:0
UEVENT[1618003569.179612] add@/class/scsi_generic/sg0
UDEV  [1618003569.290405] add@/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host4/target4:0:0/4:0:0:0
UDEV  [1618003569.423752] add@/class/scsi_generic/sg0
UDEV  [1618003569.423806] add@/class/scsi_disk/4:0:0:0
UDEV  [1618003569.474344] add@/class/scsi_device/4:0:0:0
UDEV  [1618003569.505476] add@/block/sda
UDEV  [1618003569.861895] add@/block/sda/sda1
UDEV  [1618003569.919434] add@/block/sda/sda2
UEVENT[1618003570.253329] mount@/block/sda/sda2
UDEV  [1618003570.254399] mount@/block/sda/sda2

udevinfo -p /block/sda/sda2 -q 都给了我:

P: /block/sda/sda2
N: sda2
S: disk/by-id/usb-Seagate_BUP_Slim_BK_NA7LFNNT-part2
S: disk/by-path/pci-0000:00:1d.7-usb-0:5:1.0-scsi-0:0:0:0-part2
S: disk/by-uuid/6D63-17F2
S: disk/by-label/BACKUP
E: ID_VENDOR=Seagate
E: ID_MODEL=BUP_Slim_BK
E: ID_REVISION=0143
E: ID_SERIAL=Seagate_BUP_Slim_BK_NA7LFNNT
E: ID_TYPE=disk
E: ID_BUS=usb
E: ID_PATH=pci-0000:00:1d.7-usb-0:5:1.0-scsi-0:0:0:0
E: ID_FS_USAGE=filesystem
E: ID_FS_TYPE=vfat
E: ID_FS_VERSION=FAT32
E: ID_FS_UUID=6D63-17F2
E: ID_FS_LABEL=BACKUP
E: ID_FS_LABEL_SAFE=BACKUP

udevinfo -p /block/sda2 -1 给出的结果为:

  looking at device '/block/sda/sda2':
    KERNEL=="sda2"
    SUBSYSTEM=="block"
    SYSFS{stat}=="      38      329      661      163        1        1        2        4        0      139      167"
    SYSFS{size}=="1952849920"
    SYSFS{start}=="411648"
    SYSFS{dev}=="8:2"

  looking at parent device '/block/sda':
    ID=="sda"
    BUS=="block"
    DRIVER==""
    SYSFS{stat}=="     112     1237     1811      361        1        1        2        4        0      241      365"
    SYSFS{size}=="1953525167"
    SYSFS{removable}=="0"
    SYSFS{range}=="16"
    SYSFS{dev}=="8:0"
. . .

我尝试进入 /etc/udev/rules.d/50-udev.rules 并更改

# all block devices
SUBSYSTEM=="block",             GROUP="disk", MODE="0640"
KERNEL=="root",                 GROUP="disk", MODE="0640"

# all block devices
SUBSYSTEM=="block",             GROUP="disk", MODE="0660"
KERNEL=="root",                 GROUP="disk", MODE="0640"

并重新启动;没有效果

再往下我发现了这个(在“persistent_end”之后):

ACTION=="add", SUBSYSTEM=="usb_device", \
        PROGRAM="/bin/sh -c 'K=%k; K=$${K#usbdev}; printf bus/usb/%%03i/%%03i $${K%%%%.*} $${K#*.}'", \
        NAME="%c", MODE="0644"

并尝试将 644 更改为 664;也没有效果(此外,子系统应该是“块”)。

是否还有其他地方可以放置一些内容来指定可打开 USB 设备访问的 MODE 参数?

我注意到

UEVENT[1618003570.253329] mount@/block/sda/sda2
UDEV  [1618003570.254399] mount@/block/sda/sda2

在 udevmonitor 输出的底部。我注意到“mount”上的 grep 没有找到响应“mount”事件的单个规则。我可以添加一些内容来响应此问题,无论是更改安装参数还是重新安装设备?

答案1

chown并且chmod不起作用,因为 FAT 没有实现它们,但是在安装时,您可以指定umask允许每个人写入它或uid设置闪存驱动器上所有内容的所有者。如果您正在谈论安装它的能力,您可以/etc/fstab使用适当的选项添加条目 和users。我想在 CentOS 5 中,你没有那么多东西连接到设备来保证比静态更复杂的东西fstab

答案2

如果您想使用自动挂载,udev您可以将类似的内容添加到您的 udev 规则中:

# Symlinks

SUBSYSTEM=="block", KERNEL=="sd?",       ACTION=="add",    PROGRAM="/etc/udev/scripts/isremovable.sh %k", RESULT=="YES", SYMLINK="usb_flash_raw", RUN+="/etc/udev/scripts/mount.sh %k"
SUBSYSTEM=="block", KERNEL=="sd?[0-9]*", ACTION=="add",    PROGRAM="/etc/udev/scripts/isremovable.sh %k", RESULT=="YES", SYMLINK="usb_flash_p%n", RUN+="/etc/udev/scripts/mount.sh %k"

# umount

SUBSYSTEM=="block", KERNEL=="sd?",       ACTION=="remove", RUN+="/etc/udev/scripts/umount.sh > /dev/null 2> /dev/null"

可移除的地方可以是这样的:

#!/bin/sh
DEV="`basename "$1" | sed 's|[0-9]*$||'`"
if [ "`find /sys -name "$DEV" | grep usb`" ]; then
        echo "YES"
        exit 0
else
        echo "NO"
        exit 1
fi

挂载/卸载脚本可以是您想要的任何脚本,但请注意,处理安全卸载并不容易。

答案3

我最终采取了不同的方法。

我设置了一个 cron 作业,每五分钟运行一次,以在 root 权限下将上传到备份用户主目录的文件传输到 USB 驱动器,并防止它们在上传完成之前传输,我有上传客户端设置为发送不带扩展名的文件,然后在上传完成后重命名它们以添加扩展名。

然后我发现注销控制台会卸载 USB 设备。使用基于 udev 的自动挂载就到此为止了。

因此,由于 cron 作业的脚本已经存在,我设置了自己的挂载点,然后添加代码来查看挂载点是否存在正确设置的 USB 设备,如果不存在,它会尝试挂载该设备。

然后我发现了整个练习的第一个惊喜:虽然将设备安装在我的安装点使其无法显示在 /media 下,但它以某种方式确实出现了不是当我登录时,阻止 Gnome 在桌面上提供它。

相关内容