Ejecutar la aplicación GUI como otro usuario (no root)


34

Digamos que tengo 2 cuentas de usuario user1y user2. Cuando inicio sesión como user1, y luego cambio a user2usar su, puedo ejecutar programas de línea de comandos, pero los programas GUI fallan.

Ejemplo:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

Entonces, ¿cómo puedo ejecutar una aplicación GUI?


Descubrí que una de las principales razones es que esto falla porque $XAUTHORITYtodavía está configurado en user1 ~/.Xauthority, que el programa, supongo, intentará leer, y falla porque ese archivo generalmente tiene el modo 0600 ( -rw-------), lo que significa que no está disponible para leer por cualquier persona del grupo "otro", que incluye user2. Es decir, si usted chmod o+r ~/.Xauthority(como usuario1), habrá solucionado este problema. Escribí un guión que demuestra esto.
Braden Best

Respuestas:


42

su vs. su -

Cuando te conviertes en otro usuario, generalmente quieres usarlo su - user2. El guión obligará a los usuarios2 .bash_profilea obtener su fuente.

xhost

Además, deberá otorgar a los usuarios acceso a su pantalla. Esto se rige por X. Puede usar el comando xhost +para permitir que otros usuarios muestren GUI en el escritorio del usuario1.

NOTA: Cuando se ejecute xhost +, querrá ejecutar esto mientras todavía está en un shell que pertenece al usuario1.

$ PANTALLA

Cuando se convierte en usuario2, es posible que deba establecer la variable de entorno $DISPLAY.

$ export DISPLAY=:0.0

1
xhost +user2todavía me da este error - xhost: bad hostname "user2". Busqué en Google algunos, y parece que necesito hacer xhost +user2@laptopo xhost +user2@localhost, no estoy seguro de cuál. Entonces dice xhost +user2@localhost being added to access control list.
sashoalm

1
Pero incluso después de agregar al usuario xhosty especificar export DISPLAY=:0.0, la ejecución leafpadtodavía me da No protocol specified leafpad: Cannot open display:, y no se puede ejecutar. Encontré este enlace en linuxquestions.org/questions/linux-newbie-8/… , que dice que hay algunas cookies mágicas y xauth. ¿Has probado que esas cosas funcionan en tu computadora por cierto? ¿Quizás algo es diferente con mi configuración? Estoy en Debian + LXDE.
sashoalm

1
Gracias, xhost +funciona, y parece que no se necesita nada más (no es necesario configurarlo $DISPLAY). ¿Puedes actualizar tu respuesta y la aceptaré?
sashoalm

55
Oh, encontré algo. En Fedora 21, la ejecución xhostda una lista en el formato SI:localuser:USERNAME, por lo que xhost SI:localuser:user2debería funcionar. Ah, y la pantalla del usuario se puede encontrar usando w.
Wilf

77
xhost +permitirá que cualquier usuario en cualquier host que pueda conectarse a su x-server acceda a su pantalla. xhost +SI:localuser:user2funciona para mí en Debian.
robartsd

9

Debe compartir el token de autenticación del usuario1 (suponiendo que ~sea ​​el hogar del usuario1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null

1
Esta es la única respuesta que funcionó para mí (Ubuntu 14).
sudo

Esta solución funciona bien desde la máquina remota (= cliente X Win) mientras que las soluciones xhost en otras respuestas deben ejecutarse en la máquina local (= servidor X Win).
Jpsy

Puede ser más seguro usarlo tee -apara evitar tropezar con cualquier información existente  .Xauthority.
Scott,

7

Puede usar el reenvío X11:

ssh -XY otheruser@localhost your-gui-program-name-here

Esta es una solución brillante. El más simple que he leído hasta ahora. Muchas más personas están familiarizadas con ssh que con la configuración x11.
Alexis Panagiotopoulos

6

Puede iniciar la aplicación desde otro usuario. Comenzaré la aplicación gimp desde user2, mientras estoy conectado (GUI) con el usuario 1:

$ xhost +
$ sudo su user2

(ingresar pase)

$ gimp

Disfruta :)


44
Esto es lo mismo que la respuesta aceptada de cuatro años.
G-Man dice 'Restablecer a Monica' el

¿Puedes decir una mejor manera rápida?
Antoni Stavrev

Siempre he usado este método, pero ya no me funciona con Debian y Xfce. ( corrección : funciona, pero export DISPLAYprimero tengo que hacerlo , como dice la respuesta aceptada)
giusti

