DAT*_*LOT 4 bash sudo shell-script
我想知道如何创建(如果可能)一个在 Debian 上以 root 身份运行的 bash 脚本,而不管执行它的用户是什么,而不要求任何类型的身份验证。
这个文件将像 root 用户一样运行它的所有命令,但只有真正的 root 用户才能读取它或写入它。
我需要这个,因为我想运行诸如swapoff
、swapon
、apt
等命令......但是通过另一个应用程序,我希望它不要问我任何密码。
这些命令将是固定的(那些根命令将在文件中包含它们的参数,而不是作为输入),因此安全隐患并不是我的当务之急,但我也接受解释。
Á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 讲座中的几点来结束:打字前三思,能力越大,责任越大。
让程序始终在特定 UID 下运行的低级方法是二进制文件中的 setuid 位。这就是 egsudo
并su
获得他们的 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
设置了该选项的情况下。