La forma normal de conectarse a un servidor SSH es ssh username@ip_address. Pero un usuario solo puede querer ejecutar un programa en la máquina remota. Entonces el nombre del programa sigue después del argumento normal que es ssh username@ip_address <program_name>. Por ejemplo, ssh username@ip_address ls. Ese argumento está bien, excepto para los programas interactivos (que también aceptan la entrada del usuario y proporcionan salida), por ejemplo top. La salida es
Término variable de entorno no establecida.
lo que significa que no hay un terminal (pseudo) conectado entre los programas sshd y top. La solución es agregar un argumento -tdonde ahora se convierte todo el comando ssh -t username@ip_address top.
Mi pregunta es ¿por qué sshd por defecto no puede usar un pseudo-terminal para comunicarse con programas no interactivos, por lo que no es necesario agregar el -targumento para programas interactivos?

RequestTTY yes(oforce) en su configuración.toppuede ejecutarse en modo por lotes.Respuestas:
Es cierto que, como han dicho otros, los PTY tienen cierta sobrecarga, pero la gran razón para no usar un PTY cuando se ejecuta un comando remoto es que pierde información.
Normalmente, cuando ejecuta un comando de forma remota a través de ssh, los comandos
stdouty lasstderrtransmisiones se envían al localstdoutystderr, lo que significa que puede redirigirlos / canalizarlos por separado, por ejemplo:Pero si usa un PTY, toda la salida va a
stdout, porque los PTY no tienen flujos separados para salida / error:fuente
-tdebería ser el valor predeterminado y una opción requerida para desactivarlo, por lo que realmente la ventaja de rendimiento menor es lo que tiene más sentido para mí en los casos en que no importa.La página del manual
sshdescribe esto:Es característica y probablemente causada por razones históricas de
rshcomportamiento. Es bastante razonable. La mayoría de los comandos realmente no son interactivos y no es una operación gratuita para asignar PTY (que fue más importante hace 20 años).fuente
rshes oscuro ya que ese programa no tiene la opción correspondiente.rsh, pero ciertamente hay cierta influencia, no en las opciones, sino en el comportamiento dershyrlogin(si hay un comando o no). No puede ejecutar un comando interactivo (como rogue (6) o vi (1)) usando rsh; use rlogin (1) en su lugar. .¿Cómo se
sshsupone que debes saber si el comando que estás invocando es interactivo o no?Esta pesadilla empeora cuando te das cuenta de que podrías estar iniciando sesión en una máquina que ejecuta un sistema operativo que no es Unix.
Al no haber una solución fácil, un caso tenía que ser el predeterminado.
fuente