después de que termine su sesión, será bueno deshabilitarla$ xhost -
Antoni Stavrev

4

Puedes probar el comando sux:

sux user2

sux se encargará de las cosas $ DISPLAY por usted. Es posible que deba instalarlo con:

sudo apt-get install sux

bajo Debian / Ubuntu.


44
suxya no es enviado por Debian o Ubuntu. La mejor alternativa que pude encontrar es agregar xhost SI:localuser:root(o cualquier usuario) ~/.xprofilepara permitirlo permanentemente o para usarrunuser
stefanct

Hasta e incluyendo Debian Stretch, había gksu/ gksudoalternativa que funcionaba bien. Mientras todavía está en Sid, se elimina en Buster por problemas de seguridad.
Matija Nalis

0

Como alternativa a sux, para ejecutar de forma segura el comando gráfico ( firefox-esren el ejemplo a continuación) como $AUTHUSER( guesten el ejemplo a continuación):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

el código hace:

  1. le da guestacceso al usuario a su usuario actual$DISPLAY través dexhost +SI:localuser:guest
  2. utiliza ssh-askpasspara solicitarle una contraseña gráficamente (por supuesto, puede usar sudoers(5) NOPASSWD:para evitar esto, si su política de seguridad cree que está bien. O puede usar otros askpassprogramas o especificarlos en los archivos de configuración (consulte sudo(8)para obtener más detalles --askpass)
  3. si la contraseña está bien (y tiene permisos sudoers(5)), ejecuta el comando /usr/bin/firefox-esrcomo otro usuario ( guest)
  4. una vez que se completa el programa, se revocan los permisos para que otro usuario ( guest) acceda a su$DISPLAYxhost -SI:localuser:guest
  5. finalmente, sudo -Kelimina la contraseña en caché, por lo que la próxima invocación de ssh-askpassle pedirá la contraseña nuevamente (en lugar de usar la contraseña en caché)

    mientras que es poco más trabajo de lo que gksu(8)o sux(8)lo hizo, que puede ser escrito, y es mucho más seguro que:

    • xhost + (cualquier usuario tendrá acceso a su pantalla gráfica mientras esté vigente)
    • legible ~ / .xauth por otros usuarios (acceso indefinido de ese usuario a su pantalla)
    • what gksu/ suxdid (copia temporal de ~/.Xauthority, que permitió al usuario especificado copiar su MIT-MAGIC-COOKIE-1y continuar usando su pantalla incluso después de que gksu / sux finalizó (siempre que no apague la máquina o cierre la sesión de la pantalla - los protectores de pantalla, hibernación, etc. no cambiaron la magia Galleta).

ya que solo permitirá el acceso de un usuario local a su pantalla, y luego solo mientras se ejecute el comando (cuando finalice el comando, $AUTHUSERya no podrá acceder a su pantalla de ninguna manera).

Otra alternativa segura es ssh -X(sin -Yque en realidad hace que sea menos seguro! Ver ForwardX11Trusteden ssh_config(5)los detalles), ya que es más fácil de usar si usted no está de secuencias de comandos, pero induce sobrecarga additinal (por ejemplo., Es más lento) y algunos programas podría no funcionar correctamente sin insegura -Y .


-1

Necesita cargar la interfaz de usuario de instalación como usuario2 .

Intenta seguir esto:

Inicie sesión como root :

sudo su

Probar el servidor x:

xclock

Si puede ver un reloj funcionando, eso es bueno, ahora intente ejecutar esto:

xhost

El resultado debería ser así:

xhost SI:localuser:tri
# tri is my user name

Ahora deje que user2 acceda a xhost

xhost +SI:localuser:user2

ahora intente iniciar sesión nuevamente en user2 e intente abrir cualquiera de los programas GUI.


(1) No hay nada en esta pregunta que requiera ejecutarse como root, o que sea beneficioso ejecutarlo como root. (1b) En todo caso, ejecutar como root puede confundir las cosas. (2) Raramente (si alguna vez) hay alguna razón para usar sudo su. Use  sudoo  su; elegir uno. (3) La pregunta está escrita en términos de  user1y  user2. Por favor escriba su respuesta en términos de  user1y  user2. (Hacer o no; no hay  tri). (4) Su respuesta sería mejor si incluyera una explicación de  SI:localuser. ... ... ... ... ... ... ... Por favor no responda en los comentarios; edite  su respuesta para que sea más clara y completa.
Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.