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

20

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 limitador.

Stephen Paul Lesniewski
fonte
Dado alguns dos comentários que você deixou sobre a disponibilidade dos utilitários, ajudaria se você pudesse nomear a plataforma e / ou descrever o ambiente em que está. Caso contrário, você receberá o estoque Kermit / XMODEM / YMODEM / O ZMODEMk via terminal responde ...
Avery Payne
Passo a maior parte do meu dia atrás da caixa Solaris. Então, nesses termos, se tudo o que você tinha era SUNCreq (ou talvez SUNWCuser), qual seria a resposta?
Stephen Paul Lesniewski
apenas 5 anos atrasado:: P Agora você pode aceitar minha resposta, porque era exatamente o que você queria .... mas provavelmente não precisa hoje.
JM Becker

Respostas:

12

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.

Eu tenho lrzszou kermitno 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 lrzszou kermit. Isso foi mais comum do que hoje, mas seu sistema específico ainda pode ter um deles.

O programa de console serial que você está usando no local quase certamente tem uma maneira de fazer upload de Zmodem ou Kermit, o que permite enviar o que você precisar 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 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 de usar um bom programa de transferência de arquivo binário como lrzszou kermit: eficiência, checksumming, tentativas automáticas, retomada transferência abortada, a transferência de arquivos múltiplos, etc., mas estes são luxos . Se você precisar enviar apenas um arquivo ou estiver enviando arquivos raramente, poderá fazer o upload de arquivos ASCII.

Como os protocolos de terminal interpretam muitos dos valores de bytes que ocorrem em um arquivo de dados binários, não é possível enviar o arquivo diretamente pela mesma conexão; se o fizer, o código de emulação de terminal em cada extremidade tentará interpretar alguns dados, corrompendo-os e provavelmente confundindo o código de manipulação de terminais.

Você pode contornar 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. É isso que os programas uuencodee base64fazem, 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-Cpara sair cat. Agora você tem seu arquivo decodificado no sistema remoto, conforme desejado.

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

Não é difícil inicializar-se com 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. 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 lrzsz.tgz.uuearquivo no 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ê ainda não possui um compilador no sistema remoto, pode compilar de forma cruzada o programa rz(ou o que for) 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 uuencodeduas 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 um arquivo de saída. É possível que você queira que o sistema remoto tenha um nome diferente para seu arquivo de saída.

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

Warren Young
fonte
Fantástico, eu esperava que esta pergunta tivesse uma resposta mencionando kermit! 1;)
Tim
Esta é uma boa resposta, eu gosto da seção "Mas eu não tenho". Infelizmente, ele pára em coisas bastante pop e não vai muito fundo. Criando arquivos executáveis ​​binários para arquiteturas diferentes, apenas dos códigos ASCII? Aqui é para inicialização: retrocomputing.stackexchange.com/questions/4672/...
pfalcon
5

Basicamente, você precisa usar métodos de 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 é usando o ZMODEM, o que significa que você precisa de uma ferramenta como a szjá recebida. 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-xfresta 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-xfrdo lado receptor, mas como não o temos, isso -nfunciona contornando 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, basta pressionar CTRL + a + s e digitar o caminho completo do arquivo que estou enviando. Depois que a transferência for concluída, você precisará CTRL + c para quebrar isso 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!

JM Becker
fonte
(E dois anos depois ...) na minha experiência em transferir arquivos entre sistemas que terminam com linhas finais (obrigado Microsoft!), A codificação / decodificação base64 não se importa com o estilo de final de linha. \r\nou apenas os \ndois funcionam mesmo que sejam "consertados" ao longo do caminho. Não me lembro de imediato se isso estiver no padrão base64 ou apenas nas ferramentas que usei, mas suspeito que seja realmente um comportamento padrão.
Andrew Henle 23/09
5

Talvez você deva experimentar o minicom .

elmarco
fonte
Isso não requer algo como 'sx' ou 'sz' no host de origem?
Stephen Paul Lesniewski
4
Não, o minicom lida com seus próprios xfers de arquivo. sx, sy, sz e rx, ry, rz são programas separados, geralmente encontrados em pacotes apropriadamente chamados lszrz ou algo assim. Embora eu sugira usar sz e rz. Pequeno, simples e faz o que faz. Minicom é um emulador de terminal inteiro.
reiche 11/08/10
4
Esta resposta não está correta. O Minicom gera lrzsz para transferências de arquivos. O Minicom não pode e não lida com suas próprias transferências de arquivos.
Jonathan Cline IEEE
5

Não sei se isso funcionaria se tudo o que você tinha fosse um console serial, mas se você tiver acesso à rede, poderá nc(1)copiar arquivos usando o 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 sdbYYYde uma caixa de origem para sdaXXXa caixa de destino. Minha escolha de 8675 para um 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 para o host de destino.

Kevin M
fonte
5
Posso sugerir um grande sinal vermelho acima da sua primeira ideia? Alguns alma solitária com o coração para aprender pode executar algo parecido com a esperança de cópia de arquivos apenas, sem ler o seguinte parágrafo primeiro, é claro :)
reiche
2

Eu usaria o kermit , o avô dos programas de transferência de arquivos. Já o usamos muito antes de haver o Linux.

txwikinger
fonte
ahh sim .. Lembro-me de fazer isso, mas neste caso o kermit não está instalado no host de origem.
Stephen Paul Lesniewski