¿Por qué no puedo ejecutar aplicaciones GUI desde 'root': “No se especificó ningún protocolo”?

39

Instalé Debian en mi máquina anoche. Ahora, no entiendo por qué no puedo ejecutar aplicaciones GUI desde un terminal cuando se ejecuta como root.

Por ejemplo:

sudo -i
glxgears

Genera el siguiente resultado:

No protocol specified
Error: couldn't open display :0

Pero cuando abro el terminal por primera vez, puedo ejecutarlo glxgearsdesde la cuenta de usuario. Es solo después de que hago sudo -ique el problema surge. Esto sucede para cualquier aplicación GUI que intento ejecutar. Creo que probablemente esté relacionado con X11, pero no estoy seguro.

Pulpo
fuente
1
stackoverflow.com/a/20612084 esto funcionó perfectamente para mí.

Respuestas:

39

Acceder al servidor X requiere dos cosas:

  • La $DISPLAYvariable que apunta a la pantalla correcta (generalmente:0 )
  • Información de autenticación adecuada

La información de autenticación se puede especificar explícitamente a través de $XAUTHORITY, y su valor predeterminado es lo ~/.Xauthoritycontrario.

Si $DISPLAYy$XAUTHORITY está configurado para su usuario, también sudolo configurará para el nuevo shell, y todo debería funcionar bien.

Si no están configurados, probablemente tendrán valores predeterminados incorrectos y no podrá iniciar aplicaciones X.

En Debian $XAUTHORITYgeneralmente no se establece explícitamente. Solo agrega

export XAUTHORITY=~/.Xauthority

a su .bashrco decir explícitamenteXAUTHORITY=~/.Xauthority sudo ... y todo debería funcionar.

También puede usar xauth listpara verificar si la información de autenticación adecuada está disponible.

michas
fuente
1
xauth infomuestra la ruta al archivo de autoridad
Tomas Tomecek
1
xhost +solucionó mi problema
peligro89
3
Tenga en cuenta que xhost +desactiva completamente la autenticación y permite a todos acceder a todas las aplicaciones en su pantalla ...
michas
1
para debian, ¿escribo la exportación XAUTHORITY como root? porque no funciona en deb10? Me conecto con sudo su
marinara
@marinara uso en sudo -ilugar de sudo su -.
michas
24

Tenía la misma pregunta que tú pero para un usuario normal. Digamos que quiero iniciar Firefox usando la cuenta de usuario foo. Estoy conectado como barra:

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

Lamentablemente, ese comando falló con el mismo error que en la pregunta (es decir, no se especificó ningún protocolo y no se puede abrir la pantalla)

Mi solución fue simplemente agregar al usuario foo a la lista de acceso autorizado al servidor X.

xhost si:localuser:foo

Y eso fue todo, pude iniciar Firefox (y otras aplicaciones X) usando sudoy el usuario foo.

Antecedentes : en X Window, hay una arquitectura cliente / servidor. Cuando inicia una aplicación, solicita la autorización del servidor X para mostrarla. De manera predeterminada, una vez que abre una sesión (inicia sesión gráficamente), usted (su usuario) obviamente puede comunicarse con el servidor y mostrar aplicaciones. Otros usuarios no tienen este permiso a menos que lo especifique. xhostes una herramienta para manipular la lista de permisos. El siindica que la regla es del lado del servidor y autoriza al usuario local fooa mostrar aplicaciones. X Window es muy potente a este respecto y puede mostrar aplicaciones remotas localmente jugando con elDISPLAY variable de entorno y xhost(pero no limitado a ellas). En los viejos tiempos, cuando la gente escribíaxhost + e implícitamente permitió que todos usaran su sesión X, era posible mostrar aplicaciones en su pantalla para bromas ;-) no tanto hoy en día, ya que las personas usan cada vez menos la arquitectura cliente / servidor X Window (al menos por lo que observo en el últimos 10 años).

PD: Hice esto para lanzar Firefox en una especie de "cárcel" (para evitar una vulnerabilidad como pdf.js en el futuro). Pero rápidamente descubrí que llamar a Firefox a través de sudo no le permitirá acceder al audio ni al hardware de video. Pero hay un tipo que explica claramente cómo activar la aceleración de hardware de video y el audio al llamar a Firefox a través de sudo . YMMV con estas instrucciones, por ejemplo, todavía tengo un permiso denegado con audio pero el video está bien (probado en Fedora 22 con SELinux ON).

