3

3つの異なるコマンドの出力が同じであることを確認するためにいくつかのBash-fooを理解しようとしています。これは、Bashスクリプトの数行で実行できます。私がやりたいことは、いくつかの凝ったシェルI/Oリダイレクトを使用して1行で可能かどうか疑問に思っています。

私がやりたいのは、SSL証明書が特定のキーおよび証明書署名要求と一致することを確認することです。

コマンドは次のようになります。

openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in privateKey.key | openssl md5
openssl req -noout -modulus -in CSR.csr | openssl md5

key、c​​ert、およびcsrが一致する場合、これら3つのコマンドはすべて、「(stdin)=95ce143e8418cf8a4f7dd718983ed4eb」のように同じ出力を出力する必要があります。

プロトタイプは次のとおりです。

[[ $(echo -e "blah\nblah\nblah" | uniq | wc -l) -eq 1 ]]

しかし、そこから最終製品にたどり着くことができません。これは機能しません:

[[ $(openssl x509 -noout -modulus -in certificate.crt | openssl md5 && openssl rsa -noout -modulus -in privateKey.key | openssl md5 && openssl req -noout -modulus -in CSR.csr | openssl md5 | uniq | wc -l) -eq 1 ]]

1つの問題は、私のプロトタイプが1つのコマンドから3行すべての出力を生成することですが、実際には&&2、3回使用します。

4

3 に答える 3

5

cmp -s <( cmd1) <(cmd2) && cmp -s <( cmd1) <(cmd3)

このコンストラクトはcmd1を2回実行することに注意してください。

各cmdの単一のexecが必要な場合、より複雑な行は次のようになります。

cmd1|tee >( cmp -s <(cmd2) )|cmp -s <(cmd3)

PIPESTATUS2つ目も、結果の確認が複雑です(配列を確認する必要があります)

于 2012-06-06T00:10:41.053 に答える
1

あなたはおそらく次のようなものを意味しました

((1 == $( ( echo 1 && sleep 1; echo 1 && sleep 1) | sort -u | wc -l ) ))

しかし、それはもっと簡単かもしれません

x1=$( command1 )
x2=$( command2 )
x3=$( command3 )

if [[ $x1 == $x2 && $x2 == $x3 ]] ; then
    echo The same.
fi

編集:このフォームも同様に機能するはずですが、格納される変数の数を減らしてください。

x1=$(command1)
[[ $x1 == $(command2) && $x1 == $(command3) ]] && echo match
于 2012-06-06T00:18:57.007 に答える
1

問題は、最後のコマンド「sub-pipeline」のみをにパイプしていることですuniq。これを試して:

[[ $( { openssl x509 -noout -modulus -in certificate.crt | openssl md5 && openssl rsa -noout -modulus -in privateKey.key | openssl md5 && openssl req -noout -modulus -in CSR.csr | openssl md5; } | uniq | wc -l) -eq 1 ]]

中括弧は、プロトタイプuniqと同様に、3つの「サブパイプライン」を一緒に1つのコマンドであるかのように機能させます。echo

于 2012-06-06T00:36:07.083 に答える