关于并行 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;
}