Я пишу модуль PAM для обработки аутентификации (на стороне сервера - sshd), и я должен знать, является ли ssh-клиент tty (интерактивным) или нет (не интерактивным).
У кого-нибудь есть ключ?
Если вы пишете на C:
man isatty
ОПИСАНИЕ Функция isatty() проверяет, является ли fd дескриптором открытого файла со ссылкой на терминал.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ isatty() возвращает 1, если fd - дескриптор открытого файла, ссылающийся на терминал; в противном случае возвращается 0, и errno устанавливается для обозначения ошибки.
Вы можете попробовать проверить наличие $SSH_TTY
, но это ненадежно.
$ 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.
На стороне клиента вы можете использовать команду tty
(man-страница здесь). Предполагая, что сеанс является интерактивным, эта команда будет возвращать что-то вроде:
breakthrough@lt0:~$ tty
/dev/pts/0
Однако, если клиент не интерактивный / основанный на tty, команда возвратит:
not a tty
Для фактической записи модуля PAM, хотя tty
предоставляет некоторые коды выхода, которые вы можете использовать, маловероятно, что вы можете использовать команду tty
непосредственно как системный вызов; вместо этого вы должны взглянуть на ttyname()
(или ttyname_r()
).
Вы можете увидеть пример реализации этой функции здесь, который охватывает некоторые общие случаи использования. Хотя этого должно быть достаточно, чтобы увидеть, было ли возвращено правильное имя tty, рекомендуется проверять, возникла ли ошибка ENOTTY
, что указывает на то, что переданный дескриптор файла не ссылается на терминальное устройство.