У меня есть файл формата json, расположенный на удаленной машине /tmp, и его контекст, как показано ниже.
{
"data": {
"room.number": "1111",
"name": "student",
"phone": "1234-5678"
},
"type": "XXX",
"car": "toyota"
}
Я использую следующие команды для подключения к удаленному и пытаюсь проанализировать значение. Я могу получить значение имени, но не могу успешно получить значение room.number.
Когда я запускаю команду на удаленном машинном терминале напрямую, обе команды работают.
root@remote-machine:/tmp# jq -r '.data.name' /tmp/ca.json.1
student
root@remote-machine:/tmp# jq -r '.data."room.number"' /tmp/ca.json.1
1111
Вернемся к моей локальной машине, номер room.number равен нулю
root@local-machine:~# ssh -o "StrictHostKeyChecking=no" -i /root/.ssh/id_rsa $ACCOUNT@$TARGET_IP -t 'sudo su - -c "jq -r '.data.name' /tmp/ca.json.1"'
student
root@local-machine:~# ssh -o "StrictHostKeyChecking=no" -i /root/.ssh/id_rsa $ACCOUNT@$TARGET_IP -t 'sudo su - -c "jq -r '.data."room.number"' /tmp/ca.json.1"'
null
Как мне изменить свою команду, чтобы получить значение room.number?
Вы можете добиться этого следующим образом:
ssh -o "StrictHostKeyChecking=no" -i /root/.ssh/id_rsa $ACCOUNT@$TARGET_IP -t "sudo su - -c \"jq -r '.data.\\\"room.number\\\"' /tmp/ca.json.1\""
Изначально у нас есть следующая команда
ssh [other-flags] -t "sudo su - -c \"jq -r '.data.\\\"room.number\\\"' /tmp/ca.json.1\""
Итак, ssh
вызывает команду в двойных кавычках и заменяет все escape-символы. Следовательно, \"
меняется на "
, а \\
меняется на \
. Таким образом, внутренняя команда, которая будет выполняться, будет выглядеть так:
sudo su - -c "jq -r '.data.\"room.number\"' /tmp/ca.json.1"
Теперь снова sudo вызывает команду в двойных кавычках, поэтому escape-символы снова заменяются: \"
меняется на "
, и последняя исполняемая команда становится:
jq -r '.data."room.number"' /tmp/ca.json.1
Какую именно команду мы хотели бы выполнить!
@Spark1231 Spark1231 Я отредактировал свой ответ, включив в него объяснение, почему это работает!
Привет Kartoos, спасибо за ваш пример. Хотя первая команда не работает, но вторая команда работает. Еще раз спасибо. Однако, не могли бы вы объяснить, почему мне нужно использовать \\\ для экранирования двойной кавычки, а не просто \ или \\