2017-10-16 13 views
1

J'ai un tas de machines virtuelles que je veux configurer avec un script Bash. J'ai obtenu un fichier texte avec toutes les adresses IP de toutes les machines virtuelles et j'ai aussi écrit "ssh VM-Name" en face de chaque ligne, alors quand mon script lit chaque ligne, il va SSH dans chaque VM et ensuite exécuter mes commandes dans cette VM . Il casse en quelque sorte la boucle et s'arrête après SSHing dans la première VM. Comment puis-je quitter la première VM pour qu'elle puisse passer de la SSH à la suivante?Problèmes de boucle de script Bash (SSH dans les machines virtuelles)

#!/bin/bash 
#set -x 

cat nodes.txt|while read sshlink 
do 
    echo ------------------------------------------------------- 
    echo Creating Users on: $sshlink 
    $sshlink 'echo connecting...; sleep 2; echo Creating...; sleep 1; sudo apt  
    install ntp; uname -a; sleep 1; sleep 2; echo disconnecting...; exit;' 
done 

Contenu de nodes.txt

ssh [email protected] 
ssh [email protected] 
ssh [email protected] 
ssh [email protected] 

Il fait SSH dans la première machine virtuelle, il exécute les commandes i spécifié, mais il ne sortira pas et boucle dans l'autre et ainsi de suite.

MyUsername$ ./setupnodes.sh 
------------------------------------------------------- 
Creating Users on: ssh [email protected] 
connecting... 
Creating... 

WARNING: apt does not have a stable CLI interface. Use with caution in scripts. 

Reading package lists... 
Building dependency tree... 
Reading state information... 
ntp is already the newest version (1:4.2.8p4+dfsg-3ubuntu5.6). 
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. 
Linux node-1 4.4.0-93-generiC#116-Ubuntu SMP Fri Aug 11 21:17:51 UTC 2017  
x86_64 x86_64 x86_64 GNU/Linux 
disconnecting... 
+0

Vous pouvez écrire un script expect pour le faire plus simplement https://unix.stackexchange.com/questions/288099/how-to-write-expect-in-shell – MohitC

+0

vous pouvez utiliser 'ssh -v ...' pour imprimer plus de bûches à creuser plus profondément. – georgexsh

+0

'déconnecter ... debug2: Canal 0: OBUF vide debug2: Canal 0: close_write debug2: canal 0: drain de sortie -> fermé debug2: canal 0: presque mort debug2: Canal 0: gc: informer l'utilisateur debug2: canal 0: gc: l'utilisateur détaché debug2: canal 0: close debug2: canal 0: est mort debug2: canal 0: ordures collecte debug1: canal 0: gratuit: session client, nChannels 1 debug1 : fd 0 effacement O_NONBLOCK Transféré: envoyé 3940, reçu 3908 octets, en 6,4 secondes Octets par seconde: envoyé 611.1, reçu 606.1 debug1: Quitter status 0 + exit ' – benice

Répondre

0

Essayez ici. Je l'ai utilisé pour des problèmes similaires:

while read -r remote_host; 
do 
    ssh $remote_host bash -s <<"END" 
    echo "Do Something" 
    echo "Do something else" 
    ... 
    echo "Closing connection" 
END 
done<$1 

Le script accepte une liste d'hôtes délimités avec de nouvelles lignes, ssh à chacun effectuer l'action. Chaque commande peut être placée sur une nouvelle ligne.

Ce script utilise la notation heredoc.