Come ottenere file su un host quando tutto ciò che hai è una console seriale?


21

Quando tutto ciò che hai è una console seriale (ad esempio tramite telnet tramite un server terminal), quali metodi possono essere utilizzati per trasferire file in / out da un host?

Taglia / incolla funziona per le cose piccole / stampabili e ho giocato con una combinazione di uuencode / uudecode (con gzip) per gestire gli non stampabili ma è tutto molto limitante.


Dati alcuni dei commenti che hai lasciato sulla disponibilità delle utility, sarebbe di aiuto se tu potessi dare un nome alla piattaforma e / o delineare l'ambiente in cui ti trovi. Altrimenti, otterrai lo stock Kermit / XMODEM / YMODEM / ZMODEMk tramite il terminale risponde ...
Avery Payne,

Trascorro gran parte della mia giornata dietro la scatola di Solaris. Quindi, in quei termini, se tutto ciò che avessi fosse SUNCreq (o forse SUNWCuser) quale risponderesti?
Stephen Paul Lesniewski,

con solo 5 anni di ritardo,: P Ora puoi accettare la mia risposta, perché era esattamente quello che volevi .... ma probabilmente non ti serve oggi.
JM Becker,

Risposte:


13

I programmi della console seriale¹ che utilizzerai sull'altra estremità della connessione avranno un modo per inviare un file sul lato remoto. Il modo esatto in cui lo fai dipende dalle risorse che hai a disposizione sul sistema remoto.

Ho lrzszo kermitsul lato remoto

Il caso più semplice è se sul lato remoto è installato un programma di trasferimento file binario solido come lrzszo kermit. Questo era una volta più comune di oggi, ma il tuo sistema particolare potrebbe avere ancora uno di questi.

Il programma di console seriale che stai utilizzando sul lato locale ha quasi sicuramente un modo per eseguire un caricamento di Zmodem o Kermit, che ti consente di inviare direttamente tutto ciò di cui hai bisogno.

Nel caso di Zmodem, basta digitare rzsul sistema remoto, che invia una stringa speciale che il terminale seriale locale dovrebbe comprendere, facendogli apparire una finestra di dialogo di selezione file.

Kermit è un protocollo più semplice, quindi in questo caso devi avviare manualmente il trasferimento.

Non ho un programma di trasferimento file binario, ma ho uuencode/base64

Esistono diversi vantaggi nell'utilizzare un programma di trasferimento file binario adeguato come lrzszo kermit: efficienza, checksum, tentativi automatici, ripresa del trasferimento interrotto, trasferimento di più file, ecc., Ma questi sono lussi . Se devi solo inviare un file o se invii file raramente, puoi cavartela con i caricamenti ASCII.

Poiché i protocolli terminali interpretano molti dei valori di byte che si verificano in un file di dati binari, non è possibile inviare il file direttamente tramite la stessa connessione; in tal caso, il codice di emulazione terminale su entrambe le estremità tenterà di interpretare alcuni dei dati, corrompendoli e probabilmente confondendo anche il codice di gestione dei terminali.

Per ovviare a questo, codificare i dati binari in un sottoinsieme sicuro di ASCII sul lato locale, quindi trasformarli in dati binari non elaborati sul lato remoto. Questo è ciò che fanno i programmi uuencodee base64, differendo solo per le scelte minori dell'algoritmo.

Sul sistema locale, si codifica il file: ²

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

Quindi digitare questo comando sul sistema remoto e inviare il file utilizzando la funzione "Caricamento ASCII" della console seriale locale:

$ cat | uudecode

Al termine del caricamento del file, premi Ctrl-Cper uscire cat. Ora hai il tuo file decodificato sul sistema remoto, come volevi.

Ma ho molti file da inviare e la transcodifica ASCII stampabile è una seccatura!

Non è difficile avviarsi fino a un livello superiore di tecnologia. Se il sistema remoto ha un compilatore C, è possibile utilizzare la tecnica precedente per inviare al sistema remoto una copia del lrzszcodice sorgente. Sul lato locale:

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

Quindi sul sistema remoto, digita questo tramite il programma della console seriale:

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

Dopo aver avviato il primo comando, eseguire un "caricamento ASCII" del lrzsz.tgz.uuefile sul sistema remoto. La pipeline accetta i dati codificati e li decodifica in un tarball binario per te, che puoi decomprimere e creare.

Ma non ho un compilatore C sul sistema remoto

Se non hai nemmeno un compilatore sul sistema remoto, puoi compilare in modo incrociato il rz(o qualunque altro) programma sul sistema locale e inviarlo al sistema remoto usando la tecnica sopra.


Note:

  1. minicom , picocom , PuTTY , VanDyke CRT ...

  2. Devi dare il nome del file di input a questa versione di uuencodedue volte, una volta per nominare l'origine dei dati di input e di nuovo per dichiarare come il sistema remoto dovrebbe chiamare il file quando decodifica i dati in un file di output. È possibile che il sistema remoto abbia un nome diverso per il suo file di output.

    La tua versione locale di uuencodepotrebbe comportarsi diversamente.


