2011-08-09 229 views
3

素不相識,SSH Shell腳本多個命令輸出

我想一個shell腳本內執行對SSH 2個指令和檢索輸出到我的本地機器

例如

SSH用戶@主機「命令1 「> /local/1.txt

SSH用戶@主機 」命令2「> /local/2.txt

我想這一點,但用一個連接是有可能

請不要用「期待」的解決方案回答...

非常感謝;)

回答

3

如果你不介意使用相同的文件存儲輸出;然後:

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 

的本地文件分割可以通過其他幾種方式完成,這只是其中的一種。

+0

是sed的命令是不好的,因爲它離開分離器在文件和換行符上:P – Killercode

+0

如果command1的輸出沒有以新行結束,請小心:您可以在數據行末尾添加分隔符。 – jfg956

1

編輯:如果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會一直認爲你正在寫一個文件名。

0

由於以前的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)}'