Contexte
J'ai créé un script pour:
- Lire une liste d'adresses IP une à la fois
- Copier un fichier de configuration de l'hôte local vers l'hôte distant
- Redémarrer l'hôte distant
- Fermer la session ssh en cours
Contenu du script:
#!/bin/bash
SSHPASS="OMITTED"
FILE_TO_COPY=/opt/someConfigFile.conf
TARGET_FOLDER=/opt/
echo "Reading ip list..."
cat $1 | while read ip
do
echo "Copying file to $ip"
sshpass -p $SSHPASS scp -o StrictHostKeyChecking=no -o ServerAliveInterval=3 $FILE_TO_COPY root@$ip:$TARGET_FOLDER
echo "Sending reboot command to $ip"
sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=3 'nohup reboot > /dev/null & exit'
echo "Done for $ip"
done
echo "Done for all"
Mon script lit les entrées d'un fichier texte dans lequel chaque entrée est séparée par une nouvelle ligne, quelque chose comme:
192.168.XXX.XX1
192.168.XXX.XX2
192.168.XXX.XX3
192.168.XXX.XX4
Lorsque je lance ce script, ./ConfigSender.sh /host_list.txt
je peux voir la sortie suivante:
$> ./ConfigSender.sh /host_list.txt
Rading ip list...
Copying file to 192.168.XXX.XX1
Sending reboot command to 192.168.XXX.XX1
Done for 192.168.XXX.XX1
Done for all
$>
Je m'attendais à voir la sortie pour toutes les entrées du fichier. Je soupçonnais que les commandes à l'intérieur avaient en while
quelque sorte brisé l'exécution. J'ai donc édité mon script pour simplement imprimer la valeur lue en sortie:
#...
echo "Reading ip list..."
cat $1 | while read ip
do
echo "Copying file to $ip"
done
echo "Done for all"
C'est la sortie:
$> ./ConfigSender.sh /host_list.txt
Rading ip list...
Copying file to 192.168.XXX.XX1
Copying file to 192.168.XXX.XX2
Copying file to 192.168.XXX.XX3
Copying file to 192.168.XXX.XX4
Done for all
$>
Question
Il est clair que les commandes à l'intérieur d'origine while
causent ce comportement. Quel est le problème avec la boucle while? Qu'est-ce que j'oublie ici?
MODIFIER
Les réponses @harrymc & @Kamil Maciorowski résolvent mon problème, merci beaucoup. J'ai décidé d'accepter la réponse de @ harrymc car elle est plus descriptive.
la source