Warum hat xterm die Datei /dev/ptmx nicht geöffnet?

Warum hat xterm die Datei /dev/ptmx nicht geöffnet?

gnome-terminalLassen Sie die /dev/ptmxDatei öffnen:

Bildbeschreibung hier eingeben

Aber xtermes ist nicht geöffnet:

Bildbeschreibung hier eingeben

Ich dachte, dass die Datei in jedem Terminalemulator /dev/ptmxgeöffnet sein muss. Warum ist sie also bei xterm nicht geöffnet?


Bearbeiten: Dies ist die Ausgabe von ls -ld "$(command -v xterm)"(als Antwort auf Stéphane Chazelas):

Bildbeschreibung hier eingeben

Antwort1

Xterm ist /dev/ptmxgeöffnet, aber Sie können es nicht so sehen. Hier ist der Grund.

Bei Ihren xtermAusführungsberechtigungen ist das S_ISGIDBit (set-group-ID) gesetzt, und die Datei gehört der Gruppe utmp.

Es ist so eingerichtet, dass xtermein Eintrag in /var/run/utmpund hinzugefügt werden kann /var/log/wtmp(die genauen Pfade können je nach System unterschiedlich sein), sodass Ihre Sitzung in der Ausgabe von whooder angezeigt wird last.

Mit diesen Berechtigungen xtermsieht der ausführende Prozess bei der Ausführung seineWirksamGruppen-ID auf die der utmpGruppe ändern (während dielesenDie Gruppen-ID bleibt gleich), wodurch die Berechtigung zum Öffnen der utmp/ wtmpAnmeldedatensätze im Schreibmodus erteilt wird.

Unter Linux können aus Sicherheitsgründen nur rootdie geöffneten Dateien von Prozessen aufgelistet werden, deren effektive Benutzer-ID von der tatsächlichen Benutzer-ID abweicht oder deren effektive Gruppen-ID von der tatsächlichen Gruppen-ID abweicht. (Sie werden feststellen, dass für solche Prozesse im Vergleich zu anderen Prozessen über andere Berechtigungen /proc/<pid>fdverfügt ).dr-x------ root rootdr-x------ you your-group

Aus diesem Grund lsofkönnen beim Ausführen als normaler Benutzer die geöffneten Dateien dieses xtermProzesses nicht aufgelistet werden. Sie müssen den Prozess lsofals ausführen root.

Warum es funktioniert gnome-terminals, dafür gibt es mehrere Möglichkeiten:

  • gnome-terminalfügt keine Einträge in den Anmeldedatensätzen hinzu (das ist bei meinem System der Fall)
  • gnome-terminalverwendet dieutempter Helfer(in diesem Fall ist das der SGID-Befehl utmp), um die Anmeldedatensätze hinzuzufügen. Das ist, was xtermich konsoleauf meinem System mache.
  • gnome-terminalsetzt die effektive Benutzer-ID auf die echte Benutzer-ID zurück (gibt den Sonderzugriff vorübergehend frei utmp), nachdem die Anmeldedatensätze aktualisiert wurden (was xtermnicht der Fall ist).

Antwort2

Das ist das Pseudo-Terminal-Mastergerät aufLinux. Aber xterm verwendet die POSIX-Funktion zum Öffnen des Pseudoterminals, wodurch die Details zum Öffnen des Geräts verborgen werden.

Es gibt verschiedene Konfigurationen für Pseudoterminals, aber wahrscheinlich verwendet Ihr Systemdieser Brocken:

#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 (der eigentliche Terminalemulator: "gnome-terminal" ist einFassade) verwendet etwas Ähnliches (siehesrc/pty.cc).

In der Praxis ist es nicht notwendig, weiterzumachenmitder Dateideskriptor für das Master-Gerät. xterm läuft als zwei Prozesse undVerwendetdiesen Dateideskriptor in seinem "übergeordneten" Prozess. Er verwirft den Dateideskriptor für das Master-Gerät in seinem„Kind“-Prozess (siehe Quelle).

Wenn Sie xterm ausführen,untergeordneter Prozessist diejenige, mit der Ihre Shell kommuniziert, z. B. wenn Siettyum zu sehen, welches Terminal Sie verwenden (also dasSklaveSeite des Pseudoterminals und dieMeisterSeite ist geschlossen, da jeder Prozess nur mit einer Seite des Pseudoterminals arbeiten muss).

Derübergeordneter Prozess(das /dev/ptmxgeöffnet ist) verwaltet die X-Window-Anzeige.

Angesichts all dessen würde ich erwarten, dass lsofxterm als /dev/ptmxgeöffnet angezeigt wird. Außer:

  • in Ihren Screenshots weist die Meldung darauf hin, dass Sie nicht alsWurzel, und wenn ein Berechtigungsproblem vorliegt, lsofdas verhindert, dass alle Prozesse angezeigt werden, dann könnte dies die fehlenden Informationen erklären.
  • Ihr xterm läuft nicht wirklich auf der Maschine, auf der Sie ausführen lsof, z. B. wenn Sie sich per SSH mit der Maschine verbunden haben (und Sie sehen, dass gnome-terminales in einer anderen Sitzung ausgeführt wird).

verwandte Informationen