bashの「true」の目的は何ですか「if sudo true; それから」


20

ユーザーがスーパーユーザー特権を持っているかどうか、またそうでないかどうかをテストするこの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

2
質問に賛成票を投じる場合は、質問を改善するために私にできることを説明してください。これは正しいオーバーフローサイトではありませんか?
マットパーキンズ

4
downvotesがどこから来たのかわからない。あなたがしようとしている否定文をまたは無効文を?あなたは真/エコーと「その他」の両方を取り除きたいと言いますが、最終的な目標は何ですか?
ジェフシャラー


1
そのリンクに続く@ ctrl-alt-delorは、sudoの前に感嘆符を付けるだけで、エコーとその他の両方を削除することができます。テストしました。
マットパーキンズ

2
:ついでに、あなたはおそらくエラーストリームにエラーメッセージをリダイレクトするべきであるecho "Aborting script" >&2
トビースパイツ

回答:


38

truebashはキーワードではなく、成功した終了コードで即座に終了するプログラムです。同様に、false失敗した終了コードで終了するプログラムです。

端末から両方のプログラムを実行し$?、最後のプログラムの終了コードを含む変数を読み取って、これを試すことができます。

true
echo $? # 0
false
echo $? #1

if sudo trueはに相当しませんif sudo == true。を使用しif sudo truetrueプログラムを実行しsudo、終了コードを確認しています。

したがって:

if sudo false; thenfalsesudoとしてプログラムを実行しています。戻り値は常にfalseです。

if sudo true == falsetrue引数==false使用してを使用してプログラムを実行しsudoます。これは明らかに意図したものではありません。

if [!(sudo true)] 無効な構文です。

おそらく探しているのは

if ! sudo true;

12
最初の文に対する若干のペダンティックな修正として:bashtrueおよびfalse"builtins"は、シェルによって直接解釈されるコマンドです。一般的なUnixライクなシステムでは、ファイルシステム上のスタンドアロンプ​​ログラムとしても存在します。ここでの違いはそれほど重要ではありませんが、私が知る限りsudo true、bashビルトインではなく、スタンドアロンプ​​ログラムを実行します。
IMSoP

31
PS:私のお気に入りの概要truefalseそのmanページのタイトルは以下のとおりです。true - do nothing, successfullyfalse - do nothing, unsuccessfully
IMSoP

3
@IMSoPそれは深いです。
脳図

2
場合はtrue存在しなかった、問題の番組のコードは、なぜ一つは、それを発明する必要があるかもしれません!これは、システムが本当に停止している場合にのみ失敗する最小限のプログラムです。そのため、アクセス資格情報に問題がないかどうかを確認するために使用できます。
nigel222

2
AT&T SYSV Unixでは、「true」はシェルスクリプト/ bin / trueであり、コメント内の大きな著作権表示で構成されていましたが、それ以外は何もありませんでした。
リーダニエルクロッカー

21

受け入れられた答えが実際にあなたの質問に答えなかったと思いますか?

これを行う目的は、実際にできることを確認することですsudo

このチェックの実行方法trueは、受け入れられた回答で説明されているように、プログラムを介して行われます。


1
本質的に、これ。別の方法として、ユーザーがsudoersグループに属しているかどうかを確認する方法もありますが、実行するだけsudo trueでも簡単ですが、少しハックします。
Sergiy Kolodyazhnyy

3
これもsudoインストールする必要があることに注意してください。そのため、チェックは完全に同等ではありません... sudoersグループにいても、sudoを実行できない可能性があります。(たとえば、sudoを持たない可能性のある最小限のrootfs tarballから新しいイメージをセットアップするスクリプトを作成している場合は特にそうなります。)
Mehrdad

1
OPは、sudoができない場合はドロップアウトし、noopの後にelseを置くのではなく、2行を削除します。
mckenzm

2
また、逆に、sudo(個人的にまたは他のグループのメンバーとして)にリストされている場合は、sudoersグループに属すことなく、できることもあります/etc/sudoers。ただしsudo truesudo特定のコマンドにのみアクセスを許可できるため、完全ではありません。そのため、にはアクセスできますが、にはアクセスできsudo truesudo something_else、その逆も可能です。実際に実行したいコマンドを実行しようとする以外に、テストするための強力な方法はありませんsudo
デイブシェロマン

2
また、sudoersグループに含まれている可能性がありますがsudosudoersグループがsudoersファイルにリストされていないためです。sudo名前に4文字が含まれるグループは、そのグループのユーザーがを使用して特定のことや何かを実行できるかどうかの有効な指示ではありませんsudo
jrw32982は19:13にMonica

5

このスクリプトで見たように。sudoが有効になっているかどうかを確認しているだけです。

trueはtrueを返します。

したがって、この場合、sudoを使用してコマンドを実行する必要がある場合、最初に起動時にチェックし、パスワードを1回だけ要求します。

条件は次のように機能します:sudoがtrueコマンドを正しく実行している場合、if条件に対してtrueを返し、sudoが有効になり、ユーザーがパスワードを正しく入力します。続けてはいけません。

他のコマンドは、sudoパスワードを要求する必要はありません。認証が初めて成功するためです(ただし、これはsudo構成に依存するため、このスクリプトは環境構成に大きく依存します)

「echo password ok」もそれを示しています。シェルスクリプトはパスワードをもう要求しません。


1
唯一あるのsudoを通じてその実行コマンドsudo truesudo -k。後者は明示的にパスワードを必要としません。スクリプト内の他のコマンドはいずれもsudoを介して実行されないため、当然、認証が初めて成功したかどうかに関係なく、パスワードは必要ありません。
イルッカチュ

「つまり、この場合、sudoを使用してコマンドを実行する必要がある場合、最初にパスワードを1回だけ確認して、最初にチェックします。」
Luciano Andress Martini
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.