Как я могу определить, имеет ли клиентское соединение 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 был вызван, указывая, что переданный файловый дескриптор не относится к терминальному устройству.

Другие вопросы по тегам