45

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

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

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

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

4

4 回答 4

85

要获取密码,只需放在sudo echo "Thanks."脚本的开头即可。

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

if [[ $UID != 0 ]]; then
    echo "Please run this script with sudo:"
    echo "sudo $0 $*"
    exit 1
fi
于 2010-10-20T09:31:40.303 回答
6

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

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

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

于 2017-02-04T02:32:25.377 回答
1

另一种解决方法:

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
}
于 2018-05-26T02:43:44.003 回答
1

也许更容易阅读:

[ $(whoami) == "root" ] || exit
于 2019-09-06T15:57:01.753 回答