Script Shell tout en ligne de lecture de la boucle s'arrête après la première ligne
j'ai le script shell suivant. Le but est d'effectuer une boucle à travers chaque ligne du fichier cible (dont le chemin est le paramètre d'entrée du script) et de travailler contre chaque ligne. Maintenant, il semble que cela ne fonctionne qu'avec la toute première ligne du fichier cible et s'arrête après que cette ligne ait été traitée. Y a-t-il un problème avec mon scénario?
#!/bin/bash
# SCRIPT: do.sh
# PURPOSE: loop thru the targets
FILENAME=
count=0
echo "proceed with $FILENAME"
while read LINE; do
let count++
echo "$count $LINE"
sh ./do_work.sh $LINE
done < $FILENAME
echo "ntotal $count targets"
Dans do_work.sh
, je lance un couple de ssh
des commandes.
4 réponses
le problème est que do_work.sh
exécute ssh
commandes et par défaut ssh
lit à partir de stdin qui est votre fichier d'entrée. En conséquence, seule la première ligne traitée, parce que ssh
consomme le reste du fichier, et votre boucle while se termine.
pour éviter cela, passez l'option -n
à votre commande ssh
pour la faire lire de /dev/null
à la place de stdin.
SSH-n empêche de vérifier l'état de sortie de ssh lors de l'utilisation D'HEREdoc tout en raccordant la sortie à un autre programme. Il est donc préférable d'utiliser /dev/null comme stdin.
#!/bin/bash
while read ONELINE ; do
ssh ubuntu@host_xyz </dev/null <<EOF 2>&1 | filter_pgm
echo "Hi, $ONELINE. You come here often?"
process_response_pgm
EOF
if [ ${PIPESTATUS[0]} -ne 0 ] ; then
echo "aborting loop"
exit ${PIPESTATUS[0]}
fi
done << input_list.txt
utilisez ssh -n ...
pour exécuter vos commandes à distance via ssh.
#! /bin/bash
cat /root/host.txt | while read LINE
..
..
utiliser ssh -n -o StrictHostKeychecking=no
dans do_work.sh
script
- article de la liste