
Ich schreibe ein einfaches Sicherungsprogramm in Bash und jede Ausgabe muss in JSON sein.
Ich überprüfe die Erreichbarkeit des Hosts und möchte bei Auftreten eines Fehlers diesen ausdrucken. Allerdings habe ich ein Problem mit der Ausgabe:
FEHLGESCHLAGEN=1 TIME_STARTED=$(Datum +%s) OUT="$( ${SSH} ${SSH_ARGS} ${HOST} 'true' 2>&1 >/dev/null)" wenn [[ $? != 0 && ! -z "${OUT}" ]]; dann TIME_ENDED=$(Datum +%s) JSON="{ \"Zeit_gestartet\": \"${TIME_STARTED}\", \"Zeit_ende\": \"${TIME_ENDED}\", \"Status\": ${FAILED}, \"Fehler\": \"${OUT}\" }" echo "${JSON}" beenden ${TRUE} fi
ergibt:
[root@internal ~]# ./backup -H 17.17.0.111 " }time_started": "1394889912", "time_ended": "1394889913", "state": 1, "error": "Zugriff verweigert (öffentlicher Schlüssel, Passwort, Tastatur-Interaktiv). [root@intern]
Ich verwende einige node.js-CLI-Dienstprogramme, um JSON für die endgültige Ausgabe schön auszudrucken, aber es schlägt fehl, weil es ungültiges JSON von der Shell erhält. Wie kann ich das beheben?
PS: Ich weiß, dass es viele Bibliotheken zum Formatieren von JSON gibt, aber ich muss es auf diese Weise machen und möchte das hier nicht diskutieren.
Antwort1
Mir scheint, dass die SSH-Ausgabe ein Wagenrücklaufzeichen enthält. Versuchen Sie:
JSON="{ \"time_started\": \"${TIME_STARTED}\", \"time_ended\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\": \"${OUT%$'\r'}\" }"
Erklärung: Dies:
${OUT%$'\r'}
schneidet ein abschließendes CR-Zeichen ab, falls eines vorhanden ist ...