2011-06-30 21 views
2

私は現在のスクリプトのコードの次の行を有する:KSHでSSHをループするより効率的な方法は?

set -A ARRAY OPTION1 OPTION2 OPTION3 OPTION4 
      set -A matches 

      for OPTION in ${ARRAY[@]}; do 
        DIFF=$(ssh [email protected]$host " diff $PERSONALCONF $PRESETS$OPTION") 
        if [[ $DIFF == "" ]]; then 
          set -A matches"${matches[@]}" $OPTION 
        fi 
      done 

基本的に、私は、事前に定義された配列の各要素を通過するループを有する、遠隔サーバ(同じサーバ毎時間)に接続次に、diffコマンドを使用してループで定義されたファイルとファイルを比較します。基本的には、personal.confファイルをpersonal.conf.option1、personal.conf.option2などと比較します。違いがなければ、配列に追加します。違いがある場合、何も起こりません。

SSH経由で一度だけ接続することで、これを実行するか、同じ結果(接続先のサーバーではなく、ホストマシン上の配列に一致するファイルを格納する)が可能かどうか疑問に思っていました。私はリモートサーバに何も保存することはできませんし、そのサーバ上でリモートスクリプトを実行することもできません。私はssh(愚かなセットアップの一種)を介してのみコマンドを発行することができます。現在、オプションの数だけ接続します。これは非効率的と思われる。もし誰かがより良い解決策を持っていれば、私はそれを聞いてみたいと思う。

+0

それは本当に、アレイ内のすべてのオプションを実行していることを確認するように注意してください:接続の再利用を可能にするモジュール。

答えて

3

いくつかのオプション:

  • あなたはOpenSSHの多重化機能を使用することができます(ssh(1)を参照してください)。あなただけ

    ようなものを実行することができるように

  • はまた、ほとんどのシェルは喜んで、標準入力上で実行するスクリプトを受け入れます

    cat script.sh | ssh $HOST /bin/sh 
    
  • ほとんどのスクリプト言語(などPerlやPython、Rubyは、)いくつかのSSHを持っています

    #!/usr/bin/perl 
    use Net::OpenSSH; 
    my ($user, $host) = (...); 
    my @options = (...); 
    my @matches; 
    my $ssh = Net::OpenSSH->new("$user\@$host"); 
    for my $option (@options) { 
        my $diff = $ssh->capture("diff $personal_conf $presets$option"); 
        if ($ssh->error) { 
         warn "command failed: " . $ssh->error; 
        } 
        else { 
         push @matches, $option if $diff eq ''; 
        } 
    } 
    print "@matches\n"; 
    
+0

2番目のオプションを使用して、別のスクリプトを/ bin/kshに移植しました。それは素晴らしかった!私は第3の選択肢のお気に入りを好きでしたが、無意識のうちに私はソラリスボックスに入っていて、OpenSSHのサポートはありません。 – thomascirca

関連する問題