素不相識,SSH Shell腳本多個命令輸出
我想一個shell腳本內執行對SSH 2個指令和檢索輸出到我的本地機器
例如
SSH用戶@主機「命令1 「> /local/1.txt
SSH用戶@主機 」命令2「> /local/2.txt
我想這一點,但用一個連接是有可能
請不要用「期待」的解決方案回答...
非常感謝;)
素不相識,SSH Shell腳本多個命令輸出
我想一個shell腳本內執行對SSH 2個指令和檢索輸出到我的本地機器
例如
SSH用戶@主機「命令1 「> /local/1.txt
SSH用戶@主機 」命令2「> /local/2.txt
我想這一點,但用一個連接是有可能
請不要用「期待」的解決方案回答...
非常感謝;)
如果你不介意使用相同的文件存儲輸出;然後:
ssh [email protected] "command1; command2" > /local/1-2.txt
如果它的事項,然後再嘗試這樣的事:
ssh [email protected] "command1 > /somepath/1.txt; command2 > /somepath/2.txt; ..."
scp [email protected]:/somepath/*.txt somelocalpath/
如果仍想只是一個單一的連接,也許這會爲你工作:
ssh [email protected] "command1; echo "this_is_a_separator"; command2" > /local/1-2.txt
sed -n '1,/this_is_a_separator/ {p}' /local/1-2.txt > /local/1.txt
sed -n '/this_is_a_separator/,$ {p}' /local/1-2.txt > /local/2.txt
的本地文件分割可以通過其他幾種方式完成,這只是其中的一種。
編輯:如果command1
的輸出未以新行結束,則不起作用。
編輯:如果一個或兩個命令不產生輸出,也不能正常工作。需要一個更靈活的工具 - > awk。見其他解決方案。
要做到一樣:
ssh [email protected] "command1" > /local/1.txt
ssh [email protected] "command2" > /local/2.txt
在一個單一的連接
,並沒有臨時文件,你可以這樣做:
ssh [email protected] "command1 | sed -e 's/^/1/' ; command2 | sed -e 's/^/2/'" | \
sed -n -e '/^1/{s/^.//;w /local/1.txt
};/^2/{s/^.//;w /local/2.txt
}'
你需要/local/1.txt
和/local/2.txt
後的新線路,因爲如果他們不在那裏,sed會一直認爲你正在寫一個文件名。
由於以前的sed解決方案由於行結束處理而中斷,此解決方案使用awk。
所以做一樣的:
ssh [email protected] "command1" > /local/1.txt
ssh [email protected] "command2" > /local/2.txt
在一個單一的連接
,並沒有臨時文件,你可以這樣做:
ssh [email protected] "command1 | sed -e 's/^/1/'; echo -e '\na'; command2 | sed -e 's/^/2/'; echo" | \
awk -v f1=/local/1.txt -v f2=/local/2.txt \
'BEGIN{state=0; printf "" > f1}
/^1/ {printf "%s%s", state == 1 ? "\n" : "", substr($0, 2) > f1; state=1}
/^$/ && state == 1 {printf "\n" > f1}
/^a$/ {state=2; close (f1); printf "" > f2}
/^2/ {printf "%s%s", state == 3 ? "\n" : "", substr($0, 2) > f2; state=3}
/^$/ && state == 3 {printf "\n" > f2}
END{close (f2)}'
是sed的命令是不好的,因爲它離開分離器在文件和換行符上:P – Killercode
如果command1的輸出沒有以新行結束,請小心:您可以在數據行末尾添加分隔符。 – jfg956