[Bourne sh] Boucle While

N4mek -  
 N4mek -
Bonjour,

Mon objectif est de faire une sauvegarde à l'aide d'un script, de plusieurs commutateurs référéncés dans le fichier
/etc/hosts
. Ce fichier associe le nom des commutateurs avec leur adresse IP. J'ai essayé de faire quelque chose, mais en vain.

Voici mon code :
#!/bin/sh
awk '/swdsg22/{print $1}'/etc/hosts | whileread ip; do"$ip";
password=@xxxxxxxx
expect << EOF
  spawn -noecho ssh -q -o StrictHostKeyChecking=no ***@***
  expect "Password:"
  send "$password\r"
  expect "#"
  send "wr\r"
  expect "#"
  send "exit"
EOF


Le problème vient de ma boucle, j'ai besoin de votre aide pour corriger ça.

Voici en image le principe :
https://www.cjoint.com/c/JJfppZBnM0x

Le résultat normalement avec plusieurs commut mais là juste un seul marche :
https://www.cjoint.com/c/JJfprPScdLx

Si vous avez des idées ou des solutions merci d'avance
Cordialement

9 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Attention dans ton second message tu avais laissé les mots de passe (d'où l'intérêt d'utiliser autant que possible des clés ssh quand c'est possible). D'ailleurs il n'y a plus de commande
    mail
    , du coup quelle est la question ?

    Assure-toi que tu parviens, depuis ton terminal à envoyer un mail avec la commande
    mail
    , avant de l'incorporer à ton script. Je te renvoie à mon message précédent pour paramétrer la commande mail...

    Bonne chance
    1
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    À mon avis tu devrais regarder comment faire ça en
    parallel-ssh
    ce sera beaucoup plus simple et beaucoup plus propre. Tu peux notamment te référer à ce tutoriel.

    De plus, utiiser
    /etc/hosts
    n'est pas la meilleure des idées, car ce fichier référence en général des machines autres que tes commutateurs (ne serait-ce que l'alias
    localhost
    ), donc d'un point de vue design, il vaudrait mieux utiliser un fichier dédié, même si ce fichier à part entière ressemble beaucoup à
    /etc/hosts
    . Si tu te réfères au tutoriel précédent, tu verras en outre qu'il contient le login ssh à utiliser.

    Cela me permet d'embrayer sur le point suivant. C'est une très mauvaise idée d'ouvrir les connexion en root sur un serveur ssh. C'est en effet un login présent sur toutes les machines linux et donc classiquement attaqué. C'est pourquoi par défaut, les configurations modernes du serveur ssh empêche root de se connecter. Beaucoup plus prorpre : définis un utilisateur (e.g.
    backup
    ) sur tes commutateurs, installe la clé ssh du serveur mettre qui va utiliser parallel-ssh dans le compte
    backup
    de chaque commutateur (voir
    ssh-copy-id
    ) et fais en sorte que l'utilisateur
    backup
    ait sur chaque machine des droits minimaux et suffisants pour faire ce qu'il à faire, quitte à en faire un sudoer (mais à mon avis, c'est excessif pour faire un backup).

    Par ailleurs, je ne vois aucune bonne raison d'utiliser l'option
    -o StrictHostKeyChecking=no
    , donc je la supprimerais. Il faudra juste te connecter une première fois à chaque machine à la main, le temps qu'elle soit ajoutée à ton
    ~/.ssh/known_hosts
    . C'est normalement une étape de vérfication que tu n'es pas sensé automatiser. Elle te permet de contrôler l'empreintes du serveurs auquel tu te connectes (et donc t'assurer que ta connexion n'a pas été détournée). Plus de détails ici.

    Bonne chance
    0
    1. N4Mek
       
      Bonjour,

      Merci de ta réponse rapide, je voulais juste un script basique qui sauvegarde les commutateurs à partir du fichier
      /etc/hosts
      , tout simplement. J'ai réussi à faire le script. Tu m'excuses si je n'ai pas suivi tes conseils pour faire le Script, mais j'en ai quand même tenu compte.

      Serait-il possible de faire un envoie de mail après une sauvegarde, :

      SW.......#wr

      Building configuration... -> Si ça m'affiche les deux lignes [Build.., [OK]], alors je peux envoyer un mail de confirmation
      [OK]


      Mail du genre : Le commutateur SW... a été sauvegardé avec succès.

      C'est possible de faire ça ?

      Je t'envoie quand même le résultat de mon premier Script, si tu veux l'utiliser un jour :

      #!/bin/sh
      
      password0=XXXXX
      password1=YYYYYY
      
      #### PASSWORD : XXXXX #####
      
      awk '/XXXX|XXXX|XX|XX|XXXXXX|XX|XX/{print $1}' /etc/hosts | while read ip; do
      expect << EOF
        spawn -noecho ssh -q -o StrictHostKeyChecking=no xxx@$ip
        expect "Password:"
        send "$password0\r"
        expect "#"
        send "wr\r"
        expect "#"
        send "exit"
      EOF
      done
      
      #### PASSWORD : YYYY ####
      
      awk '/yyyy|yyyy|yy|yyy/{print $1}' /etc/hosts | while read i; do
      expect << EOF
        spawn -noecho ssh -q -o StrictHostKeyChecking=no yyyy@$i
        expect "Password:"
        send "$password1\r"
        expect "#"
        send "wr\r"
        expect "#"
        send "exit"
      EOF
      done
      
      #### CONNEXION TELNET POUR UN ROUTEUR####
      
      expect << EOF
        spawn  telnet -l admin XX.XX.XXX.XXX
        expect "Username:"
        send "admin\r"
        expect "Password:"
        send "$password0\r"
        expect "#"
        send "wr\r"
        expect "#"
        send "exit"
      EOF
      done
      0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Oui c'est possible avec la commande
    mail
    . Plus de détails ici.

    Bonne chance
    0
  4. N4mek
     
    Bonjour,

    Petit problème d'envoie de mail, j'ai bien vérifié que j'utilisé bien la commande mail :

    #!/bin/sh
    
    ##########################################
    ###       Connexion en mode SSH        ###
    ##########################################
    
    password0=@XXXXXXXX!
    
    fichier=/tmp/sauvegarde.txt
    
    #### PASSWORD : @XXXXXX! #####
    
    
    awk '/SW8X-012SG22|SW8X-022SG22/{print $1}' /etc/hosts | while read ip; do
    
    expect >> $fichier  << EOF
    
                                    spawn -noecho ssh -q -o StrictHostKeyChecking=no admin@$ip
                                    expect "Password:"
                                    send "$password0\r"
                                    expect "#"
                                    send "wr\r"
                                    expect "#"
                                    send "exit"
    
    
    
    ############################################################################
    ###        Envoie d'un mail pour plusieurs sauvegardes de Switch         ###
    ############################################################################
    
    if [[( $fichier =~ Building configuration... ) && ( $fichier =~ OK  )]]
    then
            mail -s "Les switch on etait sauvegarde " ***@***
    else
             mail -s "Un probleme a ete decteter durant les sauvegardes" ***@***
    fi
    
    EOF
    done
    
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. N4mek
     
    EDIT : ce que j'ai fais :

    #!/bin/sh
    
    ##########################################
    ###       Connexion en mode SSH        ###
    ##########################################
    
    password0=@XXXXXXX
    
    fichier=/tmp/sauvegarde.txt
    
    
    awk '/SW8X-012SG22|SW8X-022SG22/{print $1}' /etc/hosts | while read ip; do
    
    expect >> $fichier  << EOF
    
                                    spawn -noecho ssh -q -o StrictHostKeyChecking=no admin@$ip
                                    expect "Password:"
                                    send "$password0\r"
                                    expect "#"
                                    send "wr \r"
                                    expect "#"
                                    send "exit"
    
    EOF
    
    nom=$(grep ^wr $fichier)
    
    
    ########################################################################
    ###      Envoie d'un mail pour plusieurs sauvegardes de Switch       ###
    ########################################################################
    
    if [[ $fichier =~ OK  ]]
    then
            echo $ip : Ok
            rm $fichier
    else
            echo $ip : Non Ok
    #       rm $fichier
    fi
    done
    
    0
  7. N4mek
     
    Ah oui, merci beaucoup désolé ^^ Alors ma question :

    Quand je sauvegarde wr, -> Création du fichier sauvegarde -> Je récupère le
    OK
    dans mon fichier (
    if [[ $fichier =~ OK  ]]
    )
    -> Résultat du script = :
    Non okSG22#wr 
    .

    Je ne comprends pas pourquoi je n'ai pas :
    SW8X-012SG22 : Ok 
    .

    Ensuite un
    rm
    du fichier sauvegarde pour avoir l'autre, en fait, ça fais comme une boucle mais j'ai pas le bon résultat. Si tu vois pourquoi.

    Je ferais la commande
    mail
    plus tard, je m'assure déjà que je reçois bien le bon message et la bonne sauvegarde du bon switch.

    Cdt,
    0
  8. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Si j'ai bien compris le
    OK
    est dans le fichier. Or ton test
    if [[ $fichier =~ OK ]]
    porte sur le nom du fichier et non son contenu (que tu pourrais récupérer avec
    `cat "$fichier"`
    .

    Bonne chance
    0
    1. N4mek
       
      Si j'ai bien compris ton raisonnement?
      if [[ `cat "$fichier"` =~ OK ]]

      Merci d'avance pour tout,
      Je vais test demain :)

      Bon courage à toi
      0
  9. N4mek
     
    Dernière question après je stop ^^'

    Quand je lance mon Script :
    OK : SW8X-012SG22#wr
    OK : SW8X-022SG22#wr
    Je ne veux pas #wr

    voici mon code nom=$(grep wr $fichier)
    J'ai essayé avec tr et sed mais je n'y arrive pas ...
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      $ cat f2
      OK : SW8X-012SG22#wr
      OK : SW8X-022SG22#wr

      $ sed '/wr/{s/#.*//}' f2
      OK : SW8X-012SG22
      OK : SW8X-022SG22

      $ grep -Po '\K.*(?=#)' f2
      OK : SW8X-012SG22
      OK : SW8X-022SG22


      ;-)
      0
  10. N4mek
     
    Là c'est un autre niveau de Grep et sed mdr bien joué :)

    EDIT : J'ai trouvé plus simple en faite :

    grep wr f2 | tr -d "#wr"
    0