A alocação de terminal quebra arquivos ao usar ssh para transferência

A alocação de terminal quebra arquivos ao usar ssh para transferência

Eu costumava sshdescompactar um arquivo remoto usando:

ssh host "cat file.tgz" | tar xf -

Isso funciona perfeitamente bem. No entanto, notei ao brincar com comandos forçados que a alocação de pty altera a saída do comando:

ssh host -T "cat file.tgz" >first_file
ssh host -t "cat file.tgz" >second_file

Aqui o primeiro arquivo está bom, mas o segundo arquivo está quebrado.

Por que exatamente a alocação de um pty altera a saída?

Responder1

Ajuda ler osshpágina de manual:

 -T      Disable pseudo-tty allocation.                                     

 -t      Force pseudo-tty allocation.  This can be used to execute arbi‐    
         trary screen-based programs on a remote machine, which can be      
         very useful, e.g. when implementing menu services.  Multiple -t    
         options force tty allocation, even if ssh has no local tty.

Quando você diz paradistribuirapseudo-tty, qualquer processo no lado remoto poderá ver que a conexão é um terminal "real" e enviará mensagens adicionais, pois a conexão é interativa. Na inicialização do seu shell, ele também é capaz de configurar os modos do terminal, que você pode inspecionar usando stty -a. Os modos terminais são usados ​​paratraduzirentre a entrada do teclado e o host e entre o texto enviado do host para o seu terminal:

  • Seminicializando, a conexão não é um terminal e nenhuma tradução é feita.
  • Cominicializando, o terminal traduzirá nova linha ( \n) em retorno de carro e avanço de linha (0x0d, 0x0a). Ele também irá (para a maioria dos usuários) traduzir tabulações em espaços.

O efeito descrito é paratradução. Sem isso, seuinterativosessão iria "escada" na tela e seria inutilizável.

Seu shell também pode imprimir informações adicionais, mas para um único comando, osugestãopor @kba é enganoso porque o shell normalmente não enviaComandos, e os controles ssh como ~Cmencionados se aplicam aentradaem vez desaída.

Ao executar para um terminal, o ssh também imprimirá uma mensagem ao fechar a conexão. Mas isso está escrito no erro padrão.

Responder2

Por que exatamente a alocação de um pty altera a saída?

Porque o lado remoto (com terminal alocado) irá "injetar" caracteres de controle para o seu terminal local (basicamente códigos de controle C0 e C1). E como o seu lado local não é um terminal, mas um arquivo, ele apenas os despeja nesse arquivo.

O SSH está tentando fazer o melhor para adivinhar o que você deseja (se stdin não for TTY, ele não alocará TTY remoto, a menos que você adicione -ttswitches). A opção existe por um motivo e se você deseja transferência binária, não quer que os terminais mexam no seu arquivo.

Você pode ver esse comportamento simplesmente transferindo arquivos pequenos e depois hexdump-los:

$ ssh -t host "cat test" > /tmp/test.t
$ ssh host "cat test" > /tmp/test
$ hexdump -C /tmp/test
00000000  0a 2a 20 46 72 69 20 46  65 62 20 31 32 20 32 30  |.* Fri Feb 12 20|
00000030  6d 3e 20 33 2e 34 2e 31  2d 31 0a 2d 20 4e 65 77  |m> 3.4.1-1.- New|

$ hexdump -C /tmp/test.t
00000000  0d 0a 2a 20 46 72 69 20  46 65 62 20 31 32 20 32  |..* Fri Feb 12 2|
00000030  6f 6d 3e 20 33 2e 34 2e  31 2d 31 0d 0a 2d 20 4e  |om> 3.4.1-1..- N|

Para mim a diferença está apenas nos dois bytes 0d 0aantes de cada nova linha, mas pode haver mais (linha Linux Newline é apenas \n, mas o terminal recebe ambos \r\n).

informação relacionada