Script transfert d'info + Expect

Résolu
Bonjour, ^^

voilà je voudrai faire un script qui récupère des fichiers périodiquement sur une machine distante.

Voilà à quoi ressemble ce que j'ai fais :
------------------------------------------------------
#!/bin/sh

# Script de recuperation des dossiers de backup des serveurs

echo "Copy from Zeus";

file=/home/maillon/backup_serveurs

if test -d "$file"
then
cd /home/maillon/backup_serveurs
echo "Le dossier existait deja"
else
mkdir /home/maillon/backup_serveurs
cd /home/maillon/backup_serveurs
echo "Le dossier existe maintenant"
fi

scp -r maillon@zeus:/home/backup/* .
------------------------------------------------------

Seulement je suis obligé de saisir un mot de passe... et donc forcément dans un script automatique ça fait désordre xD ^^

Alors j'ai remplacé la dernière ligne par ça :
-------------------
mon_login="maillon"
mon_passwd="maillon"
echo "$mon_passwd" | scp -r maillon@zeus:/home/backup/* . --stdin $mon_login
------------------
Mais ça ne marche pas, ça m'affiche ça comme message d'erreur :
---------------------------------
[maillon@athena script]$ ./recup_backup.sh
Copy from Zeus
Le dossier existe maintenant
maillon: No such file or directory
[maillon@athena script]$ maillon@zeus's password:
Permission denied, please try again.
maillon@zeus's password:
Permission denied, please try again.
maillon@zeus's password:
Permission denied (publickey,gssapi-with-mic,password).
---------------------------
(dès que j'exécute le script il me met ce bloque en entier sans que je ne saisisse rien)

Alors je suis aller sur cette page et j'ai vu la commande "expect" ssh ecrire un script pour connexion ssh

Seulement j'arrive pas à trouver une documentation complète sur cette commande et donc bah c'est du chinois pour moi. xD

Je pourrais également utiliser une clé ssh mais c'est pas vraiment pratique donc solution à oublier ^^

Est-ce que quelqu'un pourrait m'aider ? ^^

Mici ^^ ;-)
Configuration: Windows XP
Firefox 2.0.0.4

10 réponses

  1. Je réouvre le post car j'arrive pas à comprendre cette ligne :

    expect -gl "\\\[*]*"

    Je ne sais pas du tout ce que fait cette ligne et mes recherches n'ont rien donné...

    Merci.

    Cordialement,
    1. Modérateur
      Salut,

      En fait ici expect utilise des expressions régulières globales ("-gl" en opposition à "-re" expressions régulières de grep) pour définir le prompt à venir :

      un crochet ouvrant
      suivi d'un nombre quelconque de caractères
      puis d'un crochet fermant
      suivi d'un nombre quelconque de caractères.

      http://www.linuxlots.com/~barreiro/spain/expect/expect_tut-3.html#ss3.2
  2. Youpi ça marche et en plus j'ai compris ^^ lol

    Héhé merci jipicy ;-))
    1. Modérateur
      Hé hé, de rien ;-))
  3. Modérateur
    Re-

    Bon pour vérifier l'existence ET la taille de ton fichier, utilise plutôt :
    if [ -e "fich" -a -s "fich" ]; then...; else ...;fi
    Pour la date c'est plus simple ça, non :
    jour=$(date "+%e%B%G")
    Pour l'extension :
    [jp@MDK tmpfs]$ echo $serveur
    MDK
    
    [jp@MDK tmpfs]$ ls
    MDK
    
    [jp@MDK tmpfs]$ if [ -e "$serveur" ]; then mv "${serveur}" "${serveur}.${jour}"; fi
    
    [jp@MDK tmpfs]$ ls
    MDK.21juin2007
    
    [jp@MDK tmpfs]$
    ;-))
    1. Alors voilà mon script presque final ^^

      ----------------------------------------------------------------
      #!/bin/sh

      # Script de recuperation des dossiers de backup des serveurs

      echo "Copy from Zeus";

      file=/home/maillon/backup_serveurs

      if test -d "$file"
      then
      cd /home/maillon/backup_serveurs
      echo "Le dossier existait deja"
      mv /home/maillon/backup_serveurs/* /home/maillon/archives_serveurs/
      else
      mkdir /home/maillon/backup_serveurs
      cd /home/maillon/backup_serveurs
      echo "Le dossier existe maintenant"
      fi

      cd /home/maillon/script/copy_backup_server

      ./expect.exp &

      wait

      cd /home/maillon/backup_serveurs

      var=$(du -b /home/maillon/backup_serveurs | awk -F" " '{ print $1 }')
      size="4096"

      serveur=$(/bin/hostname)

      # Je teste si le dossier est vide ou pas
      if [ "$var" -eq "$size" ]

      then
      echo "pas de copie !!" |mail -s "PAS DE COPIE de sauvegarde réussie depuis $serveur" maillon@ccm.net
      else
      echo "copie réussie" | mail -s "COPIE de sauvegarde réussie depuis $serveur" maillon@ccm.net
      fi
      ----------------------------------------------------------------

      Et le fichier expect.exp :

      #!/usr/bin/expect -f

      spawn scp maillon@zeus:/home/backup/* /home/maillon/backup_serveurs
      expect "password: $"
      send "maillon\n"
      expect "\\$ $"

      J'ai utilisé une méthode assez arcaïque je pense pour tester si le dossier était vide mais j'en ai pas trouvé d'autre donc bon si vous en avez une autre je suis prenneur ^^

      Et par ailleurs est ce que c'est possible de renommer les fichiers qui sont tranférés dans le dossier archives_serveurs en nom_de_fichier (qui change selon les serveurs bien sûr donc je peux pas avoir un nom de fichier fixe).la_date_du_jour

      pour la date du jour j'ai déjà fait ça qui marche :
      jour=$(date | awk -F" " '{ print $3.$2.$6 }')

      Maintenant faut que je trouve un moyen d'ajouter cette "extension" au fichier qui est transféré à chaque fois dans le répertoire archives_serveurs. Donc en fait à chaque fois que le script sera exécuté et qu'il récupérera le fichier de sauvegarde et bien celui déjà existant sera transféré dans un autre dossier et aura l'extention .date.
      Je sais pas si j'ai été bien clair ^^

      En tout cas le script marche là donc pas de souci après c'est juste une optimisation on va dire ^^ Donc merci jipicy et dubcek ;-)
      1. Modérateur
        Re-

        Essaie en lançant ton script "expect" en arrière-plan (&) et en attendant la fin de son exécution (wait) :
        echo "Copy from Zeus";
        
        file=/home/maillon/backup_serveurs
        
        if test -d "$file"
        then
        cd /home/maillon/backup_serveurs
        echo "Le dossier existait deja"
        else
        mkdir /home/maillon/backup_serveurs
        cd /home/maillon/backup_serveurs
        echo "Le dossier existe maintenant"
        fi
        
        cd /home/maillon/script/copy_backup_server
        
        ./expect.exp &
        
        wait
        
        # Éventuellement ici fait un test pour voir si ton fichier a bien été récupéré...
        
        serveur=$(/bin/hostname)
        
        mail -s "COPIE de sauvegarde réussie depuis $serveur" maillon@ccm.net 
        ;-))
        1. En fait j'ai supprimer la ligne "set timeout 3" et là tout à coup bim ça marche ... :-|

          Alors je viens d'essayer ton script et il marche ^^
          Peut etre que avant le "set timeout" il devait y avoir le "force_conservative 1" (comme j'ai pu le voir aussi sur un autre post) mais pourquoi ... mystère ^^

          Par contre :

          donc en fait j'ai mon script shell et à l'intérieur il appelle mon script expect.exp qui fait le transfère de fichier. Seulement je voulais envoyer un mail de confirmation comme quoi la copie à bien été faite donc j'ai fait ça :

          echo "Copy from Zeus";

          file=/home/maillon/backup_serveurs

          if test -d "$file"
          then
          cd /home/maillon/backup_serveurs
          echo "Le dossier existait deja"
          else
          mkdir /home/maillon/backup_serveurs
          cd /home/maillon/backup_serveurs
          echo "Le dossier existe maintenant"
          fi

          cd /home/maillon/script/copy_backup_server

          ./expect.exp

          serveur=$(/bin/hostname)

          mail -s "COPIE de sauvegarde réussie depuis $serveur" maillon@ccm.net

          Seulement en faisant ça le script s'arrete après le ./expect.exp. Je pense qu'il faut que je mette dans le fichier expect.exp un truc du genre "exit". J'ai essayé de mettre eof mais il a pas aimé ^^
          1. Modérateur
            Re-

            Bon je viens de tester chez moi en adaptant un de mes scripts de connexions (ssh + halt) avec la commande "scp" et c'est bien passé...

            Voilà le script en question :
            #!/usr/bin/expect -f
            
            set force_conservative 1 ;
            
            set timeout 3 
            spawn scp jp@mandrake:~jp/tmpfs/fich_mandrake.txt .
            expect "Enter passphrase for key '/home/jp/.ssh/id_dsa':\r"
            send -- "mot_de_passe\r"
            expect -gl "\\\[*]*"
            Voilà d'ailleurs la sortie :
            [jp@MDK rep]$ ./essai_scp.sh
            
            spawn scp jp@mandrake:~jp/tmpfs/fich_mandrake.txt .
            Enter passphrase for key '/home/jp/.ssh/id_dsa':
            fich_mandrake.txt                               100%    0     0.0KB/s   00:00
            
            [jp@MDK rep]$ 
            Essaie de partir de ce script en adaptant à ton cas (la pass-phrase notamment).

            ;-))
            1. Alors j'ai parcouru la doc de expect ^^ (un vrai bordel perso mais bon ^^)

              J'ai fais le script suivant : (j'ai repris un scrip d'un des lien de jipicy pour voir déjà si ça marchait)

              #!/usr/bin/expect -f
              set timeout -1
              spawn scp maillon@zeus:/home/backup/* /home/maillon/bip
              expect "password: $"
              send "maillon\n"
              expect "\\$ $"

              et voici l'erreur qu'il me met :

              [maillon@athena script]$ ./expect.exp
              wrong # args: should be "set varName ?newValue?"
              while executing
              "set timeout -1 # wait until done"
              (file "./expect.exp" line 2)

              Je ne pense pas que le problème vienne du script mais plutôt d'autre part ... si vous avez une idée :-)
              1. Contributeur
                spawn scp maillon@zeus:/home/backup/* /home/maillon/bip

                Je suspecterais la *, une wild card peut poser problème ici.
              2. Modérateur
                @dubcekBen je viens d'essayer et en fait ça passe (enfin chez moi ;-) ) :
                $ ./essai_scp.sh
                
                spawn scp jp@mandrake:~jp/tmpfs/* .
                
                Enter passphrase for key '/home/jp/.ssh/id_dsa':
                
                dossier                                               100%    0     0.0KB/s   00:00
                fich1                                                 100%    0     0.0KB/s   00:00
                fich_mandrake.txt                                     100%    0     0.0KB/s   00:00
                
                $
                ;-))
            2. Merci Encore jipicy ;-)

              Je pense trouver mon bonheur dedans ... (enfin j'espère car comme tu dis la synthaxe n'est pas aisé à comprendre xD).

              Je poste mon script quand j'ai fini ... et surtout tout compris ^^
              1. Modérateur
                Salut,

                Tiens dans un 1er temps essaies de te débrouiller avec ça :
                http://modp.com/release/sshpasswords/
                http://www.oreilly.com/catalog/expect/chapter/ch03.html
                et si l'espagnol ne te rebute pas : http://www.linuxlots.com/~barreiro/spain/expect/

                J'en ai ch**r un max pour faire le script qui est donné dans ton lien et aujourd'hui encore j'avoue avoir beaucoup de mal avec la syntaxe d'expect ;-((

                Bon courage.
                ;-))