Intereting Posts
Есть ли способ чтения последнего элемента массива с помощью bash? ПУТЬ env var объявлен в / etc / environment не наследуется? Автоматическое выполнение сценария установки cli в терминале при запуске Как fsck корневая файловая система перед загрузкой или при перезагрузке iptables Port Forwarding – нет обслуживания с портом Конфликт между Месей и Нвидианией Переустановка файла tar или tar.gz в файлы меньшего размера tar / tar.gz Аккаунты autofs не обновляются после перезагрузки Постоянная переменная среды для всех пользователей Копирование XML-контента между двумя тегами из одного файла в другой ping выводить статистику в файл gawk – Динамическое создание текстового файла с использованием полей входных файлов Скрипт для изменения CSV в формат Key Value (KV) Как я могу выборочно копировать файлы из одного каталога в другой каталог? Обновление Linux (Fedora) зашифрованным объемом LUKS

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

gnome-terminal имеет файл /dev/ptmx :

введите описание изображения здесь

Но у xterm его нет:

введите описание изображения здесь

Я думал, что каждый эмулятор терминала должен иметь файл /dev/ptmx , поэтому почему xterm не открыл его?


Редактировать : это вывод команды ls -ld "$(command -v xterm)" (в ответ на Stéphane Chazelas ):

введите описание изображения здесь

Это псевдотерминальное мастер-устройство в 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 (настоящий эмулятор терминала: «гном-терминал» – это фасад ) использует нечто подобное (см. Src / pty.cc ).

На практике нет необходимости продолжать использовать файловый дескриптор для главного устройства. xterm работает как два процесса и использует этот дескриптор файла в своем «родительском» процессе. Он отбрасывает дескриптор файла для основного устройства в его «дочернем» процессе (см. Источник) .

Когда вы запускаете xterm, дочерний процесс – это тот, с которым связана ваша оболочка, например, если вы запустите tty чтобы узнать, какой терминал вы используете (который использует подчиненную сторону псевдотерминала, а главная сторона закрыта, потому что каждый процесс должен работать только с одной стороны псевдотерминала).

Родительский процесс (который имеет /dev/ptmx open) управляет отображением окна X.

Учитывая все это, я ожидал бы увидеть, что lsof показывает xterm как /dev/ptmx . Кроме:

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

Xterm имеет /dev/ptmx open, но вы не можете видеть это так. Вот почему.

У ваших xterm исполняемых разрешений установлен S_ISGID (set-group-ID), и он является групповым utmp .

Он настроен таким образом, чтобы xterm мог добавлять запись в /var/run/utmp и /var/log/wtmp (точные пути могут различаться в зависимости от вашей системы), поэтому ваш сеанс отображается в результатах того, who или last .

С этими разрешениями, когда выполняется xterm , процесс, выполняющий его, будет видеть, что его эффективное изменение utmp группы utmp с utmp группы utmp (в то время как идентификатор группы чтения останется прежним), что даст ему разрешение открыть записи входа utmp / wtmp в режиме записи.

В Linux в качестве меры безопасности только root может отображать открытые файлы процессов с эффективным идентификатором пользователя, отличным от реального идентификатора пользователя, или эффективного идентификатора группы, отличного от реального идентификатора группы. (вы заметите, что для таких процессов /proc/<pid>fd имеет dr-x------ root root права dr-x------ root root , по сравнению с dr-x------ you your-group для других процессов) ,

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

Что касается того, почему он работает для gnome-terminals , есть несколько возможностей:

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