Skip to main content
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
ftp 172.16.1.116
Noah_Davids
MYPASSWORD
put foo
&if (command_status) ^= 226 &then &goto ERROR1
get bar
&if (command_status) ^= 226 &then &goto ERROR2
quit
&
&label ERROR1
..display_line Could not put file
quit
&return
&
&label ERROR2
..display_line Could not get file
quit
&return

Figure 1 - ftp1.cm - macro de commande simple
ftp1
Connected to 172.16.1.116.
220 phx_vos-m16 FTP server (FTP 1.0 for Stratus STCP) ready. (Compatible with OS
+ TCP/IP)
User (172.16.1.116:Noah_Davids): 331 Password required for nd.
Password:
230 User Noah_Davids.CAC logged in.
200 PORT command successful.
150 Opening data connection for foo (172.16.1.34,49253)0.
226 Transfer complete.
80 bytes sent in 0.01 seconds (6.85 Kbytes/sec)
200 PORT command successful.
550 bar: No such file or directory.
recvrequest: Bad file number.
Get transfer did not complete
Could not get file
221 Goodbye.
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
login Noah_Davids
password MYPASSWORD
Figure 3 - Fichier .netrc
&attach_input
ftp 172.16.1.116
put foo
&if (command_status) ^= 226 &then &goto ERROR1
get bar
&if (command_status) ^= 226 &then &goto ERROR2
quit
&
&label ERROR1
..display_line Could not put file
quit
&return
&
&label ERROR2
..display_line Could not get file
quit
&return
Figure 4 - ftp2.cm - macro de commande sans ID utilisateur et mot de passe
ftp2
Connected to 172.16.1.116.
220 phx_vos-m16 FTP server (FTP 1.0 for Stratus STCP) ready. (Compatible with OS
+ TCP/IP)
331 Password required for nd.
230 User Noah_Davids.CAC logged in.
200 PORT command successful.
150 Opening data connection for foo (172.16.1.34,49256)0.
226 Transfer complete.
80 bytes sent in 0.04 seconds (2.09 Kbytes/sec)
200 PORT command successful.
550 bar: No such file or directory.
recvrequest: Bad file number.
Get transfer did not complete
Could not get file
221 Goodbye.
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.*
n  *.*
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.*
r  *.CAC
n  *.*
Figure 7 - Listes de contrôle d'accès incorrectes dans le fichier .netrc
ftp2
Connected to 172.16.1.116.
220 phx_vos-m16 FTP server (FTP 1.0 for Stratus STCP) ready. (Compatible with OS
+ TCP/IP)
User (172.16.1.116:Noah_Davids): 331 Password required for put foo.
Password:
530 Login incorrect.
Login failed.
221 Goodbye.
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
login Noah_Davids
password MYPASSWORD
macdef init
put foo
get bar
quit
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
Connected to 172.16.1.116.
220 phx_vos-m16 FTP server (FTP 1.0 for Stratus STCP) ready. (Compatible with OS
+ TCP/IP)
331 Password required for nd.
230 User Noah_Davids.CAC logged in.
put foo
200 PORT command successful.
150 Opening data connection for foo (172.16.1.34,49276)0.
226 Transfer complete.
80 bytes sent in 0.01 seconds (9.52 Kbytes/sec)
get bar
200 PORT command successful.
550 bar: No such file or directory.
recvrequest: Bad file number.
Get transfer did not complete
quit
221 Goodbye.
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
&if (exists new_file) = 1 &then &goto FTP
display_line No new_file as of (time)
sleep -seconds 15
&goto AGAIN
&
&
&label FTP
ftp 172.16.1.116
put new_file
&if (command_status) = 226 &then ..display_line OK
&else &do
..display_line
..display_line ERROR
..display_line
&end
quit
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
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
Figure 13 - seule une partie du dossier est transférée
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
this is the last record
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
&label AGAIN
&if (exists new_file) = 1 & (locked new_file) = 0 &then &goto FTP
display_line new_file not ready for transfer as of (time)
sleep -seconds 15
&goto AGAIN
&
&
&label FTP
ftp 172.16.1.116
put new_file
&if (command_status) = 226 &then ..display_line OK
&else &do
..display_line
..display_line ERROR
..display_line
&end
quit
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.

2024 Stratus Technologies.