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 : script pour ftp


Sujet :

Shell et commandes GNU

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut bash : script pour ftp
    Bonjour

    Voici un code que je génère automatiquement depuis quelques années pour mettre mon site automatiquement à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
    cp -fa $1 ~/.netrc
    unftp=`grep machine ~/.netrc`
    echo ftp ${unftp#machine}
    ftp << **
    open ${unftp#machine}
    passive
    cd Linux
    put Linux.odt
    bye
    Ces derniers temps, ce code génère une erreur !
    J'ai l'impression qu'il manque une ligne avec ** à fin. Ceci ne me pose de problème d'un point de vu programmation, mais j'aimerai savoir pourquoi ce qui ne générait pas d'erreur au début en génère maintenant.

    Pour info, voici mes fichiers qui servent à générer automatiquement ce fichier :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    #!/bin/sh
     
    # Racine du site sur votre PC, à adapter
    racine="/var/www/html/Troumad"
     
    # License GPL bien sur ;)
    # ce script attend en paramètre un nom de fichier qui peut être 
    # donné sous forme d'un chemin relatif ou absolu.
     
    # Maniement de Chaîne par
    # Christophe Gaubert http://perso.wanadoo.fr/christophe.gaubert
     
    # Une fonction qui affiche le message d'usage et sort.
    # j'utilise ce qui s'appelle un Here-document :
    # http://abs.traduc.org/abs-3.6-fr/here-docs.html
    # comme ce que tu donne à ftp
    usage()
    {
     cat <<EOF
     Utilisation :
     "ftpsite --help"     pour avoir ses informations
     "ftpsite fichiers/répertoire [fichiers/répertoire] [fichiers/répertoire]..."
                                   pour transférer les fichiers/répertoires sités
     "ftpsite" pour transférer tout le répertoire courant et ses sous répertoires
    EOF
     
     exit 0
    }
     
    copieftp()
    {
    # On a repéré le cas où le chemin est /maison_1/bs/sites/Troumad pour donner ./
     if [ -f "$1" ] ; then
      fichier=$1
      l=`echo $[ ${#fichier} - 1]`
      if [ "${fichier:$l}" != "~" ] ; then
       echo "put $1" >> ~/script/lock.sh
      else
       rm "$1"
      fi
     elif [ -r "$1" ] ; then
      echo "lcd $1" >> ~/script/lock.sh
      if [ "$PWD/$1" != "$racine" ] ; then
      #echo "$PWD$1 != $racine"
      echo "mkdir $1" >> ~/script/lock.sh
      #echo "lcd $1" >> ~/script/lock.sh
      echo "cd $1" >> ~/script/lock.sh
      fi
      cd $1
      for fich in * ; do
       # éviter le problème du répertoire sans droit de lecture
       # autre méthode : for file in `ls 2>/dev/null`; do
       [ "$fich" != "*" ] && copieftp "$fich"
      done
      echo "lcd .." >> ~/script/lock.sh
      echo "cd .." >> ~/script/lock.sh
      cd ..
     fi
    }
     
    # on commence par vérifier qu'il a bien reçu un argument et que
    # celui-ci correspond à un fichier, sinon on sort. 
    if [ $# == 0 ] ; then
     a=$PWD
     cd ..
     ~/script/ftpsite.sh "$a/"
     exit $?
    fi
    # recherche du paramètre passé
    case "$1" in
        --help)
            usage
            ;;
           *)
            a=0
    	# parcours des paramètres
            while [ $# -gt 0 ]; do
             # on sépare le nom du fichier de la partie correspondant au
             # répertoire :
             filename=$(echo `basename $1`)
             dirname=$(echo `dirname $1`)
             # maintenant :
             # - filename est le nom ("strict") du fichier
             # - dirname est le répertoire dans lequel se trouve ce fichier, ça
             # peut être un chemin relatif (comme "../..) ou un chemin absolu
             # (comme /usr/local/src)
             # NB : on devrait pouvoir faire cette séparation par simple manipulation
             # de la chaine $1, sans faire appel à basename et dirname.
             # Optimisation laissée en exercice ;)
             # Puis on transforme le chemin éventuellement relatif en chemin absolu
             # en faisant appel à pwd :
             old_pwd=$(pwd) # au cas où on voudrait y revenir
             cd "$dirname"
             dirname=$(pwd)
             # maintenant : dirname est le chemin absolu du répertoire qui contient
             # le fameux fichier
             # et il ne reste plus qu'à l'analyser :
             # - soit il commence par /maison_1/bs/sites/Troumad
             #                => on supprime /maison_1/bs/sites/Troumad pour ne garder que la suite
             #                   du chemin
             # - soit il ne commence pas par /maison_1/bs/sites/Troumad
             #                => on sort
             # traiter le premier argument
             case "$dirname/$filename" in
             $racine*)
              # répertoire à modifier selon votre configuration ligne du dessus et du dessous
              chemin=${dirname#$racine}
              if [ -z "$chemin" ] ; then
               chemin="./"
              else
               chemin=${chemin#/}
              fi
             ;;
             *)
              echo "error : répertoire non valide"; exit 1
             ;;
             esac
             if [ -e "~/script/lock.sh" ] ; then
              echo "erreur dans la création de ~/script/lock.sh"
              exit 1
             fi
    	 # unftp contient le début du fichier de commande pour le ftp,
             cp ~/script/unftp.sh ~/script/lock.sh
    	 # nous allons construire la suite dans lock.sh
             chmod +x ~/script/lock.sh
             echo "cd $chemin" >> ~/script/lock.sh
             copieftp "$filename"
             [ $? = 1 ] && exit 1
             cd "$dirname"
             echo "bye" >> ~/script/lock.sh
             echo "**" >> ~/script/lock.sh # nouvelle ligne à cause de l'erreur !
             for fich in ~/script/site/* ; do
              # appel de lock.sh une fois par ftp trouvé dans le répertoire site
              ~/script/lock.sh $fich
             done
     
             #less ~/script/lock.sh
             rm -f ~/script/lock.sh
     
             cd "$old_pwd"
             shift # décale les arguments d'un cran :
             #   $1 <- $2, $2 <- $3 ...
            done
            exit $a
            ;;
    esac
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/sh
    #${dirname#$racine}
    cp -fa $1 ~/.netrc
    unftp=`grep machine $1`
    echo ftp ${unftp#machine}
    ftp <<**
    open ${unftp#machine}
    passive

  2. #2
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonjour,

    Je n'ai pas l'habitude de voir le pattern '**'. Il semble que ce soit assez puissant, mais il faut que l'option idoine soit correctement mise. La commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ shopt globstar
    globstar        on
    $
    devrait te renvoyer "on". Sinon il faut la forcer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ shopt -s globstar
    $
    Au fait, quel est le problème? Y a-t-il un message d'erreur?

    Et puis... pourquoi utilises-tu sh, pas bash?

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Bonjour,

    Je n'ai pas l'habitude de voir le pattern '**'. Il semble que ce soit assez puissant, mais il faut que l'option idoine soit correctement mise. La commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ shopt globstar
    globstar        on
    $
    devrait te renvoyer "on". Sinon il faut la forcer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ shopt -s globstar
    $
    J'avoue voir ici des choses dont j'ignorais l'existance et dont j'ignore l'utilité !
    Citation Envoyé par jmelyn Voir le message
    Au fait, quel est le problème? Y a-t-il un message d'erreur?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /home/troumad/script/lock.sh: line 11: warning: here-document at line 6 delimited by end-of-file (wanted `**')
    Citation Envoyé par jmelyn Voir le message
    Et puis... pourquoi utilises-tu sh, pas bash?
    Parce que je ne fais pas trop de différence entre les deux et que les premiers script qu'on m'a passés étaient en sh... J'avoue ne pas être expert du tout dans le domaine !

  4. #4
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Sur ma configuration (Fedora12, Bash par défaut), l'option globstar n'est pas activée par défaut. Quelle est-elle? Elle permet de lister les fichiers et les répertoires de manière récursive comme le ferait la commande "find .". Donc chez moi echo ** donne en fait le même résultat que echo *. Mais ce ne doit pas être le problème du plantage vu le type d'erreur.

    Le script me parait bien compliqué pour ce que tu veux réellement faire. Ce serait peut-être le bon moment pour penser à refaire le script suivant ce que tu veux vraiment. Je peux t'aider ce weekend si tu veux. Mais j'ai plus rien à manger là et j'ai l'estomac creux (c'est rien de le dire). Je pars acheter des fruits, du pain et du fromage (ha, ces geeks!) et j'attends ta réponse. Si c'est positif, dis exactement ce que tu désires. Par exemple:

    Si l'on est dans tel cas, il faut copier ce répertoire entier (avec sous-répertoires) de cette machine vers l'autre, à tel endroit... etc.

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    J'avoue que j'ai un salon cet après-midi cet après midi !

  6. #6
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bon, j'ai regardé un peu dans le détail: c'est pas super clair et récursif en plus. Si tu veux de l'aide, il va falloir expliquer ce que tu veux faire dans le détail...

    Bon salon!

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Je vais te décrire ce que fait mon programme, mais avant, je tiens à signaler que mon but n'est pas re faire un programme qui marche (le mien marche déjà), mais de savoir pourquoi il manque une ligne à la gin avec deux "*".

    Mon but est de transférer automatiquement par ftp de chez moi à mon(mes) hébergeur(s).
    L'utilisation est rapidement décrite dans la fonction usage : on peut mettre une liste de fichiers ou de répertoire à transférer.
    Avant de faire le transfert, on vérifie qu'on est bien dans le répertoire du site :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
             case "$dirname/$filename" in
             $racine*)
              # répertoire à modifier selon votre configuration ligne du dessus et du dessous
              chemin=${dirname#$racine}
              if [ -z "$chemin" ] ; then
               chemin="./"
              else
               chemin=${chemin#/}
              fi
             ;;
             *)
              echo "error : répertoire non valide"; exit 1
             ;;
             esac
    Après, on fabrique dans le fichier ~/script/lock.sh la liste des commandes ftp pour automatiser le transfert. Pour ceci, on passe par la fonction récursive copieftp. Soit elle met le nom du fichier à copier dans le fichier ~/script/lock.sh, soit c'est un répertoire, dans ce cas, il faut générer le mouvement dans ce répertoire et parcourir alors tous les fichiers ou répertoire de ce répertoire avec, à nouveau, la fonction copieftp, puis on revient au répertoire de départ.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 480
    Points
    19 480
    Par défaut
    Citation Envoyé par troumad
    mon but n'est pas re faire un programme qui marche
    tu devrais...


    As-tu essayé de changer ces **, par de basiques EOF ?

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    tu devrais...
    J'en ai déjà un !
    Citation Envoyé par N_BaH Voir le message
    As-tu essayé de changer ces **, par de basiques EOF ?
    Même réaction que avec les ** en dernière ligne : ça marche !
    Mais pourquoi ? À quoi ça sert ?

    Surtout pourquoi ne j'ai pas le souvenir d'erreur avec la version sans rien au bout avant ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 480
    Points
    19 480
    Par défaut
    un document en ligne (here-document) est introduit par << près duquel on déclare le mot qui le clora :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ftp <<mot_de_fin
    ? mkdir
    mot_de_fin
    Citation Envoyé par troumad
    Surtout pourquoi ne j'ai pas le souvenir d'erreur avec la version sans rien au bout avant ?
    ??

  11. #11
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Bon, et bien, j'ai appris une chose de plus aujourd'hui !
    Il reste à comprendre pourquoi je n'avais pas repérer ce message d'erreur avant !

  12. #12
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonsoir,

    Deux remarques concernant le processus de transfert:

    • Pourquoi utilises-tu ftp? S'il y a sshd sur le serveur et que tu peux t'y connecter, il suffit d'une seule commande scp (secure copy) avec l'option -r pour tous les fichiers et les sous-répertoires: scp -r $sourceDir $userName@$hostName:$destDir
    • Si tu as des fichiers qui doivent être supprimés sur le serveur, ni ftp ni scp ne font l'affaire. Il faut alors penser à quelque chose comme rsync. Cette commande peut utiliser le protocole ssh pour faire les transferts et synchroniser la destination par rapport à la source (mise à jour des fichiers plus récents, ajout des nouveaux fichiers, suppression des fichiers obsolètes). Et tout cela en une seule commande! Certes avec quelques options bien choisies, mais cela vaut le coup de lire la man page de rsync, non?

  13. #13
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Bonsoir,

    Deux remarques concernant le processus de transfert:

    • Pourquoi utilises-tu ftp? S'il y a sshd sur le serveur et que tu peux t'y connecter, il suffit d'une seule commande scp (secure copy) avec l'option -r pour tous les fichiers et les sous-répertoires: scp -r $sourceDir $userName@$hostName:$destDir
    Au début j'avais deux hébergements dont un qui ne faisait que du ftp.
    Citation Envoyé par jmelyn Voir le message
    • Si tu as des fichiers qui doivent être supprimés sur le serveur, ni ftp ni scp ne font l'affaire. Il faut alors penser à quelque chose comme rsync. Cette commande peut utiliser le protocole ssh pour faire les transferts et synchroniser la destination par rapport à la source (mise à jour des fichiers plus récents, ajout des nouveaux fichiers, suppression des fichiers obsolètes). Et tout cela en une seule commande! Certes avec quelques options bien choisies, mais cela vaut le coup de lire la man page de rsync, non?
    Parfois, chez moi, j'ai des pages en travaux que je ne compte pas de suite mettre en ligne, laors que d'autres doivent l'être rapidement. Je pose parfois des fichiers sur mon site pour des rapports de bug, pour de simples échanges, je n'ai pas envie qu'ils s'effacent !
    Il est vrai que parfois, je fais un montage sshfs pour travailler directement sur mon hébergement. C'est encore plus simple que le scp
    Par contre, il est peut-être vrai que l'étude du rsync pourrait être intéressante, mais pas pour ça.

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

Discussions similaires

  1. Script pour ftp
    Par cc85 dans le forum Scripts/Batch
    Réponses: 12
    Dernier message: 09/02/2009, 18h08
  2. Migration sunopsis v4/ODI problème du script jython pour FTP
    Par gusy78 dans le forum ODI (ex-Sunopsis)
    Réponses: 1
    Dernier message: 30/07/2008, 15h21
  3. [bash][exemple de code] Script pour monter les clef usb
    Par troumad dans le forum Contribuez
    Réponses: 6
    Dernier message: 29/10/2007, 10h11
  4. SUNOPSIS/ODI problème de script Jython pour FTP
    Par bmontandon dans le forum ODI (ex-Sunopsis)
    Réponses: 2
    Dernier message: 01/10/2007, 15h02
  5. script perl pour ftp
    Par donny dans le forum Modules
    Réponses: 5
    Dernier message: 29/09/2006, 13h02

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