Question programmation en KSH

Résolu/Fermé
svein63 Messages postés 5 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 7 avril 2005 - 3 déc. 2003 à 08:35
 Le Boulet - 5 mars 2008 à 16:33
Bonjour,

Depuis quelques temps je me débat dans les affres de la programmation en KSH sous Unix.
Afin de résoudre un probléme, je dois réaliser une petite fonction qui devrait effectuer ce traitement :

faire un Ping sur une machine distante, avec adresse IP connu.
Si pas de réponse, on refait un nouvel essai. Si toujours pas de réponse on ecrie un messages type echo " machine AdresseIP injoignable".
S'il y a une réponse favorable au Ping, envoie d'un message type echo " machine AdresseIP présente " ; aprés j'embrayerais avec d'autres fonctions derriere :) .

Quelqu'un pourrait me donner des tuyaux pour cette fonction? J'ai bien regardé comment fonctionne la commande Ping, mais j'ai du mal a programmer la réponse du ping et à effectuer un traitement dessus.


En vous remerciant par avance,


Agréable journée.


stéphane SERRE

7 réponses

Bonsoir,
un petit exemple en bash(on doit pouvoir l'adapter à ksh)

ping -c 2 $1 > /dev/null # envoi 2 paquets icmp , mais d'autre options sont dispo , man ping
case $? in
0) echo "machine $1 trouvee";;
*) echo "machine $1 introuvable";;
esac
A+
0
svein63 Messages postés 5 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 7 avril 2005
4 déc. 2003 à 08:35
Rapide et efficace ;)

Merci phil pour ton aide, je vais faire quelques tests avec ce script.

Stéphane SERRE
0
svein63 Messages postés 5 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 7 avril 2005
4 déc. 2003 à 08:35
Rapide et efficace ;)

Merci phil pour ton aide, je vais faire quelques tests avec ce script.

Stéphane SERRE
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
5 déc. 2003 à 02:51
Salut,
Pour coller un peu plus a ce que tu demandais... (faire un second ping uniquement si le premier ne donne rien.)
et aussi parce que si un ping n'abouti pas le delai va-t-être trés trés long:
((ping -c1 -i10 -w5 $1 >/dev/null || ping -c1 -i10 -w5 $1 >/dev/null) && echo "ok")|| echo "pas ok"


Les chaines "ok" et "pas ok" sont à modifier à ta convenance ;)

Explications:
(ça releve un peu du bidouillage mais bon)
ping -c1 -i10 -w5 addr.ip

Si tu tapes juste 'ping -c1 ip' avec une ip pas présente sur le réseau, tu va t'appercevoir que la réponse vient trés vite (host unreachable) mais que le programme ne quitte pas aussi vite (j'ai pas eu la patience d'attendre plus d'une minute, je ne sais pas si le prog fini par quitter ou non)
La solution est de donner un timeout à ping (l'option -w)
mettons 5 secondes... au delà je ne pense pas qu'une réponse positive le soit vraiment :p

Donc à ce niveau, ping -c1 -w5 quitte apres une réponse positive, ou 5 secondes.

Le problème, c'est que le cumul de -cx et -wy dit à ping d'attendre x réponses pendant y secondes, et pas d'envoyer x ping :-(
ping envoie une demande par seconde à peu prés, ce qui fait que sans réponses positive au bout de 5 secondes, 5 ping auront été éffectués.
Pour remedier à cela, il faut aussi donner à ping, un interval entre deux requetes (-i).
En choisissant un interval arbitrairement plus grand que le timeout (ici timeout=5 et interval=10) tu peux etre sur qu'une seule requete sera envoyée!

pour la redirection (>/dev/null) c'est pour pas avoir d'affichage (pour les testes je te conseil de ne pas faire la redirection et de mettre des les ip en dur avec en position 1 une ip inexistante, et en 2 une ip connue)

((cmd1||cmd2)&& cmd3)|| cmd4)

c'est de la logique :)
c'est basé sur le test de la valeur $? (code retour de la derniere operation) comme dans l'exemple de phil. 0 = succes, 1 = echec.

cmd1 || cmd2, cmd2 est executée si et seulement si cmd1 echoue
cmd1 && cmd2, cmd2 est executée si et seulement si cmd1 réussie.

si cmd1 (le premier ping) réussi (0)
cmd2 n'est pas effectuée (cmd1||cmd2) = 0 donc cmd3 est effectuée (echo "ok")
echo "ok" renvoi 0 ((cmd1||cmd2)&&cmd3 renvoi 0) donc cmd4 n'est pas executée.

si cmd1 echoue, (1) cmd2 (second ping ) est effectué
soit cmd2 réussie (0) (cmd1||cmd2)=0 donc cmd3 est effectuée
soit cmd2 echoue (1)
on a donc (1||1) (aucun des deux ping n'a aboutis) c'est faux donc cmd3 n'est pas effectuée
on se retrouve donc avec 1||cmd4 donc cmd4 est effectuée (echo "pas ok")

Voili voilou, un peu tordu, mais ca répond exactement a la qestion je pense :o)

@++
"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je te remercie grandement asevere, aprés quelques tests, le script fonctionne à merveille :)

et merci aussi pour l'explication du script, c'est une trés délicate attention .


Stéphane SERRE
svein63@aol.com
0
ATTENTION!
Il me semble que la commande ping ne retourne pas d'erreur en cas de non réponse de la machine.

xxx@yyy# ((/etc/ping sttl19 -n 1) && echo "OK") || echo "KO"

PING sttl19: 64 byte packets

----sttl19 PING Statistics----
1 packets transmitted, 0 packets received, 100% packet loss
OK


Dans ce cas, on voit bien qu'en cas de perte de packet (100%...) le résultat est "ok"...
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
3 mars 2008 à 12:29
C'est une version maison de ping ?

Pakage: iputils-020927
man ping:
       If ping does not receive any reply packets at all it will exit with code 1. If a packet count and deadline are both specified, and fewer than count packets are received by the time the deadline has  arrived,  it  will  also
       exit with code 1.  On other error it exits with code 2. Otherwise it exits with code 0. This makes it possible to use the exit code to see if a host is alive or not.


Le tout sur une Debian.

Cordialement
0
Le Boulet > asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022
5 mars 2008 à 16:33
Donc a voir suivant la distribution et la platforme.
Ceci n'est pas valable sous UNIX HP11 par exemple :'( ... a mon grand regret!
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
3 mars 2008 à 13:40
a mon avis, les () autour du ping créant un sous-shell, ce n'est le code d'erreur du ping que teste &&
(/etc/ping sttl19 -n 1) && echo "OK"

je ferais:
C="OK" ; /etc/ping sttl19 -n 1 || { C="KO" ; } ; echo $C
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
3 mars 2008 à 15:53
Salut dubcek,

Et pourtant... ça marche! (et depuis 2003...)

A prioris, en kornshell du moins, un shell ou un sous shell renvoi le code retour de la dernière commande excepté si le shell lui même déclanche une erreur (syntax, etc.) donc un sous-shell ne peut renvoyer OK que si la dernière commande éxécutée est OK...

Ce qui me fait pencher vers le ping maison, c'est la commande utilisée:
/etc/ping ip -n1
qui ne me parrait pas valable pour la commande ping standar sous Linusque
0