Was ist XDG_RUNTIME_DIR?

13

Beim Versuch, Evince über die Befehlszeile zu öffnen , ist ein Fehler aufgetreten

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

Wie kann dieses Problem behoben werden?

Muhammad Iliyas
quelle
1
Erzählen Sie uns mehr über Ihr Betriebssystem.
DK Bose

Antworten:

27

Das Wichtigste zuerst: XDG_RUNTIME_DIR

Um Ihre erste Frage zu beantworten: "Was ist XDG_RUNTIME_DIR?" Dies ist eine Umgebungsvariable, die beim Anmelden automatisch festgelegt wird. Sie teilt jedem Programm mit, wo sich ein benutzerspezifisches Verzeichnis befindet, in dem kleine temporäre Dateien gespeichert werden können. Beachten Sie, dass dies XDG_RUNTIME_DIRdurch pam_systemd(8) festgelegt ist , sodass es nicht mit X (grafische Ausführung von Programmen) zusammenhängt, was das Problem ist, das Sie zu haben scheinen.

Problembehandlung

Ihre zweite Frage: "Wie behebe ich dieses Problem?" ist eine sehr gute. Das bedeutet , dass Sie nicht nur daran interessiert sind , was das fix ist, sondern auch , wie es auf eigene Faust herauszufinden. Schauen Sie sich zunächst die ersten Fehlermeldungen an. Wenn Sie nach No protocol specifiedoder suchen WARNING **: Could not open X display, sollten Sie insbesondere feststellen , dass das Problem bei X (auch als X-Fenstersystem bezeichnet ) liegt. Auf diese Weise werden grafische Programme auf Ihrem Bildschirm angezeigt. Wenn Sie wissen, dass dies viele Fragen zur Fehlerbehebung in Ihrem Kopf aufwirft.

X ANZEIGE

Ihre nächste Frage könnte sein, was ist dieses "X-Display" , das sich nicht öffnen lässt? Eine "Anzeige" ist die Adresse für Ihren Bildschirm. [*] Jedes Programm, das auf deinen Bildschirm schreiben möchte, muss die Adresse kennen. Sie können sehen, wie Ihre X-Anzeige aussieht, indem Sie die Umgebungsvariable DISPLAY überprüfen:

echo $DISPLAY

Und Sie können überprüfen, was sudoIhrer Meinung nach Ihr DISPLAY ist, indem Sie Folgendes eingeben:

sudo -s
echo $DISPLAY
exit

Wenn es nichts anzeigt, ist das das Problem. (Siehe Fix weiter unten).

XAUTHORITY

Aber was ist, wenn das nicht das Problem ist und das DISPLAYrichtig eingestellt ist sudo? Dann fragen Sie sich vielleicht, ob X über bestimmte Berechtigungen verfügt, die andere Benutzer daran hindern, auf mein Display zu schreiben. Wenn Sie das für richtig hielten, hat X zwei Hauptautorisierungsmethoden: xauthund xhost. Das heute am häufigsten verwendete ist xauth(1), bei dem die XAUTHORITYUmgebungsvariable verwendet wird. Lassen Sie uns noch einmal überprüfen, ob es richtig eingestellt ist sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Wenn Sie XAUTHORITYauf eine Datei in Ihrem Home-Verzeichnis verweisen, diese beim Ausführen jedoch leer sudoist, ist dies das Problem.

UPDATE: Speichern Sie die Umgebungsvariablen

Also, was ist das Problem? Wenn entweder die DISPLAYoder die XAUTHORITYUmgebungsvariablen nicht über die gespeichert werden sudo, können Sie sudo(8) anweisen, die Umgebung zu erhalten, indem Sie die folgende -EOption verwenden:

sudo -E evince

Ein besserer Weg: env_keep

Sie könnten fragen: Warten Sie, wenn -Ealles magisch funktioniert, warum ist es dann nicht die Standardeinstellung für sudo? Die Antwort lautet, dass dies ein potenzielles Sicherheitsrisiko darstellt. Umgebungsvariablen wirken sich auf die Funktionsweise von Programmen aus, und Sie möchten nicht, dass alle Programme von einem Benutzerkonto in das Stammverzeichnis exportiert werden. Die "richtige" Möglichkeit besteht darin, die Zeile mit (8)Defaults env_keep += "DISPLAY XAUTHORITY" zur sudoers(5) -Datei hinzuzufügen . Sie können überprüfen, welche Umgebungsvariablen sudo beibehält, indem Sie Folgendes ausführen:visudo

sudo sudo -V

(Ja, du tippst sudozweimal). Ich empfehle, die Zeile nicht in die Standard-sudoers-Datei ( /etc/sudoers) zu schreiben , sondern in eine lokale Datei, die beim Upgrade Ihres Systems nicht überschrieben wird. Das können Sie so machen:

sudo visudo -f /etc/sudoers.d/local 

Aber was ist, wenn keines der oben genannten Verfahren funktioniert?

Ich denke, das ist eine ziemlich gründliche Antwort, aber wenn Sie immer noch Probleme haben, gibt es noch eine andere Sache, die ich vorschlagen würde. Sie können xhost(1) verwenden , um einem bestimmten Benutzer auf dem lokalen Host (Ihrem Computer) wie folgt Zugriff zu gewähren:

xhost si:localuser:root

In diesem Fall geben wir rootals Benutzernamen an, da dies das Konto ist, sudounter dem Programme ausgeführt werden.


[*] : F: Ich habe nur einen Bildschirm. Warum benötigt ein X-Display eine "Adresse"? A: Das liegt daran, dass X nicht nur auf Ihrem Computer, sondern auch über das Internet funktioniert. Mit X ist es einfach, Programme auf Ihrem Computer auszuführen, die auf anderen Internet-Hosts angezeigt werden, und Programme auf anderen Hosts, die auf Ihrem Bildschirm angezeigt werden (vorausgesetzt, Sie geben ihnen die Erlaubnis).

hackerb9
quelle
Vielen Dank für die ausführliche Antwort. Ich bin mir sicher, dass Ihre Antwort für jeden Benutzer mindestens etwas Neues enthält. (Für mich: Wie kann ich einem bestimmten Benutzer Zugriff auf X gewähren xhost +
?
3

XDG_RUNTIME_DIRist eine Umgebungsvariable, die in Ihrem X Windows-Kontext festgelegt ist, damit Programme Dinge finden können. Sie ( neo) haben den Grafikkontext eingerichtet.

Wenn Sie versuchen, evinceals auszuführen root, haben Sie die Bedingung eingegeben, bei der ein Benutzer ( root) versucht, auf die neoAnzeige ( ) eines anderen Benutzers zuzugreifen . Dies wird als eine schlechte Sache angesehen.

Wenn Sie sich entscheiden, MÜSSEN Sie einen grafischen Editor als ausführen root, lesen man gksudo und verwenden gksudo.

Waltinator
quelle
interessanter Kommentar. Weißt du dann zufällig, wie ich so etwas machen könnte? journalctl -b -p err | wl-copyes meldet Failed to connect to a Wayland server, was Sinn macht, aber von User POV dumm klingt.
mh-cbon