
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/.Xauthority
eine 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"
¹ $HOME
hier 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 sleep
Schleife nach der While-Schleife beibehalten.