sudo 在 shell 脚本中的用法

Dav*_*542 7 shell sudo

执行shell脚本时,sudo下面如何发挥作用?

# script.sh
ls /root
sudo ls /root
Run Code Online (Sandbox Code Playgroud)

现在,如果我跑步$ sudo ./script.sh$ ./script.sh会有什么不同?例如:

  1. 运行的所有命令都会sudo ./script.sh自动在该命令前面加上“sudo”吗?
  2. 线路是否sudo ls /root畅通?或者该行应该代替ls /root并需要 root 调用?

基本上,我试图找出作为 sudo 运行的行项目或作为 sudo 运行的脚本本身的区别。

Dav*_*ica 5

如果您的脚本需要某些命令的提升权限,则处理这些命令的一种方法是使用sudo. 在使用之前sudo,配置其使用有几个注意事项。例如,如果您希望某些用户能够运行命令并sudo进一步运行sudo而不提示输入密码,则首先需要进行一些配置。sudo通过visudo实用程序进行配置。对于大多数用途,sudo您只需取消文件末尾选项的注释即可。但是,为了允许用户在没有密码的情况下运行sudo,您还需要将这些用户添加到wheel组中(某些发行版现在使用sudo组 - 检查)。将用户添加到wheel组后,为了允许他们sudo无需密码即可使用,您将运行visudo并取消注释以下行:

## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

配置完毕sudo后,在脚本中,如果需要提升(根)权限,您只需检查用户UID(和/或EUID)是否等于零,表明用户是根,如果不是,则用于sudo运行命令。您可以根据自己的喜好以消极或积极的方式构建测试,例如

if [ "$UID" -eq 0 -o "$EUID" -eq 0 ]; then
    command
else
    sudo command
fi
Run Code Online (Sandbox Code Playgroud)

或者

if [ "$UID" -ne 0 -a "$EUID" -ne 0 ]; then
    sudo command
else
    command
fi
Run Code Online (Sandbox Code Playgroud)

如果您的command命令不是简单的命令,而是包含重定向或管道,那么您必须运行整个命令,而sudo不仅仅是列表中的第一个命令。为此,只需使用sudo bash -c "your long command"以确保需要提升的权限的复合命令的每个部分都可用。例如,如果您尝试:

sudo cat /etc/sudoers > sudoersbackup
Run Code Online (Sandbox Code Playgroud)

该命令将失败。虽然cat具有读取文件的提升权限,但>重定向会以普通用户身份运行,并且会因缺乏权限而失败。为了处理这种情况,你可以这样做:

sudo bash -c "cat /etc/sudoers > sudoersbackup"
Run Code Online (Sandbox Code Playgroud)

这确保了整个命令都可以使用提升的权限。


小智 0

SUDO 代表“超级用户执行的操作”。基本上,它是一个关键字,当在任何其他命令之前添加前缀时,将强制该命令以提升的权限运行。某些命令需要提升权限。/etc/sudoers 中应该有一个文件,它提供有权执行特权命令的用户或用户组的列表。

因此,如果您的 shell 脚本不需要特殊权限即可运行(我希望它不需要),那么 sudo ./script.sh 应该等同于 bash script.sh 或 ./script.sh。