
我正在嘗試透過 ssh 運行 jq 命令來獲取此 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 無法正常工作。
我在本地測試了這個命令,沒有使用ssh,運行正常。
我認為問題出在 printf '%s\0' 上,但無法弄清楚我到底做錯了什麼。
答案1
確保所有引用正確完成的最簡單方法是讓 shell 為您完成此操作,方法是使用declare -f
生成已本地定義函數的文字表示,並declare -p
產生函數所需的任何局部變數的文字表示進入。
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 [email protected] \
"$(declare -p GCP_INSTANCES; declare -f doRemoteWork); doRemoteWork"