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

20

Quando tudo que você tem é um console serial (digamos 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 o material pequeno / imprimível e eu tenho jogado com uma combinação de uuencode / uudecode (com gzip) manipular o não-imprimível, mas é tudo muito limitante.

    
por Stephen Paul Lesniewski 11.08.2010 / 17:58

5 respostas

11

Os programas de console serial¹ que você usará no outro lado da conexão terão alguma maneira de enviar um arquivo para o lado remoto. Como exatamente você vai depende dos recursos disponíveis no sistema remoto.

Eu tenho lrzsz ou kermit no 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, como lrzsz ou kermit . Isso foi mais uma vez comum do que hoje, mas seu sistema em particular ainda pode ter um desses.

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

No caso do Zmodem, basta digitar rz no sistema remoto, que envia uma string especial que o terminal serial local deve entender, fazendo com que ele abra uma caixa de diálogo de seleção de arquivos.

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

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

Existem várias vantagens em usar um programa de transferência de arquivos binário como lrzsz ou kermit : eficiência, soma de verificação, novas tentativas automáticas, retomada de transferência abortada, transferência de arquivos múltiplos, etc., mas são luxuries . Se você precisar enviar apenas um arquivo ou estiver enviando arquivos raramente, poderá usar os uploads ASCII.

Como os protocolos de terminal interpretam muitos dos valores de byte 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 cada extremidade tentará interpretar alguns dos dados, corrompendo os dados e provavelmente confuso o código de manuseio 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 que o uuencode e base64 dos programas, diferindo apenas nas escolhas de algoritmos menores.

No sistema local, você codifica o arquivo: ²

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

Em seguida, você digita esse 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, pressione Ctrl-C para sair de cat . Agora você tem seu arquivo decodificado no sistema remoto, como você queria.

Mas eu tenho Muitos arquivos para enviar e a transcodificação ASCII imprimível é uma dor!

Não é difícil se adaptar a 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 código-fonte lrzsz . 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 isso 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 uuencoded e os decodifica para 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 tem nem mesmo um compilador no sistema remoto, você pode fazer uma compilação cruzada do rz (ou qualquer outro) programa no sistema local e enviá-lo para o sistema remoto usando a técnica acima.

Notas de rodapé:

  1. minicom , picocom , PuTTY , CRD VanDyke ...

  2. Você precisa fornecer o nome do arquivo de entrada para esta versão de uuencode duas vezes, uma vez para nomear a origem dos dados de entrada e declarar novamente o que o sistema remoto deve chamar o arquivo quando decodificar os dados para uma saída Arquivo. Você pode querer que o sistema remoto tenha um nome diferente para o arquivo de saída.

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

por 12.08.2010 / 20:52
5

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

A única maneira possível de fazer essa transferência é diretamente sobre o canal, usando ASCII de terminal seguro, em estilo clean pré-8 bits. Eu 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, certifique-se de que seu comando com send-file seja, ascii-xfr , essa 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-xfr no lado de recebimento, mas, como não temos, o -n trabalha em torno disso mantendo os finais de linha corretos.

Receptor:

Agora que estamos conectados, acesse o diretório em que você deseja o arquivo recebido.

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

No picocom, apenas CTRL + a + s , e insiro 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 nós decodificamos o arquivo

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

Faça o que for possível para verificar se o arquivo é IDENTICAL para aquele que você enviou, porque uma transferência ASCII não possui 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!

    
por 19.07.2016 / 04:37
5

Talvez você deva dar minicom uma tentativa.

    
por 11.08.2010 / 18:10
5

Não sei se isso funcionaria se tudo o que você tinha era um console serial, mas se você tivesse acesso de rede, então você poderia 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 número de porta TCP foi arbitrária; você pode usar qualquer porta que você 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 de rsa ( ~/.ssh/id_rsa.pub ) e a adicionei ao arquivo de chaves autorizadas para o host de destino.

    
por 11.08.2010 / 18:52
2

Eu usaria o kermit , o avô dos programas de transferência de arquivos. Nós já usamos isso há muito tempo antes do Linux.

    
por 11.08.2010 / 18:31