&attach_input |
sftp1 |
put foo |
sftp -b sftp2_input [email protected] |
sftp -b sftp2_input [email protected] |
Leider führt sftp einfach alle Anfragen in der Eingabedatei nacheinander aus, es gibt keinen Mechanismus, um zu testen, ob die Übertragung funktioniert hat oder nicht.
Da Befehlsmakros nicht verwendet werden können, gibt es irgendwelche Alternativen? Das gnu_tools-Produkt wird mit einem Programm namens expect ausgeliefert. Es kann dazu verwendet werden, Befehle zu senden, auf eine beliebige Anzahl verschiedener Antworten zu warten und etwas auf der Grundlage dessen zu tun, was es im Ausgabestrom sieht. Ich bin kein expect-Experte, aber das Skript in Abbildung 6 wird Ihnen den Einstieg erleichtern. Wenn Sie im Internet nach "expect scripts" suchen, werden Sie viele Hinweise finden, die Ihnen helfen werden, mein einfaches Beispiel anzupassen.
# If we get an end-of-file (eof) it means that the sftp process Diese Prozedur führt Übereinstimmungen mit regulären Ausdrücken auf der Suche nach Schlüsselstrings durch.# in der Ausgabe, die von dem ausgeführten Befehl gesammelt wurde. In diesem Fall Ich melde nur die Art des Fehlers, aber es können auch andere Dinge getan werden. # auch. Ich prüfe auch nur auf 2 Fehler. Es gibt noch andere. Sie haben # um sie hinzuzufügen, wenn Sie sie finden. # proc checkforerrors {buf cmd} { if [regexp {.*nicht gefunden} $buf] { puts "$cmd FAILED : not foundnnn" Rückgabe 1 } if [regexp {.*Erlaubnis verweigert} $buf] { puts "$cmd FAILED : Zugriffsproblemennn" Rückgabe 1 } Rückgabe 0 }# Setzen Sie die Zeitüberschreitung auf -1, damit es keine Zeitüberschreitung gibt. Der Standardwert ist 10 Sekunden # und die meisten Dateiübertragungen dauern länger als das. Ich habe beschlossen, keine Timeout, können Sie das ändern. Zeitüberschreitung -1 setzen # sftp starten # auf die sftp-Eingabeaufforderung warten, aber wenn wir eine Authentifizierungsaufforderung erhalten, die mit # Wechseln Sie in ein geeignetes Verzeichnis zum Testen # check for errors aufrufen und alle gesammelten Zeichen an den sendet "put foor" sendet "get barr" senden "quitr" |
expect sftp3.exp Wir haben uns mit dem falschen Server verbunden oder der Server wurde neu geladen.Der Serverschlüssel muss validiert werden, bevor dieses Skript erneut ausgeführt werden kann.ready 10:41:10 |
expect sftp3.exp sftp> get barDie entfernte Datei konnte nicht gefunden werden: No such file or directory Datei "/SysAdmin/Noah_Davids/sftp_test/bar" nicht gefunden. sftp> get bar FAILED : nicht gefundenready 10:42:11 |
Schließlich habe ich in meinem FTP-Blog erwähnt, dass FTP in der Lage war, Dateien zu lesen, die noch geöffnet waren, was gelegentlich dazu führte, dass unvollständige Dateien übertragen wurden. Ich schlug vor, dass das FTP-Makro, wenn es darauf wartet, dass eine Datei an einem Ort erscheint und sie dann überträgt, überprüfen sollte, ob sie nicht mehr gesperrt ist. Das gleiche Problem kann bei SFTP auftreten, und die Lösung ist dieselbe. Sie können die Prüfung der Dateisperre in ein Befehlsmakro einbauen (Abbildung 9) und dann, wenn die Datei nicht mehr gesperrt ist, expect mit dem entsprechenden Skript aufrufen.
&label AGAIN |