Passa al contenuto principale
Molte persone hanno creato processi automatizzati per il trasferimento di file tramite FTP. Ci sono diversi modi per farlo, alcuni migliori di altri. Questo blog discuterà i diversi approcci e individuerà i vantaggi e gli svantaggi di ciascuno di essi. Si parlerà anche di un problema che può portare al trasferimento di file incompleti.
L'approccio più semplice è quello di inserire il vostro ID utente, la password e tutte le vostre richieste FTP in una macro di comando (figura 1) e di eseguirla semplicemente (figura 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

Figura 1 - ftp1.cm - macro comando semplice
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.
Figura 2 - ftp1.cm - esecuzione di una semplice macro di comando
L'attrattiva di questo approccio è che il vostro ID utente e soprattutto la vostra password sono in chiaro come parte della macro. Chiunque abbia accesso alla macro può vederla. Il secondo approccio consiste nell'utilizzare il file .netrc per contenere l'ID utente e la password. (figura 3). La macro di comando (figura 4) comprende poi solo le richieste FTP da eseguire (figura 5).
machine 172.16.1.116
login Noah_Davids
password MYPASSWORD
Figura 3 - File .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
Figura 4 - ftp2.cm - macro di comando senza ID utente e password
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.
Figura 5 - ftp2.cm - esecuzione della macro di comando senza ID utente e password
Il file .netrc funziona solo se il proprietario è l'unico ad avere accesso al file (figura 6). Se qualcun altro ha accesso in lettura (figura 7) non funziona e viene visualizzato il prompt della password (figura 8).
display_access .netrc -all
%phx_vos#m15_mas>SysAdmin>Noah_Davids>.netrc
w  Noah_Davids.*
n  *.*
Figura 6 - ACL corrette su file .netrc
display_access .netrc -all
%phx_vos#m15_mas>SysAdmin>Noah_Davids>.netrc
w  Noah_Davids.*
r  *.CAC
n  *.*
Figura 7 - ACL non corrette su file .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.
Figura 8 - richiesta di password quando .netrc ha le ACL sbagliate
È possibile inserire tutti i comandi nel file .netrc creando una macro FTP. Se la macro si chiama "init" (figura 9) viene eseguita automaticamente dopo il login, questo rende la macro del comando VOS lunga solo 1 riga (figura 10), il comando ftp. Il problema principale di questo approccio è che non vi è alcun recupero degli errori; non è possibile controllare lo stato di una qualsiasi richiesta FTP con la funzione (command_status) (figura 11).
machine 172.16.1.116
login Noah_Davids
password MYPASSWORD
macdef init
put foo
get bar
quit
Figura 9 - File .netrc con macro init
ftp 172.16.1.116
Figura 10 - ftp3.cm - macro se utilizzato con file .netrc contenente la macro init FTP
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.
Figura 11 - ftp3.cm - uscita quando si utilizza la macro init - nessun recupero dell'errore
Molte macro che ho visto solo in loop in attesa che un file appaia in una directory, quando lo fa la macro usa l'FTP per trasferirlo (figura 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
Figura 12 - ftp4.cm - macro in attesa della comparsa di un file e quindi del trasferimento
Il problema di questo approccio è che l'FTP può leggere un file ancora aperto e in fase di scrittura. Per un file di grandi dimensioni o se il vostro tempismo è semplicemente pessimo il risultato sarà che solo una parte del file sarà trasferita (figura 13).
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
Figura 13 - solo una parte del file viene trasferita
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
1234567890
abcdefghij
this is the last record
Figura 14 - file completo
Non è sufficiente controllare se il file esiste, bisogna anche controllare se il file è bloccato (figura 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
Figura 15 - ftp5.cm - verifica che un file sia sbloccato prima di trasferirlo
Quindi il miglior approccio è quello di utilizzare il file .netrc per contenere il proprio ID utente e la password e una macro di comando VOS con la possibilità di controllare il command_status dopo ogni richiesta per controllare le richieste effettive. Anche prima di trasferire un file controllare che non sia bloccato.
Alcuni di voi si interrogano su SFTP; automatizzare i trasferimenti di file con SFTP è completamente diverso e sarà discusso nel mio prossimo blog.

© 2024 Stratus Technologies.