Ausführen einer GUI-Anwendung als ein anderer Benutzer (nicht als Root)


34

Angenommen, ich habe 2 Benutzerkonten user1und user2. Wenn ich mich als anmelde user1und dann auf user2using umschalte su, kann ich Befehlszeilenprogramme ausführen, aber GUI-Programme schlagen fehl.

Beispiel:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

Wie kann ich eine GUI-Anwendung ausführen?


Ich habe festgestellt, dass einer der Hauptgründe dafür ist, dass dies fehlschlägt, weil $XAUTHORITYimmer noch user1 gesetzt ist ~/.Xauthority, was das Programm vermutlich versucht zu lesen, und dass dies fehlschlägt, da diese Datei normalerweise den Modus 0600 ( -rw-------) hat, was bedeutet, dass sie nicht verfügbar ist zum Lesen durch irgendjemanden in der "anderen" Gruppe, zu der user2 gehört. Das heißt, wenn Sie chmod o+r ~/.Xauthority(als Benutzer1), haben Sie sich um dieses Problem gehackt. Ich habe ein Skript geschrieben , das dies demonstriert.
Braden Best

Antworten:


42

su vs. su -

Wenn Sie ein anderer Benutzer werden, möchten Sie in der Regel verwenden su - user2. Der Bindestrich zwingt Benutzer2, eine Quelle .bash_profilezu erhalten.

xhost

Zusätzlich müssen Sie Benutzern Zugriff auf Ihr Display gewähren. Dies wird von X geregelt. Mit dem Befehl xhost +können Sie anderen Benutzern die Berechtigung erteilen, GUIs auf dem Desktop von Benutzer1 anzuzeigen.

HINWEIS: Wenn xhost +Sie das Programm ausführen, möchten Sie es ausführen, während Sie sich noch in einer Shell befinden, die zu Benutzer1 gehört.

$ DISPLAY

Wenn Sie Benutzer2 werden, müssen Sie möglicherweise die Umgebungsvariable festlegen $DISPLAY.

$ export DISPLAY=:0.0

1
xhost +user2gibt mir noch diesen fehler - xhost: bad hostname "user2". Ich habe einige gegoogelt, und es scheint, als müsste ich etwas tun, xhost +user2@laptopoder ich bin mir xhost +user2@localhostnicht sicher, welche. Dann heißt es xhost +user2@localhost being added to access control list.
Sashoalm

1
Aber auch nach dem Hinzufügen des Benutzers mit xhostund dem Festlegen von export DISPLAY=:0.0, leafpadgibt mir das Ausführen immer noch No protocol specified leafpad: Cannot open display:und kann nicht ausgeführt werden. Ich habe diesen Link auf linuxquestions.org/questions/linux-newbie-8/… gefunden , der besagt, dass es einige magische Kekse gibt und xauth. Haben Sie getestet, dass diese Dinge auch auf Ihrem Computer funktionieren? Vielleicht ist etwas mit meiner Konfiguration anders? Ich bin auf Debian + LXDE.
Sashoalm

1
Danke, xhost +funktioniert und nichts anderes scheint nötig zu sein (keine Notwendigkeit einzustellen $DISPLAY). Können Sie Ihre Antwort aktualisieren und ich akzeptiere sie?
Sashoalm

5
Oh, hab was gefunden. Auf Fedora 21 läuft xhosteine Liste im Format SI:localuser:USERNAME, xhost SI:localuser:user2sollte also funktionieren. Ach ja und das Display des Benutzers kann mit gefunden werden w.
Wilf

7
xhost +ermöglicht jedem Benutzer auf jedem Host, der eine Verbindung zu Ihrem X-Server herstellen kann, auf Ihren Bildschirm zuzugreifen. xhost +SI:localuser:user2arbeitet für mich an Debian.
robartsd

9

Sie müssen die Authentifizierung von dem Token teilen user1 (unter der Annahme ~Heimat ist user1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null

1
Dies ist die einzige Antwort, die bei mir funktioniert hat (Ubuntu 14).
Sudo

Diese Lösung funktioniert gut von der entfernten Maschine (= X Win Client) aus, während die xhost-Lösungen in anderen Antworten auf der lokalen Maschine (= X Win Server) ausgeführt werden müssen.
Jpsy

Es ist möglicherweise sicherer zu verwenden tee -a, um das Überladen vorhandener Informationen in zu vermeiden  .Xauthority.
Scott

7

Sie können die X11-Weiterleitung verwenden:

ssh -XY otheruser@localhost your-gui-program-name-here

Dies ist eine brillante Lösung. Das einfachste, das ich bisher gelesen habe. Weit mehr Leute sind mit ssh vertraut als mit der x11-Konfiguration.
Alexis Panagiotopoulos

6

Sie können die App von einem anderen Benutzer starten. Ich starte die Gimp-App von Benutzer2 aus, während ich mit Benutzer 1 angemeldet bin (GUI):

$ xhost +
$ sudo su user2

(Pass eingeben)

$ gimp

Genießen :)


4
Dies ist das Gleiche wie die vierjährige akzeptierte Antwort.
G-Man sagt, dass Monica

Kannst du einen schnelleren Weg finden?
Antoni Stavrev

Ich habe diese Methode immer verwendet, aber sie funktioniert mit Debian und Xfce nicht mehr. ( Korrektur : es funktioniert, aber ich muss export DISPLAYzuerst, wie die akzeptierte Antwort sagt)
giusti

