
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 lrzsz
oder kermit
auf 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.lrzsz
oderkermit
. 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 rz
auf 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 lrzsz
oder 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 dieuuencode
Undbase64
Dies 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 lrzsz
Quellcodes 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.uue
Datei 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:
Sie müssen den Eingabedateinamen für diese Version
uuencode
zweimal 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
uuencode
verhä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 sz
bereits 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-xfr
Dies 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-xfr
auf der Empfangsseite, aber da wir es nicht haben, -n
umgeht 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 sdbYYY
von einer Quellbox auf sdaXXX
die 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.