ti-enxame.com

Como obter 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 por meio de um servidor de terminal), quais métodos podem ser usados ​​para transferir arquivos de entrada/saída de um host?

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

22
Stephen Paul Lesniewski

Os programas do 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ê faz isso depende de quais recursos você tem disponível no sistema remoto.

Tenho lrzsz ou Kermit no lado remoto

O caso mais fácil é se você tiver um sólido programa de transferência de arquivos binários instalado no lado remoto, como lrzsz ou Kermit . Isso foi mais comum do que hoje, mas seu sistema em particular ainda pode ter um deles.

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

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

O Kermit é um protocolo mais simples, portanto, você deve iniciar a transferência manualmente nesse caso.

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

Existem várias vantagens em usar um programa de transferência de arquivos binários adequado, como lrzsz ou Kermit: eficiência, soma de verificação, tentativas automáticas, retomada de transferência interrompida, transferência de arquivos múltipla etc., mas são: luxos . Se você precisar enviar apenas um arquivo ou estiver enviando arquivos raramente, poderá usar ASCII.

Como protocolos de terminal interpreta muitos dos valores de bytes que ocorrem em um arquivo de dados binários, você não pode enviar o arquivo diretamente através da mesma conexão; se o fizer, o código de emulação de terminal em ambos os lados tentará interpretar alguns dados, corrompendo-os e provavelmente confuso o código de manipulação de terminais também.

Você pode contornar isso codificando os dados binários em um subconjunto seguro de ASCII no lado local e, em seguida, transformando-o novamente em dados binários brutos no lado remoto. É isso que uuencode e base64 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 "ASCII upload" do console serial local:

$ cat | uudecode

Quando o upload do arquivo terminar, pressione Ctrl-C sair de cat. Agora você tem seu arquivo decodificado no sistema remoto, conforme desejado.

Mas eu tenho Muitos Arquivos a serem enviados e imprimíveis ASCII Transcodificar é uma dor!

Não é difícil bootstrap até um nível mais alto 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 lrzsz código fonte No 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 arquivo lrzsz.tgz.uue para o sistema remoto. O pipeline aceita os dados codificados e decodifica-os em um tarball binário para você, que você pode descompactar e construir.

Mas eu não tenho um compilador C no sistema remoto

Se você não possui um compilador no sistema remoto, pode compilar de forma cruzada o programa rz (ou qualquer outro) no sistema local e enviá-lo ao sistema remoto usando a técnica acima.


Notas de rodapé:

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

  2. Você deve atribuir o nome do arquivo de entrada a esta versão de uuencode duas vezes, uma vez para nomear a origem dos dados de entrada e novamente para declarar como o sistema remoto deve chamar o arquivo quando decodificar os dados em uma saída Arquivo. É possível que você queira que o sistema remoto tenha um nome diferente para seu arquivo de saída.

    Sua versão local de uuencode pode se comportar de maneira diferente.

13
Warren Young

Basicamente, você precisa usar métodos pré-Internet para transferir através de um serial tty e precisa ter uma maneira de receber a transferência do outro lado. Obviamente, a melhor maneira de fazer isso é usar o ZMODEM, o que significa que você precisa de uma ferramenta como sz já na extremidade receptora. No entanto, isso nem sempre é possível, por exemplo, quando o destino de recebimento é um roteador sem rede.

A única maneira possível de fazer essa transferência é diretamente sobre o canal, usando ASCII seguro para terminal, no estilo limpo antes de 8 bits. Vou usar ferramentas mais modernas, que eu espero que estejam instaladas na maioria dos sistemas.

Remetente:

Primeiro codificamos nosso arquivo

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

Agora, verifique se o comando com send-file é, ascii-xfr, esta foi a 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-xfr no lado receptor, mas como não temos, isso -n contorna isso mantendo as terminações de linha corretas.

Receptor:

Agora que estamos conectados, vá para o diretório em que deseja o arquivo recebido.

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

No picocom, eu apenas CTRL + a + s , e digito o caminho completo do arquivo que estou enviando. Depois que a transferência for concluída, você precisará CTRL + c para quebrar esse cat.

Agora decodificamos o arquivo,

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

Faça o possível 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 de recebimento tinha sha512sum, mas qualquer comando de soma de verificação seria suficiente. Depois de confirmar manualmente a correspondência de somas, você pode assumir que a transferência foi bem-sucedida!

5
J. M. Becker

Talvez você deva tentar minicom .

5
elmarco

Não sei se isso funcionaria se tudo o que você tinha fosse um console serial, mas se você tiver acesso à rede, poderá usar nc(1) para 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, eu clonei sdbYYY de uma caixa de origem para sdaXXX da caixa de destino. Minha escolha de 8675 para um TCP foi arbitrário; 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 adicionou-o ao arquivo de chaves autorizado para o host de destino.

5
Kevin M

Eu usaria Kermit , o avô dos programas de transferência de arquivos. Nós o usamos já muito antes de haver o Linux.

2
txwikinger