
Ich möchte einen Xorg-Server starten (der nur einen minimalen xterm
Terminalemulator aus einem neu erstellten „unbearbeiteten“ tty
) enthalten sollte. Ich dachte, das wäre so einfach wie die Ausgabe von xinit
oder vielleicht von , startx
aber beides hat bei mir nicht funktioniert. Daher die Frage:
Wie kann ich einen Xorg-Server manuell auf einem anderen VT/TTY ausführen/initialisieren/starten?
Hier das
Längere Hintergrundgeschichte zur vorliegenden Frage:
Dies ist der Hintergrund und was ich bereits versucht habe:
Ich man openvt
konnte eine Shell auf einem neu erstellten tty
(oder vt
, kann nicht genau sagen, die verschiedenenvt<>tty) so was:
$> sudo openvt -s /bin/bash
das -s
von bewirkt den direkten Wechsel zu dem neuen TTY/VT auf dem neuen TTY wollte ich manuell einen Server starten, Xorg
der laut man xinit
mit einer minimalen xterm
Anwendung starten sollte. Auf der neuen Shell auf dem umgeschalteten TTY (erstellt über openvt
) gebe ich daher diesen Befehl ein:
$> su -c 'xinit xterm -display :4 -- :4' - mahr &>/tmp/output
und ich erhalte diese Ausgabe
$> cat /tmp/output
X.Org X Server 1.19.6
Release Date: 2017-12-20
X Protocol Version 11, Revision 0
Build Operating System: Linux 4.4.0-148-generic x86_64 Ubuntu
Current Operating System: Linux scitech 4.15.0-70-generic #79-Ubuntu SMP Tue Nov 12 10:36:11 UTC 2019 x86_64
Kernel command line: BOOT_IMAGE=/vmlinuz-4.15.0-70-generic root=/dev/mapper/ubuntu--vg-root ro
Build Date: 03 June 2019 08:10:35AM
xorg-server 2:1.19.6-1ubuntu4.3 (For technical support please see http://www.ubuntu.com/support)
Current version of pixman: 0.34.0
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/home/mahr/.local/share/xorg/Xorg.4.log", Time: Thu Nov 28 10:57:53 2019
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
(EE)
Fatal server error:
(EE) parse_vt_settings: Cannot open /dev/tty0 (Permission denied)
(EE)
(EE)
Please consult the The X.Org Foundation support
at http://wiki.x.org
for help.
(EE) Please also check the log file at "/home/mahr/.local/share/xorg/Xorg.4.log" for additional information.
(EE)
(EE) Server terminated with error (1). Closing log file.
Session terminated, terminating shell...xinit: giving up
xinit: unable to connect to X server: Connection refused
xinit: unexpected signal 2
...terminated.
Antwort1
Nicht verwenden xinit
, da es anfällig ist. Verwenden Sie startx
. xinit
scheint so geschrieben zu sein, dass X-Verbindungen von jeder Benutzer-ID ohne Warnung oder Dokumentation akzeptiert werden. startx
scheint dies zu beheben. Ich weiß nicht, warum diese Situation toleriert wird oder wie es überhaupt dazu gekommen ist.
Die Funktionsweise X
hat sich „kürzlich“ geändert. X
Früher musste man als Root mit gesetzter UID angemeldet sein und zu einem neuen VT wechseln. Beachten Sie, dass es selbst dann möglicherweise nur funktioniert hat, wenn Sie es von einem Text-VT aus gestartet haben. Beispielsweise kann ein Nicht-Root-Benutzer möglicherweise nicht aus einer anderen Sitzung heraus X
starten . Mit anderen Worten, ich bin mir nicht sicher, ob dies überhaupt das bewirken würde, was Sie möchten.X
X
X wurde nun so geändert, dass es dieaktuellVT stattdessen. Einige Tools wie startx
haben ihr Verhalten geändert, um das neue Design zu verwenden.
Das Design ist so konzipiert, dass Sie kein Programm als Root starten müssen (um die Sicherheit zu verbessern). Dies funktioniert logind
, indem stattdessen ein kleinerer Hintergrunddienst verwendet wird (der mit Root-Rechten gestartet wird).
Wenn Sie wieder als Root arbeiten X
, benötigen Sie keine Berechtigung von logind
. Ich denke, X
die Kompatibilität wird damit wahrscheinlich bestehen bleiben.
Sie haben anscheinend versucht, es auszuführen, X
ohne es zu erzwingen, als Vollversion zu laufen root
. In diesem Fall benötigen Sie die Erlaubnis von logind
. logind
gibt Ihnen die Erlaubnis, Dinge zu tunauf dem VT, bei dem Sie sich angemeldet habenIch habe einen Trick entwickelt, umeinen Login fälschen.
user=mahr
sudo systemd-run \
--property PAMName=login \
--property User="$user" \
--property StandardInput=tty \
--property TTYPath=/dev/tty8 \
sh -c 'chvt 8 && exec startx /usr/bin/xterm'
Es scheint, als ob es möglich sein sollte, das TTY auch dynamisch zuzuweisen (mit openvt -s
und einem Skript mit dem tty
Befehl). Allerdings ist mein Bildschirm bei dem Versuch, das zu tun, ein paar Mal eingefroren :-).
(logind
beabsichtigtum den Schaden zu reduzieren, den Nicht-Root-Programme wie dieser X-Server dem System zufügen können. Soweit ich weiß, ist die Implementierung davon ziemlich begrenzt. Es bietet keinen Wiederherstellungsschlüssel. logind
wird sogar schrecklich beendet, wenn Sie den System Attention Key des Kernels verwenden.)
Selbst nach Verwendung des Kernelbefehls SysRQ + R konnte ich den Bildschirm nicht wiederherstellen. Ich denke, irgendetwas ist kaputt gegangen, wahrscheinlich logind
oder gdm
:-).
Antwort2
nach meinem Test funktionieren Ihre Befehle gut, wenn Sie diese beiden Zeilen einfügen/etc/X11/Xwrapper.config:
allowed_users=anybody
needs_root_rights=yes
es scheint, dass das Starten des X-Servers standardmäßig nur dem Benutzer gestattet ist, der Besitzer des virtuellen Zielterminals ist und physisch (Tastatur) mit diesem verbunden ist. (Ihr Fall: Root ist VT-Besitzer und X hat versucht, als „mahr“ ausgeführt zu werden.)
Diese beiden Zeilen überschreiben diese Anforderung und ermöglichen sogar das Starten von allem über einen Befehl oder ein Terminal (nützlich für Init-Skripte oder Remote-X-Starts mit SSH).
sudo openvt -c15 -- su user -c 'xinit /usr/bin/xterm -display :15 -- :15 vt15'
Antwort3
Hier ist meine Version von @sourcejedi'sAntwort(Entschuldigung, das passt nicht in einen Kommentar):
#!/bin/sh
# login-spoof
# Pretend that we're running a command after having logged into a
# given virtual terminal as us. Example:
# $ ./login-spoof 8 startx /usr/bin/xterm -- :1
# Running as unit: run-r3cc564bee3134c789c09c21faee9e710.service
# (opens xterm on /dev/tty8)
TTYNUM=$1; shift
sudo systemd-run \
--property PAMName=login \
--property User="$USER" \
--property StandardInput=tty \
--property TTYPath=/dev/tty$TTYNUM \
sh -c 'export PATH="'$PATH'"; chvt '$TTYNUM' && exec "$@"' x "$@"