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 :

Expect et bash


Sujet :

Shell et commandes GNU

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut Expect et bash
    Bonjour,

    J'essaie de mettre le résultat d'un grep dans une variable expect.

    Voici la commande grep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    send "grep -A1000 HOSTS /etc/hosts | cut -f1 | sed 1d
    Mais je n'arrive pas à lancer ma commande.. J'ai essayé mais je n'arrive pas à lancer la commande grep.
    Et lorsque j'affiche ce que me retourne ma variable f, elle m'afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -A1000 HOSTS /etc/hosts | cut -f1 | sed 1d
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set f [send -- "grep -A1000 HOSTS /etc/hosts | cut -f1 | sed 1d\r"]
    #puts "$f"
    set data [read $f]
    close $f
    Et voici l'erreur que je récupère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    can not find channel named ""| cut -f1 | sed 1d
        while executing
    "read $f"
        invoked from within
    "set data [read $f]"
    Merci par avance

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    salut,

    je ne pratique pas expect, alors j'ai cherché un peu (mais pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set f [exec grep -A1000 HOSTS /etc/hosts | cut -f1 | sed 1d]
    ?

    ps: je ne suis pas fan de grep|cut|sed, mais ce n'est pas le problème, ici.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ps: je ne suis pas fan de grep|cut|sed, mais ce n'est pas le problème, ici.
    +1

    un truc du genre awk '/HOSTS/{seen=1;next} seen{print $1}' /etc/hosts doit pouvoir remplacer l'enchainement de commandes

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Merci pour vos réponses !

    Et la commande commande correspond bien à ce que je recherchais.

    Concernant le grep|cut|sed, c'était pour éviter de complexifier la syntaxe avec des \ ; ` ; " et autre car je débute seulement.

    Par contre autre petite question, mon projet étant de me connecter à chaque équipement contenu dans la varible f
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set f [exec grep -A1000 AGMSM /etc/hosts | cut -f1 | sed 1d]
    J'ai fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       set f [exec grep -A1000 AGMSM /etc/hosts | cut -f1 | sed 1d]
       set data [read $f]
       close $f
     
        foreach line [split $data \n] {
                if {$line eq {}} continue
                spawn -noecho ssh -q -o StrictHostKeyChecking=no $user@$line
    Mais j'ai un retour avec la liste de tous les équipements, avec ce retour prompt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        while executing
    "read $f"
        invoked from within
    "set data [read $f]"
    Peut-être est-il mieux de renvoyer la liste de mes équipements vers un fichier temporaire plutôt que dans une variable ?

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    juste pour savoir, y'a vraiment besoin de expect dans ton cas ?

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/HOSTS/{seen=1;next} seen{print $1}' /etc/hosts | xargs -I{} ssh -q -o StrictHostKeyChecking=no $user@{}
    un truc comme ça ne fait pas tes affaires ?

    Citation Envoyé par musha76 Voir le message
    Peut-être est-il mieux de renvoyer la liste de mes équipements vers un fichier temporaire plutôt que dans une variable ?
    non, 99% du temps ça ne sert rigoureusement à rien de passer par un fichier plutôt que par la mémoire directement

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Oui, j'ai bien besoin de expect car j'ai besoin d'envoyer des commandes et donc d'attendre un retour de cet équipement.

    En fait, j'essaie de faire un script qui se gère automatiquement, à savoir qu'il aille chercher la liste des équipements tout seul.

    Si vous connaissez un peu plus expect, voici le 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #!/usr/bin/expect -f
     
        #Option session
        set force_conservative 1 ;
        match_max 1000000000
        set timeout 5
     
        #Edit for User
        set user 
     
        #Edit for Password
        set password 
     
        #Get IP List from hosts.txt
        set f [open "/XXXX/hosts.txt"]
        set data [read $f]
        close $f
     
        foreach line [split $data \n] {
                if {$line eq {}} continue
                spawn -noecho ssh -q -o StrictHostKeyChecking=no $user@$line
                sleep 2
                expect {
                        "XX@$line's password:" {
                                send "$password\r"
                                expect {
                                        "" {
                                                 expect "**  WARNING: THIS DEVICE HAS BOOTED FROM THE BACKUP JUNOS IMAGE      **\r"
                                                    set output $expect_out(buffer)
                                                    if {[regexp {BACKUP} $output matched sub1 sub2]} {
                                                            set BACKUP [open /XXXX/partition_backup.list a+]
                                                            puts $BACKUP "$line"
                                                            close $BACKUP
                                                    } else {
                                                            puts "$line OK"
                                                            }
                                                    send "exit\r"
                                                    continue
                                                     }}}}}
    Actuellement, pour récupérer les ip de mes équipements, je passe par un fichier que j'actualise de temps en temps.
    Mais j'aimerais que le script soit capable de récupérer la liste des équipements qui elle même est géré dynamiquement.

    Je ne sais pas si c'est très clair, mais grossièrement l'objectif est d'envoyer dans une variable le résultat de la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -A1000 XXX /etc/hosts | cut -f1 | sed 1d
    et pour chaque line comprise dans cette variable on déroule la boucle.

  7. #7
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par musha76 Voir le message
    Si vous connaissez un peu plus expect, voici le script
    non du tout, et c'est à mon avis un peu le problème; je doute qu'il y ait beaucoup de compétences autour de expect sur le forum (c'est à mon avis moins utilisé qu'on pourrait croire, et puis faut aussi que ça intéresse...)

    à titre perso j'ai administré des dizaines de machines pendant plusieurs années sans jamais utiliser expect, je dis pas que c'est pas utile dans le cas présent, mais que malgré une certaine expérience j'en ai jamais trouvé l'utilité dans des tâches d'admin pourtant complexes parfois, réussissant toujours à m'en sortir avec du scripting "régulier"/bash, des outils de déploiement, de la conf un peu maline etc.

    m'est avis que N_BaH t'a quand même bien mis sur la voie, pour le reste et au minimum j'imagine que la doc expect/tcl est ton amie...

    edit: on trouve ici une tournure peut-être intéressante qui si on l'adapte devrait donner un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set data [exec awk '/HOSTS/{seen=1;next} seen{print $1}' /etc/hosts]
    for {set line 0} {$line < [array size data]} {incr line} {
       spawn -noecho ssh -q -o StrictHostKeyChecking=no $user@$line
    }

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Ok merci Bob

    Expect je ne connais pas avant que je tombe sur un script que j'ai trouvé sur internet, donc j'ai gardé la commande.

    Je vais creuser dans ce sens alors

  9. #9
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut
    Bonjour,

    Pour interroger des équipements (j'ai vu JunOs), tu peux regarder du côté de Python et de la bibliothèque NAPALM.
    C'est plus lisible et moins complexe que expect.
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

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

Discussions similaires

  1. 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
  2. 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
  3. 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
  4. Requête POST dans un script bash
    Par desperado dans le forum Linux
    Réponses: 4
    Dernier message: 11/12/2007, 22h38
  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