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 glxgears
desde la cuenta de usuario. Es solo después de que hago sudo -i
que 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:
$DISPLAY
variable 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~/.Xauthority
contrario.Si
$DISPLAY
y$XAUTHORITY
está configurado para su usuario, tambiénsudo
lo 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
$XAUTHORITY
generalmente no se establece explícitamente. Solo agregaa su
.bashrc
o decir explícitamenteXAUTHORITY=~/.Xauthority sudo ...
y todo debería funcionar.También puede usar
xauth list
para verificar si la información de autenticación adecuada está disponible.fuente
xauth info
muestra 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 -i
lugar 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
sudo
y 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.
xhost
es una herramienta para manipular la lista de permisos. Elsi
indica que la regla es del lado del servidor y autoriza al usuario localfoo
a mostrar aplicaciones. X Window es muy potente a este respecto y puede mostrar aplicaciones remotas localmente jugando con elDISPLAY
variable 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
foo
fueroot
, es decir, tuve que ejecutarxhost si:localuser:root
en Ubuntu 17.10.xhost si:localhost<user>
comando? Si no hay usuarios conectados, entonces nadie tiene un servidor X disponible para dar permiso.ParaView
un programa integradovtk
, generalmente en la estación de trabajo.ParaView
tambié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.-X
o (¿mejor?)-Y
En 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.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,
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
sudo
copia de sus credenciales de autorización X11.pam_xauth
se incluye en ellibpam-modules
paquete exactamente para este propósito; para usarlo, solo necesita agregara su
/etc/pam.d/sudo
archivo También puede optar por agregarlosu
también. Para obtener información completa, consulte lapam_xauth
página de manual, por supuesto.fuente
Lo que me ayudó
xauth generate :0 . trusted
en eluser
lateral, lo que generará un nuevoMIT-MAGIC-COOKIE-1
Verifique que la clave recién creada con
xauth list' as
la variable xAuthority` del usuarioand
root(they should be the same if your
esté apuntando al mismo archivo.Voila,
root
accederá a cualquieraX-App
desde 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
sudo
comando 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
DISPLAY
yXAUTHORITY
ya está configurado correctamente .fuente
usa este comando y funcionará
fuente
cp: cannot stat ‘/home/user/.Xauthority’: No such file or directory
en cualquiera de las más de 10 máquinas basadas en Debian a las que tengo acceso.