Servidor X local

Servidor X local

Tengo que utilizar una herramienta casera en mi empresa que requiere privilegios de "root".

Para empeorar las cosas, es una aplicación GUI. Normalmente, no ejecutaría esas cosas, pero no tengo muchas opciones.

Actualmente estoy usando

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

para ejecutar la aplicación. Sin embargo, esto significa que mientras se ejecuta Java, el control de acceso al X-Server está deshabilitado.

Por supuesto, este podría no ser el peor de los problemas de seguridad, pero todavía me hace preguntarme si existe un método más oportuno para ejecutar xhost -inmediatamente después de que la aplicación haya abierto su conexión X.

TL;DR: ¿Cómo puedo ejecutar un comando justo después de que se haya abierto una ventana GUI?

Respuesta1

Servidor X local

Si su servidor X es local (es decir, conexión de socket Unix en lugar de TCP), podría ser más detallado y permitir solo ese usuario local específico:

xhost +SI:localuser:root

X sobre SSH

De lo contrario, podría considerar permitir SSH directo a la raíz (usando autenticación de clave pública), con X reenviado a través de esta conexión segura, y usar esto como reemplazo de su invocación sudo:

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

.Xautoridad y sudo

Suponiendo que root pueda leer su .Xauthorityarchivo (probablemente, a menos que su directorio de inicio esté en NFS), entonces puede encontrar que simplemente colocar XAUTHORITY=$HOME/.Xauthority¹ en el entorno del comando ejecutado dentro de sudo le permitirá conectarse:

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

Si sudo está configurado para no permitir el paso XAUTHORITY, puede exportar explícitamente el token:

.Xautoridad y xauth

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

¹ $HOMEaquí está el directorio de inicio del usuario, no el de raíz.

Respuesta2

Puse lo siguiente en mi ~/.bash_aliases

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

Respuesta3

Si tienes pgrep instalado, podrías hacerlo más determinista con algo como:

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 -
}

... dependiendo de cuál termine siendo el nombre del proceso final. Si resulta que se dispara demasiado rápido, siempre puedes mantener un pequeño sleepbucle después del while.

información relacionada