SSH Shell脚本多个命令输出

时间:2011-08-09 15:06:34

标签: shell ssh

素不相识,

我想在shell脚本中的ssh上执行2个命令,并将输出检索到我的本地机器

例如

ssh user @ host“command1”> /local/1.txt

ssh user @ host“command2”> /local/2.txt

我想要这个,但只有一个连接就可以了

请不要回答“期待”解决方案...

非常感谢;)

3 个答案:

答案 0 :(得分:3)

如果您不介意使用相同的文件存储输出;然后:

ssh user@host "command1; command2" > /local/1-2.txt

如果重要,那么试试这样的事情:

ssh user@host "command1 > /somepath/1.txt; command2 > /somepath/2.txt; ..."
scp user@host:/somepath/*.txt somelocalpath/

如果您仍想要一个连接,也许这可能对您有用:

ssh user@host "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

本地文件拆分可以通过其他几种方式完成,这只是其中之一。

答案 1 :(得分:1)

修改:如果command1的输出未以新行结尾,则无效。

编辑:如果一个或两个命令不产生输出,也无效。需要更灵活的工具 - > AWK。见其他解决方案。

做同样的事情:

ssh user@host "command1" > /local/1.txt
ssh user@host "command2" > /local/2.txt

在一个连接中,没有临时文件,你可以这样做:

ssh user@host "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会一直认为您正在编写文件名。

答案 2 :(得分:0)

由于以前的解决方案由于行尾处理而被打破,因此该解决方案使用awk。

所以做同样的事情:

ssh user@host "command1" > /local/1.txt
ssh user@host "command2" > /local/2.txt

在一个连接中,没有临时文件,你可以这样做:

ssh user@host "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)}'