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é:
-
minicom , picocom , PuTTY , CRD VanDyke ...
-
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.