Fantastico, speravo che questa domanda avesse una risposta che menzionasse il kermit! +1;)
Tim

Questa è una buona risposta, mi piace quella sezione "Ma non ho". Sfortunatamente, si ferma a cose abbastanza pop e non va molto in profondità. Creare file eseguibili binari per architetture diverse da soli codici ASCII? Ecco per bootstrap: retrocomputing.stackexchange.com/questions/4672/…
pfalcon

5

Fondamentalmente devi usare i metodi pre-internet per trasferire su una seriale tty e devi avere un modo per ricevere il trasferimento dall'altra parte. Ovviamente il modo migliore per farlo è usare ZMODEM, il che significa che è necessario disporre di uno strumento come szgià sul lato ricevente. Tuttavia, ciò non è sempre possibile, ad esempio, quando la destinazione di ricezione è un router senza rete.

L'unico modo possibile per eseguire questo trasferimento è direttamente sul canale, utilizzando il terminale ASCII sicuro, in stile pulito pre-8-bit. Userò strumenti più moderni, che spero siano installati sulla maggior parte dei sistemi.

Mittente:

Innanzitutto codifichiamo il nostro file

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

Ora assicurati che il tuo comando send-file com sia ascii-xfr, questa era la mia riga di comando di connessione

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

Normalmente vogliamo ascii-xfrdal lato ricevente, ma dal momento che non ce l'abbiamo, questo -naggira il problema mantenendo le terminazioni di linea corrette.

Ricevitore:

Ora che ci siamo connessi, vai alla directory in cui desideri il file ricevuto.

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

Su picocom, ho solo CTRL + a + s , e inserisco il percorso completo del file che sto inviando. Una volta completato il trasferimento, dovrai interrompere CTRL + ccat .

Ora decodifichiamo il file,

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

Fai tutto il possibile per verificare che il file sia IDENTICO a quello che hai inviato, perché un trasferimento ASCII non ha una protezione di checksum. La mia casella di ricezione aveva sha512sum, ma qualsiasi comando di checksum sarebbe stato sufficiente. Dopo aver confermato manualmente la corrispondenza delle somme, puoi presumere che il trasferimento sia andato a buon fine!


(E due anni dopo ...) nella mia esperienza di trasferimento di file tra sistemi che intercettano terminazioni di linea (grazie a Microsoft!), La codifica / decodifica base64 non si preoccupa dello stile di fine linea. \r\no \nentrambi funzionano anche se vengono "riparati" lungo il percorso. Non ricordo di persona se è nello standard base64 o solo gli strumenti che ho usato, ma sospetto che sia in realtà un comportamento standard.
Andrew Henle,

5

Forse dovresti provare Minicom .


Questo non richiede qualcosa come 'sx' o 'sz' sull'host di origine?
Stephen Paul Lesniewski l'

4
No, minicom gestisce i propri file xfers. sx, sy, sz e rx, ry, rz sono programmi separati, generalmente presenti in pacchetti appropriatamente chiamati lszrz o qualcosa del genere. Anche se suggerirei di usare sz e rz. Piccolo, semplice e fa quello che fa. Minicom è un intero emulatore di terminale.
Reiche,

4
Questa risposta non è corretta Minicom genera lrzsz per i trasferimenti di file. Minicom non può e non gestisce i propri trasferimenti di file.
Jonathan Cline IEEE

5

Non so se questo avrebbe funzionato se tutto ciò che avevi era una console seriale, ma se hai l'accesso alla rete, puoi utilizzare i nc(1)file per copiare tramite TCP / IP.

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

Nell'esempio sopra, ho clonato sdbYYYda una casella di origine a quella sdaXXXdi destinazione. La mia scelta di 8675 per un numero di porta TCP era arbitraria; potresti usare qualsiasi porta a cui hai accesso. E non deve essere un dispositivo; può essere qualsiasi file.

kevin@destination-box.local $ nc -l 12345 >> ~/.ssh/authorized_keys
kevin@source-box.local $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345

Nel secondo esempio, ho copiato la mia chiave pubblica rsa ( ~/.ssh/id_rsa.pub) e l'ho aggiunta al file di chiavi autorizzato per l'host di destinazione.


5
Potrei suggerire un grande segnale di avvertimento rosso sopra la tua prima idea? Un'anima solitaria con il cuore da imparare potrebbe eseguire qualcosa del genere nella speranza di copiare solo i file, senza leggere il seguente paragrafo prima ovviamente :)
Reiche

2

Vorrei usare kermit , il nonno dei programmi di trasferimento di file. Lo usavamo già molto prima che ci fosse Linux.


ahh si .. Ricordo di averlo fatto ma in questo caso kermit non è installato sull'host di origine.
Stephen Paul Lesniewski l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.