也許準備日誌文件的另一邊,管它到stdout,就像這樣:
ssh -n [email protected] 'x() { local ret; "[email protected]" >&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
當然,你可以做的更好解析的或使其適應你的whishes日誌文件應如何樣子。請注意,遠程程序的未捕獲正常stdout
被寫入stderr
(請參閱x()
中的重定向)。
如果你需要一個配方來捕獲和準備日誌文件命令的輸出,下面是https://gist.github.com/hilbix/c53d525f113df77e323d這樣一個捕獲器的副本 - 但是,這是一個更大的樣板文件來「在shell的當前上下文中運行某些東西,後處理標準輸出+標準錯誤,而不會干擾返回代碼「:
# 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 "[email protected]" "$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
}
看到倒數第二行中的示例(向下滾動)
你是說我需要單獨ssh運行每個命令,以便我可以提取他們的退出狀態?我試圖在我的真實代碼中在相同的ssh會話中運行至少5個命令。 – 2013-03-13 17:01:03
嗨,@larsks。你能解釋一下'ssh localhost exit 10'的含義嗎?這意味着用一個明確的10作爲狀態碼來執行ssh localhost?在這裏,exit是ssh或linux命令'exit'的選項? – 2017-01-19 15:26:19
請記住,ssh命令的基本語法是'ssh'。所以在上面的答案中,'exit 10'是傳遞給遠程shell的命令。 –
larsks
2017-01-19 19:50:04