J'écris un module PAM pour gérer l'authentification (côté serveur - sshd) et je dois savoir si un client ssh est un tty (interactif) ou non (non interactif).
Quelqu'un a-t-il une idée ?
J'écris un module PAM pour gérer l'authentification (côté serveur - sshd) et je dois savoir si un client ssh est un tty (interactif) ou non (non interactif).
Quelqu'un a-t-il une idée ?
Vous pouvez essayer de vérifier si $SSH_TTY
mais ce n'est pas fiable.
$ 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.
Du côté du client, vous pouvez utiliser la fonction tty
( page de manuel ici ). En supposant que la session est interactive, cette commande renverrait quelque chose comme :
breakthrough@lt0:~$ tty
/dev/pts/0
Cependant, si le client est ノット interactive/tty-based, la commande retournera :
not a tty
En fait, pour écrire un module PAM, tandis que tty
fournit certains codes de sortie que vous pouvez utiliser, mais il est peu probable que vous puissiez utiliser la fonction tty
directement en tant que syscall ; à la place, vous devriez jeter un coup d'oeil à el ttyname()
(ou ttyname_r()
) fonction .
Vous pouvez voir un exemple de mise en œuvre de cette fonction ici qui couvre certains cas d'utilisation générale. Bien qu'il devrait être suffisant de voir si un nom de tty valide a été renvoyé, la meilleure pratique serait de vérifier si l'erreur ENOTTY
a été soulevé, indiquant que le descripteur de fichier transmis ne fait pas référence à un périphérique terminal.
@IgnacioVazquez-Abrams même un pseudo-terminal émule un terminal de texte complet, de sorte que l'on peut s'attendre à ce que même une session non interactive invoquée avec cette commande devrait indiquer que la session est TTY indépendamment...
Si vous écrivez en C :
man isatty
DESCRIPTION La fonction isatty() teste si fd est un descripteur de fichier ouvert faisant référence à un terminal.
RETOURNER LA VALEUR isatty() renvoie 1 si fd est un descripteur de fichier ouvert faisant référence à un terminal ; sinon, 0 est renvoyé, et errno est défini pour indiquer l'erreur.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.