Bash
如何從遠端伺服器的文件中提取一行?
我想檢查來自遠端伺服器的特定線路。到目前為止,我可以檢查文件是否存在。但是我可以使用像 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 的情況下比較這些本地和遠端文件嗎?
沒必要把它弄複雜。只需從遠端主機獲取 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 文件的內容。