2011-06-30 4 views
2

j'ai actuellement les lignes suivantes de code dans un script:Une manière plus efficace de boucler sur SSH dans KSH?

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 

Fondamentalement, j'avoir une boucle qui passe à travers chaque élément dans un réseau prédéfini, se connecte à un serveur distant (même serveur chaque fois) , puis compare un fichier avec un fichier défini par la boucle à l'aide de la commande diff. Fondamentalement, il compare un fichier personal.conf avec personal.conf.option1, personal.conf.option2, etc. S'il n'y a pas de différence, il l'ajoute au tableau. S'il y a une différence, rien ne se passe. Je me demandais s'il est possible d'exécuter ceci ou d'obtenir le même résultat (stocker les fichiers correspondants dans un tableau sur l'ordinateur hôte, pas le serveur auquel il est connecté) en ne se connectant qu'une seule fois via SSH. Je ne peux rien stocker sur le serveur distant, et je ne peux pas non plus exécuter un script distant sur ce serveur. Je peux seulement émettre des commandes via ssh (une sorte de configuration maladroite). Actuellement, il se connecte autant de fois qu'il y a d'options. Cela semble inefficace. Si quelqu'un a une meilleure solution, j'aimerais l'entendre.

+0

Prenez soin de vous assurer qu'il fonctionne vraiment toutes les options dans le tableau. ssh dans une boucle quittera (selon mon expérience) après le premier appel si vous n'ajoutez pas

Répondre

3

Plusieurs options:

  • Vous pouvez utiliser la fonction de multiplexage OpenSSH (voir ssh(1)).

  • En outre, la plupart des coquilles se fera un plaisir d'accepter un script à exécuter sur stdin, de sorte que vous pouvez simplement lancer quelque chose comme

    cat script.sh | ssh $HOST /bin/sh 
    
  • La plupart des langages de script (Perl, Python, Ruby, etc.) ont une certaine SSH module qui permet la réutilisation de connexion:

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

J'ai fini par utiliser la deuxième option pour diriger un script séparé vers/bin/ksh. Ça a bien marché! J'ai aimé le lok de la troisième option mais, malheureusement, je suis sur un boîtier Solaris et il n'y a pas de support OpenSSH. – thomascirca

Questions connexes