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 -t
donde 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 -t
argumento para programas interactivos?
RequestTTY yes
(oforce
) en su configuración.top
puede 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
stdout
y lasstderr
transmisiones se envían al localstdout
ystderr
, 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
-t
deberí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
ssh
describe esto:Es característica y probablemente causada por razones históricas de
rsh
comportamiento. 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
rsh
es 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 dersh
yrlogin
(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
ssh
supone 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