![SSH를 통해 argjson과 함께 jq 보내기](https://linux55.com/image/162362/SSH%EB%A5%BC%20%ED%86%B5%ED%95%B4%20argjson%EA%B3%BC%20%ED%95%A8%EA%BB%98%20jq%20%EB%B3%B4%EB%82%B4%EA%B8%B0.png)
이 JSON을 얻기 위해 ssh를 통해 jq 명령을 실행하려고 합니다.
{
"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
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"
답변2
확실한 대안은 힘든 작업을 수행하는 것입니다.현지의.
ssh remote-host 'cat our-document.json' |
jq 'expression...expression...expression' |
ssh remote-host 'cat >tmfile && mv tmpfile our-document.json'