Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script bash avec ping et requête ssh

    25 juin 2015 à 11:10:44

    Bonjour a tous ,

    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()

    Pourriez vous m'aider ?

    -
    Edité par samuelLe Coz 25 juin 2015 à 11:11:38

    • Partager sur Facebook
    • Partager sur Twitter
      25 juin 2015 à 11:29:40

      Bonjour,

      samuelLe Coz a écrit:

      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 ;)

      • Partager sur Facebook
      • Partager sur Twitter
        25 juin 2015 à 11:35:57

        J'ai cherché pas mal quand même je te rassure :D, comme je l'ai dis je débute en shell et s'est compliqué de commencer aussi haut o_O( 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 .

        • Partager sur Facebook
        • Partager sur Twitter
          25 juin 2015 à 11:42:15

          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 ;)



          • Partager sur Facebook
          • Partager sur Twitter
            25 juin 2015 à 11:52:06

            J'ai trouvé mieux  , avec de l'aide bien sur : 
            #!/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

            Dis moi ce que tu en pense :D

            -
            Edité par samuelLe Coz 25 juin 2015 à 11:53:49

            • Partager sur Facebook
            • Partager sur Twitter
              25 juin 2015 à 14:23:10

              salut,

              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

              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                25 juin 2015 à 14:25:43

                Tant que ça fonctionne c'est nickel ;)

                y'a mille et une façon de faire et si ça marche alors c'est que c'est bon :p

                Perso je voyais plus le coté gestion du code de retour comme ça :

                ping -c 1 148.60.210."$COUNTER" 1>/dev/null 2>/dev/null
                if [ $? -eq 0 ]
                then
                     echo "Succès"
                else
                     echo "Echec"
                fi

                Après comme j'ai dis les deux fonctionnent donc c'est purement en fonction de comment tu vas coder, tu prendras des habitudes toi aussi x)

                edit suite à la réponse de dtc ;p

                effectivement c'est plus short ;)

                -
                Edité par Supafish 25 juin 2015 à 14:27:08

                • Partager sur Facebook
                • Partager sur Twitter
                  25 juin 2015 à 14:50:09

                  on peut enfoncer une vis avec un marteau, ou un ciseau à bois ! Ça fonctionne, alors c'est bon !?
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                    26 juin 2015 à 12:10:02

                    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



                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 juin 2015 à 13:09:18

                      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.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      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.
                      • Editeur
                      • Markdown