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.

Respuestas:
Acceder al servidor X requiere dos cosas:
$DISPLAYvariable que apunta a la pantalla correcta (generalmente:0)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$XAUTHORITYestá configurado para su usuario, tambiénsudolo 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 agregaa 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.fuente
xauth infomuestra la ruta al archivo de autoridadxhost +solucionó mi problemaxhost +desactiva completamente la autenticación y permite a todos acceder a todas las aplicaciones en su pantalla ...sudo -ilugar desudo su -.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:
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.
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. Elsiindica que la regla es del lado del servidor y autoriza al usuario localfooa mostrar aplicaciones. X Window es muy potente a este respecto y puede mostrar aplicaciones remotas localmente jugando con elDISPLAYvariable de entorno yxhost(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).
fuente
foofueroot, es decir, tuve que ejecutarxhost si:localuser:rooten Ubuntu 17.10.xhost si:localhost<user>comando? Si no hay usuarios conectados, entonces nadie tiene un servidor X disponible para dar permiso.ParaViewun programa integradovtk, 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 ejecutarxhost, 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.-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 complicadoTu también puedes
Especifique la pantalla que se utilizará en la línea de comando, agregando
-display :0.0o
Configure la variable de entorno en el script de inicio de sesión de root (uno de .bashrc, .profile, .bash_profile ...).
export DISPLAY=:0.0Puede verificar si está configurado,
Para abrir su pantalla para todos los usuarios de todos los hosts como su usuario normal, puede hacer esto con:
xhost +fuente
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 bajosudo su.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 ellibpam-modulespaquete exactamente para este propósito; para usarlo, solo necesita agregara su
/etc/pam.d/sudoarchivo También puede optar por agregarlosutambién. Para obtener información completa, consulte lapam_xauthpágina de manual, por supuesto.fuente
Lo que me ayudó
xauth generate :0 . trusteden eluserlateral, lo que generará un nuevoMIT-MAGIC-COOKIE-1Verifique que la clave recién creada con
xauth list' asla variable xAuthority` del usuarioandroot(they should be the same if youresté apuntando al mismo archivo.Voila,
rootaccederá a cualquieraX-Appdesde la terminal, pero solo temporalmente.Para hacerlo permanente, ¡mira la respuesta de @Huygens!
fuente
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
Para fines de prueba, podemos ejecutar el comando bajo el usuario actual y reiniciar el script raíz / trabajo / servicio / ...
fuente
El
sudocomando tiene un interruptor para preservar las variables de entorno.Para que pueda ejecutar el comando con el interruptor -E. Ejemplo:
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
DISPLAYyXAUTHORITYya está configurado correctamente .fuente
usa este comando y funcionará
fuente
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.