Wie kann ich eine Datei an einen Host senden, wenn ich nur eine serielle Konsole habe?

20

Wenn Sie nur eine serielle Konsole haben (z. B. über Telnet über einen Terminalserver), welche Methoden können zum Übertragen von Dateien auf einen Host bzw. von einem Host verwendet werden?

Das Ausschneiden / Einfügen funktioniert für das kleine / druckbare Material und ich habe mit einer Kombination aus Uuencode / Uudecode (mit GZIP) gespielt, um das nicht druckbare zu behandeln, aber es ist alles sehr einschränkend.

Stephen Paul Lesniewski
quelle
In Anbetracht einiger Kommentare zur Verfügbarkeit von Dienstprogrammen ist es hilfreich, wenn Sie die Plattform benennen und / oder die Umgebung beschreiben, in der Sie sich befinden. Andernfalls erhalten Sie die Aktie Kermit / XMODEM / YMODEM / ZMODEMk über Terminal Antworten ...
Avery Payne
Ich verbringe den größten Teil meines Tages hinter der Solaris-Box. Wenn Sie also nur SUNCreq (oder vielleicht SUNWCuser) hätten, was würden Sie antworten?
Stephen Paul Lesniewski
nur 5 Jahre zu spät: P Jetzt können Sie meine Antwort annehmen, weil es genau das war, was Sie wollten ... aber wahrscheinlich heute nicht brauchen.
JM Becker

Antworten:

12

Die seriellen Konsolenprogramme¹, die Sie am anderen Ende der Verbindung verwenden, haben eine Möglichkeit, eine Datei an die Remote-Seite zu senden. Wie genau Sie vorgehen, hängt davon ab, welche Ressourcen auf dem fernen System verfügbar sind.

Ich habe lrzszoder kermitauf der Remote-Seite

Der einfachste Fall ist, wenn auf der Remote-Seite ein solides Programm zur Übertragung von Binärdateien installiert ist, z. B. lrzszoder kermit. Dies war einmal häufiger als heute, aber Ihr spezielles System könnte immer noch eines davon haben.

Das serielle Konsolenprogramm, das Sie lokal verwenden, bietet mit ziemlicher Sicherheit die Möglichkeit, einen Zmodem- oder Kermit-Upload durchzuführen, mit dem Sie alles, was Sie benötigen, direkt senden können.

Im Fall von Zmodem geben Sie einfach rzauf dem Remote-System ein, das eine spezielle Zeichenfolge ausgibt, die das lokale serielle Terminal verstehen sollte, wodurch ein Dialogfeld für die Dateiauswahl geöffnet wird.

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

Ich habe kein Programm zum Übertragen von Binärdateien, aber ich habe uuencode/base64

Die Verwendung eines ordnungsgemäßen binären Dateiübertragungsprogramms wie lrzszoder hat mehrere Vorteile kermit: Effizienz, Prüfsummenbildung, automatische Wiederholungsversuche, Wiederaufnahme der Übertragung abgebrochen, mehrfache Dateiübertragung usw., aber dies ist Luxus . Wenn Sie nur eine Datei senden müssen oder nur selten Dateien senden, können Sie ASCII-Uploads durchführen.

Da Terminalprotokolle viele der in einer Binärdatendatei vorkommenden Bytewerte interpretieren, können Sie die Datei nicht direkt über dieselbe Verbindung senden. In diesem Fall versucht der Terminal-Emulationscode an beiden Enden, einige der Daten zu interpretieren. Dadurch werden die Daten beschädigt, und der Code für die Terminal-Verarbeitung wird möglicherweise ebenfalls verwirrt .

Sie umgehen dies, indem Sie die Binärdaten auf der lokalen Seite in eine sichere Teilmenge von ASCII codieren und sie dann auf der Remote-Seite wieder in Binärrohdaten umwandeln. Dies ist, was die Programme uuencodeund base64tun, die sich nur in geringfügigen Algorithmuswahlen unterscheiden.

Auf dem lokalen System codieren Sie die Datei: ²

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

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

$ cat | uudecode

Wenn der Datei-Upload abgeschlossen ist, klicken Sie auf Ctrl-C, um auszusteigen cat. Jetzt haben Sie Ihre dekodierte Datei auf dem Remote-System, wie Sie wollten.

Aber ich muss viele Dateien senden, und druckbare ASCII-Transkodierung ist mühsam!

Es ist nicht schwer, sich auf ein höheres technologisches Niveau zu begeben. Wenn das ferne System über einen C-Compiler verfügt, können Sie mit der vorherigen Technik eine Kopie des lrzszQuellcodes an das ferne System 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 fernen 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 ferne System durch. Die Pipeline akzeptiert die unkodierten Daten und dekodiert sie für Sie in einen Binär-Tarball, den Sie entpacken und erstellen können.

Ich habe aber keinen C-Compiler auf dem Remote-System

Wenn auf dem fernen System noch nicht einmal ein Compiler vorhanden ist, können Sie das (oder was auch immer) Programm auf dem lokalen System übergreifend kompilierenrz und mit der oben beschriebenen Technik an das ferne System senden.


Fußnoten:

  1. Minicom , Picocom , PuTTY , VanDyke CRT ...

  2. Sie müssen dieser Version uuencodeden Namen der Eingabedatei zweimal geben, einmal, um die Quelle der Eingabedaten zu benennen, und erneut, um zu deklarieren, wie das ferne System die Datei aufrufen soll, wenn es die Daten in eine Ausgabedatei dekodiert. Es ist denkbar, dass das ferne System einen anderen Namen für die Ausgabedatei hat.

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

