Linux 对每个主机使用自定义参数的并行SSH

Linux 对每个主机使用自定义参数的并行SSH,linux,bash,shell,ssh,distributed,Linux,Bash,Shell,Ssh,Distributed,有很多关于并行ssh的线程和文档,但是我找不到任何关于向每个主机传递自定义参数的内容。以pssh为例,主机文件定义为: 111.111.111.111 222.222.222.222 但是,我希望通过shell脚本将自定义参数传递给每个主机,如下所示: 111.111.111.111 param1a param1b ... 222.222.222.222 param2a param2b ... 或者,更好的做法是,主机和参数将在两个文件之间拆分 因为这并不常见,这是不是滥用了并行ssh?我应

有很多关于并行ssh的线程和文档,但是我找不到任何关于向每个主机传递自定义参数的内容。以
pssh
为例,主机文件定义为:

111.111.111.111
222.222.222.222
但是,我希望通过shell脚本将自定义参数传递给每个主机,如下所示:

111.111.111.111 param1a param1b ...
222.222.222.222 param2a param2b ...
或者,更好的做法是,主机和参数将在两个文件之间拆分


因为这并不常见,这是不是滥用了并行ssh?我应该从脚本中创建许多ssh进程吗?我应该如何处理这一问题?

这里有一个解决方案,您可以根据自己的需要对其进行裁剪后使用:

#!/bin/bash
#filename: example.sh
#usage: ./example.sh <par1> <par2> <par3> ... <par6>

#set your ip addresses
$traf1=1.1.1.1
$traf2=2.2.2.2
$traf3=3.3.3.3

#set some custom parameters for your scripts and use them as you wish.
#In this example, I use the first 6 command line parameters passed when run the example.sh


ssh -T $traf1 -l username "/export/home/path/to/script.sh $1  $2" 1>traf1.txt 2>/dev/null &
echo "Fetching data from traffic server 2..."
ssh -T $traf2 -l username "/export/home/path/to/script.sh $3  $4" 1> traf2.txt 2>/dev/null &
echo "Fetching data from traffic server 3..."
ssh -T $traf3 -l username "/export/home/path/to/script.sh $5  $6" 1> traf3.txt 2>/dev/null &

#your application will block on this line, and will only continue if all 
#3 remotely executed scripts will complete
wait
#/bin/bash
#文件名:example.sh
#用法:./example.sh。。。
#设置您的ip地址
$traf1=1.1.1.1
$traf2=2.2.2.2
$traf3=3.3.3.3
#为脚本设置一些自定义参数,并根据需要使用它们。
#在本例中,我使用运行example.sh时传递的前6个命令行参数
ssh-T$traf1-l username”/export/home/path/to/script.sh$1$2“1>traf1.txt 2>/dev/null&
echo“正在从流量服务器2获取数据…”
ssh-T$traf2-l username”/export/home/path/to/script.sh$3$4“1>traf2.txt 2>/dev/null&
echo“正在从流量服务器3获取数据…”
ssh-T$traf3-l username”/export/home/path/to/script.sh$5$6“1>traf3.txt 2>/dev/null&
#您的应用程序将在此行上被阻止,并且只有在所有
#3个远程执行的脚本将完成
等待
请记住,以上要求您在机器之间进行设置,否则解决方案将中断以请求密码输入

如果可以使用Perl:

use Net::OpenSSH::Parallel;
use Data::Dumper;

my $pssh = Net::OpenSSH::Parallel->new;

$pssh->add_host('111.111.111.111');
$pssh->add_host('222.222.222.222');

$pssh->push('111.111.111.111', $cmd, $param11, $param12);
$pssh->push('222.222.222.222', $cmd, $param21, $param22);

$pssh->run;

if (my %errors = $ssh->get_errors) {
  print STDERR "ssh errors:\n", Dumper \%errors;
}
你可以用

假设您有一个文件argfile

111.111.111.111 param1a param1b ...
222.222.222.222 param2a param2b ...
然后跑

parallel --colsep ' ' ssh {1} prog {2} {3} ... :::: argfile

将使用相应的参数在每个主机上运行
prog
。每个主机的参数数量必须相同,这一点很重要。

我当前的解决方案是创建ssh进程并对其进行后台处理,然后等待它们完成。这在我的例子中非常有效,因为我可以传递我想要的参数,但它让我不得不自己管理日志并控制它们。太棒了!我已经有一段时间没有研究过这个东西了,但是如果这个方法有效的话,它看起来是最优雅的解决方案。在我最初的问题中,我没有提到我要将这些参数传递给任意数量的服务器(可能是数百台),这似乎很容易扩展。谢谢分享!如果您的参数包含空格,那么您可能希望使用TAB(\t)作为--colsep(如果argfile来自电子表格,则特别方便)。如果您仍然希望将主机和参数拆分为2个文件,那么使用--xapply,它将从每个输入源读取一行:parallel--xapply ssh{1}prog{2}:::hosts argfile