Вы можете добавить его ниже блока *nat
.
*filter
означает таблицу фильтрации, которая используется по умолчанию, если вы не указали никакой таблицы.
Это мастер-устройство псевдотерминала в Linux. Но xterm использует функцию POSIX для открытия псевдотерминала, которая скрывает детали открытия устройства.
Существуют различные конфигурации псевдотерминалов, но, скорее всего, ваша система использует этот фрагмент:
#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT_PTY_ISATTY)
if ((*pty = posix_openpt(O_RDWR)) >= 0) {
char *name = ptsname(*pty);
if (name != 0) {
strcpy(ttydev, name);
result = 0;
}
}
VTE (фактический эмулятор терминала: «gnome-terminal» — это фасад ) использует нечто подобное (см. src/pty.cc).
На практике нет необходимости продолжать использование файлового дескриптора для главного устройства. xterm работает как два процесса и использует этот файловый дескриптор в своем «родительском» процессе. Он отбрасывает файловый дескриптор главного устройства в своем «дочернем» процессе (см. источник).
Когда вы запускаете xterm, дочерний процесс — это тот, с которым общается ваша оболочка, например, если вы запустите tty
, чтобы увидеть, какой терминал вы используете (то есть используете ведомая сторона псевдотерминала, а сторона ведущая закрыта, поскольку каждому процессу нужно работать только с одной стороной псевдотерминала).
родительский процесс (который имеет открытый /dev/ptmx
) управляет отображением окна X.
Учитывая все это, я ожидаю, что lsof
покажет, что xterm открыт /dev/ptmx
.За исключением:
lsof
, которая не позволяет ему видеть все процессы , то это может объяснить недостающую информацию. lsof
, например, если вы подключились к машине по ssh (и вы видите gnome-terminal
выполняется в другом сеансе). В Xterm открыт /dev/ptmx
, но вы не можете видеть его в таком виде. Вот почему.
Ваши разрешения на исполняемый файл xterm
имеют установленный бит S_ISGID
(set-group-ID) и принадлежат группе utmp
.
Он настроен таким образом, что xterm
может добавить запись в /var/run/utmp
и /var/log/wtmp
(точные пути зависит от вашей системы), поэтому ваш сеанс отображается в выводе кто
или последний
.
С этими разрешениями, когда xterm
выполняется, выполняющий его процесс увидит, что его эффективный идентификатор группы изменится на идентификатор группы utmp
(в то время как Идентификатор группы read останется прежним), что даст ему разрешение на открытие записей входа utmp
/wtmp
в режиме записи.
В Linux в качестве меры безопасности только root
может отображать открытые файлы процессов, у которых эффективный идентификатор пользователя отличается от реального идентификатора пользователя или эффективный идентификатор группы отличается от реального идентификатора группы. (вы заметите, что для таких процессов /proc/
имеет права dr-x------ root root
по сравнению с dr- x------ вы your-group
для других процессов).
Вот почему lsof
при работе от имени обычного пользователя не может вывести список открытых файлов этого процесса xterm
. Вам нужно будет запустить lsof
как root
.
Что касается того, почему это работает для гном-терминалов
, есть несколько вариантов:
гном-терминал
не добавляет записи в записи входа в систему (в моей системе так и есть) gnome-terminal
использует utempter
помощник (в данном случае это sgid utmp
) для добавления записей входа. Это то, что xterm
и konsole
делают в моей системе. gnome-terminal
сбрасывает эффективный идентификатор пользователя на реальный идентификатор пользователя (временно отказывается от специального доступа utmp
) после обновления записей входа (что xterm
не не делать).