Warren Young
quelle
Fantastisch, ich hatte gehofft, dass diese Frage eine Antwort hat, in der Kermit erwähnt wird! +1;)
Tim
Dies ist eine gute Antwort. Ich mag den Abschnitt "Aber ich habe nicht". Leider hört es bei ziemlich popigen Sachen auf und geht nicht wirklich tief. Erstellen von ausführbaren Binärdateien für verschiedene Architekturen aus nur ASCII-Codes Hier ist für Bootstrap: retrocomputing.stackexchange.com/questions/4672/...
pfalcon
5

Grundsätzlich müssen Sie vor dem Internet Methoden verwenden, um über eine Seriennummer zu übertragen, und Sie müssen eine Möglichkeit haben, die Übertragung auf der anderen Seite zu empfangen. Offensichtlich ist der beste Weg, dies zu tun, die Verwendung von ZMODEM, was bedeutet, dass Sie ein Werkzeug haben müssen, wie es szbereits auf der Empfangsseite vorhanden ist. Dies ist jedoch nicht immer möglich, wenn das empfangende Ziel beispielsweise ein Router ohne Netzwerk ist.

Die einzige Möglichkeit, diese Übertragung durchzuführen, ist die direkte Übertragung über den Kanal unter Verwendung von terminal-sicherem ASCII in einem sauberen 8-Bit-Stil. Ich werde modernere Tools verwenden, die hoffentlich auf den meisten Systemen installiert sind.

Absender:

Zuerst verschlüsseln wir unsere Datei

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

Stellen Sie nun sicher, dass Ihr Befehl com send-file lautet ascii-xfr. Dies war meine Verbindungsbefehlszeile

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

Normalerweise wollen wir ascii-xfrauf der Empfängerseite, aber da wir es nicht haben, -nfunktioniert das, indem wir die richtigen Zeilenenden beibehalten.

Empfänger:

Wechseln Sie nach dem Herstellen der Verbindung in das Verzeichnis, in dem Sie die empfangene Datei speichern möchten.

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

Auf picocom drücke ich einfach STRG + a + s und gebe den vollständigen Pfad der Datei ein, die ich sende. Sobald die Übertragung abgeschlossen ist, müssen Sie STRG + c drücken, um dies zu unterbrechen cat.

Jetzt dekodieren wir die Datei,

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

Tun Sie alles, um sicherzustellen, dass die Datei mit der von Ihnen gesendeten identisch ist, da eine ASCII-Übertragung keinen Prüfsummenschutz hat. Meine Empfangsbox hatte sha512sum, aber jeder Prüfsummenbefehl würde ausreichen. Sobald Sie die Summenübereinstimmung manuell bestätigt haben, können Sie davon ausgehen, dass die Übertragung erfolgreich war!

JM Becker
quelle
(Und zwei Jahre später ...) Meiner Erfahrung nach ist es bei der Base64-Codierung / -Decodierung unerheblich, wie die Zeilenenden aussehen, wenn Dateien zwischen Systemen übertragen werden, die Zeilenenden mischen (dank Microsoft!). \r\noder einfach \nbeide funktionieren, auch wenn sie auf dem Weg "repariert" werden. Ich kann mich nicht ohne weiteres erinnern, ob dies im base64-Standard oder nur in den von mir verwendeten Tools enthalten ist, aber ich vermute, dass dies tatsächlich das Standardverhalten ist.
Andrew Henle
5

Vielleicht solltest du es mit minicom versuchen.

Elmarco
quelle
Benötigt das nicht etwas wie 'sx' oder 'sz' auf dem Quellhost?
Stephen Paul Lesniewski
4
Nö, minicom handhabt seine eigenen Dateiübertragungen. sx, sy, sz und rx, ry, rz sind separate Programme, die normalerweise in Paketen mit dem passenden Namen lszrz oder so gefunden werden. Ich würde allerdings die Verwendung von sz und rz vorschlagen. Klein, einfach und macht das, was es macht. Minicom ist ein ganzer Terminal-Emulator.
Reiche
4
Diese Antwort ist nicht richtig. Minicom erzeugt lrzsz für Dateiübertragungen. Minicom kann und kann keine eigenen Dateitransfers durchführen.
Jonathan Cline IEEE
5

Sie wissen nicht, ob dies funktionieren würde, wenn Sie nur eine serielle Konsole hätten. Wenn Sie jedoch überhaupt über Netzwerkzugriff verfügen, können Sie nc(1)Dateien mithilfe von 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 einem Quellfeld in ein Zielfeld geklont sdaXXX. Meine Wahl von 8675 für eine 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 sich um eine beliebige Datei handeln.

[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.

Kevin M
quelle
5
Darf ich ein großes rotes Warnschild über Ihrer ersten Idee vorschlagen? Eine einsame Seele mit dem Herzen zum Lernen könnte so etwas in der Hoffnung ausführen, nur Dateien zu kopieren, ohne den folgenden Absatz zuerst zu lesen :)
reiche
2

Ich würde Kermit verwenden , den Großelternteil der Filetransfer-Programme. Wir haben das schon lange benutzt, bevor es Linux gab.

txwikinger
quelle
ahh ja .. ich erinnere mich, dass ich das getan habe, aber in diesem Fall ist kermit nicht auf dem Quellhost installiert.
Stephen Paul Lesniewski