2010-07-09 7 views
2

J'ai un script rapide pour exécuter une commande sur chaque serveur en utilisant ssh (je suis sûr qu'il y a beaucoup de meilleures façons de le faire, mais il était destiné à travailler rapidement!). Pour le test1 etc, il n'y a pas de serveur donc le script continue, le script continue aussi si l'authentification pubkey échoue. Toutefois, si le script se connecte, la date est imprimée mais la boucle ssh se termine ...dans ma boucle bash sur une liste de certains serveurs, si le ssh connecte le script bash quitte

#!/bin/bash -x 

cat <<EOF | 
##file servers 
test1 
test2 
server1 
server2 
EOF 
while read line 
do 
if [ "${line:0:1}" != "#" ]; then 

ssh -q -oPasswordAuthentication=no -i id_dsa [email protected]${line} date 

fi 
done 

echo read line must have exited 

sortie est comme si;

+ cat 
+ read line 
+ '[' t '!=' '#' ']' 
+ ssh -q -oPasswordAuthentication=no -i id_dsa [email protected] date 
+ read line 
+ '[' t '!=' '#' ']' 
+ ssh -q -oPasswordAuthentication=no -i id_dsa [email protected] date 
+ read line1 
+ '[' s '!=' '#' ']' 
+ ssh -q -oPasswordAuthentication=no -i id_dsa [email protected] date 
Fri Jul 9 09:04:16 PDT 2010 
+ read line 
+ echo read line must have exited 
read line must have exited`enter code here` 

quelque chose à voir avec le retour réussi de la commande ssh est de jouer avec la condition de la boucle ou le var ... des suggestions sur les raisons?

Répondre

9

Vous devez passer le drapeau -n à ssh, pour l'empêcher de jouer avec stdin :

ssh -n -q -oPasswordAuthentication=no -i id_dsa [email protected]${line} date 

J'ai testé cela avec mon propre serveur et reproduit le problème, en ajoutant -n le résout. Comme la page de manuel ssh dit:

Redirige stdin/dev/null (en fait, empêche la lecture de stdin)

Dans votre exemple, ssh doit avoir lu de stdin, qui bousille votre lecture dans la boucle.

+0

. testé et c'est parti! –

0

Je pense que la raison est que comme ssh est en train d'être forké et exécuté dans votre script bash, l'entrée standard du script est rouverte de sorte que votre read se termine simultanément. Essayez re-craft comme suit:

for line in test1 test2 server1 server2 
do 
    if [ "${line:0:1}" != "#" ]; then 
     ssh -q -oPasswordAuthentication=no -i id_dsa [email protected]${line} date 
    fi 
done 

ou courir peut-être le ssh dans un sous-shell comme ceci:

(ssh -q -oPasswordAuthentication=no -i id_dsa [email protected]${line} date) 
+0

pour boucler sur eux n'est pas ce que je veux faire, mais je suppose que ma prochaine étape aurait été de coller chaque ligne dans un tableau afin que je puisse disposer de besoin de garder le tuyau stdin à boucle. Il est intéressant de noter que le sous-shell saisit toujours le stdin et ferme le tube –