script bash parallèle ssh la commande à distance
j'ai un script qui se déclenche à distance des commandes sur plusieurs machines différentes, par le biais de la connexion ssh. Le Script va quelque chose comme:
for server in list; do
echo "output from $server"
ssh to server execute some command
done
Le problème, c'est évidemment le temps, comme il se doit pour établir la connexion ssh, commande le feu, attendre la réponse, de l'imprimer. Ce que je voudrais, c'est d'avoir un script qui permettrait d'essayer d'établir des connexions tout à la fois et l'écho de sortie "$serveur" et la sortie de la commande dès qu'il l'obtient, alors pas nécessaire dans l'ordre de la liste.
J'ai cherché sur google ce pour un certain temps, mais n'ai pas trouver de réponse. Je ne peut pas annuler une session ssh après la commande exécuter en tant qu'un thread a suggéré, parce que j'ai besoin d'une sortie et je ne peux pas utiliser parallèle gnu suggéré dans d'autres threads. Aussi je ne peut pas utiliser n'importe quel autre outil, je ne peut pas mettre/installer quoi que ce soit sur cette machine, utilisable outil GNU bash, version 4.1.2(1)-release.
Une autre question est de savoir comment les sessions ssh comme cela a limité? Si j'ai simplement coller 5+ lignes de "ssh connecter, faire une commande" il ne fait pas faire quoi que ce soit, ou d'exécuter uniquement sur la première de la liste. (il fonctionne si je colle 3-4 lignes). Merci
OriginalL'auteur | 2014-10-13
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé?
Mise à jour: Démarrer sous-coquille:
Fondamentalement, la question est de savoir comment puis-je obtenir la ligne echo "sortie à partir de $serveur" sur la même "niveau" que ssh utilisateur@serveur "commande" &, donc, je voudrais obtenir ces sorties en même temps
J'ai mis à jour ma réponse.
OriginalL'auteur Cyrus
Il y a plusieurs parallèles SSH outils qui peuvent gérer pour vous:
Aussi, vous pourriez être intéressé à la configuration de solutions de déploiement, tels que Chef, Puppet, Ansible, Tissu, etc (voir ce résumé ).
Une troisième option consiste à utiliser un terminal de diffusion tels que pconsole
Si vous ne pouvez utiliser les commandes GNU, vous pouvez écrire votre script comme ceci:
et puis
sort
la sortie de concilier les lignes.La dernière partie est ce qu'il vous faut : il ajoute au début de chaque ligne de serveur qui a imprimé que ligne. Mais il a besoin d'un correctif pour également préfixe stderr :
for server in $servers ; do ( ssh user@$server "command 2>&1" 2>&1 | sed -e "s/^/from $server: /" ) & ; done ; wait
OriginalL'auteur damienfrancois
J'ai commencé avec le shell hacks mentionné dans ce fil, ensuite procédé à quelque chose d'un peu plus robuste : https://github.com/bearstech/pussh
C'est mon cheval de bataille, et j'ai en fait exécuter quoi que ce soit à l'encontre de 250 serveurs en 20 secondes (c'est en fait limitée par la vitesse sinon le taux de raccordement tue mon ssh-agent). J'ai été en utilisant ce depuis des années.
Voir par vous-même à partir de la page de man (le clone et exécutez 'l'homme ./pussh.1') : https://github.com/bearstech/pussh/blob/master/pussh.1
Exemples
Afficher tous les serveurs rootfs utilisation dans l'ordre décroissant :
Compter le nombre de processeurs dans un cluster :
Montrer le processeur modèles, triés par occurence :
Récupérer une liste de paquet installé dans un fichier par l'hôte :
Masse copier une arborescence de fichiers (broadcast) :
Masse copier plusieurs fichiers à distance des arbres (recueillir) :
Noter que le pussh -u fonctionnalité de chargement et d'exécution) a été la principale raison pour laquelle j'ai programmé ce, sans outils semblait être en mesure de le faire. Je me demande encore si c'est le cas aujourd'hui.
OriginalL'auteur zerodeux
Vous pouvez, comme le parallèle ssh projet avec le
pssh
commande:Il affiche une ligne par serveur lorsque la commande est exécutée avec succès. Avec le
-P
option, vous pouvez également voir la sortie de la commande.OriginalL'auteur Dettorer