web-dev-qa-db-ja.com

Sudoパスワードを必要とするBashスクリプト

OSXとLinuxの両方のライブラリをコンパイルしてインストールするBashインストーラスクリプトを作成しています。スクリプト内の一部のコマンド(「make install」、「apt-get install」、「port install」など)ではSudoが必要なので、ユーザーにパスワードを指定する必要があります。

現在、ユーザーは最初のSudoコマンドを実行しようとするたびにパスワードの入力を求められますが、これは多くの場合コンパイルステージの後であるため、スクリプトを開始してからパスワードを入力するまでの間に常に時間があります。

スクリプトの最初にパスワードエントリ+チェックを配置したいと思います。また、これが本当にシステムライブラリをインストールする適切な方法であるかどうかも知りたいです。

または、Sudoを必要としないローカルのサンドボックスの場所にライブラリをインストールすることもできますが、apt-getとmacportsに、デフォルトの/ usr/local /と/ opt/local以外のライブラリをインストールする場所を指示する必要があります、それを行う方法も、それが賢いアイデアかどうかもわかりません。

37

パスワードを取得するには、Sudo echo "Thanks."スクリプトの先頭。

しかし、私はこの解決策を好みます:

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

スクリプト全体を昇格させたくない場合(必要に応じてスクリプト内でSudoのみを使用してリスクを制限するため)、受け入れられた回答の最初の部分Sudo echo "Thanks"は機能しますが、スクリプトを終了してSudoパスワードの失敗に応答しません。これを実現するために、Sudoコマンドを含み、使用前にSudoアクセスを確実にしたいスクリプトは、

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

警告は、残りのプロンプトを抑制するために、スクリプトの期間中続くsudoersタイムアウトの存在に依存していることです。

5
Travis R

それについて進む別の方法:

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
}
1
Mike Q

少し読みやすいかもしれません:

[ $(whoami) == "root" ] || exit
0
Paul Back