【发布时间】:2011-08-10 03:43:55
【问题描述】:
问候,
我想在一个 shell 脚本中在 ssh 上执行 2 个命令并将输出检索到我的本地机器
例子
ssh user@host "command1" > /local/1.txt
ssh user@host "command2" > /local/2.txt
我想要这个,但是只有一个连接是可能的
请不要用“期待”的解决方案来回答...
非常感谢;)
【问题讨论】:
问候,
我想在一个 shell 脚本中在 ssh 上执行 2 个命令并将输出检索到我的本地机器
例子
ssh user@host "command1" > /local/1.txt
ssh user@host "command2" > /local/2.txt
我想要这个,但是只有一个连接是可能的
请不要用“期待”的解决方案来回答...
非常感谢;)
【问题讨论】:
如果您不介意使用相同的文件来存储输出;那么:
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
本地文件拆分可以通过其他几种方式完成,这只是其中之一。
【讨论】:
编辑:如果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 会一直认为您正在编写文件名。
【讨论】:
由于行尾处理导致之前使用 sed 的解决方案被破坏,因此该解决方案使用 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)}'
【讨论】: