
私は bash で簡単なバックアップ ユーティリティを作成していますが、出力はすべて JSON 形式である必要があります。
ホストの到達可能性をチェックしていて、エラーが発生した場合はそれを出力したいのですが、出力に問題があります。
失敗=1 TIME_STARTED=$(日付 +%s) OUT="$( ${SSH} ${SSH_ARGS} ${HOST} 'true' 2>&1 >/dev/null)" [[ $? != 0 && ! -z "${OUT}" ]]; の場合 TIME_ENDED=$(日付 +%s) JSON="{ \"time_started\": \"${TIME_STARTED}\", \"time_ended\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\": \"${OUT}\" }" エコー "${JSON}" 終了 ${TRUE} フィ
結果は次のようになります:
[root@内部 ~]# ./backup -H 17.17.0.111 " }time_started": "1394889912", "time_ended": "1394889913", "state": 1, "error": "アクセスが拒否されました (公開鍵、パスワード、キーボードインタラクティブ)。 [ルート@内部]#
最終出力用に JSON をきれいに印刷するために node.js CLI ユーティリティを使用していますが、シェルから無効な JSON を取得するため失敗します。これを修正するにはどうすればよいでしょうか?
PS: JSON をフォーマットするライブラリはたくさんあることは知っていますが、私はこの方法で行う必要があるので、ここでは説明しません。
答え1
ssh 出力で復帰文字が取り込まれているようです。次を試してください:
JSON="{ \"time_started\": \"${TIME_STARTED}\", \"time_ended\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\": \"${OUT%$'\r'}\" }"
説明: これは:
${OUT%$'\r'}
末尾に CR 文字がある場合はそれをカットします...