Como enviar um arquivo para um host quando tudo que você tem é um console serial?

Como enviar um arquivo para um host quando tudo que você tem é um console serial?

Quando tudo o que você tem é um console serial (por exemplo, via telnet através de um servidor de terminal), quais métodos podem ser usados ​​para transferir arquivos de/para um host?

Recortar/colar funciona para coisas pequenas/imprimíveis e eu brinquei com uma combinação de uuencode/uudecode (com gzip) para lidar com o não imprimível, mas é tudo muito limitante.

Responder1

Os programas de console serial¹ que você usará na outra extremidade da conexão terão alguma maneira de enviar um arquivo para o lado remoto. Como exatamente você fará isso depende de quais recursos você tem disponíveis no sistema remoto.

Eu tenho lrzszou kermitno lado remoto

O caso mais fácil é se você tiver um programa sólido de transferência de arquivos binários instalado no lado remoto, comolrzszoukermit. Isso já foi mais comum do que hoje, mas seu sistema específico ainda pode ter um desses.

O programa de console serial que você está usando no lado local quase certamente tem uma maneira de fazer upload de Zmodem ou Kermit, que permite enviar tudo o que você precisa diretamente.

No caso do Zmodem, basta digitar rzno sistema remoto, que envia uma string especial que o terminal serial local deve entender, fazendo com que apareça uma caixa de diálogo de seletor de arquivos.

Kermit é um protocolo mais simples, então nesse caso você terá que iniciar a transferência manualmente.

Não tenho um programa de transferência de arquivos binários, mas tenho uuencode/base64

Existem várias vantagens em usar um programa adequado de transferência de arquivos binários como lrzszou kermit: eficiência, soma de verificação, novas tentativas automáticas, retomada de transferência abortada, transferência de vários arquivos, etc., mas estas sãoluxos. Se você precisar enviar apenas um arquivo ou raramente enviar arquivos, poderá fazer uploads ASCII.

Porqueprotocolos de terminalinterpretar muitos dos valores de bytes que ocorrem em um arquivo de dados binários, você não pode enviar o arquivo diretamente pela mesma conexão; se você fizer isso, o código de emulação de terminal em cada extremidade tentará interpretar alguns dos dados, corrompendo os dados e provavelmenteconfusoo código de manipulação do terminal também.

Você contorna isso codificando os dados binários em um subconjunto seguro de ASCII no lado local e, em seguida, transformando-os novamente em dados binários brutos no lado remoto. Isto é o queuuencodeebase64os programas sim, diferindo apenas em pequenas escolhas de algoritmos.

No sistema local, você codifica o arquivo:²

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

Em seguida, você digita este comando no sistema remoto e envia o arquivo usando o recurso "upload ASCII" do console serial local:

$ cat | uudecode

Quando o upload do arquivo terminar, clique Ctrl-Cpara sair do arquivo cat. Agora você tem seu arquivo decodificado no sistema remoto, como desejava.

Mas eu tenhoMuitosArquivos para enviar e transcodificação ASCII para impressão é uma dor!

Não é difícil chegar a um nível superior de tecnologia. Se o sistema remoto tiver um compilador C, você poderá usar a técnica anterior para enviar ao sistema remoto uma cópia do lrzszcódigo-fonte. Do lado local:

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

Em seguida, no sistema remoto, digite isto através do programa do console serial:

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

Depois de iniciar o primeiro comando, faça um "upload ASCII" do lrzsz.tgz.uuearquivo para o sistema remoto. O pipeline aceita os dados uuencoded e os decodifica em um tarball binário para você, que você pode descompactar e compilar.

Mas não tenho um compilador C no sistema remoto

Se você nem tiver um compilador no sistema remoto, você podecompilação cruzadao rzprograma (ou qualquer outro) no sistema local e envie-o para o sistema remoto usando a técnica acima.


Notas de rodapé:

  1. minicom,picocom,Massa,Van Dyke CRT...

  2. Você deve fornecer o nome do arquivo de entrada para esta versão uuencodeduas vezes, uma vez para nomear a fonte dos dados de entrada e novamente para declarar como o sistema remoto deve chamar o arquivo ao decodificar os dados para um arquivo de saída. Você poderia querer que o sistema remoto tivesse um nome diferente para seu arquivo de saída.

    Sua versão local uuencodepode se comportar de maneira diferente.

Responder2

Basicamente, você precisa usar métodos pré-internet para transferir por meio de um tty serial e deve ter uma maneira de receber a transferência do outro lado. Obviamente, a melhor maneira de fazer isso é usando o ZMODEM, o que significa que você precisa ter uma ferramenta como essa szjá disponível. No entanto, isso nem sempre é possível, por exemplo, quando o alvo receptor é um roteador sem rede.

A única maneira possível de fazer essa transferência é diretamente pelo canal, usando ASCII seguro de terminal, em estilo limpo pré-8 bits. Usarei ferramentas mais modernas, que espero que estejam instaladas na maioria dos sistemas.

Remetente:

Primeiro codificamos nosso arquivo

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

Agora certifique-se de que seu comando com send-file seja, ascii-xfresta foi minha linha de comando de conexão

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

Normalmente queremos ascii-xfro lado receptor, mas como não o temos, isso -ncontorna isso mantendo os finais de linha corretos.

Receptor:

Agora que estamos conectados, vá até o diretório onde deseja o arquivo recebido.

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

No picocom, eu apenasCTRL+a+se digite o caminho completo do arquivo que estou enviando. Assim que a transferência for concluída, você precisaráCTRL+cpara quebrar isso cat.

Agora decodificamos o arquivo,

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

Faça o que puder para verificar se o arquivo é IDÊNTICO ao que você enviou, porque uma transferência ASCII não tem proteção de soma de verificação. Minha caixa receptora tinha sha512sum, mas qualquer comando de soma de verificação seria suficiente. Depois de confirmar manualmente a correspondência das somas, você pode presumir que a transferência foi bem-sucedida!

Responder3

Não sei se isso funcionaria se tudo o que você tivesse fosse um console serial, mas se você tiver acesso à rede, poderá nc(1)copiar arquivos usando TCP/IP.

# 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

No exemplo acima, clonei sdbYYYde uma caixa de origem para sdaXXXa caixa de destino. Minha escolha de 8675 para número de porta TCP foi arbitrária; você pode usar qualquer porta à qual tenha acesso. E não precisa ser um dispositivo; pode ser qualquer arquivo.

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

No segundo exemplo, copiei minha chave pública rsa ( ~/.ssh/id_rsa.pub) e a adicionei ao arquivo de chaves autorizadas do host de destino.

Responder4

eu usariaSapo, o avô dos programas de transferência de arquivos. Já usávamos isso muito antes de existir o Linux.

informação relacionada