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