【问题标题】:Parallel SSH with Custom Parameters to Each Host每个主机的具有自定义参数的并行 SSH
【发布时间】:2012-11-20 13:25:39
【问题描述】:

有很多关于并行 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 进程吗?我应该如何处理?

【问题讨论】:

  • 我目前的解决方案是创建 ssh 进程并将它们置于后台并等待它们完成。这在我的情况下效果很好,因为我可以传递我想要的参数,但它让我不得不自己管理和控制日志。

标签: linux bash shell ssh distributed


【解决方案1】:

你可以使用GNU parallel

假设你有一个文件argfile

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

然后运行

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

将使用相应的参数在每个主机上运行prog。每个主机的参数数量必须相同。

【讨论】:

  • 太棒了!自从我看过这些东西以来已经有一段时间了,但如果这有效,它看起来是最优雅的解决方案。我在最初的问题中没有提到我有任意数量的服务器可以将这些参数传递给(可能是数百个),这似乎很容易扩展。感谢分享!
  • 如果您的参数包含空格,那么您可能希望使用 TAB (\t) 作为 --colsep(如果 argfile 来自电子表格,则特别方便)。
  • 如果您仍然想将主机和参数拆分为 2 个文件,请使用 --xapply,它将从每个输入源读取一行:parallel --xapply ssh {1} prog {2} :::: 主机参数文件
【解决方案2】:

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

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

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

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2018-07-05
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多