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?
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.
En el lado del cliente, puede usar el
tty
comando (página de manual aquí ). Suponiendo que la sesión es interactiva, este comando devolvería algo como:Sin embargo, si el cliente no es interactivo / basado en tty, el comando devolverá:
Para escribir realmente un módulo PAM, aunque
tty
proporciona algunos códigos de salida que puede usar, es poco probable que pueda usar eltty
comando directamente como una llamada al sistema; en su lugar, debería echar un vistazo a la funciónttyname()
(ottyname_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
ENOTTY
produjo el error , lo que indica que el descriptor de archivo pasado no se refiere a un dispositivo terminal.fuente
-t
se apruebe.Si estás escribiendo en C:
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.
fuente