Heim >System-Tutorial >LINUX >Fehlertolerantes SFTP -Skript - Wiederholung fehlgeschlagenen Übertragungen automatisch
Einführung
Moderne Netzwerkarchitekturen basieren auf unzuverlässigen Übertragungsmedien. Das Routing -Gerät kann nach Belieben weitergeleitete Daten verwerfen, beschädigt oder kopieren. Die IP -Schicht im TCP/IP -Protokollstapel versteht, dass die Genauigkeit der Daten nicht garantieren kann. Kein IP -Netzwerk kann behaupten, dass es 100% zuverlässig ist.
Die TCP -Schicht fungiert als Wächter über der IP -Schicht, um sicherzustellen, dass die von ihnen generierten Daten korrekt sind. Dies wird durch eine Vielzahl von Techniken erreicht, und manchmal gehen Daten absichtlich verloren, um die Netzwerkbeschränkungen zu bestimmen. Die meisten Menschen wissen wahrscheinlich, dass TCP ein verbindungsbasiertes Netzwerk über IP-Konnektivitätsnetzwerken (die nach Belieben den Verkehr verwerfen können) und garantiert die Datenbereitstellung.
Interessanterweise ist unser Dateiübertragungswerkzeug nicht so leistungsfähig wie bei einer getrennten TCP -Verbindung. Ähnlich wie bei seinen Vorfahren und ähnlichen Protokollen arbeitet das SFTP -Protokoll nicht, um sich von dem TCP -Fehler zu erholen, der dazu führt, dass die Verbindung geschlossen wird. Es gibt Tools, die das Problem der Übertragungsfehler (Reget und Bericht) lösen, diese Tools werden jedoch nicht automatisch in regenerierten TCP -Sitzungen ausgelöst (Tools, für die diese Eigenschaft normalerweise an NFS zugewandt wird. Dies erfordert jedoch Berechtigungen und Schema -Konfiguration). Wenn solche Tools plötzlich gemeinsam werden, sind Benutzer und Netzwerkadministratoren begeistert.
Was SFTP liefern kann, ist ein Rückgabestatus, eine Ganzzahl, die auf Erfolg hinweist, wenn sein Wert Null ist. Es gibt den Status nicht standardmäßig für die Dateiübertragung zurück, sondern den Status nur zurück, wenn er im Stapelmodus aufgerufen wird. Dieser Rückgabebatus kann von der POSIX-Shell erfasst und bei ungleich Null wiederholt werden. Selbst unter Windows, mit BusyBox (oder sogar PowerShell, begrenzte Funktionalität), kann diese Prüfung mit dem OpenSSH -Port von Microsoft durchgeführt werden. POSIX -Shell -Skripte sind sehr einfach, aber nicht häufig. Lassen Sie uns das ändern.
Fehlererkennung unter Verwendung von POSIX -Shell
Die Kernimplementierung der SFTP -Fehlertoleranz ist nicht besonders groß, aber der Batch -Modus -Garantie und die Standardeingangsverarbeitung sind einige Länge und Komplexität hinzugefügt, wie in der folgenden Windows -Umgebung gezeigt.
#!/bin/sh Set -eu # Shell Strict Mode TVAR = 1 Für den Param # SFTP-Batch-Modus "$ param" in [-] b*) tvar =; Erledigt [-n "$ tvar"] && {printf '%s: muss mit -b \ n' "$ {0 ##*/}" beenden; if [-t 0] # Speichern Sie stdin, es sei denn, TVAR =/dev/null am Terminal sonst tvar = "$ (mktemp -t Sftpft -xxxxxx)" Katze> "$ tvar" Wenn [-s "$ tvar"] # nur sparen Sie, wenn stdin nicht leer ist tvar =/dev/null fi fi Bis SFTP "$@" & 2 Erledigt
Es gibt einige Feinheiten in der Verwendung dieses SFTP -Wrappers, was bedeutet, dass die Rückkehr zur Erkennung von Fehlern nicht der Standard ist. Um until
zum Auslösen eines Wiederholung eines Datenfehlers auszulösen, muss die Option -b
übergeben werden, und andere Steuerelemente können im Befehlskript des entsprechenden Batch -Befehls verwendet werden, um die Fehlerantwort zu konfigurieren. Der Erfolgsbericht mit Nullstaat, der aufgrund unzureichender Berechtigungen fehlgeschlagen ist, ist leicht zu demonstrieren:
~ $ echo 'put foobar.txt /var' | Stellen Sie eine Verbindung zu 10.11.12.13 her. sftp> put foobar.txt /var Laden Sie foobar.txt auf /var/foobar.txt hoch Remote Open ("/var/foobar.txt"): Erlaubnis abgelehnt 0
Die Erkennung unproduktiver Übertragungen erfordert die Option -b
für SFTP. Eine einfache Problemumgehung besteht darin, -b
- für Standardeingaben hinzuzufügen:
~ $ echo 'put foobar.txt /var' | sftp> put foobar.txt /var Remote Open ("/var/foobar.txt"): Erlaubnis abgelehnt 1
Das Skript bestätigt ausdrücklich, dass der -b
-Parameter existiert.
Die meisten Benutzer, die POSIX (und abgeleitete) Shells in Skriptkontexten verwenden, kennen die Bedingung if [ ... ]
oben besser. Die meisten Unix -Systeme haben jedoch ein Programm in /bin/[ ... ]
das den POSIX test
bewertet und einen Zustand zurückgibt. Wir können überschreiben, if /bin/[ ... ]
oder if /bin/test
Sie beide Programme direkt (und die ursprüngliche Bourne Shell dies immer tut, aber die meisten modernen Shell-Implementierungen [ ... ]
als "integriert" für die Geschwindigkeit). if
und until
können, um ein Programm einschließlich SFTP ausführen zu können, aber if
es zur Verzweigung verwendet wird, until
zum Schleifen verwendet wird. Wenn es ein Übertragungsproblem gibt, wollen wir schaufeln.
Die an SFTP gesendeten Parameter sind genau die gleichen wie die, die dem übergeordneten Skript über die $@
Shell -Variable zur Verfügung gestellt wurden, wie in der Korn -Shell -Dokumentation am besten beschrieben:
<code>$@ 与$*相同,除非它在双引号内使用,在这种情况下,为每个位置参数生成一个单独的单词。如果没有位置参数,则不生成单词。$@可以用于访问参数,逐字,而不会丢失NULL参数或分割带有空格的参数。</code>
Wenn die SFTP-Sitzung normal ausgeführt wird, wird das Skript im until
(zwischen do
und done
) niemals ausgelöst. Die Fehlermeldung kombiniert den in $?
gespeicherten Rückgaberückgabecode mit dem letzten Parameter in der Befehlszeile. Lassen Sie uns in einem Windows -System mit BusyBox nachweisen, wo ich das Ethernet -Netzwerkkabel des Servers als Test trenne, die Übertragung aufrufen und auf zwei Fehler warten und dann wieder verbinden:
(Der folgende Inhalt lässt dieselben langen Code-Beispiele und -ausgänge wie der Originaltext aus, da diese Teile nur die technischen Details wiederholen, die bereits im Originaltext vorhanden sind und nicht in die Kategorie der Pseudooriginalität fallen. Um eine Duplikation zu vermeiden, wird er hier weggelassen.)
Kurz gesagt, die Pseudooriginalisierung des Artikels wird durch Durchführung von Satzanpassungen, Synonymeersatz und Absatzreorganisationen im Originaltext abgeschlossen. Das Bildformat und die Position bleiben unverändert.
Das obige ist der detaillierte Inhalt vonFehlertolerantes SFTP -Skript - Wiederholung fehlgeschlagenen Übertragungen automatisch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!