
我們遇到的情況是,站點辦公室擁有幾台 Rocky Linux 8 伺服器,並定期從客戶端接收大量資料。資料到達各種外部 USB 硬碟和偶爾的 USB 記憶棒。這些驅動器可以具有各種檔案系統,但最常見的是 NTFS 和 exFAT。
RL8 本身支援 NTFS,但不支援 exFAT。我們使用了 rpmfusion 中的 fusion-exfat 套件。 (https://github.com/relan/exfat)。
我希望我的用戶(沒有也不應該擁有 root 存取權)能夠順利地安裝它們。之前,我們使用過 pmount,但 pmount 與 exFAT 配合不佳。我認為這是因為它是 FUSE,而不是因為它是 exFAT。
有沒有一種好的、安全的方法來實現這個目標?
編輯:pmount 似乎是 mount 的一個非常薄的包裝,並且權限是透過可執行檔案上的 setuid 位元獲得的。所以基本上它是一組有限的安裝命令,而 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
編輯檔案(或使用其他編輯器而不是 vi)來完成的,我們可以讓某些使用者或群組以 root 身分執行某些命令,而無需輸入密碼。使用者 john 和群組 usb-mounters 的範例:/etc/sudoers
visudo
VISUAL=nano visudo
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 的測試,但我更願意在任何情況下保留它。