私はユーザーにスーパーユーザー権限があるかどうかをテストし、そうでない場合はスーパーユーザー権限を要求するbashスクリプトを作成しました。最終的に、次の2行を削除できるように、2番目の "if"ステートメントを逆に置き換えようとしています(echo "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」であることは、単に空のステートメントですか?
4行目でテストを逆にする必要がありますが、どうすればよいですか?私が試したことは次のとおりです。
if sudo false; then
if sudo true == false; then
if [!(sudo true)]; then
答え1
true
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;
答え2
許可された回答が実際にあなたの質問に対する答えではないと思いますか?
これ目的実際にできることを確認するには、次のようにしますsudo
。
どのようにこの確認は、true
許可された回答で説明されているようにプログラム的に行われます。
答え3
このスクリプトで見られるように。 sudoが有効になっていることを確認するだけです。
true は単に true を返します。
したがって、この場合、sudoを使用してコマンドを実行する必要がある場合は、最初に起動を確認し、パスワードを一度だけ尋ねます。
条件は次のように動作します。 sudoがtrueコマンドを正しく実行すると、if条件はtrueを返し、sudoがアクティブになり、ユーザーが入力したパスワードが正確になります。それ以外の場合は、間違ったパスワードを入力したか、sudoが有効になっていないため、スクリプトを続行しないでください。 。
他のコマンドは認証が初めて成功するため、sudoパスワードを要求する必要はありません(ただし、これはsudo構成によって異なり、このスクリプトは環境構成に大きく依存します)。
「echo Password ok」もこれを証明します。シェルスクリプトはパスワードを必要としません。