Je viens de débuté le shell et donc le bash pour certaines demandes , j'ai un problème :
je dois intégrer un .txt a une variable ; et cette variable va ping chaque adresses et me donné un résultat , si résultat=0(donc éteint) passer à la prochaine @ip si résultat=1 alors requête SSH avec commande system()
je dois intégrer un .txt a une variable ; et cette variable va ping chaque adresses et me donné un résultat
Je comprend assez mal ce que tu entends par là. Pourrais tu être un peu plus explicite sur la partie de gestion de la variable ?
Si j'ai bien compris ton fichier .txt contient des adresses ip à pinguer puis à prendre en ssh si elle répond ?
Si c'est bien ça l'idée va être assez simple, utilise une boucle for de façon à lire ton ficher ligne par ligne, pour chaque ligne (donc chaque itération de la boucle for), tu pingueras l'adresse puis tu récupèreras le code de retour du ping. Tu pourras ensuite tester cette variable avec un if, puis faire un ssh en fonction du résultat.
Je suis volontairement assez évasif pour te laisser quand même chercher un petit peu
J'ai cherché pas mal quand même je te rassure , comme je l'ai dis je débute en shell et s'est compliqué de commencer aussi haut ( je pense que s'est du bon niveau ce que je demande ) .
Bref Je veut que ma variable ping une à une les ip contenu dans un fichier .txt et que si il y a une réponse alors requête ssh .
Le problème s'est que je ne sais pas comment faire lire mon fichier .txt par mon script .
un moyen assez simple, c'est de mettre ton fichier .txt dans une variable, puis de la passer dans une boucle for. Ta boucle for va alors comprendre que c''est pour chaque éléments de ta variable.
Pour passer ton fichier dans une variable tu peux utiliser qqch comme ça
toto=`cat fic.txt`
donc pour ta boucle for tu peux un peu compacter le tout si tu n'a pas besoin de la variable après :
for ligne in `cat fic.txt`
do
echo $ligne
done
Du coup, il suffi juste de remplacer le echo par un ping vers la machine, puis une récupération du code d'erreur, test, tout ça tout ça
Normalement la tu as tout le principe du code, tu devrai réussir, mais je peux préciser mes idées au besoin
#!/bin/bash
RESULT="1"
COUNTER=60
while [ $COUNTER -lt 70 ]; do
PING=$(ping 148.60.210."$COUNTER" -c 1 | grep -E -o '[0-9]+ received' | cut -f1 -d' ')
if [ "$RESULT" == "$PING" ]
then
echo "SUCCESSFULL 148.60.210."$COUNTER
else
echo "FAILED 148.60.210."$COUNTER
fi
let COUNTER=COUNTER+1
done
En faites j'ai fait un compteur pour un pool d'ip donc de 1 a 254 sur counter en haut je met 254 et ça me ping les @ips un à une jusqu’à le nombre que j'ai voulu
on ne lit pas un fichier avec une boucle for, qui lit uniquement des mots, et non des lignes !
parfois ça fonctionne, mais dans le souci de prodiquer les "meilleures pratiques", il est préférable de ne pas le suggérer, et de recommander une boucle while.
par contre, l'incrémentation d'un compteur, en bash, se fait avec une boucle for :
deb=1
fin=254
for ((i=deb; i<=fin; i++))
do
echo "do stuff with $i"
done
le pipe n'est pas utile : si le ping échoue, il retournera un code de retour supérieur à zéro (comme n'importe quelle autre commande)
if ping -c 1 "$adresseIP"
then
echo success
else
echo failure
fi
et en "short" :
ping -c1 "$adresseIP" && echo ok || echo ko
- Edité par dantonq 25 juin 2015 à 14:25:03
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
J'ai un autre problème je souhaiterais écrire automatiquement un mot de passe pour la connexion SSH , avec la fonction Expect il me semble pourriez vous m'aider .
Voici ce qu'est devenu mon code :
#!/bin/bash
RESULT="1"
COUNTER=66
while [ $COUNTER -lt 69 ]; do
PING=$(ping 148.60.210."$COUNTER" -c 1 | grep -E -o '[0-9]+ received' | cut -f1 -d' ')
if [ "$RESULT" == "$PING" ]
then
echo $(date +"%A %d %m %Y ") $(date +%R)"SUCCESSFULL TO PING ON 148.60.210."$COUNTER >> "/home/user/Bureau/Bash_SSH_PING/Log"
echo $(date +"%A %d %m %Y ") $(date +%R)"SUCCESSFULL TO PING ON 148.60.210."$COUNTER
echo $(date +"%A %d %m %Y ") $(date +%R)"REQUESTED SSH ON 148.60.210."$COUNTER >> "/home/user/Bureau/Bash_SSH_PING/Log"
echo $(date +"%A %d %m %Y ") $(date +%R )"REQUESTED SSH ON 148.60.210."$COUNTER
ssh -t -a user@148.60.210.$COUNTER
else
echo $(date +"%A %d %m %Y " )$(date +%R)"FAILED TO PING ON 148.60.210."$COUNTER >> "/home/user/Bureau/Bash_SSH_PING/Log"
echo $(date +"%A %d %m %Y ") $(date +%R)"FAILED TO PING ON 148.60.210."$COUNTER
fi
let COUNTER=COUNTER+1
done
De mon coté je ne connais pas du tout excpect, peut-être dantonq ?
Cependant tu pourrais utiliser un agent ssh pour entrer automatiquement tes mots de passe. Vu qu'il s'agit d'une suite d'adresse IP, on peut supposer que tu vas t'y connecter avec le meme login/mdp ? Si oui en entrant un seul mot de passe au lancement de l'agent ssh tu pourras te connecter avec le couple login/mdp automatiquement jusqu'à l'arrêt de l'agent. Niveau sécurité c'est tout à fait acceptable. Après à voir si ça correspond à tes impératifs.
Script bash avec ping et requête ssh
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique