将自定义参数并行 SSH 到每个主机


有很多

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

111.111.111.111
222.222.222.222

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

111.111.111.111 param1a param1b ...
222.222.222.222 param2a param2b ...

或者,更好的是,主机和参数将在 2 个文件之间拆分。

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

你可以使用GNU并行。

假设您有一个文件参数文件

111.111.111.111 param1a param1b ...
222.222.222.222 param2a param2b ...

然后运行

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

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

以下是

您可以根据自己的需求进行定制后可以使用的解决方案:

#!/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

请记住,上述要求您在计算机之间设置无密码登录,否则解决方案将中断以请求输入密码。

如果你可以使用 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;
}

相关内容

  • 没有找到相关文章

最新更新