需要 sudo 密码的 Bash 脚本

Posted

技术标签:

【中文标题】需要 sudo 密码的 Bash 脚本【英文标题】:Bash scripts requiring sudo password 【发布时间】:2011-04-27 22:37:34 【问题描述】:

我正在创建一个 Bash 安装程序脚本,它为 OSX 和 Linux 编译和安装一些库。因为我的脚本中的某些命令(“make install”、“apt-get install”、“port install”等)需要 sudo,所以我需要用户提供密码。

目前,每当第一个 sudo 命令即将执行时,都会要求用户输入密码,但由于这通常是在编译阶段之后,所以在启动脚本和必须输入密码之间总是有一段时间。

我想把密码输入+检查放在脚本的开头。我也很好奇这是否真的是安装系统库的好方法。

或者,我可以将库安装在不需要 sudo 的本地沙箱位置,但是我必须告诉 apt-get 和 macports 在哪里安装它们的库,而不是默认的 /usr/local/ 和 / opt/local,我不知道该怎么做,也不知道这是不是一个聪明的主意。

【问题讨论】:

【参考方案1】:

要获取密码,只需在脚本开头输入sudo echo "Thanks."

但我更喜欢这个解决方案:

if [[ $UID != 0 ]]; then
    echo "Please run this script with sudo:"
    echo "sudo $0 $*"
    exit 1
fi

【讨论】:

如果可以直接sudo,为什么要echo sudo? @TobiasKienzler:因为问题要求它。 我在 Solaris 上使用 $UID 时遇到了问题——使用 sudo 运行脚本时 var 为空白。所以我不得不检查id -u 我知道这是一个老问题,但是对于遇到它的其他人,如果您想提示他们输入密码而不回显任何文本,您可以使用sudo echo -n-n 用于抑制尾随换行符。 这将要求允许用户在 sudoers 策略中以 root 身份运行 echo,这将是一个奇怪的策略(除了可能允许用户以所有用户身份运行所有命令的桌面框所有主机...)。【参考方案2】:

对于那些不想提升整个脚本的人(通过仅在需要的脚本中使用 sudo 来限制风险),接受的答案的第一部分 sudo echo "Thanks" 有效,但不会通过以下方式响应 sudo 密码失败退出脚本。为此,包含 sudo 命令并希望在使用之前确保 sudo 访问的脚本可以以

开头
if [[ ! $(sudo echo 0) ]]; then exit; fi

需要注意的是,您依赖于 sudoers 超时的存在,该超时将持续脚本的持续时间来抑制其余提示。

【讨论】:

【参考方案3】:

另一种方法:

function checkSudo() 
    if ((EUID != 0)); then
        echo "Granting root privileges for script ( $SCRIPT_NAME )"
        if [[ -t 1 ]]; then
            sudo "$0" "$@"
        else
            exec 1>output_file
            gksu "$0" "$@"
        fi
        exit
    fi

【讨论】:

【参考方案4】:

也许更容易阅读:

[ $(whoami) == "root" ] || exit

【讨论】:

默认情况下不会退出 .... [ $(whoami) == "root" ] || (echo "No." && exit 1)

以上是关于需要 sudo 密码的 Bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何从需要 SUDO 的 php 调用 shell 脚本?

如何从需要SUDO的php调用shell脚本?

shell 脚本中的 su 和 sudo

运行自己的shell脚本

在脚本内使用没有密码的 sudo

在 Bash 中检查 sudo(带有 if 语句的脚本)