Wie bekommt man eine Datei auf einen Host, wenn man nur eine serielle Konsole hat?

Wie bekommt man eine Datei auf einen Host, wenn man nur eine serielle Konsole hat?

Wenn Sie nur über eine serielle Konsole verfügen (z. B. per Telnet über einen Terminalserver), welche Methoden können zum Übertragen von Dateien in einen/aus einem Host verwendet werden?

Ausschneiden/Einfügen funktioniert für kleine/druckbare Dinge, und ich habe mit einer Kombination aus Uuencode/Uudecode (mit Gzip) herumgespielt, um das Nichtdruckbare zu handhaben, aber das ist alles sehr einschränkend.

Antwort1

Die seriellen Konsolenprogramme¹, die Sie am anderen Ende der Verbindung verwenden, verfügen über eine Möglichkeit, eine Datei an die Remote-Seite zu senden. Wie Sie dabei genau vorgehen, hängt davon ab, welche Ressourcen Ihnen auf dem Remote-System zur Verfügung stehen.

Ich habe lrzszoder kermitauf der Remote-Seite

Am einfachsten ist es, wenn Sie auf der Remote-Seite ein zuverlässiges Programm zum Übertragen binärer Dateien installiert haben, wie z. B.lrzszoderkermit. Dies war früher üblicher als heute, aber Ihr spezielles System verfügt möglicherweise immer noch über eines davon.

Das serielle Konsolenprogramm, das Sie lokal verwenden, verfügt mit ziemlicher Sicherheit über eine Möglichkeit für einen Zmodem- oder Kermit-Upload, mit dem Sie alles, was Sie benötigen, direkt senden können.

Im Fall von Zmodem geben Sie einfach etwas rzauf dem Remote-System ein. Daraufhin wird eine spezielle Zeichenfolge gesendet, die das lokale serielle Terminal verstehen muss. Dadurch wird ein Dialogfeld zur Dateiauswahl angezeigt.

Kermit ist ein einfacheres Protokoll, daher müssen Sie die Übertragung in diesem Fall manuell starten.

Ich habe kein Programm zur binären Dateiübertragung, aber ich habe uuencode/base64

Die Verwendung eines geeigneten binären Dateiübertragungsprogramms wie lrzszoder bietet mehrere Vorteile kermit: Effizienz, Prüfsummenbildung, automatische Wiederholungsversuche, Wiederaufnahme abgebrochener Übertragungen, Übertragung mehrerer Dateien usw., aber diese sindLuxusWenn Sie nur eine Datei senden müssen oder selten Dateien senden, reichen ASCII-Uploads aus.

WeilTerminalprotokolleviele der Bytewerte interpretieren, die in einer binären Datendatei vorkommen, können Sie die Datei nicht direkt über dieselbe Verbindung senden. Wenn Sie dies tun, wird der Terminalemulationscode an beiden Enden versuchen, einige der Daten zu interpretieren, was die Daten beschädigt und wahrscheinlichverwirrendauch der Terminal-Handling-Code.

Sie umgehen dies, indem Sie die Binärdaten auf der lokalen Seite in eine sichere Teilmenge von ASCII kodieren und sie dann auf der Remote-Seite wieder in Rohbinärdaten umwandeln. Das ist, was dieuuencodeUndbase64Dies ist bei Programmen der Fall und sie unterscheiden sich nur in der Auswahl geringfügiger Algorithmen.

Auf dem lokalen System kodieren Sie die Datei:²

$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz

Anschließend geben Sie diesen Befehl auf dem Remote-System ein und senden die Datei mit der Funktion „ASCII-Upload“ der lokalen seriellen Konsole:

$ cat | uudecode

Wenn der Dateiupload abgeschlossen ist, klicken Sie auf , Ctrl-Cum den Vorgang zu beenden cat. Jetzt haben Sie Ihre dekodierte Datei wie gewünscht auf dem Remote-System.

Aber ich habeVieleDas Senden von Dateien und die druckbare ASCII-Transkodierung sind mühsam!

Es ist nicht schwer, sich auf ein höheres Technologieniveau hochzuarbeiten. Wenn das Remote-System über einen C-Compiler verfügt, können Sie die vorherige Technik verwenden, um dem Remote-System eine Kopie des lrzszQuellcodes zu senden. Auf der lokalen Seite:

$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz

Geben Sie dann auf dem Remote-System Folgendes über das serielle Konsolenprogramm ein:

$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally

Nachdem Sie den ersten Befehl gestartet haben, führen Sie einen „ASCII-Upload“ der lrzsz.tgz.uueDatei auf das Remote-System durch. Die Pipeline akzeptiert die uuencoded-Daten und dekodiert sie für Sie in ein binäres Tarball, das Sie entpacken und erstellen können.

