2 votes

Comment puis-je déterminer si une connexion SSH client est associée à un tty ?

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 ?

0voto

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.

0 votes

Ce n'est pas du côté du client ? Je suis du côté serveur (sshd).

0 votes

Euh, non, c'est fait sur le serveur.

0voto

Breakthrough Points 33693

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.

0 votes

Sauf si -t est adoptée.

0 votes

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

0voto

Ole Tange Points 4059

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.

SistemesEz.com

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.

Powered by:

X