Почему xterm не открыл файл / dev / ptmx?

Вы можете добавить его ниже блока *nat.

*filter означает таблицу фильтрации, которая используется по умолчанию, если вы не указали никакой таблицы.

1
29.04.2017, 13:47
2 ответа

Это мастер-устройство псевдотерминала в 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.За исключением:

  • на ваших снимках экрана, сообщение намекает, что вы не работаете как root, и если есть проблема с разрешениями для lsof, которая не позволяет ему видеть все процессы , то это может объяснить недостающую информацию.
  • ваш xterm на самом деле не работает на машине, на которой вы используете lsof, например, если вы подключились к машине по ssh (и вы видите gnome-terminal выполняется в другом сеансе).
1
27.01.2020, 23:34

В 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/fd имеет права dr-x------ root root по сравнению с dr- x------ вы your-group для других процессов).

Вот почему lsof при работе от имени обычного пользователя не может вывести список открытых файлов этого процесса xterm. Вам нужно будет запустить lsof как root.

Что касается того, почему это работает для гном-терминалов, есть несколько вариантов:

  • гном-терминал не добавляет записи в записи входа в систему (в моей системе так и есть)
  • gnome-terminal использует utempter помощник (в данном случае это sgid utmp) для добавления записей входа. Это то, что xterm и konsole делают в моей системе.
  • gnome-terminal сбрасывает эффективный идентификатор пользователя на реальный идентификатор пользователя (временно отказывается от специального доступа utmp) после обновления записей входа (что xterm не не делать).
1
27.01.2020, 23:34

Теги

Похожие вопросы