Lokaler X-Server

Lokaler X-Server

Ich muss in meiner Firma ein selbst entwickeltes Tool verwenden, das Root-Berechtigungen erfordert.

Um das Ganze noch schlimmer zu machen, handelt es sich um eine GUI-Anwendung. Normalerweise würde ich so etwas nicht ausführen, aber ich habe keine große Wahl.

Derzeit verwende ich

xhost + && sudo java -jar servermanager.jar && xhost -

um die Anwendung auszuführen. Dies bedeutet jedoch, dass für die Zeit, in der Java ausgeführt wird, die Zugriffskontrolle auf den X-Server deaktiviert ist.

Zugegeben, das ist vielleicht nicht das schlimmste Sicherheitsproblem, aber ich frage mich trotzdem, ob es eine zeitgesteuertere Methode gibt, die xhost -sofort ausgeführt wird, nachdem die Anwendung ihre X-Verbindung geöffnet hat.

TL;DR: Wie kann ich einen Befehl direkt nach dem Öffnen eines GUI-Fensters ausführen?

Antwort1

Lokaler X-Server

Wenn Ihr X-Server lokal ist (d. h. eine Unix-Socket-Verbindung statt TCP), können Sie es genauer vorgehen und nur diesen bestimmten lokalen Benutzer zulassen:

xhost +SI:localuser:root

X über SSH

Andernfalls könnten Sie direktes SSH zum Rooten zulassen (mit Public-Key-Authentifizierung), wobei X über diese sichere Verbindung weitergeleitet wird, und dies als Ersatz für Ihren Sudo-Aufruf verwenden:

ssh -X -f root@localhost java -jar servermanager.jar

.Xauthority und sudo

Vorausgesetzt, Root kann Ihre Datei lesen .Xauthority(was wahrscheinlich ist, es sei denn, Ihr Home-Verzeichnis befindet sich auf NFS), können Sie XAUTHORITY=$HOME/.Xauthorityeine Verbindung herstellen, indem Sie einfach ¹ in die Umgebung des mit „sudo“ ausgeführten Befehls eingeben:

XAUTHORITY="${XAUTHORITY-$HOME/.Xauthority}" \
  sudo -E java -jar servermanager.jar

Wenn sudo so konfiguriert ist, dass die Übergabe nicht zulässig ist XAUTHORITY, können Sie das Token explizit exportieren:

.Xauthority und xauth

xauth extract - $DISPLAY | sudo bash -c \
  "xauth merge - && java -jar servermanager.jar"

¹ $HOMEhier ist das Home-Verzeichnis des Benutzers, nicht das von Root.

Antwort2

Ich habe Folgendes in meine ~/.bash_aliases eingefügt

   smg(){
     xhost + 
     sudo echo "Starting servermanager" #To get sudo prompt in fg
     sudo java -jar ~/downloads/servermanager.jar 2>/dev/null &
     sleep 5
     xhost -
    }

Antwort3

Wenn Sie pgrep installiert haben, können Sie es mit etwas wie dem folgenden deterministischer machen:

smg(){
  xhost + 
  sudo echo "Starting servermanager" #To get sudo prompt in fg
  sudo java -jar ~/downloads/servermanager.jar 2>/dev/null &
  while  ! pgrep -l servermanager.jar > /dev/null ; do :; done
  xhost -
}

... je nachdem, wie der endgültige Prozessname aussieht. Wenn sich herausstellt, dass der Prozess zu schnell ausgelöst wird, können Sie immer noch eine kleine sleepSchleife nach der While-Schleife beibehalten.

verwandte Informationen