出力が一致したら、次のコマンドを実行して条件を作成したいと思います。
diff -is <(echo 'curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256') \
<(shasum -a 256 teleport-v9.3.4-linux-amd64-bin.tar.gz)
上記のコマンドの出力は次のとおりです。
< 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15 teleport-v9.3.4-linux-amd64-bin.tar.gz
> 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15 teleport-v9.3.4-linux-amd64-bin.tar.gz
この場合、チェックサムは一致するため、条件に追加する各出力をどのように宣言できますか?例:出力a = =出力bの場合、チェックサムは一致します。誰でも助けてもらえればいいでしょう。
回答ありがとうございます。次の答えを試してみましたが、要求された操作を実行できました。
答え1
私はshasumがその出力をdiff
-ingする代わりに、独自の組み込みの「チェック」オプション()を使用するようにします。*.sha256
shasum
shasum -c
実行中:
$ echo "This is a file" > file1
$ echo "This is another file" > file2
$ shasum -a 256 file* | tee files.sha256
0b7d91193b9c0f5cc01d40332a10cf1ed338a41640bd7f045f1087628c1d7a9b file1
0290013ed1662eda102bee144a282ffe03d226b4dd9134c251c6b3be6d69d6ec file2
$ shasum -c files.sha256
file1: OK
file2: OK
$ echo $?
0
$ echo "damaged file" > file1
$ shasum -c files.sha256
file1: FAILED
file2: OK
shasum: WARNING: 1 computed checksum did NOT match
$ echo $?
1
このスクリプトを作成すると、shasum -cの終了コードを使用して検証が成功したかどうかを確認できます。
したがって、お客様の場合は、次のことを行います。
wget https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
shasum -c teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
rm teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
または
shasum -c <(curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256)
答え2
URLとファイル名を変更した後に実際に実行するコマンドは次のとおりです。
diff -is <(echo `curl "$url"`) <(shasum -a 256 "$file")
^ ^
これはecho `curl...`
投稿(*)などの一重引用符ではなくバックティックです。引用符なしのコマンド置換を介しcurl
て渡される出力は、2つの別々の引数を提供し、スペースecho
で連結してトークン化を適用します。ファイルの二重スペースを単一のスペースに効果的に変更します。
curl https://...
(*一重引用符を使用すると、コマンドで実行されずに出力されます)
望むより:
これが出力が提供される理由でもありますdiff
。行は単一の空白と同じです。
無駄なコマンド置換を削除して実行すると
diff -is <(curl "$url") <(shasum -a 256 "$file")
代わりに、ファイルを同じと認識して-s
。その後、diff
印刷された出力を気にせずに終了ステータスを直接使用できます。
if diff -iq <(curl "$url") <(shasum -a 256 "$file") > /dev/null; then
echo "hashes are the same"
else
echo "hashes differ"
fi
diff
大文字と小文字を無視する機能以外には必要ありませんが、必ずしも必要ではないと思います。出力をシェル変数に保存して比較できます。
their=$(curl "$url")
mine=$(shasum -a 256 "$file")
if [[ "$their" == "$mine" ]]; then
echo "hashes match"
else
echo "hashes do not match"
fi
または、最初の部分をハッシュと比較したい場合:
their=$(curl "$url")
their=${their%% *}
mine=$(shasum -a 256 "$file")
mine=${mine%% *}
if [[ "$their" == "$mine" ]]; then
...
それとも同じ
read -r hash1 filename1 < <(curl "$url")
etc.
出力の2つのフィールドを別々の変数として読み込みます。