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

Vue hybride

troumad bash : script pour ftp 27/02/2010, 10h11
jmelyn Bonjour, Je n'ai pas... 27/02/2010, 10h57
troumad J'avoue voir ici des choses... 27/02/2010, 11h19
jmelyn Sur ma configuration... 27/02/2010, 12h01
troumad J'avoue que j'ai un salon cet... 27/02/2010, 12h17
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    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
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre émérite 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
    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 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    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 !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Membre émérite 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
    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 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    J'avoue que j'ai un salon cet après-midi cet après midi !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Membre émérite 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
    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!

+ 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, 17h08
  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, 14h21
  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, 09h11
  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, 14h02
  5. script perl pour ftp
    Par donny dans le forum Modules
    Réponses: 5
    Dernier message: 29/09/2006, 12h02

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