4

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

111.111.111.111
222.222.222.222

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

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

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

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

4

3 回答 3

4

您可以使用GNU 并行

假设您有一个文件argfile

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

然后运行

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

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

于 2013-01-22T11:54:33.167 回答
1

以下是您可以使用的解决方案,根据您的需要对其进行定制:

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

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

于 2013-01-21T14:22:46.997 回答
0

如果你可以使用 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;
}
于 2013-01-22T10:25:59.090 回答