Huygens
fuente
1
En mi caso foofue root, es decir, tuve que ejecutar xhost si:localuser:rooten Ubuntu 17.10.
Karl Richter
¿Dónde agregas el xhost si:localhost<user>comando? Si no hay usuarios conectados, entonces nadie tiene un servidor X disponible para dar permiso.
cbcoutinho
@cbcoutinho El caso de uso anterior es cuando alguien inicia sesión y quiere ejecutar una aplicación XWindow como otra persona en el mismo host. Si explica su caso de uso (cuál es el problema que le gustaría resolver), entonces potencialmente puedo ayudarlo.
Huygens
@Huygens Tengo una estación de trabajo para simular fluidos que también está equipada con una GPU. Represento las visualizaciones con ParaViewun programa integrado vtk, generalmente en la estación de trabajo. ParaViewtambién proporciona un modelo seguro de representación de cliente / servidor sin cabeza a través de ssh, que me gustaría aprovechar de forma remota en lugar de usar VNC. Sin iniciar sesión en la estación de trabajo y ejecutar xhost, no puedo utilizar la GPU. Eso significa que no puedo reiniciar la máquina de forma remota y todavía tengo acceso a la GPU.
cbcoutinho
1
@cbcoutinho X Window es una arquitectura de servidor cliente. Cuando se conecta a través de ssh, su estación de trabajo local se convierte en la ventana X del cliente. Puede usar el xhost con protocolos inseguros como rlogin pero no ssh. Debe indicar a ssh que lo haga por usted. Utilice el indicador -Xo (¿mejor?) -YEn ssh, hará la redirección adecuada. Por supuesto, entonces necesita un servidor C local. Sin embargo, con GPU y OpenGL, no estoy seguro de dónde ocurre el procesamiento / procesamiento, tal vez sea del lado del cliente, no del servidor. Podría ser complicado
Huygens
10

Tu también puedes

Especifique la pantalla que se utilizará en la línea de comando, agregando -display :0.0

o

Configure la variable de entorno en el script de inicio de sesión de root (uno de .bashrc, .profile, .bash_profile ...).

export DISPLAY=:0.0

Puede verificar si está configurado,

$ env |grep DISPLAY
DISPLAY=:0.0

Para abrir su pantalla para todos los usuarios de todos los hosts como su usuario normal, puede hacer esto con:

xhost +

X Tian
fuente
1
xhost + funciona como una medida temporal antes de entrar como sudo
Octopus
1
xhost +también funcionó para mí, solo que se olvidaron de mencionar que deberíamos ejecutarlo desde el terminal del usuario que autoriza, no desde un terminal bajo sudo su.
nyxee
1
trabajo perfecto como boom
Adiii
3

Dado que está en Debian, la solución simple y compatible es organizar la sudocopia de sus credenciales de autorización X11. pam_xauthse incluye en el libpam-modulespaquete exactamente para este propósito; para usarlo, solo necesita agregar

session  optional  pam_xauth.so

a su /etc/pam.d/sudoarchivo También puede optar por agregarlo sutambién. Para obtener información completa, consulte la pam_xauthpágina de manual, por supuesto.

Toby Speight
fuente
2

Lo que me ayudó

  1. Puedes xauth generate :0 . trusteden el userlateral, lo que generará un nuevoMIT-MAGIC-COOKIE-1
  2. Verifique que la clave recién creada con xauth list' asla variable xAuthority` del usuario androot (they should be the same if youresté apuntando al mismo archivo.

  3. Voila, rootaccederá a cualquiera X-Appdesde la terminal, pero solo temporalmente.

Para hacerlo permanente, ¡mira la respuesta de @Huygens!

Timo
fuente
1

Solución alternativa :

Los servicios como cron que se ejecuta bajo root no tienen acceso para mostrar si el usuario x actual no es root.

Solo necesitamos agregar un usuario root a x, puede hacerlo al momento de iniciar sesión con un script de inicio

xhost local:root

Para fines de prueba, podemos ejecutar el comando bajo el usuario actual y reiniciar el script raíz / trabajo / servicio / ...

intika
fuente
Solo por curiosidad, ¿por qué estarías ejecutando una aplicación gui a través de un cron?
Pulpo
en mi distribución tengo un trabajo cron cronológico (msec) que verifica el estado de seguridad del sistema y hace un informe ... así que en lugar de ir a los registros para verificar ese informe, prefiero tener una interfaz gráfica de usuario emergente con el informe cuando se ejecuta ese trabajo
intika
ESTO funcionó para mí
Marcus Vinicius Pompeu
0

El sudocomando tiene un interruptor para preservar las variables de entorno.

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

Para que pueda ejecutar el comando con el interruptor -E. Ejemplo:

sudo -E wireshark

Si no necesita ejecutar aplicaciones críticas de privacidad como los navegadores web, será mejor que agregue el interruptor -E con sudo. No podemos ejecutar Chrome o Firefox simplemente agregando el interruptor -E . Porque muchos navegadores han implementado protección contra violaciones de espacio de usuario. La respuesta de @huygens puede tener ideas sobre este tema.

Nota: Agregar el modificador -E no ayudará si el entorno de su usuario NO tiene DISPLAY y XAUTHORITY ya está configurado correctamente .

shan
fuente
-1

usa este comando y funcionará

sudo cp /home/user/.Xauthority .Xauthority
usuario187508
fuente
2
Esto dará cp: cannot stat ‘/home/user/.Xauthority’: No such file or directoryen cualquiera de las más de 10 máquinas basadas en Debian a las que tengo acceso.
Anthon
Esto proporciona un poco de contexto (por ejemplo, espera silenciosamente algún directorio actual) y no menciona efectos secundarios como problemas al hacerlo en varias instancias de X11. Creo que de esta manera es un poco hacky.
v6ak