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

38

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

Beispielsweise:

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 glxgearsvom Benutzerkonto ausführen . Erst wenn ich das tue sudo -i, taucht das Problem auf. Dies geschieht für jede GUI-App, die ich ausführen möchte. Ich denke, es hängt wahrscheinlich mit X11 zusammen, aber ich bin mir nicht sicher.

Tintenfisch
quelle
1
stackoverflow.com/a/20612084 das hat bei mir perfekt funktioniert.
Über Wayland, nur für den Fall: Arch Wiki , "Sudo mit grafischen Apps funktioniert nicht auf Wayland" .
Alexey

Antworten:

39

Für den Zugriff auf den X-Server sind zwei Dinge erforderlich:

  • Die $DISPLAYVariable, die auf die richtige Anzeige zeigt (normalerweise :0)
  • Richtige Authentifizierungsinformationen

Die Authentifizierungsinformationen können explizit über angegeben werden $XAUTHORITY. Standardmäßig ist dies nicht der Fall ~/.Xauthority.

Wenn $DISPLAYund $XAUTHORITYfür Ihren Benutzer festgelegt ist, sudowerden sie auch für die neue Shell festgelegt, und alles sollte ordnungsgemäß funktionieren.

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

In Debian $XAUTHORITYwird das normalerweise nicht explizit gesetzt. Einfach hinzufügen

export XAUTHORITY=~/.Xauthority

zu deinem .bashrcoder explizit zu sagen XAUTHORITY=~/.Xauthority sudo ...und alles sollte funktionieren.

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

michas
quelle
1
xauth infozeigt den Pfad zur
Normdatei
1
xhost +Mein Problem wurde
behoben
3
xhost +
Beachten
1
tippe ich für debian den export von xauthority als root ein? weil es auf deb10 nicht funktioniert? Ich melde mich mit sudo su
marinara
@marinara verwenden sudo -istatt sudo su -.
Michas
23

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:

[bar@localhost ~]$ sudo -u foo -H firefox

Leider ist dieser Befehl mit demselben Fehler wie in der Frage fehlgeschlagen (dh es wurde kein Protokoll angegeben und das Display 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 dann, ich war in der Lage, Firefox (und andere X-Anwendung) mit sudound dem Benutzer foo zu 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. xhostist ein Tool zum Bearbeiten der Liste der Berechtigungen. Das sibedeutet, dass die Regel serverseitig ist und den lokalen Benutzer foozum Anzeigen von Anwendungen berechtigt . X Window ist in dieser Hinsicht sehr leistungsfähig und Sie können Remoteanwendungen lokal anzeigen, indem Sie mit der DISPLAYUmgebungsvariablen und xhost(aber nicht darauf beschränkt) spielen. In früheren Zeiten, als Menschen tipptenxhost + und implizit erlaubt, dass jeder seine X - Sitzung verwendet, war es heutzutage möglich, eine Anwendung auf dem Bildschirm anzuzeigen, um Streiche zu spielen ;-) letzten 10 Jahre).

PS: Ich habe dies getan, um Firefox in einer Art "Gefängnis" zu starten (um in Zukunft eine Sicherheitsanfälligkeit wie bei pdf.js zu vermeiden ). Aber ich habe schnell herausgefunden, dass das Aufrufen von Firefox über sudo weder den Zugriff auf Audio- noch auf Video-Hardware zulässt. Aber es gibt jemanden, der klar erklärt, wie man die Videohardwarebeschleunigung und das Audio aktiviert, wenn man Firefox über sudo aufruft . YMMV mit diesen Anweisungen, z. B. ich habe noch eine Berechtigung mit Audio verweigert, aber Video ist in Ordnung (getestet auf Fedora 22 mit SELinux ON).

