Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Im writing a PAM module to handle authentication (server side - sshd) and I have to know if an ssh client is a tty (interactive) or not (non interactive).

Does anyone have a clue?

share|improve this question

You could try checking for $SSH_TTY, but that isn't reliable.

$ ssh -6 fedoraplug.local
Last login: ......
-$ echo "${!SSH*}"
-$ exit
$ ssh -6 fedoraplug.local 'echo "${!SSH*}"'
$ ssh -t -6 fedoraplug.local 'echo "${!SSH*}"'
Connection to fedoraplug.local closed.
share|improve this answer
isnt that on the client side? Im on the server side (sshd) – jontra volta Jul 15 '13 at 6:36
Uh, no, that's done on the server. – Ignacio Vazquez-Abrams Jul 15 '13 at 6:39

On the client side of things, you can use the tty command (manpage here). Assuming the session is interactive, this command would return something like:

breakthrough@lt0:~$ tty

However, if the client is not interactive/tty-based, the command will return:

not a tty

For actually writing a PAM module, while tty does provide some exit codes that you can use, it's unlikely that you can use the tty command directly as a syscall; instead, you should take a look at the ttyname() (or ttyname_r()) function.

You can see a sample implementation of this function here which covers some general use cases. While it should be sufficient to see if a valid ttyname was returned, best practice would be to check if the error ENOTTY was raised, indicating that the passed file descriptor does not refer to a terminal device.

share|improve this answer
Unless -t is passed. – Ignacio Vazquez-Abrams Jul 15 '13 at 6:39
@IgnacioVazquez-Abrams even a pseudo-terminal emulates a full text terminal, so one would expect even a non-interactive session invoked with this should indicate that the session is TTY regardless... – Breakthrough Jul 15 '13 at 6:46

If you are writing in C:

man isatty

DESCRIPTION The isatty() function tests whether fd is an open file descriptor referring to a terminal.

RETURN VALUE isatty() returns 1 if fd is an open file descriptor referring to a terminal; otherwise 0 is returned, and errno is set to indicate the error.

share|improve this answer
While this command may answer the question, it is better to include the essential parts of the answer here and provide the link to documentation for reference. – Jawa Aug 11 '13 at 16:43

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.