
Eu costumava ssh
descompactar 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 ossh
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 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 ~C
mencionados 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 -tt
switches). 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 0a
antes de cada nova linha, mas pode haver mais (linha Linux Newline é apenas \n
, mas o terminal recebe ambos \r\n
).