代码之家  ›  专栏  ›  技术社区  ›  Thijs Koerselman

需要sudo密码的Bash脚本

  •  33
  • Thijs Koerselman  · 技术社区  · 15 年前

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

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

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

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

    3 回复  |  直到 15 年前
        1
  •  69
  •   Aaron Digulla    15 年前

    要获取密码,只需输入 sudo echo "Thanks."

    但我更喜欢这样的解决方案:

    if [[ $UID != 0 ]]; then
        echo "Please run this script with sudo:"
        echo "sudo $0 $*"
        exit 1
    fi
    
        2
  •  5
  •   Travis R    8 年前

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

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

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

        3
  •  1
  •   Mike Q    7 年前

    另一种方法是:

    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
  •  0
  •   Paul Back    6 年前

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