リモートサーバーの特定の行を確認したいです。これまでファイルが存在するかどうかを確認できます。しかし、jqのようなツールを使って特定の行にインデックスを付けることはできますか?
if ssh -q -i $pathToPem $sshUsernameIp [ -f ${remote_serial} ];
then
echo "Serial number is found externally"
serialNumber=$(cat serialNumber.json | jq '.serialNumber')
if ssh -q -i $pathToPem $sshUsernameIp [ "$serialNumber" == "${remote_serial | jq '.serialNumber'}" ];
then
echo "Serial number is same"
else
echo "Serial number is not same"
fi
fi
出力>
Serial number is found externally
./test.sh: line 127: ${remote_serial | jq '.serialNumber'}: bad substitution
{} 内部に変数を渡すには? scpを使用せずにこれらのローカルファイルとリモートファイルを比較できますか?
ベストアンサー1
仕事を複雑にする必要はありません。リモートホストからJSONをインポートしてjq
渡し、ローカルで同じことを行います。それから比較しなさい。リモートファイルが失われるとエラーが発生し(廃棄可能)、シリアル番号が異なるように比較されます(ローカルのシリアル番号も失われない限り)。
r_serial=$( ssh -q -i "$pathToPem" "$sshUsernameIp" cat "$remote_serial" 2>/dev/null | jq -r '.serialNumber' )
l_serial=$( jq -r '.serialNumber' serialNumber.json )
if [ "$r_serial" = "$l_serial" ]; then
echo 'same'
else
echo 'different (or missing)'
fi
これが$remote_serial
リモートシステム上のJSONドキュメントのパス名であるとします。
また、呼び出し時の変数拡張への参照も参照してくださいssh
。
発生する実際のエラーは、次の事実に由来します。
"${remote_serial | jq '.serialNumber'}"
有効な変数拡張ではありません。次のようなものを使用したい場合があります。
"$( printf '%s\n' "$remote_serial" | jq '.serialNumber' )"
ただし、これは$remote_serial
JSONドキュメントの内容が含まれていると仮定します。