Escape-символы SSH и передача двоичных файлов
Одно преимущество, которое не было упомянуто в других ответах, состоит в том, что при работе без псевдотерминала экранирующие символы SSH, такие как ~C
, не поддерживаются ; это позволяет программам безопасно передавать двоичные файлы, которые могут содержать эти последовательности.
Доказательство концепции
Скопируйте двоичный файл, используя псевдо-терминал:
$ ssh -t anthony@remote_host 'cat /usr/bin/free' > ~/free
Connection to remote_host closed.
Скопируйте бинарный файл без использования псевдо-терминала:
$ ssh anthony@remote_host 'cat /usr/bin/free' > ~/free2
Два файла не совпадают:
$ diff ~/free*
Binary files /home/anthony/free and /home/anthony/free2 differ
Тот, который был скопирован с псевдо-терминалом, поврежден:
$ chmod +x ~/free*
$ ./free
Segmentation fault
в то время как другой нет:
$ ./free2
total used free shared buffers cached
Mem: 2065496 1980876 84620 0 48264 1502444
-/+ buffers/cache: 430168 1635328
Swap: 4128760 112 4128648
Передача файлов по SSH
Это особенно важно для программ, таких как scp
или rsync
которые используют SSH для передачи данных. Это подробное описание того, как работает протокол SCP, объясняет, как протокол SCP состоит из смеси текстовых сообщений протокола и данных двоичного файла.
OpenSSH помогает защитить вас от себя
Стоит отметить, что даже если этот -t
флаг используется, ssh
клиент OpenSSH откажется выделять псевдо-терминал, если обнаружит, что его stdin
поток не является терминалом:
$ echo testing | ssh -t anthony@remote_host 'echo $TERM'
Pseudo-terminal will not be allocated because stdin is not a terminal.
dumb
Вы по-прежнему можете заставить клиента OpenSSH выделить псевдо-терминал с помощью -tt
:
$ echo testing | ssh -tt anthony@remote_host 'echo $TERM'
xterm
В любом случае, это (разумно) не волнует, если stdout
или stderr
перенаправлены:
$ ssh -t anthony@remote_host 'echo $TERM' >| ssh_output
Connection to remote_host closed.