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

4

Eu usei ssh para descompactar um arquivo remoto usando:

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

Isso funciona perfeitamente bem. No entanto notei enquanto brincava com comandos forçados, que a alocação de ptys alterava 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 é bom, mas o segundo arquivo está quebrado.

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

    
por michas 18.02.2016 / 09:25

2 respostas

2

Ajuda a ler a ssh pá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 para alocar um pseudo -tty , qualquer processo no lado remoto pode ver que a conexão é um terminal "real" e enviará mensagens adicionais, já que a conexão é interativa. Na inicialização do seu shell, também é possível configurar os modos de terminal, que você pode inspecionar usando stty -a . Os modos de terminal são usados para traduzir entre a entrada do teclado e o host e entre o texto enviado do host para o terminal:

  • Sem inicializando, a conexão não é um terminal e nenhuma tradução é feita.
  • Com inicialização, o terminal traduzirá nova linha ( \n ) para retorno de linha e alimentação de linha (0x0d, 0x0a). Ele também (para a maioria dos usuários) converterá as guias em espaços.

O efeito descrito é para tradução . Sem isso, sua sessão interativa teria "escadaria" pela tela e ficaria inutilizável.

Seu shell também pode imprimir informações adicionais, mas, para um único comando, o sugestão por @kba é enganosa porque o shell normalmente não enviará prompts , e os controles ssh como ~C mencionados se aplicam a entrada em vez de saí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.

    
por 18.02.2016 / 11:04
0

Why exactly does the allocation of a pty change the output?

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

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

Você pode ver esse comportamento simplesmente transferindo arquivos pequenos e, em seguida, fazendo o hexdump deles:

$ 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 é apenas nos dois bytes 0d 0a antes de cada nova linha, mas pode haver mais (a linha do Linux Newline é apenas \n , mas o terminal obtém os dois \r\n ).

    
por 18.02.2016 / 09:41

Tags