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.
solaris
console
serial-console
Stephen Paul Lesniewski
fonte
fonte
Respostas:
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
lrzsz
oukermit
no lado remotoO caso mais fácil é se você tiver um sólido programa de transferência de arquivos binários instalado no lado remoto, como
lrzsz
oukermit
. 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
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 de usar um bom programa de transferência de arquivo binário como
lrzsz
oukermit
: 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
uuencode
ebase64
fazem, diferindo apenas em pequenas escolhas de algoritmos.No sistema local, você codifica o arquivo: ²
Em seguida, você digita este comando no sistema remoto e envia o arquivo usando o recurso "ASCII upload" do console serial local:
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
lrzsz
código-fonte. No lado local:Em seguida, no sistema remoto, digite isto através do programa do console serial:
Depois de iniciar o primeiro comando, faça um "upload ASCII" do
lrzsz.tgz.uue
arquivo 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é:
minicom , picocom , PuTTY , VanDyke CRT ...
Você deve atribuir o nome do arquivo de entrada a esta versão
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 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
uuencode
pode se comportar de maneira diferente.fonte
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
sz
já 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
Agora, verifique se o comando com send-file é,,
ascii-xfr
esta foi a minha linha de comando de conexãoNormalmente queremos
ascii-xfr
do lado receptor, mas como não o temos, isso-n
funciona contornando as terminações de linha corretas.Receptor:
Agora que estamos conectados, vá para o diretório em que deseja o arquivo recebido.
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,
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!fonte
\r\n
ou apenas os\n
dois 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.Talvez você deva experimentar o minicom .
fonte
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.No exemplo acima, eu clonei
sdbYYY
de uma caixa de origem parasdaXXX
a 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.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.fonte
Eu usaria o kermit , o avô dos programas de transferência de arquivos. Já o usamos muito antes de haver o Linux.
fonte