Aber ich habe keinen C-Compiler auf dem Remote-System

Wenn Sie nicht einmal einen Compiler auf dem Remote-System haben, können SieCross-Kompilierungdas rz(oder welches auch immer) Programm auf dem lokalen System und senden Sie es mit der oben beschriebenen Technik an das Remote-System.


Fußnoten:

  1. minicom,picocom,Kitt,VanDyke CRT...

  2. Sie müssen den Eingabedateinamen für diese Version uuencodezweimal angeben, einmal, um die Quelle der Eingabedaten zu benennen, und erneut, um anzugeben, wie das Remote-System die Datei nennen soll, wenn es die Daten in eine Ausgabedatei dekodiert. Es ist durchaus denkbar, dass das Remote-System seiner Ausgabedatei einen anderen Namen geben möchte.

    Ihre lokale Version uuencodeverhält sich möglicherweise anders.

Antwort2

Grundsätzlich müssen Sie Methoden aus der Zeit vor dem Internet verwenden, um über ein serielles TTY zu übertragen, und Sie müssen eine Möglichkeit haben, die Übertragung auf der anderen Seite zu empfangen. Am besten geht das natürlich mit ZMODEM, was bedeutet, dass Sie szbereits ein Tool wie dieses auf der Empfangsseite haben müssen. Dies ist jedoch nicht immer möglich, beispielsweise wenn das Empfangsziel ein Router ohne Netzwerk ist.

Die einzige Möglichkeit, diese Übertragung durchzuführen, ist direkt über den Kanal, unter Verwendung von terminalsicherem ASCII im sauberen Pre-8-Bit-Stil. Ich werde modernere Tools verwenden, von denen ich hoffe, dass sie auf den meisten Systemen installiert sind.

Absender:

Zuerst kodieren wir unsere Datei

base64 file.tar.gz > file.tar.gz.b64

Stellen Sie nun sicher, dass Ihr com send-file-Befehl lautet: ascii-xfrDies war meine Verbindungsbefehlszeile

picocom -f n -p n -d 8 -b 115200  --send-cmd "ascii-xfr -snv" /dev/ttyS0

Normalerweise möchten wir dies ascii-xfrauf der Empfangsseite, aber da wir es nicht haben, -numgeht das dies, indem korrekte Zeilenenden beibehalten werden.

Empfänger:

Nachdem wir nun eine Verbindung hergestellt haben, gehen Sie in das Verzeichnis, in dem Sie die empfangene Datei haben möchten.

cd /tmp/
cat > file.tar.gz.b64

Auf Picocom habe ich geradeSTRG+A+Sund geben Sie den vollständigen Pfad der Datei ein, die ich sende. Sobald die Übertragung abgeschlossen ist, müssen SieSTRG+Cum das zu brechen cat.

Nun dekodieren wir die Datei,

base64 -d file.tar.gz.b64 > file.tar.gz

Versuchen Sie mit allen Mitteln zu überprüfen, ob die Datei mit der Datei identisch ist, die Sie gesendet haben, da eine ASCII-Übertragung keinen Prüfsummenschutz bietet. Meine Empfangsbox hatte einen Prüfsummenschutz sha512sum, aber jeder Prüfsummenbefehl würde genügen. Sobald Sie manuell bestätigen, dass die Summen übereinstimmen, können Sie davon ausgehen, dass die Übertragung erfolgreich war!

Antwort3

Ich weiß nicht, ob dies funktionieren würde, wenn Sie nur eine serielle Konsole hätten, aber wenn Sie überhaupt Netzwerkzugriff haben, könnten Sie damit nc(1)Dateien über TCP/IP kopieren.

# WARNING: Depending on your setup, this could make your system unbootable
[email protected] # nc -l 8675 | dd of=/dev/sdXXX
[email protected] # dd if=/dev/sdYYY | nc destination-box.local 8675

Im obigen Beispiel habe ich sdbYYYvon einer Quellbox auf sdaXXXdie Zielbox geklont. Meine Wahl von 8675 als TCP-Portnummer war willkürlich; Sie können jeden Port verwenden, auf den Sie Zugriff haben. Und es muss kein Gerät sein; es kann jede beliebige Datei sein.

[email protected] $ nc -l 12345 >> ~/.ssh/authorized_keys
[email protected] $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345

Im zweiten Beispiel habe ich meinen öffentlichen RSA-Schlüssel ( ~/.ssh/id_rsa.pub) kopiert und ihn der Datei mit den autorisierten Schlüsseln für den Zielhost hinzugefügt.

Antwort4

ich würde ... benutzenKermit, der Urahn der Filetransfer-Programme. Den haben wir schon lange vor Linux verwendet.

verwandte Informationen