¿Por qué sshd no utiliza un pseudo terminal cuando el argumento del cliente ssh es seguido por un programa interactivo?

11

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?

Ron Vince
fuente
3
La respuesta corta es "porque generalmente eso no es lo que quieres".
Celada
Predigo que su pregunta será moderada por esencialmente pedir una opinión / presentar una queja. Pero volteemos la pregunta: ¿por qué ssh debería asignar recursos tty cuando no es necesario en la gran mayoría de los casos? La pregunta REAL es: ¿por qué la asignación de fuerza-tty no es una opción de configuración para que pueda hacerla predeterminada o predeterminada del host?
Oteo
@Otheus Es es una opción de configuración. Puede establecer RequestTTY yes(o force) en su configuración.
Jakuje
Er de hecho. Parece haber sido introducido en 6 pero con errores hasta poco después. Solo uso distribuciones muy antiguas. :)
Oteo
66
¿Cómo puede SSH saber de manera confiable que un programa es interactivo? Incluso toppuede ejecutarse en modo por lotes.
muru

Respuestas:

18

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 las stderrtransmisiones se envían al local stdouty stderr, lo que significa que puede redirigirlos / canalizarlos por separado, por ejemplo:

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory

Pero si usa un PTY, toda la salida va a stdout, porque los PTY no tienen flujos separados para salida / error:

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$
psmears
fuente
Este es un buen punto del que no estaba al tanto.
Jakuje
1
@ThomasDickey: Apenas ... la pregunta no es "cuál es la razón histórica detrás de la elección de los desarrolladores de este valor predeterminado", sino "por qué sshd no puede usar un pseudo-terminal por defecto" (el énfasis es mío, pero el la redacción es más o menos directa de la pregunta). Entonces, la diferencia en el comportamiento (que rompería varios modismos de secuencias de comandos) es relevante, independientemente de cómo los desarrolladores tomaron esa decisión :-)
psmears
2
@ThomasDickey: ¿Has leído la pregunta? ¿Dónde menciona la opinión de los desarrolladores?
psmears
1
+1 señala una ventaja específica de no usar una pty (que no sea el rendimiento). Todavía podría argumentar que -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.
Peter Cordes
7

La página del manual sshdescribe esto:

Cuando el servidor acepta la identidad del usuario, el servidor ejecuta el comando dado en una sesión no interactiva o, si no se ha especificado ningún comando, inicia sesión en la máquina y le da al usuario un shell normal como sesión interactiva . Toda comunicación con el comando remoto o shell se cifrará automáticamente.

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).

Jakuje
fuente
Los problemas de recursos son plausibles, pero el comentario al respecto rshes oscuro ya que ese programa no tiene la opción correspondiente.
Thomas Dickey
@ThomasDickey Nunca lo usé rsh, pero ciertamente hay cierta influencia, no en las opciones, sino en el comportamiento de rshy rlogin(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. .
Jakuje
1

¿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.

dmckee --- gatito ex moderador
fuente
No lo sabe No puede saber Y, por lo tanto, tenemos una página de manual que describe el comportamiento en estas situaciones.
Jakuje