Beaucoup de gens ont créé des processus automatisés pour transférer des fichiers par FTP. Il existe plusieurs façons de le faire, certaines meilleures que d'autres. Ce blog discutera des différentes approches et identifiera les avantages et les inconvénients de chacune. Il abordera également une question qui peut entraîner le transfert de fichiers incomplets.
L'approche la plus simple consiste à placer votre nom d'utilisateur, votre mot de passe et toutes vos demandes FTP dans une macro de commande (figure 1) et à l'exécuter (figure 2).
&attach_input |
Figure 1 - ftp1.cm - macro de commande simple
ftp1 |
Figure 2 - ftp1.cm - exécution d'une macro de commande simple
L'inconvénient de cette approche est que votre nom d'utilisateur et, surtout, votre mot de passe sont en clair dans le cadre de la macro. Toute personne ayant accès à la macro peut le voir. La deuxième approche consiste à utiliser le fichier .netrc pour conserver votre nom d'utilisateur et votre mot de passe. (figure 3). La macro de commande (figure 4) ne contient alors que les demandes FTP à exécuter (figure 5).
machine 172.16.1.116 |
Figure 3 - Fichier .netrc
&attach_input |
Figure 4 - ftp2.cm - macro de commande sans ID utilisateur et mot de passe
ftp2 Connected to 172.16.1.116. |
Figure 5 - ftp2.cm - exécution d'une macro de commande sans ID utilisateur et mot de passe
Le fichier .netrc ne fonctionne que si son propriétaire est le seul à y avoir accès (figure 6). Si quelqu'un d'autre a un accès en lecture (figure 7), il ne fonctionnera pas et une invite de mot de passe s'affichera (figure 8).
display_access .netrc -all %phx_vos#m15_mas>SysAdmin>Noah_Davids>.netrc w Noah_Davids.* |
Figure 6 - Listes de contrôle d'accès correctes dans le fichier .netrc
display_access .netrc -all %phx_vos#m15_mas>SysAdmin>Noah_Davids>.netrc w Noah_Davids.* |
Figure 7 - Listes de contrôle d'accès incorrectes dans le fichier .netrc
ftp2 |
Figure 8 - Invite de mot de passe lorsque le .netrc a les mauvaises LCA
Vous pouvez placer toutes les commandes dans le fichier .netrc en créant une macro FTP. Si la macro est nommée "init" (figure 9), elle est exécutée automatiquement après la connexion, ce qui fait que la macro de commande VOS ne fait qu'une ligne de long (figure 10), la commande ftp. Le problème majeur de cette approche est qu'il n'y a pas de récupération d'erreur ; vous ne pouvez pas vérifier l'état d'une des requêtes FTP avec la fonction (command_status) (figure 11).
machine 172.16.1.116 |
Figure 9 - Fichier .netrc avec macro init
ftp 172.16.1.116 |
Figure 10 - ftp3.cm - macro lorsqu'elle est utilisée avec un fichier .netrc contenant une macro FTP init
ftp3 |
Figure 11 - ftp3.cm - sortie lors de l'utilisation de la macro init - pas de récupération d'erreur
Beaucoup de macros que j'ai vues ne font que boucler en attendant qu'un fichier apparaisse dans un répertoire, quand elles le font la macro utilise le FTP pour le transférer (figure 12).
&attach_input &label AGAIN |
Figure 12 - ftp4.cm - macro attendant l'apparition d'un fichier puis son transfert
Le problème de cette approche est que le FTP peut lire un fichier qui est encore ouvert et en cours d'écriture. Pour un gros fichier ou si votre timing est mauvais, le résultat sera que seule une partie du fichier sera transférée (figure 13).
1234567890 |
Figure 13 - seule une partie du dossier est transférée
1234567890 |
Figure 14 - Dossier complet
Il ne suffit pas de vérifier si le fichier existe, vous devez également vérifier si le fichier est verrouillé (figure 15).
&attach_input |
Figure 15 - ftp5.cm - vérifier qu'un fichier est déverrouillé avant de le transférer
La meilleure approche est donc d'utiliser le fichier .netrc qui contient votre nom d'utilisateur et votre mot de passe ainsi qu'une macro de commande VOS permettant de vérifier le statut de la commande après chaque demande afin de contrôler les demandes réelles. Avant de transférer un fichier, vérifiez également qu'il n'est pas verrouillé.
Certains d'entre vous s'interrogent sur le SFTP ; l'automatisation des transferts de fichiers avec le SFTP est complètement différente et sera abordée dans mon prochain blog.