有没有办法让 shell 脚本始终以 root 身份运行

DAT*_*LOT 4 bash sudo shell-script

我想知道如何创建(如果可能)一个在 Debian 上以 root 身份运行的 bash 脚本,而不管执行它的用户是什么,而不要求任何类型的身份验证。

这个文件将像 root 用户一样运行它的所有命令,但只有真正的 root 用户才能读取它或写入它。

我需要这个,因为我想运行诸如swapoffswaponapt等命令......但是通过另一个应用程序,我希望它不要问我任何密码。

这些命令将是固定的(那些根命令将在文件中包含它们的参数,而不是作为输入),因此安全隐患并不是我的当务之急,但我也接受解释。

Áng*_*gel 10

您无法创建运行 setuid 的 bash 脚本。但是,您可以使用sudo(或类似的程序,如 calife)来确保它们以 root 权限运行。

有两种基本方法可以做到这一点。

假设您的脚本被调用reset-swap并执行以下操作:

#!/bin/sh
swapoff /dev/sdb
shred -n0 -z /dev/sdb
mkswap /dev/sdb
swapon /dev/sdb
Run Code Online (Sandbox Code Playgroud)

选项 A:允许任何用户运行这些单独的命令,并在它们前面加上 sudo:

#!/bin/sh
sudo swapoff /dev/sdb
sudo shred -n0 -z /dev/sdb
sudo mkswap /dev/sdb
sudo swapon /dev/sdb
Run Code Online (Sandbox Code Playgroud)

并添加/etc/sudoers一系列让每个人都可以这样做的行:

ALL     ALL = NOPASSWD: /sbin/swapoff /dev/sdb
ALL     ALL = NOPASSWD: shred -n0 -z /dev/sdb
ALL     ALL = NOPASSWD: mkswap /dev/sdb
ALL     ALL = NOPASSWD: swapon /dev/sdb
Run Code Online (Sandbox Code Playgroud)

然而,虽然每个人都可以安全地执行指定的操作(如脚本所做的那样),但它可能不是那么独立。例如,mkswap在处理交换分区之前检查交换分区是否未安装,但shred很乐意擦除已安装的交换分区。

因此,最好使用

选项 B:仅让该脚本使用 sudo 运行。

ALL     ALL = NOPASSWD: /usr/local/bin/reset-swap
Run Code Online (Sandbox Code Playgroud)

然后您可以将其称为 assudo reset-swap而不是reset-swap。如果你喜欢的话,如果脚本不以 root 身份运行,它可以提升自身,让它在不指定前缀的情况下运行sudo

ALL     ALL = NOPASSWD: /sbin/swapoff /dev/sdb
ALL     ALL = NOPASSWD: shred -n0 -z /dev/sdb
ALL     ALL = NOPASSWD: mkswap /dev/sdb
ALL     ALL = NOPASSWD: swapon /dev/sdb
Run Code Online (Sandbox Code Playgroud)

最后,让我以 sudo 讲座中的几点来结束:打字前三思,能力越大,责任越大。


ilk*_*chu 7

让程序始终在特定 UID 下运行的低级方法是二进制文件中的 setuid 位。这就是 egsudosu获得他们的 root 权限,即使它们通常是由正常使用启动的。但总的来说,类 Unix 系统不支持 setuid脚本,请参阅:Allow setuid on shell scripts

但是,您可以做的是配置sudo或其他一些此类工具,以允许用户以适当的权限运行某些特定文件。例如,这将允许使用任何参数viceadmin运行/usr/local/bin/sudoswapon,并且无需身份验证:

viceadmin ALL = NOPASSWD:/usr/local/bin/sudoswapon
Run Code Online (Sandbox Code Playgroud)

现在,由于sudo处理更改权限本身,sudoswapon可以是一个 shell 脚本。

您注意到脚本需要小心处理命令行参数的方式是正确的,并且shell 语言的所有问题都将适用。幸运的是,sudo过滤掉了大多数环境变量,至少在env_reset设置了该选项的情况下。

  • @ user414777 如果您发现答案中有错误,请指出它们。简单地说某事是错误的而不解释_如何_它是错误的或它的哪些部分是错误的是没有帮助的。 (6认同)
  • @ user414777,我以为我之前写过对此效果的评论,但是您不认为具体说明链接的问题和答案中有什么问题会很有用吗?据我所知,setuid 脚本不起作用。有没有改变?至于 sudo,与其说它是可疑的,不如说它是可疑的,你不认为告诉 _why_ 它是可疑的吗?你也知道你可以自由地写出更好的答案吗? (5认同)