私はこのbashスクリプトをハッキングして、ユーザーがスーパーユーザー権限を持っているかどうかをテストし、そうでない場合はスーパーユーザー権限を要求します。最終的に、次の2行を削除できるように、2番目の「if」ステートメントを反転させようとしています(エコー「password ok」と次の行のelse)。
# Root user only
if [[ "$EUID" != 0 ]]; then
Sudo -k # make sure to ask for password on next Sudo
if Sudo true; then
echo "Password ok"
else
echo "Aborting script"
exit 1
fi
fi
echo "do my ops"
4行目の "true"の目的は単なるnullステートメントですか?
4行目のテストを反転させる必要があります。どうすればよいですか?これが私が試したものです:
if Sudo false; then
if Sudo true == false; then
if [!(Sudo true)]; then
true
in bashはキーワードではありません。成功した終了コードで即座に終了するプログラムです。同様に、false
は、失敗した終了コードで終了するプログラムです。
端末から両方のプログラムを実行し、最後のプログラムの終了コードを含む_$?
_変数を読み取ることで、これを試すことができます。
_true
echo $? # 0
false
echo $? #1
_
_if Sudo true
_は_if Sudo == true
_と同等ではありません。 _if Sudo true
_は、true
を使用してSudo
プログラムを実行し、終了コードを確認しています。
したがって:
_if Sudo false; then
_はSudoとしてプログラムfalse
を実行しています。戻り値は常にfalseになります。
_if Sudo true == false
_は、true
を使用して、_==
_およびfalse
を引数としてプログラムSudo
を実行します。これは明らかに意図したものではありません。
if [!(Sudo true)]
は無効な構文です。
あなたがおそらく探しているのは
_if ! Sudo true;
_
受け入れられた答えが実際にあなたの質問に答えなかったと思いますか?
これを行う目的は、実際にSudo
を実行できることを確認することです。
方法このチェックは、受け入れられた回答で説明されているtrue
プログラムを介して実行されます。
このスクリプトで見たように。 Sudoが有効になっているかどうかを確認しているだけです。
trueは単にtrueを返します。
したがって、この場合、Sudoを使用してコマンドを実行する必要がある場合、最初に最初にチェックし、パスワードを1回だけ尋ねます。
条件は次のように機能します。Sudoがtrueコマンドを正しく実行している場合、if条件に対してtrueが返され、Sudoが有効になり、ユーザーがパスワードを正しく入力した。続けてはならない.
認証は初めて成功するため、他のコマンドはSudoパスワードを要求する必要はありません(ただし、これはSudo構成に依存するため、このスクリプトは環境構成に大きく依存します)。
「エコーパスワードOK」もそれを示しています。シェルスクリプトはパスワードを要求しなくなります。