Есть ли способ контролировать, какой псевдотерминал (/dev/pts/*) дается для соединения? Например, у меня есть несколько тонких клиентов, каждый из которых запускает отдельные терминальные сеансы с сервером RHEL через SSH, я хотел бы настроить что-то так, чтобы тонкому клиенту A всегда выделялось /dev/pts/7, а тонкому клиенту B всегда /dev/pts/8. Я пытался создать правило udev, но udevinfo возвращает только «не удалось получить класс устройства», когда я запускаю его против идентификатора терминала, я не уверен, как создать правило, если устройство на самом деле не классифицировано в udev.
решение1
Linux обычно использует интерфейс псевдотерминала Unix 98. Записи в /dev/pts
назначаются вне контроля приложения. Приложение, которое хочет создать псевдотерминал (в данном случае сервер SSH), открывает /dev/ptmx
, который выделяет псевдотерминал и возвращает ему файловый дескриптор. Номер псевдотерминала (число после /dev/pts/
) определяется при выделении псевдотерминала; он привязан к индексу псевдотерминала в структуре данных ядра.
(Если вам интересно, код ядра такой:ptmx_open
вdrivers/tty/pty.c
, который призываетdevpts_new_index
вfs/devpts/inode.c
, который используетida_get_new
вlib/idr.c
. Это приводит к возврату первого доступного числа, хотя нет гарантии, что так будет всегда.)
Ни C API, ни API ядра не позволяют создателю псевдотерминала передавать параметр, который мог бы повлиять на результат.
Возможно, можно получить статический pty, используя устаревший API BSD, который создает pty в форме (master) и (slave). Это потребует как минимум перекомпиляции сервера SSH без настройки конфигурации, чтобы заставить его использовать pty в стиле BSD. Вам нужно будет позаботиться о разрешениях, хотя если SSH — единственный пользователь, это может быть немного проще. Тогда вам нужно будет пропатчить OpenSSH, чтобы добавить некий механизм для привязки определенного номера pty к определенному клиенту./dev/ptyNUM
/dev/ttyNUM
HAVE_DEV_PTMX
Я бы настоятельно не рекомендовал этого делать: это нестандартная конфигурация, требующая написания дополнительного кода. Это дополнительные усилия по обслуживанию и риск для безопасности.
Я вообще не вижу смысла. Можно запустить last
и посмотреть, какой клиент сейчас вошел в систему на каждом терминале.