我们遇到过这样的情况:一个现场办公室有几台 Rocky Linux 8 服务器,并定期从客户那里接收大量数据。数据通过各种外部 USB 硬盘和偶尔的 USB 记忆棒到达。这些驱动器可以有各种文件系统,但最常见的是 NTFS 和 exFAT。
RL8 原生支持 NTFS,但不支持 exFAT。我们使用了 rpmfusion 中的 fuse-exfat 包。(https://github.com/relan/exfat)。
我希望我的用户能够顺利地安装这些文件,他们没有、也不应该有 root 访问权限。以前,我们使用过 pmount,但 pmount 与 exFAT 配合得不好。我认为这是因为它是 FUSE,而不是因为它是 exFAT。
有没有一个好的、安全的方法来达到这个目的?
编辑:pmount 似乎是 mount 的一个非常薄的包装器,权限是通过可执行文件上的 setuid 位实现的。因此,基本上它是一组有限的 mount 命令,而 exfat 不是其中之一。这里有一些讨论:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755434此处建议使用以下补丁:launchpadlibrarian.net/229524614/pmount.exfat.patch
答案1
您可以使用udisks2
,它允许用户在没有 root 访问权限的情况下管理和安装存储设备。
设置
- 安装工具:
sudo dnf install udisks2 ntfs-3g fuse-exfat
- 允许用户管理:
sudo usermod -a -G disk <username>
组中的非root用户disk
可以使用udisksctl
命令行工具来管理和挂载外部驱动器。
替换<username>
为您允许管理驱动器的用户。
使用示例
- 安装驱动器:
udisksctl mount -b /dev/sdXY
- 解除驱动器的锁定:
udisksctl unmount -b /dev/sdXY
- 获取信息:
udisksctl info -b /dev/sdXY
答案2
我认为我成功了。将以下 polkit 规则添加到/etc/polkit-1/rules.d/10-allow-usb-mounts.rules
:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.udisks2.filesystem-mount-other-seat" && subject.isInGroup("groupforthosewhocanmountusbdisks")) {
var bus = action.lookup("drive.removable.bus");
if (bus == "usb" || bus == "firewire") {
polkit.log("polkit rule for mounting USB drives with udisks2")
polkit.log("Device: " + action.lookup("device"))
polkit.log("Drive: " + action.lookup("drive"))
polkit.log("Bus: " + bus)
polkit.log("Serial: " + action.lookup("drive.serial"))
polkit.log("Vendor: " + action.lookup("drive.vendor"))
polkit.log("Model: " + action.lookup("drive.model"))
return polkit.Result.YES;
}
}
});
要测试,请以普通用户身份安装磁盘,使用以下命令:
udisksctl mount -b /dev/sdb
并使用 检查输出journalctl
。
答案3
您可以配置sudo
让用户执行一些特制的脚本,将 USB 驱动器挂载到仅指示设备的固定挂载点上。例如,他们可以运行:
sudo mount-usb /dev/sdb
脚本将尝试挂载 /dev/usb,例如,挂载在 /mnt/usb 中,并通知用户。同样,我们可以用以下脚本umount-usb
卸载驱动器:
sudo umount-usb
mount-usb 脚本可能是这样的:
#!/bin/bash
# mount-usb: mount drives in /mnt/usb
[ -z "$1" ] && echo "Use: $0 device" && exit
if ! [[ $1 =~ ^/dev/.*$ ]] ; then
echo "Use /dev/xxx as device"
exit
fi
mount -t auto -o uid=$SUDO_UID,gid=$SUDO_UID,ro "$1" /mnt/usb
mount | grep /mnt/usb #-- show result
我们使用 SUDO* vars 获取调用用户的真实 id/gid,并使用正则表达式对设备规格进行简单检查。相应的内容umount-usb
如下:
#!/bin/bash
# umount-usb: unmounts the device in /mnt/usb
umount /mnt/usb
的配置sudo
是/etc/sudoers
使用visudo
命令编辑文件(或VISUAL=nano visudo
使用其他编辑器代替 vi)完成的,我们可以让某些用户或组以 root 身份执行某些命令而无需输入密码。以用户 john 和组 usb-mounters 为例:
Defaults !lecture
Cmnd_Alias USBMNT = /root/mount-usb ^/dev/.*$, umount-usb ""
john ALL=NOPASSWD: USBMNT
%usb-mounters ALL=NOPASSWD: USBMNT
请注意,正则表达式仅启用 /dev/xx 参数,mount-usb
而空字符串则禁用它们umount-usb
(如sudoers 手册)。我们可以用这个定义来省略脚本中对/dev/xx的测试,但是无论如何我还是喜欢保留它。