Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 27/02/2010, 10h11   #1
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 249
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 43
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 249
Points : 4 740
Points : 4 740
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 :
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 :
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 :
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 Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels

Dernière modification par troumad ; 27/02/2010 à 10h22.
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 10h57   #2
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
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 :
1
2
3
$ shopt globstar
globstar        on
$
devrait te renvoyer "on". Sinon il faut la forcer:
Code :
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?
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 11h19   #3
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 249
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 43
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 249
Points : 4 740
Points : 4 740
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 :
1
2
3
$ shopt globstar
globstar        on
$
devrait te renvoyer "on". Sinon il faut la forcer:
Code :
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 :
/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 Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 12h01   #4
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
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.
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 12h17   #5
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 249
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 43
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 249
Points : 4 740
Points : 4 740
J'avoue que j'ai un salon cet après-midi cet après midi !
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 14h57   #6
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
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!
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 18h32   #7
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 249
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 43
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 249
Points : 4 740
Points : 4 740
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 :
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.
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 18h53   #8
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
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 ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 20h30   #9
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 249
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 43
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 249
Points : 4 740
Points : 4 740
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 ?
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 20h49   #10
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
un document en ligne (here-document) est introduit par << près duquel on déclare le mot qui le clora :
Code :
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 ?
??
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2010, 20h54   #11
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 249
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 43
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 249
Points : 4 740
Points : 4 740
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 !
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 00h00   #12
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
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?
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 09h43   #13
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 249
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 43
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 249
Points : 4 740
Points : 4 740
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.
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 06h46.


 
 
 
 
Partenaires

Hébergement Web