&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
Sfortunatamente, sftp si limiterà ad eseguire tutte le richieste nel file di input una dopo l'altra, non c'è un meccanismo per testare se il trasferimento ha funzionato o meno.
Poiché le macro di comando non possono essere utilizzate, ci sono alternative? Il prodotto gnu_tools viene fornito con un programma chiamato expect. Può essere usato per inviare comandi, attendere un numero qualsiasi di risposte diverse e fare qualcosa in base a ciò che vede nel flusso di uscita. Non sono un esperto di expect, ma lo script in figura 6 vi aiuterà ad iniziare. Se cercate sul web gli "script di attesa" troverete molti riferimenti che vi aiuteranno a personalizzare il mio semplice esempio.
# If we get an end-of-file (eof) it means that the sftp process # Questa procedura fa corrispondere l'espressione regolare alla ricerca di stringhe di tasti# nell'output raccolto dal comando che è stato eseguito. In questo caso # Sto solo segnalando il tipo di errore, ma altre cose si possono fare # Anche... # Inoltre, controllo solo 2 errori. Ce ne sono altri. Avrete # per aggiungerli come li trovi. # proc checkforerrors {buf cmd} { se [regexp {.*non trovato} $buf] { mette "$cmd FALLITO: non trovato". ritorno 1 } se [regexp {.*Permissione negata} $buf] { mette "$cmd FAILED : problemi di accesso". ritorno 1 } ritorno 0 }# impostare il timeout a -1 in modo che non ci sia timeout. Il valore predefinito è 10 secondi # e la maggior parte dei trasferimenti di file richiede più tempo. Ho deciso di impostare no # Timeout, puoi cambiarlo. # impostare il timeout -1 # inizia sftp # attendere il prompt di sftp ma se otteniamo un prompt di autenticazione, che termina con # cambiare in una directory comoda per i test # chiama il controllo degli errori passandogli tutti i caratteri raccolti fino al inviare "mettere foor" inviare "ottenere barr" invia "quitr". |
expect sftp3.exp Ci siamo collegati al server sbagliato o il server è stato ricaricato.La chiave del server deve essere convalidata prima che questo script possa essere eseguito di nuovo.ready 10:41:10 |
expect sftp3.exp sftp> get barNon sono riuscito a stabilire un file remoto: Nessun file o directory di questo tipo File "/SysAdmin/Noah_Davids/sftp_test/bar" non trovato. sftp> get bar FAILED : non trovato già 10:42:11 |
Infine, nel mio blog FTP ho accennato al fatto che l'FTP era in grado di leggere i file ancora aperti e questo a volte ha portato al trasferimento di file incompleti, ho suggerito che se la macro FTP aspetta che un file appaia in un luogo e poi lo trasferisce, la macro dovrebbe controllare per essere sicura che non sia più bloccata. Lo stesso problema può verificarsi con SFTP e la soluzione è la stessa. È possibile inserire il controllo di blocco del file in una macro di comando (figura 9) e poi, quando il file non è più bloccato, la chiamata aspettarsi con lo script appropriato.
&label AGAIN |