在shell脚本中使用sudo的用法

7
执行shell脚本时,sudo 如何参与以下操作?
# script.sh
ls /root
sudo ls /root

现在,如果我运行$ sudo ./script.sh或者$ ./script.sh,会有什么区别?例如:

  1. sudo ./script.sh 所运行的所有命令都会自动添加 "sudo" 前缀吗?
  2. sudo ls /root 这行命令是否有效?或者应该使用 ls /root 并需要 root 调用?

基本上,我正在尝试弄清楚以 sudo 权限运行单个命令与以 sudo 权限运行整个脚本之间的区别。


只是运行两个并查看差异吗?这里你的问题真的不太清楚。 - oguz ismail
在脚本中,在需要升级特权的命令之前,您可以检查当前用户的 UID(和/或 EUID)。如果它不是 0 并且需要 root 权限,则可以使用 sudo 来执行命令(或者如果涉及超过一个简单命令,则启动一个单独的子shell)。例如 if [ "$UID" -ne 0 -a "$EUID" -ne 0 ]; then # use sudo 如果您有某个特定的用户应该能够无需密码就使用 sudo,请将该用户添加到 wheel 组,并作为 root 运行 visudo,并在末尾配置(取消注释)所需的行。 - David C. Rankin
@DavidC.Rankin 谢谢 -- 您能把这个放在答案里吗?我可以接受它吗? - David542
当然,给我一分钟,我会写出来。 - David C. Rankin
2个回答

5
如果您的脚本需要在某些命令中使用提升的权限,那么一种处理这些命令的方法是使用sudo。在使用sudo之前,有几个考虑配置其使用的方面。例如,如果您有特定的用户希望能够使用sudo运行命令,并且进一步运行sudo而无需提示密码,则首先需要进行一些配置。sudo是通过visudo实用程序进行配置的。对于大多数sudo的使用,您只需要取消文件末尾的选项注释即可。然而,要允许用户在不需要密码的情况下使用sudo,您还需要将这些用户添加到wheel组(某些发行版现在使用sudo组,请检查)。将用户添加到wheel组后,为了允许他们在不需要密码的情况下使用sudo,您可以运行visudo并取消以下行的注释:
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL

有了配置好的sudo,在脚本中如果需要提升(root)权限,你只需要检查用户UID(和/或EUID)是否等于零,即表示该用户是root,如果不是,则使用sudo运行命令。你可以以否定或肯定的方式构建测试以适合自己的口味,例如:

if [ "$UID" -eq 0 -o "$EUID" -eq 0 ]; then
    command
else
    sudo command
fi

或者
if [ "$UID" -ne 0 -a "$EUID" -ne 0 ]; then
    sudo command
else
    command
fi

如果您的命令不是简单的指令,而是包含重定向或管道,则必须使用sudo来运行整个命令,而不仅仅是列表中的第一个命令。为此,只需使用sudo bash -c "您的长命令" 确保每个需要提升权限的复合命令的部分都可用。例如,如果您尝试执行以下操作:
sudo cat /etc/sudoers > sudoersbackup

命令将会失败。虽然cat命令拥有读取该文件的高级权限,但>重定向是作为普通用户运行的,因此由于缺乏权限而失败。要处理这种情况,您可以执行以下操作:
sudo bash -c "cat /etc/sudoers > sudoersbackup"

这确保了整个命令可以访问提升的权限。

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接