おそらく、反対側でログ ファイルを準備し、次のように stdout にパイプします。
ssh -n user@example.com 'x() { local ret; "$@" >&2; ret=$?; echo "[`date +%Y%m%d-%H%M%S` $ret] $*"; return $ret; };
x true
x false
x sh -c "exit 77";' > local-logfile
x
基本的に、このラッパーで呼び出したいリモートのすべてにプレフィックスを付けるだけです。コマンドの終了コードを変更しないため、条件に対しても機能します。
このコマンドは簡単にループできます。
この例では、次のようにログに書き込みます。
[20141218-174611 0] true
[20141218-174611 1] false
[20141218-174611 77] sh -c exit 77
もちろん、より解析しやすくしたり、ログファイルがどのように見えるかを希望に合わせたりすることができます。stdout
リモート プログラムのキャッチされていない法線が に書き込まれることに注意してstderr
ください ( のリダイレクトを参照x()
)。
ログファイルのコマンド出力をキャッチして準備するためのレシピが必要な場合は、https://gist.github.com/hilbix/c53d525f113df77e323dからのキャッチャーのコピーを参照してください。 「シェルの現在のコンテキストで何かを実行し、リターンコードを乱すことなく stdout + stderr を後処理します」:
# Redirect lines of stdin/stdout to some other function
# outfn and errfn get following arguments
# "cmd args.." "one line full of output"
: catch outfn errfn cmd args..
catch()
{
local ret o1 o2 tmp
tmp=$(mktemp "catch_XXXXXXX.tmp")
mkfifo "$tmp.out"
mkfifo "$tmp.err"
pipestdinto "$1" "${*:3}" <"$tmp.out" &
o1=$!
pipestdinto "$2" "${*:3}" <"$tmp.err" &
o2=$!
"${@:3}" >"$tmp.out" 2>"$tmp.err"
ret=$?
rm -f "$tmp.out" "$tmp.err" "$tmp"
wait $o1
wait $o2
return $ret
}
: pipestdinto cmd args..
pipestdinto()
{
local x
while read -r x; do "$@" "$x" </dev/null; done
}
STAMP()
{
date +%Y%m%d-%H%M%S
}
# example output function
NOTE()
{
echo "NOTE `STAMP`: $*"
}
ERR()
{
echo "ERR `STAMP`: $*" >&2
}
catch_example()
{
# Example use
catch NOTE ERR find /proc -ls
}
例については、最後から 2 番目の行を参照してください (下にスクロール)