Выполнение команд на удаленном сервере для создания строки JSON - PullRequest
0 голосов
/ 30 октября 2018

Мне нужно узнать местное время и имя хоста сервера удаления.

Следующая команда выполняется правильно на локальном сервере.

echo "{\"hostname\":\"`hostname`\" , \"date\":\"`date '+%Y-%m-%d %H:%M:%S'`\"}"

и верните следующий вывод правильно:

{"hostname":"server1" , "date":"2018-10-29 17:43:51"}

Но когда я выполняю ту же команду на удаленном сервере, происходит сбой:

var1=`ssh server2 " echo "{\"hostname\":\"`hostname`\" , \"date\":\"`date '+%Y-%m-%d %H:%M:%S'`\"}" "`

bash: ": команда не найдена

bash: +% Y-% m-% d% H:% M:% S: команда не найдена

`ssh server2 " echo "{\"hostname\":\"`hostname`\" , \"date\":\"`date '+%Y-%m-%d %H:%M:%S'`\"}" "`

bash: ": команда не найдена

bash: "}: команда не найдена

bash: {имя_хоста: имя_хоста: команда не найдена

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Использование bash -s с заключенным в кавычки heredoc может использоваться для запуска вашего кода в точности таким, как он есть, без каких-либо изменений:

ssh server2 bash -s <<'EOF'
echo "{\"hostname\":\"`hostname`\" , \"date\":\"`date '+%Y-%m-%d %H:%M:%S'`\"}"
EOF

В общем, использование конкатенации строк для генерации JSON - плохая идея (может привести к выводу, который на самом деле не является допустимым JSON, если ваши команды возвращают неожиданный вывод). Подумайте, что ваш контент должен быть разделен символами новой строки, когда он проходит через SSH, а затем генерировать JSON локально с помощью инструмента с поддержкой синтаксиса, такого как jq:

IFS=$'\n' read -r -d '' hostname date < <(
  ssh server2 'hostname && date +"%Y-%m-%d %H:%M:%S" && printf "\0"'
)
jq --arg hostname "$hostname" --arg date "$date" \
  '{ "hostname": $hostname, "date": $date }'
0 голосов
/ 30 октября 2018

Charles ' ответ является лучшим для JSON. Если у вас нет jq, вы можете сделать это:

var1=$(ssh server2 bash -s << 'EOF'
  h=$(hostname)
  d=$(date)
  printf '{"hostname": "%s", "date": "%s" }\n' "$h" "$d"
EOF
)
0 голосов
/ 30 октября 2018

Попробуйте:

var1=$(ssh server2 " echo "{\"hostname\":\"\$\(hostname\)\" , \"date\":\"\$\(date '+%Y-%m-%d %H:%M:%S'\)\"}" ")

По сути, вы не можете вкладывать `` обратные пометки, поэтому вам нужно использовать $ (), а команды, которые вы хотите выполнить удаленно (имя хоста и дату), должны быть экранированы.

...