IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

bash et expect


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Par défaut bash et expect
    Bonjour tout le monde,

    Je souhaite créer un script permettant de vérifier le bon retour d'une commande.

    Pour résumer, je me connecter à un équipement, je lance une commande et je vois si je match une expression.
    Sauf que je n'arrive pas à cibler le résultat de ma commande...

    Voici pour ce qui est du script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/sh
     
    password=''
     
    for routeur in $(cat /tmp/partition_backup.list);
    do
    expect << EOF
                                    spawn -noecho ssh -q -o StrictHostKeyChecking=no test@$routeur
                                    expect "test@$routeur's password"
                                    send "$password\r"
                                    expect test@$routeur
                                    set output $expect_out(buffer)
                                    send "show chassis alarms | match backup\r"
                                    puts "---DEBUT $output ---FIN"
                                    expect admin@$routeur
    EOF
    done
    Voici le résultat que j'obtiens avec ce script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    test@routeur's password:
    {master:1}
    test@routeur> ---DEBUT  ---FIN
    show chassis alarms | match backup
    2017-01-11 03:42:15 CET  Minor  Host 1 Boot from backup root
    Alors que j'aimerais simplement cibler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2017-01-11 03:42:15 CET  Minor  Host 1 Boot from backup root

    Savez-vous comment je peux faire ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Par défaut
    Je pense avoir trouvé une piste mais je bloque pour le moment :

    Voici ce que j'ai rajouté à mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     expect << EOF
                                    spawn -noecho ssh -q -o StrictHostKeyChecking=no test@$routeur
                                    expect "test@$routeur's password"
                                    send "$password\r"
                                    expect test@$routeur
                                    send "show chassis alarms | match backup\r"
                                    puts $expect_out(buffer)
                                    expect test@$routeur
                                    parray expect_out
    EOF
    Et voici le retour du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    test@test's password:
    test@test> (buffer)
    show chassis alarms | match backup
    2017-01-11 03:42:15 CET  Minor  Host 1 Boot from backup root
     
    test@test> expect_out(0,string) = test@test's password
    expect_out(buffer)   = test@test's password
    expect_out(spawn_id) = exp4
    J'obtiens bien quelque chose dans mon buffer mais ce n'est toujours pas ce que je veux :/

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par musha76 Voir le message
    Alors que j'aimerais simplement cibler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2017-01-11 03:42:15 CET  Minor  Host 1 Boot from backup root
    Qu'est-ce que tu entends par "cibler"?
    Tu veux dire "filtrer" (au sens de "grep")?

    Si tu peux nous décrire ce que tu voudrais voir, il suffit de "piper" la sortie de ton script avec un "grep", par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monscript | grep 'backup'
    D'un autre côté, si tu peux nous décrire ce que tu voudrais pas voir, il suffit de "piper" la sortie de ton script avec un "grep -v", par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monscript | grep -v 'test@routeur'

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Par défaut
    En fait, j'aimerais pouvoir faire correspondre le $routeur à la sortie de la commande "show chassis alarms | match backup"

    Dès que j'obtiens "2017-01-11 03:42:15 CET Minor Host 1 Boot from backup root", j'aimerais pouvoir mettre dans un autre fichier :
    $routeur : Boot from backup root

    et si je ne détecte pas le message "2017-01-11 03:42:15 CET Minor Host 1 Boot from backup root" mettre $routeur : OK

    Je sais pas si c'est un peu plus clair pour vous

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if monscript | grep -q "2017-01-11 03:42:15 CET  Minor  Host 1 Boot from backup root"
    then echo "$routeur : Boot from backup root"
    else echo "$routeur : OK"
    fi > un_autre_fichier

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Par défaut
    Oui je comprends parfaitement la syntaxe. Mais je ne sais pas comment, ni ou mettre la boucle dans mon script, sachant que le $routeur dépend de mon expect

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/sh
     
    password=''
     
    for routeur in $(cat /tmp/partition_backup.list);
    do
    expect << EOF
                                    spawn -noecho ssh -q -o StrictHostKeyChecking=no test@$routeur
                                    expect "test@$routeur's password"
                                    send "$password\r"
                                    expect test@$routeur
                                    set output $expect_out(buffer)
                                    send "show chassis alarms | match backup\r"
                                    puts "---DEBUT $output ---FIN"
                                    expect admin@$routeur
    EOF
    done

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Je pense qu'on peut faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/sh
     
    password=''
     
    for routeur in $(cat /tmp/partition_backup.list);
    do expect | grep -q "2017-01-11 03:42:15 CET  Minor  Host 1 Boot from backup root"; then echo "$routeur : Boot from backup root"; else echo "$routeur : OK"; fi > un_autre_fichier << EOF
                                    spawn -noecho ssh -q -o StrictHostKeyChecking=no test@$routeur
                                    expect "test@$routeur's password"
                                    send "$password\r"
                                    expect test@$routeur
                                    set output $expect_out(buffer)
                                    send "show chassis alarms | match backup\r"
                                    puts "---DEBUT $output ---FIN"
                                    expect admin@$routeur
    EOF
    done
    Si ça ne marche pas, tu peux aussi faire une fonction prenant $routeur comme argument.

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Par défaut
    L'idée de la boucle est bonne mais malheureusement elle ne passe pas dans le expect

    Il est ne m'est pas possible de passer le $routeur en argument sachant que cela provient d'une liste et que j'aimerais passer le script la nuit.

    Je vais de mon côté essayer de creuser pour inclure cette boucle avec la commande expect

  9. #9
    Membre averti
    Profil pro
    étudiant
    Inscrit en
    Avril 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 44
    Par défaut
    Effectuer un partage de clé et envoyer les commandes via ssh ne serait pas plus simple ?

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Par défaut
    Cette solution me semble trop complexe sachant que j'ai beaucoup d'équipements à gérer.
    Mais merci de la proposition!

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par musha76 Voir le message
    L'idée de la boucle est bonne mais malheureusement elle ne passe pas dans le expect

    Il est ne m'est pas possible de passer le $routeur en argument sachant que cela provient d'une liste et que j'aimerais passer le script la nuit.

    Je vais de mon côté essayer de creuser pour inclure cette boucle avec la commande expect
    Je n'ai rien compris!
    Que veux-tu dire par "elle ne passe pas dans le expect"?
    Pourquoi ne peux-tu pas passer le $routeur en argument d'une fonction?
    Quel rapport avec le fait qu'elle provient d'une liste?
    Quel rapport avec le fait de passer le script la nuit?

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Par défaut
    Je me suis mal expliqué. Pour que ce soit plus clair, voici le debug de la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bash -x test_partition.sh
    + password=XXXXXX
    ++ cat /tmp/test.list
    + for routeur in '$(cat /tmp/test.list)'
    + expect
    + grep -q 'Boot from backup root'
    + echo 'X.X.X.X : OK'
    *
    En fait, le script ne boucle pas sur la liste d'équipement.

    Par contre, je ne sais pas comment faire pour passer $routeur en argument de la fonction...
    J'avais compris $routeur en argument (genre ./test_partition $1)...

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par musha76 Voir le message
    En fait, le script ne boucle pas sur la liste d'équipement.
    Il faudrait comprendre pourquoi.

    Je ne connais pas "expect". Je ne sais pas comment "expect" se comporte lorsqu'il arrive sur la fin de fichier (avec le 'EOF').
    Peut-être faudrait-il le lancer en background ?
    Peut-être faut-il lancer (avec "send") une commande pour terminer la session "expect"?

    Par contre, je ne sais pas comment faire pour passer $routeur en argument de la fonction...
    J'avais compris $routeur en argument (genre ./test_partition $1)...
    Pour passer $routeur en argument d'une fonction, on peut faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/sh
     
    password=''
     
    function test_routeur {
      routeur=$1
      expect  << EOF
                                    spawn -noecho ssh -q -o StrictHostKeyChecking=no test@$routeur
                                    expect "test@$routeur's password"
                                    send "$password\r"
                                    expect test@$routeur
                                    set output $expect_out(buffer)
                                    send "show chassis alarms | match backup\r"
                                    puts "---DEBUT $output ---FIN"
                                    expect admin@$routeur
    EOF
    }
     
    for routeur in $(cat /tmp/partition_backup.list)
    do
      echo "testing routeur $routeur"
      # On passe "$routeur" à la fonction "test_routeur"
      if test_routeur "$routeur" | grep -q "2017-01-11 03:42:15 CET  Minor  Host 1 Boot from backup root"
      then echo "$routeur : Boot from backup root"
      else echo "$routeur : OK"
      fi >> autre_fichier_log
    done

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Expect et bash
    Par musha76 dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 06/10/2017, 14h01
  2. Connexion à un serveur mysql via un script bash zenity avec expect
    Par xunil2003 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 24/02/2014, 07h31
  3. se connecter à mysql avec expect send bash
    Par paissad dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/11/2010, 03h00
  4. Expect et bash : rapatriement de données par ssh
    Par Bénarès77 dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 02/07/2010, 17h52
  5. [Plugin]package does not match the expected package src
    Par Fladnag dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 10/03/2004, 20h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo