我想允许用户脚本将remount
驱动器设置为“ro”或“rw”。
通过使用user
fstab 中的选项,我可以以用户身份成功挂载和卸载驱动器,但-o remount,rw
失败了。
用户是否无法使用该remount
选项?!?
/etc/fstab
读...
UUID=789f-4b3a-b0b2-c05955d7c5ad /mnt/nasbackup auto rw,user,noexec 0 2
但...
john@johnbox /mnt> mount UUID=789f-4b3a-b0b2-c05955d7c5ad
john@johnbox /mnt> mount | grep nvme
/dev/nvme0n1 on /mnt/nasbackup type ext4 (rw,nosuid,nodev,noexec,relatime,stripe=4,user=john)
john@johnbox /mnt> mount -o remount,ro UUID=789f-4b3a-b0b2-c05955d7c5ad
mount: /mnt/nasbackup: must be superuser to use mount.
dmesg(1) may have more information after failed mount system call.
john@johnbox /mnt [32]> umount UUID=789f-4b3a-b0b2-c05955d7c5ad
john@johnbox /mnt>
答案1
这是一个建筑限制的mount
。作为一种解决方法,您可以使用 C 编写一些 suid 包装器。Shell 脚本将不起作用,因为 Bash 拒绝保留 suid。
sudo apt install build-essential
- 将以下内容粘贴到
remountro.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
if (setuid(0) != 0) abort();
puts("Will remount nasbackup as ro");
execl("/bin/mount", "mount", "-o", "remount,ro", "UUID=789f-4b3a-b0b2-c05955d7c5ad", NULL);
abort();
}
- 将以下内容粘贴到
remountrw.c
:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
if (setuid(0) != 0) abort();
puts("Will remount nasbackup as rw");
execl("/bin/mount", "mount", "-o", "remount,rw", "UUID=789f-4b3a-b0b2-c05955d7c5ad", NULL);
abort();
}
- 跑步
make remountrw remountro
- 在 root shell 中运行:
chown root:root remountrw remountro
chmod 4755 remountrw remountro # 4 = suid
mv -t /usr/local/bin remountrw remountro
- 现在任何用户都可以运行
remountro
或remountrw
修复这两个命令
您仍然需要 部分user
,/etc/fstab
以便非重新安装命令可以像以前一样继续工作。或者,您可以编辑/etc/sudoers
,但要确保您编写的参数限制规则sudo
保持安全,这更为复杂。