我有一个脚本,它通过ssh连接在几台不同的机器上触发远程命令。脚本类似于:
for server in list; do
echo "output from $server"
ssh to server execute some command
done
这样做的问题显然是时间问题,因为它需要建立ssh连接、发出命令、等待应答、打印它。我想要的是脚本,将试图建立所有的连接一次,并返回回显“输出从$server”和输出的命令,一旦它得到它,所以没有必要在列表顺序。
我已经用谷歌搜索了一段时间,但没有找到答案。我不能像一个线程建议的那样在命令运行后取消ssh会话,因为我需要输出,并且我不能在其他线程中使用建议的并行gnu。此外,我不能使用任何其他工具,我不能带/安装任何东西在这台机器上,唯一可用的工具是GNU bash,版本4.1.2(1)-release。
另一个问题是,像这样的ssh会话是如何受限的?如果我只是粘贴一些命令行"ssh connect,do 5+“,它实际上什么也不做,或者只在列表中的第一行执行。(如果我粘贴3-4行就可以了)。谢谢
发布于 2014-10-13 19:13:10
你试过这个吗?
for server in list; do
ssh user@server "command" &
done
wait
echo finished
更新:启动子外壳:
for server in list; do
(echo "output from $server"; ssh user@server "command"; echo End $server) &
done
wait
echo All subshells finished
发布于 2014-10-13 19:51:43
有几个并行SSH工具可以为您处理此问题:
此外,您可能对配置部署解决方案感兴趣,如厨师、木偶、Ansible、Fabric等(请参阅this summary )。
第三种选择是使用终端广播,如pconsole
如果你只能使用GNU命令,你可以这样写你的脚本:
for server in $servers ; do
( { echo "output from $server" ; ssh user@$server "command" ; } | \
sed -e "s/^/$server:/" ) &
done
wait
然后对输出执行sort
操作以协调这些行。
发布于 2015-01-27 07:44:27
我从这个帖子中提到的shell hack开始,然后转向更健壮的东西:https://github.com/bearstech/pussh
这是我每天的工作,我基本上在20秒内对250台服务器运行任何东西(它实际上是有速率限制的,否则连接速率会杀死我的ssh-agent)。我已经用了很多年了。
从手册页亲自查看(克隆它并运行‘man./pussh.1’):https://github.com/bearstech/pussh/blob/master/pussh.1
示例
按降序显示所有服务器的rootfs使用情况:
pussh -f servers df -h / |grep /dev |sort -rn -k5
计算集群中的处理器数量:
pussh -f servers grep ^processor /proc/cpuinfo |wc -l
显示处理器型号,按事件排序:
pussh -f servers sed -ne "s/^model name.*: //p" /proc/cpuinfo |sort |uniq -c
在每个主机的一个文件中获取已安装软件包的列表:
pussh -f servers -o packages-for-%h dpkg --get-selections
批量复制文件树(广播):
tar czf files.tar.gz ... && pussh -f servers -i files.tar.gz tar -xzC /to/dest
批量复制多个远程文件树(收集):
pussh -f servers -o '|(mkdir -p %h && tar -xzC %h)' tar -czC /src/path .
请注意,pussh -u功能(上传和执行)是我编写此程序的主要原因,似乎没有工具能够做到这一点。我仍然怀疑现在的情况是不是这样。
https://stackoverflow.com/questions/26338438
复制相似问题