在shell脚本中使用sudo

在shell脚本中使用sudo,shell,sudo,Shell,Sudo,在执行shell脚本时,sudo如何在以下方面发挥作用 # script.sh ls /root sudo ls /root 现在,如果我运行$sudo./script.sh或$./script.sh有什么区别?例如: 使用sudo./script.sh运行的所有命令是否都会自动在该命令前面加上“sudo” 是sudo ls/root行vlid吗?或者该行而不是ls/root,是否需要根调用 基本上,我试图找出行项目作为sudo运行与脚本本身作为sudo运行的区别。sudo代表“超级用户do”

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

# script.sh
ls /root
sudo ls /root
现在,如果我运行
$sudo./script.sh
$./script.sh
有什么区别?例如:

  • 使用
    sudo./script.sh运行的所有命令是否都会自动在该命令前面加上“sudo”
  • sudo ls/root
    行vlid吗?或者该行而不是
    ls/root
    ,是否需要根调用
  • 基本上,我试图找出行项目作为sudo运行与脚本本身作为sudo运行的区别。

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


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

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

    如果
    命令
    不是一个简单的命令,而是包含重定向或管道,则必须使用
    sudo
    运行整个命令,而不仅仅是列表中的第一个命令。要做到这一点,只需使用sudobash-c“yourlongcommand”
    ,以确保提升的权限可用于复合命令中需要它的每个部分。例如,如果您尝试:

    sudo cat /etc/sudoers > sudoersbackup
    
    命令将失败。当
    cat
    具有读取文件的提升权限时,
    重定向将作为普通用户运行,并将由于缺乏权限而失败。要处理这种情况,您可以执行以下操作:

    sudo bash -c "cat /etc/sudoers > sudoersbackup"
    

    这确保提升的权限可用于整个命令。

    只需同时运行这两个命令,就可以看到区别了吗?现在还不清楚您在问什么。在脚本中,在需要提升权限的命令之前,检查当前用户的
    UID
    (和或
    EUID
    )。如果不需要
    0
    并且需要
    root
    权限,则可以使用
    sudo
    执行该命令(如果涉及多个简单命令,则启动单独的子shell)。例如,
    if[“$UID”-ne 0-a“$EUID”-ne 0];然后#使用sudo
    如果你有一个用户不需要密码就可以
    sudo
    ——将该用户添加到
    wheel
    组中,以root用户身份运行
    visudo
    ,并在末尾配置(取消注释)所需的行。@DavidC.Rankin谢谢——想把它放在一个答案中,我可以接受吗?当然,给我一分钟,我会把它写下来。
    sudo bash -c "cat /etc/sudoers > sudoersbackup"