¿Cómo puedo determinar si una conexión SSH de cliente tiene un tty asociado?


2

Estoy escribiendo un módulo PAM para manejar la autenticación (lado del servidor - sshd) y tengo que saber si un cliente ssh es un tty (interactivo) o no (no interactivo).

¿Alguien tiene una pista?

Respuestas:


0

Podría intentar verificarlo $SSH_TTY, pero eso no es confiable.

$ ssh -6 fedoraplug.local
Last login: ......
-$ echo "${!SSH*}"
SSH_CLIENT SSH_CONNECTION SSH_TTY
-$ exit
$ ssh -6 fedoraplug.local 'echo "${!SSH*}"'
SSH_CLIENT SSH_CONNECTION
$ ssh -t -6 fedoraplug.local 'echo "${!SSH*}"'
SSH_CLIENT SSH_CONNECTION SSH_TTY
Connection to fedoraplug.local closed.

¿No es eso del lado del cliente? Estoy en el lado del servidor (sshd)
jontra volta

Uh, no, eso se hace en el servidor.
Ignacio Vazquez-Abrams

0

En el lado del cliente, puede usar el ttycomando (página de manual aquí ). Suponiendo que la sesión es interactiva, este comando devolvería algo como:

breakthrough@lt0:~$ tty
/dev/pts/0

Sin embargo, si el cliente no es interactivo / basado en tty, el comando devolverá:

not a tty

Para escribir realmente un módulo PAM, aunque ttyproporciona algunos códigos de salida que puede usar, es poco probable que pueda usar el ttycomando directamente como una llamada al sistema; en su lugar, debería echar un vistazo a la función ttyname()(o ttyname_r()) .

Puede ver una implementación de muestra de esta función aquí que cubre algunos casos de uso general. Si bien debería ser suficiente para ver si se devolvió un nombre tty válido, la mejor práctica sería verificar si se ENOTTYprodujo el error , lo que indica que el descriptor de archivo pasado no se refiere a un dispositivo terminal.


A menos que -tse apruebe.
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams, incluso un pseudo-terminal emula un terminal de texto completo, por lo que uno esperaría incluso una sesión no interactiva invocada con esto debería indicar que la sesión es TTY independientemente ...
Avance

0

Si estás escribiendo en C:

man isatty

DESCRIPCIÓN La función isatty () prueba si fd es un descriptor de archivo abierto que se refiere a un terminal.

VALOR DEVUELTO isatty () devuelve 1 si fd es un descriptor de archivo abierto que se refiere a un terminal; de lo contrario, se devuelve 0 y se establece errno para indicar el error.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.