Huygens
quelle
1
In meinem Fall foowar root, dh ich musste xhost si:localuser:rootauf Ubuntu 17.10 laufen .
Karl Richter
Wo fügen Sie den xhost si:localhost<user>Befehl hinzu? Wenn keine Benutzer angemeldet sind, steht keinem X-Server eine Berechtigung zur Verfügung.
cbcoutinho
@cbcoutinho Der obige Anwendungsfall ist, wenn jemand angemeldet ist und eine XWindow-Anwendung als jemand anderes auf demselben Host ausführen möchte. Wenn Sie Ihren Anwendungsfall erläutern (welches Problem möchten Sie lösen), kann ich Ihnen möglicherweise helfen.
Huygens
@Huygens Ich habe eine Workstation zur Simulation von Flüssigkeiten, die auch mit einer GPU ausgestattet ist. Ich rendere die Visualisierungen mit ParaVieweinem Programm vtk, das normalerweise auf der Workstation selbst aufgebaut ist. ParaViewbietet auch ein sicheres Headless-Client / Server-Rendering-Modell über ssh, bei dem ich Remote anstelle von VNC nutzen möchte. Ohne Anmeldung an der Workstation und Ausführung xhostkann ich die GPU nicht verwenden. Das bedeutet, dass ich den Computer nicht remote neu starten kann und immer noch Zugriff auf die GPU habe.
cbcoutinho
1
@cbcoutinho X Window ist eine Client-Server-Architektur. Wenn Sie eine Verbindung über ssh herstellen, wird Ihre lokale Workstation zum Client-X-Fenster. Sie könnten den xhost mit unsicheren Protokollen wie rlogin aber nicht mit ssh verwenden. Sie müssen ssh anweisen, dies für Sie zu tun. Verwenden Sie entweder das Flag -Xoder (besser?) Für -Yssh, um die korrekte Umleitung durchzuführen. Dann brauchen Sie natürlich einen lokalen C-Server. Bei GPU und OpenGL bin ich mir jedoch nicht sicher, wo das Rendern / Berechnen stattfindet. Vielleicht liegt es auf der Client-Seite, nicht auf der Server-Seite. Könnte schwierig sein.
Huygens
10

Du kannst entweder

Geben Sie die Anzeige an, die in der Befehlszeile verwendet werden soll, indem Sie hinzufügen -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 normalen Benutzer zu öffnen, können Sie dies tun mit:

xhost +

X Tian
quelle
1
xhost + ist eine temporäre Maßnahme, bevor Sie als sudo
Octopus am
1
xhost +funktionierte auch für mich, nur dass sie vergessen hatten zu erwähnen, dass wir es vom Terminal des autorisierenden Benutzers ausführen sollten, nicht von einem Terminal unter sudo su.
Nyxee
1
perfekte Arbeit wie Boom
Adiii
3

Da Sie unter Debian arbeiten, ist es die einfache und unterstützte Lösung, dafür zu sorgen sudo, dass Ihre X11-Berechtigungsnachweise kopiert werden. pam_xauthist libpam-modulesgenau zu diesem Zweck im Lieferumfang enthalten ; Um es zu verwenden, müssen Sie nur hinzufügen

session  optional  pam_xauth.so

zu Ihrer /etc/pam.d/sudoDatei. Sie können es auch hinzufügen su. Ausführliche Informationen finden Sie pam_xauthnatürlich auf der Manpage.

Toby Speight
quelle
2

Was hat mir geholfen:

  1. Sie können xauth generate :0 . trustedauf der userSeite, die eine neue generierenMIT-MAGIC-COOKIE-1
  2. Überprüfen Sie den neu erstellten Schlüssel mit xauth list' asBenutzer androot (they should be the same if yourxAuthority` Variable auf die gleiche Datei verweist.

  3. Voila greift von rootjedem X-AppTerminal aus zu, jedoch nur vorübergehend.

Um es dauerhaft zu machen, siehe @Huygens Antwort!

Timo
quelle
1

Alternative Lösung :

Dienste wie cron, die unter root ausgeführt werden, können nicht angezeigt werden, wenn der aktuelle x-Benutzer nicht root ist.

Wir müssen nur den root-Benutzer zu x hinzufügen, Sie können dies zum Zeitpunkt 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 Root-Skript / job / service / ... neu starten.

intika
quelle
Nur neugierig, warum würden Sie eine GUI-App über einen Cron ausführen?
Octopus
in meinem Distro habe ich einen Wurzel cron - Job (ms), die die Systemsicherheit Gesundheit überprüfen und einen Bericht machen ... so stattdessen Protokolle gehen diesen Bericht zu prüfen , i einen Popup - gui mit dem Bericht bevorzuge , wenn dieser Job ausgeführt wird
intika
Das hat für mich funktioniert
Marcus Vinicius Pompeu
0

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

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

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

sudo -E wireshark

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

Hinweis: Das Hinzufügen -E - Schalter wird nicht helfen , wenn Ihre Benutzerumgebung nicht über DISPLAY und XAUTHORITY bereits richtig eingestellt .

shan
quelle
-1

Verwenden Sie diesen Befehl und es wird funktionieren

sudo cp /home/user/.Xauthority .Xauthority
user187508
quelle
2
Dies wird cp: cannot stat ‘/home/user/.Xauthority’: No such file or directoryauf jedem der über 10 Debian-basierten Rechner, auf die ich Zugriff habe, angezeigt.
Anthon
Dies ergibt einen kleinen Kontext (Sie erwarten z. B. stillschweigend ein aktuelles Verzeichnis), und Sie erwähnen keine Nebenwirkungen wie Probleme, wenn Sie dies in mehreren X11-Instanzen tun. Ich finde diesen Weg ein bisschen hackig.
v6ak