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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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 confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    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 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
    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 confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    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 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, 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.

+ 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