Bonjour,

J'ai à réaliser une procédure de validation de transferts de fichiers par FTP qui sera également chargée de réémettre les-dits fichiers en cas de problème.
J'ai donc réalisé un script Bash.
La procédure consiste en:

- Lancer les transferts de fichier avec l'option verbose de la commande ftp et rediriger la sortie standard vers un fichier de log. Les infos de connexion et de transferts sont contenues dans un fichier texte.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
ftp -vin @IP_SRV_FTP < fichier 2>&1 > ftp.log
Le fichier texte:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
user Utilisateur Password
ascii
lcd /dossier
cd /recup
send fichier*
ls
quit
- Faire un ls dans le dossier local et un ls sur le serveur FTP.
- Récupérer et traiter leur contenu afin d'obtenir les noms des fichiers et leurs tailles.
- Tester les tailles des fichiers locaux avec celles des fichiers distants.
- Réémettre ces fichiers si la taille ne correspond pas.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
# ./ftp.sh /dossier/ /dossier/ftp.log
Je passe en paramètre le chemin des fichiers qui ont été envoyés et le chemin du fichier de log du transfert.

Le code:

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
 
#!/bin/bash
# On supprime les fichiers temporaires 
rm -rf /dossier/reemission
rm -rf /dossier/liste_locale
 
# On liste le contenu du répertoire passé en 1er paramètre dans un fichier
# On récupère des lignes de la forme: fichier taille_fichier
 
ls -l $1 | sed '1d'| awk '{printf $9" "}{print $5}' >> /dossier/liste_locale
 
# Pour chaque ligne:
 
cat /dossier/liste_locale | while read line
do
	# On récupère la taille et le nom du fichier des fichiers locaux
 
	nom=`echo $line | cut -d ' ' -f1`
	taille=`echo $line | cut -d ' ' -f2`
 
	# On affecte à deux variables les valeurs de la taille du fichier d'origine et celle du fichier transmis
 
	taille_origine=$(cat $2 | awk '/'$nom'/{printf '$taille'}')
	taille_transferee=$(cat $2 | awk '/'$nom'/{print $5}')
 
	# On teste le contenu des 2 variables. Si différents, alors on ajoute au fichier de réemission
 
	if [ $taille_origine != $taille_transferee ];then
 
		# On teste si le fichier de réemission  est deja crée
 
		if [ ! -f /dossier/reemission ];then
			echo "user Utilisateur Password" >>/dossier/reemission
        		echo "ascii" >>/dossier/reemission
        		echo "cd répertoire_distant" >>/dossier/reemission
			echo "lcd "$1 >>/dossier/reemission 
		fi
		echo "send "$nom >>/dossier/reemission
	fi
done
 
	# On finalise le fichier de reemission une fois les lignes traitées
		echo "quit" >>/dossier/reemission
 
# On réemet les fichiers qui n'ont pas été correctement envoyés
 
ftp -vin @IP_FTP </dossier/reemission 2>&1 >> /dossier/reemission.log

J'ai codé en dur l'adresse FTP du serveur, le login et le mot de passe pour tester.
Le script réalisé fonctionne, mais j'aimerai des avis quant à une éventuelle optimisation et amélioration. De même, s'il est judicieux dans ses tests et traitement de chaînes.

Merci d'avance,