如何从远程服务器的文件中 jq 一行?

如何从远程服务器的文件中 jq 一行?

我想检查远程服务器上的特定线路。到目前为止,我可以检查该文件是否存在。但是我可以使用 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 文档的内容。

答案2

看起来应该是

"$(echo ${remote_serial} | jq '.serialNumber')"

代替

"${remote_serial | jq '.serialNumber'}"

相关内容