
gnome-terminal
Lassen Sie die /dev/ptmx
Datei öffnen:
Aber xterm
es ist nicht geöffnet:
Ich dachte, dass die Datei in jedem Terminalemulator /dev/ptmx
geö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):
Antwort1
Xterm ist /dev/ptmx
geöffnet, aber Sie können es nicht so sehen. Hier ist der Grund.
Bei Ihren xterm
Ausführungsberechtigungen ist das S_ISGID
Bit (set-group-ID) gesetzt, und die Datei gehört der Gruppe utmp
.
Es ist so eingerichtet, dass xterm
ein Eintrag in /var/run/utmp
und hinzugefügt werden kann /var/log/wtmp
(die genauen Pfade können je nach System unterschiedlich sein), sodass Ihre Sitzung in der Ausgabe von who
oder angezeigt wird last
.
Mit diesen Berechtigungen xterm
sieht der ausführende Prozess bei der Ausführung seineWirksamGruppen-ID auf die der utmp
Gruppe ändern (während dielesenDie Gruppen-ID bleibt gleich), wodurch die Berechtigung zum Öffnen der utmp
/ wtmp
Anmeldedatensätze im Schreibmodus erteilt wird.
Unter Linux können aus Sicherheitsgründen nur root
die 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>fd
verfügt ).dr-x------ root root
dr-x------ you your-group
Aus diesem Grund lsof
können beim Ausführen als normaler Benutzer die geöffneten Dateien dieses xterm
Prozesses nicht aufgelistet werden. Sie müssen den Prozess lsof
als ausführen root
.
Warum es funktioniert gnome-terminals
, dafür gibt es mehrere Möglichkeiten:
gnome-terminal
fügt keine Einträge in den Anmeldedatensätzen hinzu (das ist bei meinem System der Fall)gnome-terminal
verwendet dieutempter
Helfer(in diesem Fall ist das der SGID-Befehlutmp
), um die Anmeldedatensätze hinzuzufügen. Das ist, wasxterm
ichkonsole
auf meinem System mache.gnome-terminal
setzt die effektive Benutzer-ID auf die echte Benutzer-ID zurück (gibt den Sonderzugriff vorübergehend freiutmp
), nachdem die Anmeldedatensätze aktualisiert wurden (wasxterm
nicht 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 Sietty
um 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/ptmx
geöffnet ist) verwaltet die X-Window-Anzeige.
Angesichts all dessen würde ich erwarten, dass lsof
xterm als /dev/ptmx
geöffnet angezeigt wird. Außer:
- in Ihren Screenshots weist die Meldung darauf hin, dass Sie nicht alsWurzel, und wenn ein Berechtigungsproblem vorliegt,
lsof
das 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, dassgnome-terminal
es in einer anderen Sitzung ausgeführt wird).