如何在没有 root 权限的情况下重新安装驱动器?

如何在没有 root 权限的情况下重新安装驱动器?

我想允许用户脚本将remount驱动器设置为“ro”或“rw”。

通过使用userfstab 中的选项,我可以以用户身份成功挂载和卸载驱动器,但-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。

  1. sudo apt install build-essential
  2. 将以下内容粘贴到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();
}
  1. 将以下内容粘贴到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();
}
  1. 跑步make remountrw remountro
  2. 在 root shell 中运行:
chown root:root remountrw remountro
chmod 4755 remountrw remountro # 4 = suid
mv -t /usr/local/bin remountrw remountro
  1. 现在任何用户都可以运行remountroremountrw修复这两个命令

您仍然需要 部分user/etc/fstab以便非重新安装命令可以像以前一样继续工作。或者,您可以编辑/etc/sudoers,但要确保您编写的参数限制规则sudo保持安全,这更为复杂。

相关内容