Как выполнить команду на удаленной машине ssh и проанализировать значение json

У меня есть файл формата 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?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добиться этого следующим образом:

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

Какую именно команду мы хотели бы выполнить!

Привет Kartoos, спасибо за ваш пример. Хотя первая команда не работает, но вторая команда работает. Еще раз спасибо. Однако, не могли бы вы объяснить, почему мне нужно использовать \\\ для экранирования двойной кавычки, а не просто \ или \\

Spark1231 22.11.2022 14:18

@Spark1231 Spark1231 Я отредактировал свой ответ, включив в него объяснение, почему это работает!

Kartoos 22.11.2022 17:24

Другие вопросы по теме