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 : rapatriement de données par ssh


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 30
    Points : 29
    Points
    29
    Par défaut Expect et bash : rapatriement de données par ssh
    Bonjour à tous,
    J'ai des petits soucis avec expect. Voilà, je veux automatiser du rapatriement de données via ssh sur une machine distance. J'ai donc essayé un petit script expect, que voilà :

    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
     
    #!/usr/bin/expect -f
    set login [lrange $argv 0 0]
    set password [lrange $argv 1 1]
    set ipaddr [lrange $argv 2 2]
     
    set timeout -1
    spawn ssh $login@$ipaddr 
    match_max 100000
    expect "*?assword:*"
    send -- "$password\r"
    expect "*?kraken:~$"
    send -- "\r"
    send -- "cd tests\r"
    send -- "tar -czvf resultats.tar.gz resultats\r"
    send -- "exit\r"
    expect eof
    Ce qui me permet de préparer le transfert proprement dit. Mais le problème c'est que lorsque je rajoute des commandes après, "spawn scp " par exemple, le début du script ne marche plus ! Il reste coincé sur la machine distante et n'arrive pas à exécuter les commandes suivantes.
    J'ai exactement le même problème quand j'essaie d'intégrer le script ci-dessus (même sans les ajouts ultérieurs) au sein d'un script bash, comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    /usr/bin/expect - << EndMark
    (code ci-dessus)
    EndMark
    Si vous vous demandez pourquoi j'ai rajouté le "expect kraken", où kraken est le nom de la machine distante, c'est parce que sinon il n'arrivait pas du tout à exécuter de commandes distantes sur la machine.
    Voilà, désolé si cette question est une question de noob :s et merci d'avance.

  2. #2
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    c'est une mauvaise solution dans le cas ou tu pourrais être amené à utiliser ton script sur une configuration qui ne pocede pas extract

    des bonnes solutions plus portables sont rsync et bien plus sur encore : ssh &scp que tu es sur de trouver partout .

    ou encore la création locale du tar des données de la machine distante telle que (via ssh) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ssh -l operateur undertaker "tar cf - *dump " | gzip - > dump.tar.gz
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scp operateur@undertaker:~/*dump.tar.gz .
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rsync -zauv operateur@undertaker:~/*dump.tar.gz .

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 30
    Points : 29
    Points
    29
    Par défaut
    Merci de cette réponse, mais justement je dois récupérer des données régulièrement sur plusieurs machines, sur lesquels sont installés expect (je suppose c'est c'est ce que tu voulais dire par "extract" ?) et c'est assez long de taper les mots de passe à chaque coup, c'est pourquoi j'essaie de faire ça avec expect.

  4. #4
    Membre éprouvé
    Avatar de matrix788
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 740
    Points : 1 056
    Points
    1 056
    Billets dans le blog
    2
    Par défaut
    Salut,

    j'ai le même souci, même en m'y prenant autrement. Connexion ssh ok, mais il reste sur le bash distant sans envoyer les commandes inscrites dans le script.

    J'ai pas encore essayé, mais tu peux regarder du côté d'un lancement en background, style nohup, ou "&"... ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par Bénarès77 Voir le message
    Merci de cette réponse, mais justement je dois récupérer des données régulièrement sur plusieurs machines, sur lesquels sont installés expect (je suppose c'est c'est ce que tu voulais dire par "extract" ?) et c'est assez long de taper les mots de passe à chaque coup, c'est pourquoi j'essaie de faire ça avec expect.
    Comme souligné plus haut, tu te compliques la vie pour rien. Rsync ou scp avec une authentification par clé et tu n'auras plus de mot de passe à taper.

    Avec une préférence pour rsync qui économise de la bande passante en comprimant le transfert (si souhaité) et en ne transférant que les parties de fichiers qui ont changé. C'est l'utilitaire le plus utilisé pour le mirroring.

  6. #6
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    Citation Envoyé par ripat Voir le message
    Comme souligné plus haut, tu te compliques la vie pour rien. Rsync ou scp avec une authentification par clé et tu n'auras plus de mot de passe à taper.
    C'est exactement ce que je voulais dire mais j'ai omis de préciser mon propos en effet car c'est tellement évident quand on a l'habitude...

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 30
    Points : 29
    Points
    29
    Par défaut
    Effectivement je ne connaissais pas le système de clés, je vous ai dit que j'étais un noob

    Donc j'ai fait quelques essais qui marchent bien, mais j'ai un petit souci encore, peut-être que vous avez une idée pour moi. En gros, j'ai des machines sur lesquels je ne peux pas me connecter directement, il faut que je passe par d'autres machine en ssh avant. Mettons que de A (machine physique) je veuille aller à C, en passant par B. Et bien pour ce second ssh, le système de clé ne marche pas bien, ou plutôt le ssh-agent. En effet, j'ai l'impression que comme il y a déjà une session ouverte sur B et donc un processus ssh-agent, il a du mal ensuite à gérer les clés (la commande ssh-add ne marche pas bien par exemple, voire pas du tout). Est-ce que vous auriez une idée (assez simple) pour ce problème ?

  8. #8
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    Citation Envoyé par Bénarès77 Voir le message
    Effectivement je ne connaissais pas le système de clés, je vous ai dit que j'étais un noob
    parce que tu crois qu'on en est ou était pas nous ? Il n'y a pas de honte à demander mais seulement à ne pas demander et faire une bourde.

    Donc j'ai fait quelques essais qui marchent bien, mais j'ai un petit souci encore, peut-être que vous avez une idée pour moi. En gros, j'ai des machines sur lesquels je ne peux pas me connecter directement, il faut que je passe par d'autres machine en ssh avant. Mettons que de A (machine physique) je veuille aller à C, en passant par B. Et bien pour ce second ssh, le système de clé ne marche pas bien, ou plutôt le ssh-agent. En effet, j'ai l'impression que comme il y a déjà une session ouverte sur B et donc un processus ssh-agent, il a du mal ensuite à gérer les clés (la commande ssh-add ne marche pas bien par exemple, voire pas du tout). Est-ce que vous auriez une idée (assez simple) pour ce problème ?
    là c'est juste un usage illogique tu peut utiliser un fichier hosts commun et distribué pour définir l'enssemble de tes machines et donc les accès (et droits) pour éviter les "rebonds" ou mieux encore un DNS

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    192.168.0.2     undertaker.pagnol.net   undertaker
    192.168.0.10    nas.pagnol.net  nas
    192.168.0.20    baccus.pagnol.net       baccus
    192.168.0.100   netbook.pagnol.net netbook marvin marvin.pagnol.net
    192.168.0.254   free.pagnol.net free
    192.168.0.200   thor.pagnol.net thor

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Si je comprends bien tu es dans le schéma suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    machine.a ----- machine.b ----- machine.c
       |                                |
       '-----------|        |-----------'

    J'imagine que le firewall de la machine.c ne te permet pas de t'y connecter directement sans passer par la machine.b qui, elle, y a bien accès.

    Heureusement, ssh permet de faire du "hop tunneling" ou "TCP forwarding".
    Création du tunnel depuis la machine.a (par exemple sur le port 54321)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh -f -L 54321:machine.c:22 machine.b sleep 1800
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    machine.a[54321] ---- [22]machine.b[22] ---- [22]machine.c
                            |            |
                            '------------'
    Pour vérifier si le tunnel fonctionne bien:
    Ensuite simplement (par exemple pour rappatrier un fichier de la machine.c):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsync -av -e "ssh -p 54321" localhost:/chemin/sur/machine.c /rep/local
    Le localhost semble bizarre mais il est indispensable car il est l'entrée du tunnel. Dans la commande de tunneling j'ai mis un timeout de 30 minutes (1800 sec.) pour ne pas à avoir à nettoyer les sockets ouverts.

Discussions similaires

  1. création d'une base de donnée par programme
    Par lassad dans le forum Bases de données
    Réponses: 9
    Dernier message: 18/10/2005, 16h36
  2. Récupérer des données par LDAP
    Par wil4linux dans le forum ASP
    Réponses: 3
    Dernier message: 14/09/2005, 12h11
  3. script de connexion par ssh
    Par black_code dans le forum Modules
    Réponses: 2
    Dernier message: 25/07/2005, 15h10
  4. envoyer des données par l'intermédiaire d'un bouton
    Par mathilde50 dans le forum Access
    Réponses: 26
    Dernier message: 28/10/2004, 16h49
  5. Réponses: 9
    Dernier message: 17/04/2004, 16h32

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