it-swarm.com.de

Warum kann ich GUI-Apps nicht über 'root' ausführen: "Kein Protokoll angegeben"?

Ich habe Debian letzte Nacht auf meinem Computer installiert. Jetzt verstehe ich nicht, warum ich GUI-Apps nicht von einem Terminal aus ausführen kann, wenn ich als Root ausgeführt werde.

Zum Beispiel:

Sudo -i
glxgears

Erzeugt die folgende Ausgabe:

No protocol specified
Error: couldn't open display :0

Aber wenn ich das Terminal zum ersten Mal öffne, kann ich glxgears über das Benutzerkonto ausführen. Es ist erst nachdem ich Sudo -i dass das Problem auftaucht. Dies geschieht für jede GUI-App, die ich ausführen möchte. Ich denke, es hängt wahrscheinlich mit X11 zusammen, bin mir aber nicht sicher.

41
Octopus

Der Zugriff auf den X-Server erfordert zwei Dinge:

  • Die Variable $DISPLAY Zeigt auf die richtige Anzeige (normalerweise :0).
  • Richtige Authentifizierungsinformationen

Die Authentifizierungsinformationen können explizit über $XAUTHORITY Angegeben werden, andernfalls standardmäßig ~/.Xauthority.

Wenn $DISPLAY Und $XAUTHORITY Für Ihren Benutzer festgelegt sind, legt Sudo sie auch für die neue Shell fest, und alles sollte einwandfrei funktionieren.

Wenn sie nicht festgelegt sind, werden wahrscheinlich standardmäßig die falschen Werte verwendet, und Sie können keine X-Anwendungen starten.

In Debian wird $XAUTHORITY Normalerweise nicht explizit festgelegt. Einfach hinzufügen

export XAUTHORITY=~/.Xauthority

zu Ihrem .bashrc oder sagen Sie explizit XAUTHORITY=~/.Xauthority Sudo ... und alles sollte funktionieren.

Sie können auch xauth list Verwenden, um zu überprüfen, ob die richtigen Authentifizierungsinformationen verfügbar sind.

40
michas

Ich hatte die gleiche Frage wie Sie, aber für einen normalen Benutzer. Angenommen, ich möchte Firefox mit dem Benutzerkonto foo starten. Ich bin als Bar angemeldet:

[[email protected] ~]$ Sudo -u foo -H firefox

Leider ist dieser Befehl mit demselben Fehler wie in der Frage fehlgeschlagen (d. H. Kein Protokoll angegeben und Anzeige kann nicht geöffnet werden).

Meine Lösung bestand darin, den Benutzer foo einfach zur Liste der autorisierten Zugriffe auf den X-Server hinzuzufügen.

xhost si:localuser:foo

Und das war es, ich konnte dann Firefox (und andere X-Anwendungen) mit Sudo und dem Benutzer foo starten.

Hintergrund: In X Window gibt es eine Client/Server-Architektur. Wenn Sie eine Anwendung starten, fordern Sie die X-Server-Berechtigung an, diese anzuzeigen. Sobald Sie eine Sitzung öffnen (Sie melden sich grafisch an), dürfen Sie (Ihr Benutzer) standardmäßig mit dem Server kommunizieren und Anwendungen anzeigen. Andere Benutzer haben diese Berechtigung nur, wenn Sie sie angeben. xhost ist ein Tool zum Bearbeiten der Liste der Berechtigungen. Das si gibt an, dass die Regel serverseitig ist, und autorisiert den lokalen Benutzer foo, Anwendungen anzuzeigen. X Window ist in dieser Hinsicht sehr leistungsfähig und Sie können Remote-Anwendungen lokal anzeigen, indem Sie mit der Umgebungsvariablen DISPLAY und xhost spielen (ohne darauf beschränkt zu sein). In älteren Zeiten, als Leute xhost + und implizit erlaubt jedem, seine X-Sitzung zu verwenden, war es möglich, Anwendungen auf ihrem Bildschirm für Streiche anzuzeigen ;-) heutzutage nicht mehr so ​​sehr, da die Leute immer weniger die X Window-Client/Server-Architektur verwenden (zumindest für das, was ich beobachte in den letzten 10 Jahren).

