
Я пишу простую утилиту резервного копирования на bash, и все выходные данные должны быть в формате JSON.
Я проверяю доступность хоста и если возникает какая-либо ошибка, я хочу ее распечатать. Однако у меня проблема с выводом:
НЕУДАЧНО=1 TIME_STARTED=$(дата +%s) OUT="$( ${SSH} ${SSH_ARGS} ${HOST} 'истина' 2>&1 >/dev/null)" если [[ $? != 0 && ! -z "${OUT}" ]]; тогда TIME_ENDED=$(дата +%s) JSON="{ \"время_начало\": \"${TIME_STARTED}\", \"время_окончание\": \"${TIME_ENDED}\", \"состояние\": ${FAILED}, \"ошибка\": \"${OUT}\" }" эхо "${JSON}" выход ${ИСТИНА} фи
результаты в:
[root@internal ~]# ./backup -H 17.17.0.111 " }time_started": "1394889912", "time_ended": "1394889913", "state": 1, "error": "Отказано в доступе (открытый ключ, пароль, интерактивная клавиатура). [корень@внутренний]#
Я использую некоторые утилиты node.js CLI для красивого вывода JSON для финального вывода, но это не удается, потому что он получает недействительный JSON из оболочки. Как мне это исправить?
PS: Я знаю, что существует множество библиотек для форматирования JSON, но мне нужно сделать именно так, и я не хотел бы обсуждать это здесь.
решение1
Мне кажется, что вывод ssh принимает символ возврата каретки. Попробуйте:
JSON="{ \"time_started\": \"${TIME_STARTED}\", \"time_ended\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\": \"${OUT%$'\r'}\" }"
Объяснение: Это:
${OUT%$'\r'}
вырезает конечный символ CR, если он есть...