Bash

如何從遠端伺服器的文件中提取一行?

  • February 18, 2019

我想檢查來自遠端伺服器的特定線路。到目前為止,我可以檢查文件是否存在。但是我可以使用像 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 文件的內容。

引用自:https://unix.stackexchange.com/questions/501349