首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bash脚本并行ssh远程命令

bash脚本并行ssh远程命令
EN

Stack Overflow用户
提问于 2014-10-13 19:01:23
回答 4查看 14.8K关注 0票数 8

我有一个脚本,它通过ssh连接在几台不同的机器上触发远程命令。脚本类似于:

代码语言:javascript
运行
复制
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行就可以了)。谢谢

EN

回答 4

Stack Overflow用户

发布于 2014-10-13 19:13:10

你试过这个吗?

代码语言:javascript
运行
复制
for server in list; do
  ssh user@server "command" &
done
wait
echo finished

更新:启动子外壳:

代码语言:javascript
运行
复制
for server in list; do
  (echo "output from $server"; ssh user@server "command"; echo End $server) &
done
wait
echo All subshells finished
票数 9
EN

Stack Overflow用户

发布于 2014-10-13 19:51:43

有几个并行SSH工具可以为您处理此问题:

  • http://code.google.com/p/pdsh/
  • http://sourceforge.net/projects/clusterssh/
  • http://code.google.com/p/sshpt/
  • http://code.google.com/p/parallel-ssh/

此外,您可能对配置部署解决方案感兴趣,如厨师、木偶、Ansible、Fabric等(请参阅this summary )。

第三种选择是使用终端广播,如pconsole

如果你只能使用GNU命令,你可以这样写你的脚本:

代码语言:javascript
运行
复制
for server in $servers ; do
   ( { echo "output from $server" ; ssh user@$server "command" ; } | \
    sed -e "s/^/$server:/" ) & 
done
wait 

然后对输出执行sort操作以协调这些行。

票数 4
EN

Stack Overflow用户

发布于 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使用情况:

代码语言:javascript
运行
复制
pussh -f servers df -h / |grep /dev |sort -rn -k5

计算集群中的处理器数量:

代码语言:javascript
运行
复制
pussh -f servers grep ^processor /proc/cpuinfo |wc -l

显示处理器型号,按事件排序:

代码语言:javascript
运行
复制
pussh -f servers sed -ne "s/^model name.*: //p" /proc/cpuinfo |sort |uniq -c

在每个主机的一个文件中获取已安装软件包的列表:

代码语言:javascript
运行
复制
pussh -f servers -o packages-for-%h dpkg --get-selections

批量复制文件树(广播):

代码语言:javascript
运行
复制
tar czf files.tar.gz ... && pussh -f servers -i files.tar.gz tar -xzC /to/dest

批量复制多个远程文件树(收集):

代码语言:javascript
运行
复制
pussh -f servers -o '|(mkdir -p %h && tar -xzC %h)' tar -czC /src/path .

请注意,pussh -u功能(上传和执行)是我编写此程序的主要原因,似乎没有工具能够做到这一点。我仍然怀疑现在的情况是不是这样。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26338438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档