1

次のコードは、root権限があるかどうかを確認し、それを使用してスクリプトを再実行します。

    CMDLN_ARGS="$@" # Command line arguments for this script (if any)
    export CMDLN_ARGS
    func_check_for_sudo() {
        if [ ! $( id -u ) -eq 0 ]; then
                echo "You may be asked for your login password for [`whoami`]." ;sleep 1
                LAUNCH="`dirname \"${0}\"`"
                exec sudo -S su -c ${LAUNCH}/$(basename ${0}) ${CMDLN_ARGS}
        exit ${?}
    fi
    }

問題が発生しているのは、このスクリプトを「$ HOME / bin」フォルダーなどに配置して、パスなしで起動できるようにする場合です。「そのようなファイルやディレクトリはありません」というエラーが表示されます。その情報を取得してexecに正しく渡すためのスクリプトが必要です。

私の質問はこれです:パスなしで呼び出されたときに、スクリプト内から/ path / to / script_nameを正しく取得するにはどうすればよいですか?要約すると、MY_SCRIPT insead / path / to / MY_SCRIPTを呼び出しています。これは、ルート権限をチェックし、ルート権限がない場合は再実行する必要があるため、スクリプトを中断します。

基本的に、問題のコード行は次のとおりです。ここで、$ {0}はスクリプト名です(パスを使用して呼び出した場合はパスを使用)。

    exec sudo -S su -c ${0} ${CMDLN_ARGS}
4

1 に答える 1

3

ここにはいくつかの問題があります。

  • スクリプトへのパスを見つけます。これを行う簡単な方法がいくつかあり"$BASH_SOURCE"ます$0。または、(少なくともデフォルトでは) sudo が $PATH を保持するという事実を利用してsudo "$0" ...、スクリプトをうまく解決します。
  • 2 つ目は、スクリプトが引数を適切に保持していないことです。引数内のスペースは引数間の区切りと間違えられ、ワイルドカードは誤って展開されます。これは、CMDLN_ARGS="$@"すべての引数をスペースで区切ってまとめてから、スペースで${CMDLN_ARGS}再分割し (同じ方法ではない可能性があります)、ワイルドカードも展開するためです。

これが問題を修正する際の私の見解です。ハンドラーを関数に配置すると、不要な複雑さのレイヤーが追加されるだけなので、インラインに配置することに注意してください。また、sudo の -p オプションを使用して、プロンプトをわずかにクリーンアップしました。

if [ $( id -u ) -ne 0 ]; then
    exec sudo -p "Login password for %p: " "$0" "$@"
    exit $?
fi
于 2012-11-11T04:32:50.150 に答える