Warum funktioniert chvt als normaler Benutzer auf einem virtuellen Terminal, aber nicht unter X?

9

Wenn ich als Benutzer "paul" auf einem virtuellen Terminal (z. B. / dev / tty2) angemeldet bin und "chvt 4" eingebe, werde ich für / dev / tty4 ganz gut auf das virtuelle Terminal umgeschaltet.

Wenn ich als Benutzer "paul" "chvt 7" eingebe, werde ich auf das X-Fenstersystem umgeschaltet. Alles gut.

JEDOCH ... Wenn ich innerhalb eines xterm als Benutzer "paul" "chvt 2" eingebe, wird die folgende Fehlermeldung angezeigt: "Es konnte kein Dateideskriptor für die Konsole abgerufen werden."

Der Befehl chvt funktioniert nur innerhalb eines xterm, wenn ich ihn als "root" ausführe. In diesem Fall ist es dann eine Freude, mich auf ein virtuelles Terminal umzuschalten.

Das scheint mir sehr kaputt zu sein. Weiß jemand, warum das so ist wie es ist?

pbr
quelle

Antworten:

13

Denken Sie aus Sicherheitsgründen daran, dass X sowohl über das Netzwerk als auch an der physischen Konsole verwendet werden kann. Virtuelle Terminals sind es nicht, daher ist ein Login bei der physischen VT ein anderes Sicherheitstier als X.

Aus diesem Debian-Fehlerbericht über den gleichen Fehler in fgconsole. Hier ist die Aufschlüsselung, warum chvtund Freunde von X nicht darauf zugreifen können:

Es betrifft nicht nur fgconsole, sondern auch chvt, openvtund anderer kbd Dienstprogramm , das eine Konsole Dateideskriptor zu erhalten versucht. Diese Programme erledigen ihre Arbeit, indem sie versuchen, diese Dateien (in dieser Reihenfolge) zu öffnen / ioctl :

/proc/self/fd/0         (is a pseudo tty in your case)
/dev/tty                (also PTY)
/dev/tty0               (only accessible to root)
/dev/vc/0               (doesn’t exist nowadays)
/dev/console            (root)
std{in,out,err}         (PTY)

Da keiner von diesen auf ein VT_GETSTATEioctl reagieren kann, schlagen fgconsole und Freunde fehl.

Die bevorzugte Lösung für das Problem ist die Verwendung sudo. Es gibt andere Optionen, die jedoch aus Sicherheitsgründen im allgemeinen Fall weniger vorzuziehen sind. Sie können entscheiden, ob Ihre Situation die eine oder andere tolerieren kann (Hervorhebung von mir):

Es gibt also keine wirkliche Lösung, wenn ich kein Sudo benutze?

Sie können die Berechtigungen von /dev/tty0oder /dev/console ohne Öffnen einer riesigen Sicherheitslücke nicht ändern . Das Einstellen der gewünschten Programme ist eine Option, aber ich würde mich davon fernhalten. sudoist viel sicherer und kann detaillierter gesteuert werden.

Quacksalber
quelle
Wow ... herausragende Details, warum das so ist. Danke, ~ Quacksalber! <p> Trotzdem scheint es mir falsch, dass dies nicht funktioniert, wenn DISPLAY 0: 0 oder 0: N ist, dh wenn der X-Client lokal ausgeführt wird. <p> Mit X über ein Netzwerk wäre DISPLAY 1: 0 ... N, 2: 0..N usw. und aus Sicherheitsgründen sollten alle X-Clients, die nicht auf 0: 0..N stehen, ausfallen. <p> Es ist nur eine Schande, dass diese Programme fehlschlagen, wenn sie von lokalen Clients ohne sudo ausgeführt werden.
pbr
Es ist nur "Hostname: xy", und da "y" normalerweise "0" ist, können wir es auf "Hostname: x" kürzen. Es gibt keinen lokalen / Remote-Unterschied - das: N sagt X nichts darüber aus, ob es sich um eine Remote- oder eine lokale Anzeige handelt. Zum Beispiel führt mein Server gerade Xvnc auf myserver aus: 0. Wenn ich wollte, könnte ich es so konfigurieren, dass es stattdessen auf myserver: 2 ausgeführt wird - das bedeutet nicht unbedingt, dass auf myserver: 0 und myserver: 1 auch ein x-Server vorhanden ist. Daher kann X anhand der: N-Anzeigenummer
Quacksalber Quijote
Ich könnte in dieser Sache abwesend sein, aber ich dachte, der Teil von DISPLAY links von: identifizierte den Host? 0 aka 0.0.0.0 aka localhost oder 127.0.0.1 und möglicherweise einige andere würden localhost anzeigen, was bedeutet, dass es sich um eine lokale Anzeige handelt. Ich habe Sudoers und ein oder zwei Alias ​​NOPASSWD hinzugefügt, damit ich jetzt nahtlos hin und her wechseln kann, aber es ist ein Hack. Immer noch ratlos darüber, warum es nicht möglich wäre, dies zu beheben.
pbr