Caracteres de escape SSH e transferência de arquivos binários
Uma vantagem que não foi mencionada nas outras respostas é que, ao operar sem um pseudo-terminal , os caracteres de escape SSH , como não~C
são suportados ; isso torna seguro para os programas transferir arquivos binários que podem conter essas seqüências.
Prova de conceito
Copie um arquivo binário usando um pseudo-terminal:
$ ssh -t anthony@remote_host 'cat /usr/bin/free' > ~/free
Connection to remote_host closed.
Copie um arquivo binário sem usar um pseudo-terminal:
$ ssh anthony@remote_host 'cat /usr/bin/free' > ~/free2
Os dois arquivos não são os mesmos:
$ diff ~/free*
Binary files /home/anthony/free and /home/anthony/free2 differ
O que foi copiado com um pseudo-terminal está corrompido:
$ chmod +x ~/free*
$ ./free
Segmentation fault
enquanto o outro não é:
$ ./free2
total used free shared buffers cached
Mem: 2065496 1980876 84620 0 48264 1502444
-/+ buffers/cache: 430168 1635328
Swap: 4128760 112 4128648
Transferindo arquivos pelo SSH
Isso é particularmente importante para programas como scp
ou rsync
que usam SSH para transferência de dados. Esta descrição detalhada de como o protocolo SCP funciona explica como o protocolo SCP consiste em uma mistura de mensagens de protocolo textuais e dados de arquivos binários.
O OpenSSH ajuda a proteger você de si mesmo
Vale ressaltar que, mesmo que o -t
sinalizador seja usado, o ssh
cliente OpenSSH se recusará a alocar um pseudo-terminal se detectar que seu stdin
fluxo não é um terminal:
$ echo testing | ssh -t anthony@remote_host 'echo $TERM'
Pseudo-terminal will not be allocated because stdin is not a terminal.
dumb
Você ainda pode forçar o cliente OpenSSH a alocar um pseudo-terminal com -tt
:
$ echo testing | ssh -tt anthony@remote_host 'echo $TERM'
xterm
Em ambos os casos, (sensatamente) não se importa se é stdout
ou stderr
é redirecionado:
$ ssh -t anthony@remote_host 'echo $TERM' >| ssh_output
Connection to remote_host closed.