Nachdem Sie Ihre Sitzung beendet haben, können Sie sie deaktivieren, indem Sie$ xhost -
Antoni Stavrev

4

Sie können den Befehl sux versuchen:

sux user2

sux wird das $ DISPLAY-Zeug für Sie erledigen. Möglicherweise müssen Sie es installieren mit:

sudo apt-get install sux

unter Debian / Ubuntu.


4
suxwird nicht mehr von Debian oder Ubuntu ausgeliefert. Die beste Alternative, die ich finden konnte, ist das Hinzufügen xhost SI:localuser:root(oder welcher Benutzer auch immer) ~/.xprofile, um es dauerhaft zuzulassen oder zu verwendenrunuser
stefanct

Bis einschließlich Debian Stretch gab es gksu/ gksudoalternative, die gut funktionierten. Während es sich noch in Sid befindet, wird es aus Sicherheitsgründen in Buster entfernt.
Matija Nalis

0

Alternativ dazu suxkönnen Sie den grafischen Befehl ( firefox-esrim folgenden Beispiel) sicher ausführen als $AUTHUSER( guestim folgenden Beispiel):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

der Code macht:

  1. Ermöglicht dem guestBenutzer den Zugriff auf Ihren aktuellen Benutzer $DISPLAYüberxhost +SI:localuser:guest
  2. Anwendungen ssh-askpassSie grafisch für Passwort fragen (natürlich könnten Sie sudoers(5) NOPASSWD:dies vermeiden, wenn Sie Ihre Sicherheitspolitik denkt , dass es in Ordnung ist. Oder könnten Sie andere verwenden askpassProgramme, oder sie in Konfigurationsdateien (siehe angeben sudo(8)Einzelheiten über --askpass)
  3. Wenn das Kennwort in Ordnung ist (und Sie über Berechtigungen verfügen sudoers(5)), wird der Befehl /usr/bin/firefox-esrals anderer Benutzer ausgeführt ( guest).
  4. Nach Abschluss des Programms werden die guestZugriffsberechtigungen für andere Benutzer ( ) $DISPLAYüber widerrufenxhost -SI:localuser:guest
  5. sudo -KEntfernt schließlich das zwischengespeicherte Passwort. Beim nächsten Aufruf von ssh-askpasswerden Sie erneut nach dem Passwort gefragt (anstatt das zwischengespeicherte Passwort zu verwenden).

    Es ist zwar wenig mehr Arbeit als das, was gksu(8)oder was es sux(8)getan hat, aber es kann als Skript geschrieben werden und es ist viel sicherer als:

    • xhost + (Jeder Benutzer hat Zugriff auf Ihre grafische Anzeige, solange diese in Kraft ist.)
    • für andere Benutzer lesbar ~ / .xauth (unbegrenzter Zugriff dieses Benutzers auf Ihr Display)
    • was gksu/ suxtat (temporäre Kopie von ~/.Xauthority, die es dem angegebenen Benutzer ermöglichte MIT-MAGIC-COOKIE-1, Ihr Display zu kopieren und weiter zu verwenden, auch nachdem gksu / sux beendet wurde (solange Sie das Gerät nicht heruntergefahren oder sich vom Display abgemeldet haben - Bildschirmschoner, Ruhezustand usw. haben die Magie nicht verändert Plätzchen).

da nur ein lokaler Benutzer auf Ihre Anzeige zugreifen kann und nur solange der Befehl ausgeführt wird (wenn der Befehl beendet ist, $AUTHUSERkann er in keiner Weise mehr auf Ihre Anzeige zugreifen).

Eine weitere sichere Alternative ist ssh -X(ohne -Ydie eigentlich macht Sie weniger sicher! Sehen ForwardX11Trustedin ssh_config(5)für Details), so ist einfacher zu benutzen , wenn Sie es nicht scripting, aber es induziert additinal Overhead (zB. Es ist langsamer) und einige Programme möglicherweise nicht korrekt funktionieren ohne unsicher -Y .


-1

Sie müssen die Installationsoberfläche als Benutzer2 laden .

Versuchen Sie dies zu befolgen:

Melden Sie sich als root an :

sudo su

Testen Sie den x-Server:

xclock

Wenn Sie eine laufende Uhr sehen können, ist das eine gute Idee. Versuchen Sie nun Folgendes:

xhost

Das Ergebnis sollte so aussehen:

xhost SI:localuser:tri
# tri is my user name

Lassen Sie jetzt user2 auf xhost zugreifen

xhost +SI:localuser:user2

Versuchen Sie nun erneut, sich bei Benutzer2 anzumelden und ein beliebiges GUI-Programm zu öffnen.


(1) In dieser Frage gibt es nichts, was es erfordert, als root zu arbeiten, oder wo es von Vorteil ist, als root zu arbeiten. (1b) Wenn überhaupt, kann das Ausführen als root die Sache nur verwirren. (2) Es gibt selten (wenn überhaupt) einen Grund zur Verwendung sudo su. Verwenden Sie  sudooder  su; wähle eins. (3) Die Frage bezieht sich auf  user1und  user2. Bitte schreiben Sie Ihre Antwort in Bezug auf  user1und  user2. (Tue oder tue nicht; es gibt kein  tri.) (4) Ihre Antwort wäre besser, wenn sie eine Erklärung von enthalten würde  SI:localuser. ………………… Bitte antworten Sie nicht in Kommentaren; Bearbeiten Sie  Ihre Antwort, um sie klarer und vollständiger zu gestalten.
Scott
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.