通过ssh用argjson发送jq [英] Sending jq with argjson via ssh
问题描述
我正在尝试通过ssh为该JSON运行jq命令:
I'm trying to run jq command via ssh for this JSON:
{
"nodes": {
"app": {
"nodes": 1,
"is_manager": true,
"ip": [
"0.0.0.0"
],
"cpus": 16,
"memory": 64
},
"data": {
"nodes": 1,
"ip": [
"0.0.0.0"
],
"cpus": 16,
"memory": 64
},
"analysis": {
"nodes": 1,
"ip": [
"0.0.0.0"
],
"cpus": 16,
"memory": 64
},
"elastic_kafka_1": {
"nodes": 1,
"ip": [
"0.0.0.0"
],
"cpus": 16,
"memory": 64
},
"elastic_kafka_2": {
"nodes": 1,
"ip": [
"0.0.0.0"
],
"cpus": 16,
"memory": 64
},
"elastic_kafka_3": {
"nodes": 1,
"ip": [
"0.0.0.0"
],
"cpus": 16,
"memory": 64
},
"master": {
"nodes": 1,
"ip": [
"0.0.0.0"
],
"cpus": 16,
"memory": 64
}
}
}
这就是我要运行的:
ssh -o StrictHostKeyChecking=no -i key.pem user@"172.13.1.23"
"jq -Rn --argjson original_doc \"\$(<nodes.json)\" '
input | split(\"\u0000\") as \$ips
| \$original_doc
| .nodes.app.ip = \$ips[0]
| .nodes.data.ip = \$ips[1]
| .nodes.analysis.ip = \$ips[2]
| .nodes.elastic_kafka_1.ip = \$ips[3]
| .nodes.elastic_kafka_2.ip = \$ips[4]
| .nodes.elastic_kafka_3.ip = \$ips[5]
| .nodes.master.ip = \$ips[6]
' < <(printf '%s\0' \"\${GCP_INSTANCES[@]}\") > test.json && mv test.json nodes.json"
这是输出:
{
"nodes": {
"app": {
"nodes": 1,
"is_manager": true,
"ip": "",
"cpus": 16,
"memory": 64
},
"data": {
"nodes": 1,
"ip": "",
"cpus": 16,
"memory": 64
},
"analysis": {
"nodes": 1,
"ip": null,
"cpus": 16,
"memory": 64
},
"elastic_kafka_1": {
"nodes": 1,
"ip": null,
"cpus": 16,
"memory": 64
},
"elastic_kafka_2": {
"nodes": 1,
"ip": null,
"cpus": 16,
"memory": 64
},
"elastic_kafka_3": {
"nodes": 1,
"ip": null,
"cpus": 16,
"memory": 64
},
"master": {
"nodes": 1,
"ip": null,
"cpus": 16,
"memory": 64
}
}
}
如您所见,由于ssh或某些语法问题,jq无法正常工作.
As you can see jq doesn't work properly due to some syntax issue with ssh or something.
我在没有ssh的情况下在本地测试了此命令,并且运行正常.
I tested this command locally, without ssh, and it works properly.
我认为问题出在printf'%s \ 0',但无法弄清楚我到底在做什么错.
I think the problem is with printf '%s\0', but couldn't figure out what exatly I'm doing wrong.
推荐答案
确保所有引用正确完成的最简单方法是让外壳程序通过使用declare -f
生成文本表示形式来为您完成此操作一个已经在本地定义的函数,然后使用declare -p
生成该函数需要访问的任何局部变量的文本表示形式.因此:
The easiest way to ensure that all the quoting is done right is to have the shell do it for you, by using declare -f
to generate a textual representation of an already-locally-defined function, and declare -p
to generate textual representations of any local variables that function needs access to. Thus:
doRemoteWork() {
jq -Rn --argjson original_doc "$(<nodes.json)" '
input | split("\u0000") as $ips
| $original_doc
| .nodes.app.ip = $ips[0]
| .nodes.data.ip = $ips[1]
| .nodes.analysis.ip = $ips[2]
| .nodes.elastic_kafka_1.ip = $ips[3]
| .nodes.elastic_kafka_2.ip = $ips[4]
| .nodes.elastic_kafka_3.ip = $ips[5]
| .nodes.master.ip = $ips[6]
' < <(printf '%s\0' "${GCP_INSTANCES[@]}") >"nodes.json.$$" \
&& mv "nodes.json.$$" nodes.json
}
ssh -o StrictHostKeyChecking=no -i key.pem user@172.13.1.23 \
"$(declare -p GCP_INSTANCES; declare -f doRemoteWork); doRemoteWork"
这篇关于通过ssh用argjson发送jq的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!