Caractères d'échappement SSH et transfert de fichiers binaires
Un autre avantage qui n’a pas été mentionné dans les autres réponses est que, lorsqu’ils fonctionnent sans pseudo-terminal , les caractères d’échappement SSH tels que ne~C
sont pas pris en charge ; Cela permet aux programmes de transférer des fichiers binaires pouvant contenir ces séquences en toute sécurité.
Preuve de concept
Copier un fichier binaire en utilisant un pseudo-terminal:
$ ssh -t anthony@remote_host 'cat /usr/bin/free' > ~/free
Connection to remote_host closed.
Copier un fichier binaire sans utiliser de pseudo-terminal:
$ ssh anthony@remote_host 'cat /usr/bin/free' > ~/free2
Les deux fichiers ne sont pas identiques:
$ diff ~/free*
Binary files /home/anthony/free and /home/anthony/free2 differ
Celui qui a été copié avec un pseudo-terminal est corrompu:
$ chmod +x ~/free*
$ ./free
Segmentation fault
tandis que l'autre n'est pas:
$ ./free2
total used free shared buffers cached
Mem: 2065496 1980876 84620 0 48264 1502444
-/+ buffers/cache: 430168 1635328
Swap: 4128760 112 4128648
Transfert de fichiers sur SSH
Ceci est particulièrement important pour les programmes tels que scp
ou rsync
utilisant SSH pour le transfert de données. Cette description détaillée du fonctionnement du protocole SCP explique en quoi celui-ci consiste en un mélange de messages de protocole textuels et de données de fichier binaires.
OpenSSH vous aide à vous protéger de vous-même
Il est à noter que même si l' -t
indicateur est utilisé, le ssh
client OpenSSH refusera d'allouer un pseudo-terminal s'il détecte que son stdin
flux n'est pas un terminal:
$ echo testing | ssh -t anthony@remote_host 'echo $TERM'
Pseudo-terminal will not be allocated because stdin is not a terminal.
dumb
Vous pouvez toujours forcer le client OpenSSH à allouer un pseudo-terminal avec -tt
:
$ echo testing | ssh -tt anthony@remote_host 'echo $TERM'
xterm
Dans les deux cas, peu importe la raison (sensuellement) stdout
ou stderr
sont redirigés:
$ ssh -t anthony@remote_host 'echo $TERM' >| ssh_output
Connection to remote_host closed.