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 |
Figura 1 - ftp1.cm - macro comando semplice
ftp1 |
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 |
Figura 3 - File .netrc
&attach_input |
Figura 4 - ftp2.cm - macro di comando senza ID utente e password
ftp2 Connected to 172.16.1.116. |
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.* |
Figura 6 - ACL corrette su file .netrc
display_access .netrc -all %phx_vos#m15_mas>SysAdmin>Noah_Davids>.netrc w Noah_Davids.* |
Figura 7 - ACL non corrette su file .netrc
ftp2 |
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 |
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 |
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 |
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 |
Figura 13 - solo una parte del file viene trasferita
1234567890 |
Figura 14 - file completo
Non è sufficiente controllare se il file esiste, bisogna anche controllare se il file è bloccato (figura 15).
&attach_input |
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.