PS: Ich habe dies getan, um Firefox in einer Art "Gefängnis" zu starten (um eine Sicherheitslücke wie für pdf.js in Zukunft zu vermeiden). Aber ich fand schnell heraus, dass das Aufrufen von Firefox über Sudo weder den Zugriff auf Audio noch auf die Videohardware ermöglicht. Aber es gibt einen Mann, der klar erklärt wie man die Beschleunigung und das Audio von Video-Hardware aktiviert, wenn man Firefox über Sudo anruft . YMMV mit diesen Anweisungen, z. Ich habe immer noch eine Erlaubnis, die mit Audio verweigert wurde, aber Video ist in Ordnung (getestet auf Fedora 22 mit SELinux ON).

25
Huygens

Du kannst entweder

Geben Sie die Anzeige an, die in der Befehlszeile verwendet werden soll, indem Sie -display :0.0

oder

Richten Sie die Umgebungsvariable im Anmeldeskript von root ein (eines von .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Sie können überprüfen, ob es eingestellt ist,

$ env |grep DISPLAY
DISPLAY=:0.0

Um Ihre Anzeige für alle Benutzer von allen Hosts als Ihren normalen Benutzer zu öffnen, haben Sie folgende Möglichkeiten:

xhost +

10
X Tian

Da Sie Debian verwenden, besteht die einfache und unterstützte Lösung darin, Sudo zu veranlassen, Ihre X11-Autorisierungsdaten zu kopieren. pam_xauth Ist genau zu diesem Zweck im Paket libpam-modules Enthalten. Um es zu verwenden, müssen Sie nur hinzufügen

session  optional  pam_xauth.so

in Ihre /etc/pam.d/Sudo Datei. Sie können es auch zu su hinzufügen. Ausführliche Informationen finden Sie natürlich auf der Manpage pam_xauth.

3
Toby Speight

Was hat mir geholfen:

  1. Sie können xauth generate :0 . trusted Auf der Seite user auswählen, wodurch ein neuer MIT-MAGIC-COOKIE-1 Erzeugt wird.
  2. Überprüfen Sie den neu erstellten Schlüssel mit xauth list' as Benutzer androot (they should be the same if your Die Variable xAuthority` zeigt auf dieselbe Datei.

  3. Voila, root greift vom Terminal auf alle X-App Zu, jedoch nur vorübergehend.

Um es dauerhaft zu machen, lesen Sie die Antwort von @Huygens!

2
Timo

Alternative Lösung :

Dienste wie cron, die unter root ausgeführt werden, haben keinen Zugriff auf die Anzeige, wenn der aktuelle x-Benutzer nicht root ist.

Wir müssen nur Root-Benutzer zu x hinzufügen. Sie können dies bei der Anmeldung mit einem Startskript tun

xhost local:root

Zu Testzwecken können wir einfach als Befehl unter dem aktuellen Benutzer ausführen und das Stammskript/job/service/... neu starten.

1
intika

Der Befehl Sudo verfügt über einen Schalter zum Beibehalten von Umgebungsvariablen.

 -E, --preserve-env            preserve user environment when running command

Damit Sie den Befehl mit dem Schalter -E ausführen können. Beispiel:

Sudo -E wireshark

Wenn Sie keine datenschutzkritischen Anwendungen wie Webbrowser ausführen müssen, sollten Sie mit Sudo den Schalter -E hinzufügen. Wir können Chrome oder Firefox nicht einfach durch Hinzufügen des Schalters - E ausführen. Da viele Browser den Schutz vor Verletzungen des Benutzerbereichs implementiert haben . @ huygens ' Antwort kann Einblicke in dieses Thema haben.

Hinweis: Das Hinzufügen des Schalters -E hilft nicht, wenn die Umgebung Ihres Benutzers NICHT über DISPLAY und verfügt XAUTHORITY bereits richtig eingestellt .

0
shan