¿Por qué gksu / gksudo o lanzar una aplicación gráfica con sudo no funcionan con Wayland?

44

Instalé Ubuntu 17.10. Ahora estoy teniendo problemas con gksu:

$ gksu -dg synaptic
No ask_pass set, using default!
xauth: /tmp/libgksu-HgUjgQ/.Xauthority
STARTUP_ID: gksu/synaptic/8760-0-alex-XPS-15-9530_TIME4974977
cmd[0]: /usr/bin/sudo
cmd[1]: -H
cmd[2]: -S
cmd[3]: -p
cmd[4]: GNOME_SUDO_PASS
cmd[5]: -u
cmd[6]: root
cmd[7]: --
cmd[8]: synaptic
buffer: -GNOME_SUDO_PASS-
brute force GNOME_SUDO_PASS ended...
Yeah, we're in...
Unable to init server: Could not connect: Connection refused
(synaptic:8767): Gtk-WARNING **: cannot open display: :1
xauth: /tmp/libgksu-HgUjgQ/.Xauthority
xauth_env: (null)
dir: /tmp/libgksu-HgUjgQ

Si no lo uso -g, el diálogo de contraseña está deshabilitado. Parece un problema al crear un tty para root.

¿Algún consejo?

Alex Chapiro
fuente
1
gksudono funcionará en una sesión de Wayland , puede cambiar a una sesión de Xorg e intentarlo.
pomsky
2
El error en sí mismo si un error X "no puede abrir la pantalla:: 1". Wayland está diseñado de esta manera y, en opinión de los desarrolladores, no debería ejecutar aplicaciones gráficas como root desde la línea de comandos. Puedes trabajar con xhost.
Panther
1
gksu -dg synaptic Nunca deberías estar haciendo eso de todos modos.
Rinzwind
3
@N0rbert deja de agregar el 17.10 a las preguntas que mencionan 17.10. Las etiquetas de versión deben usarse si la pregunta es específica de esa versión. La mayoría de estas preguntas son generalmente aplicables donde Wayland, GNOME Shell, etc. están disponibles, y eso incluye versiones pasadas y futuras.
Muru
@maru. 16.04 LTS es actual, 17.04 está cerca de EOL, así que 17.10 normal significa Wayland y GNOME Shell predeterminado, por lo que creo que la etiqueta 17.10 es útil. Es difícil encontrar preguntas, donde los usuarios tienen problemas con 17.10, pero no tienen respuestas y comentarios aquí . Necesitan respuestas, pero olvidaron agregar la etiqueta 17.10 cuando se les preguntó. Puedo dejar de agregar etiquetas. Fue una buena voluntad.
N0rbert

Respuestas:

55

Tenga en cuenta que esta respuesta es específica para las versiones de Ubuntu que usan Wayland, siendo 17.10 la primera versión que usa Wayland por defecto.

¡Es una característica, no un error! Es una característica de diseño de Wayland que no puede iniciar aplicaciones gráficas como root desde el terminal.

Las discusiones principales son, por supuesto, en los sitios de Fedora. Vea el error de Fedora # 1274451 y las aplicaciones gráficas no se pueden ejecutar como root en wayland (por ejemplo, gedit, beesu, gparted, nautilus) en Ask Fedora . Pero también hay una discusión sobre los sitios de Ubuntu (los desarrolladores de Ubuntu no están seguros acerca del uso de Wayland por defecto en 17.10 - ¡OMG! Ubuntu ).

Informe de error de Ubuntu: no se pueden iniciar aplicaciones pkexec en la sesión de Wayland

Posible solución : si está editando archivos del sistema con un editor gráfico (como gedit), use una herramienta de línea de comandos como nanoor vimo emacs. nanoPor lo general, vimes más fácil para los nuevos usuarios, es más potente y tiene más funciones, consulte este Tutorial de Vim o similar.

En cualquier caso, si realmente desea o necesita ejecutar aplicaciones gráficas como root , configure xhostprimero lo que obliga a recurrir a Xserver.

Para establecer permisos, ejecute:

xhost si:localuser:root 

Cuando haya terminado, para eliminar permisos

xhost -si:localuser:root 

Puede agregar una opción gráfica / de escritorio para hacer esto según este informe de error sináptico

Las aplicaciones pxexec se pueden curar con el xhost +si:localuser:rootinicio automático de XDG de la siguiente manera (idea de N0rbert):

cat <<EOF | sudo tee /etc/xdg/autostart/xhost.desktop
[Desktop Entry]
Name=xhost
Comment=Fix graphical root applications
Exec="xhost +si:localuser:root"
Terminal=false
Type=Application
EOF

Puede agregar este comando xhost a .bashrc, pero le recomendaría un par de alias

alias gsuon='xhost si:localuser:root'

alias gsuoff='xhost -si:localuser:root'

Puedes nombrar los alias como quieras.

Para más detalles ver:


Cambiar de nuevo a Xorg

Si prefiere Xorg por cualquier motivo, puede seleccionar ejecutar Xorg al iniciar sesión

Vea ¿Cómo cambia de Wayland a Xorg en Ubuntu 17.10?

Pantera
fuente
¿Esta solución también funciona con Mir ?
Elías Kagan
No sé sobre MIR, puede ser.
Panther
1
O simplementexhost +local:
chaskes
18
"¡Es una característica, no un error!" ... suspiro. Este tipo de cosas es exactamente la razón por la que no puedo convencer a mis amigos y colegas para que se cambien a Linux. Usar VIM y Nano no es una alternativa a GEdit. Gedit funciona como un bloc de notas, mientras que necesitas aprender el código CRTL para esos otros. Y tome por ejemplo a Nano usando los términos como "Escribir" en lugar de "Guardar" ... Muy amigable para el usuario.
JHBonarius
99
Esto también rompe por completo a gparted, que es algo importante para tener acceso. ¿Qué pasó con "No intentes evitar que las personas estúpidas hagan cosas estúpidas; solo lograrás evitar que las personas inteligentes hagan cosas inteligentes"?
Matthew Najmon
21

ingrese la descripción de la imagen aquí Soluciones

En Wayland a menudo es difícil ejecutar programas de aplicación GUI con permisos elevados (sudo -H, gksu ...). Es una buena idea hacer tales tareas con herramientas de línea de comandos.

Pero existen soluciones alternativas, si tiene una herramienta GUI, que funcione bien para usted y necesite permisos elevados. (Uso dos de estas herramientas estándar: Synaptic Package Manager synapticy la herramienta de particionamiento Gparted gparted. También uso MakeUSB para crear unidades de arranque USB mkusb, pero puede ejecutar las partes que necesitan permisos elevados sin gráficos).

xhost y sudo -H

  1. Existe una solución alternativa para permitir programas de aplicaciones gráficas propiedad de otros usuarios que no sean el usuario registrado en Wayland,

    xhost +si:localuser:root
    
  2. gksuy gksudono están incluidos en Ubuntu estándar y no funcionan aquí, pero funcionan en Xorg.

    En cambio, puedes usar

    sudo -H
    
  3. Es una buena idea evitar los programas de aplicaciones gráficas propiedad de otros usuarios que no sean el usuario que inició sesión posteriormente,

    xhost -si:localuser:root
    

backend de administración de gvfs

En Ubuntu 17.10 (gvfs> = 1.29.4) puede usar el backend de administración de gvfs. Tenga en cuenta que necesita la ruta completa,

gedit admin:///path/to/file

En teoría, el método de back-end de administración de gvfs (que usa polkit) es mejor y más seguro (que xhosty xudo -H), independientemente de la interfaz de usuario que use.

No ejecuta toda la aplicación como root. La escalada de privilegios ocurre solo cuando es estrictamente necesario. Vea el siguiente enlace y enlaces desde él,

nautilus-admin

También es posible usarlo nautilus-adminpara operaciones de archivo con permisos elevados y usar geditcon permisos elevados. Esto se describe en la siguiente respuesta de AskUbuntu:

Acceso temporal para root al escritorio de Wayland a través de la función gks

Por favor, evite sudo GUI-program. Puede hacer que el sistema sobrescriba los archivos de configuración para su ID de usuario normal con rootla configuración y establezca la propiedad y los permisos para ajustar rooty bloquear su ID de usuario normal. Debe ejecutar aplicaciones GUI con sudo -H, que escribe los archivos de configuración en rootel directorio de inicio de ' /root. Ejemplo:

sudo -H gedit myfile.txt

Pero existe el riesgo de que lo olvides -H. En su lugar, puede crear una función, por ejemplogks

gks () { xhost +si:localuser:root; sudo -H "$@"; xhost -si:localuser:root; }

y guárdalo ~/.bashrccerca de los alias. Entonces puedes correr

gks gedit myfile.txt

de una manera similar a la que usabas gksudoantes.

Pruebas

Puede comprobar cómo sudo, sudo -Hy gksel trabajo con los siguientes comandos

sudodus@xenial32 ~ $ sudo bash -c "echo ~"
/home/sudodus
sudodus@xenial32 ~ $ sudo -H bash -c "echo ~"
/root
sudodus@xenial32 ~ $ gks () { xhost +si:localuser:root; sudo -H "$@"; xhost -si:localuser:root; }
sudodus@xenial32 ~ $ gks bash -c "echo ~"
localuser:root being added to access control list
/root
localuser:root being removed from access control list
sudodus@xenial32 ~ $ 

y por supuesto

gks gedit myfile.txt

según el ejemplo de la sección anterior.

Método que funciona a través de Alt-F2 y el menú Gnome Shell

En lugar de agregar una función simple de una línea ~/.bashrc, puede crear un sistema que funcione también sin bash. Puede ser conveniente de usar, pero es más complicado de configurar. Tenga en cuenta que debe instalar solo una de las alternativas, ya que la función de una línea alterará el uso de este sistema más complicado.

Tres archivos

El shellscript gks:

#!/bin/bash

xhost +si:localuser:root

if [ $# -eq 0 ]
then
  xterm -T "gks console - enter command and password" \
  -fa default -fs 14 -geometry 60x4 \
  -e bash -c 'echo "gks lets you run command lines with GUI programs
with temporary elevated permissions in Wayland."; \
read -p "Enter command: " cmd; \
cmdfile=$(mktemp); echo "$cmd" > "$cmdfile"; \
sudo -H bash "$cmdfile"; rm "$cmdfile"'
else
 xterm -T "gks console - enter password" -fa default -fs 14 -geometry 60x4 -e sudo -H "$@"
fi 

xhost -si:localuser:root;

El archivo de escritorio gks.desktop:

[Desktop Entry]
Version=1.0
Categories=Application;System;
Type=Application
Name=gks
Description=Run program with temporary elevated permissions in Wayland
Comment=Run program with temporary elevated permissions in Wayland
Exec=gks %f
Icon=/usr/share/icons/gks.svg
Terminal=false
StartupNotify=false
GenericName[en_US.UTF-8]=Run program with temporary elevated permissions in Wayland

El archivo de icono se gks.svgve así:

ingrese la descripción de la imagen aquí

Puede descargar el archivo de icono o un tarball con los tres archivos desde este enlace,

wiki.ubuntu.com/Wayland/gks

Copie los archivos [extraídos, copiados y pegados] en las siguientes ubicaciones,

sudo cp gks /usr/bin
sudo cp gks.desktop /usr/share/applications/
sudo cp gks.svg /usr/share/icons

Cerrar sesión / iniciar sesión o reiniciar, y debería haber un icono de escritorio que funcione. Funcionará desde una ventana de terminal como con la solución simple con la función.

Alt F2 caja:

ingrese la descripción de la imagen aquí

Menú de Shell de Gnome:

ingrese la descripción de la imagen aquí

consola gks y gparted:

ingrese la descripción de la imagen aquí

Script personalizado y archivo de escritorio

Si solo tiene unas pocas aplicaciones GUI, que necesitan permisos elevados, puede crear scripts personalizados y archivos de escritorio para ellos y evitar ingresar el comando (nombre de la aplicación). Solo ingresaría la contraseña, que no es más difícil en comparación con las versiones anteriores de Ubuntu (de todos modos, debe ingresar la contraseña).

Ejemplo con el programa GUI simple xlogoque viene con el paquete del programa x11-apps:

El shellscript gkslogo(simplificado en comparación con gks),

#!/bin/bash

xhost +si:localuser:root

xterm -T "gks console - enter password" -fa default -fs 14 -geometry 60x4 -e sudo -H xlogo

xhost -si:localuser:root;

El archivo de escritorio gkslogo.desktop:

[Desktop Entry]
Version=1.0
Categories=Application;System;
Type=Application
Name=gkslogo
Description=Run program with temporary elevated permissions in Wayland
Comment=Run program with temporary elevated permissions in Wayland
Exec=gkslogo
Icon=/usr/share/icons/gks.svg
Terminal=false
StartupNotify=false
GenericName[en_US.UTF-8]=Run program with temporary elevated permissions in Wayland

Era flojo y usaba el mismo archivo de ícono gks.svg

Copie los archivos [copiados y pegados] en las siguientes ubicaciones,

sudo cp gkslogo /usr/bin
sudo cp gkslogo.desktop /usr/share/applications/

Consola gks [logo] y xlogo:

ingrese la descripción de la imagen aquí

sudodus
fuente
¿Es el "acceso temporal para root al escritorio de Wayland a través de la función gks" un método más seguro (por ejemplo, que agregar un archivo /etc/xdg/autostart/xhost.destopcomo también se sugiere) porque termina restaurando el entorno original? ¿Y podemos reemplazarlo sudo -Hcon seguridad gksuen el alias para usar insertar en archivos .desktop, etc.?
Sadi
1
Sí, creo que es más seguro permitir el acceso de root al escritorio solo cuando sea necesario. Y sí, se puede reemplazar sudo -Hcon gksula función, que puede funcionar mejor para sus aplicaciones.
sudodus
1
+1 para una respuesta extremadamente completa. De manera similar a su gksabreviatura, configuré el gsuuso de kits de políticas (el nuevo futuro para 16.04) para gedity nautilus. Cuando salga 18.04, creo que solo xhost +si...nombraré el script de envoltura gksuque nunca instalaré desde los paquetes que comiencen 18.04.
WinEunuuchs2Unix
2
"Wayland está diseñado para no permitir permisos elevados (sudo -H, gksu ...) con programas de aplicación GUI". - falso Wayland permite aplicaciones root muy bien. Puedes ver esto corriendo sudo -E gedit. Actualmente hay un error en el gdmque configura el servidor de compatibilidad Xwayland X11 para que no sea compatible con XAUTHORITY, que es necesario para que las aplicaciones X11 que se ejecutan como root funcionen. Las aplicaciones nativas de wayland que se ejecutan como root funcionan bien.
psusi
1
@psusi, modifiqué la respuesta para evitar declaraciones sobre el diseño y las intenciones de Wayland.
sudodus
6

Verifique mejor si wayland realmente se está ejecutando primero antes de otorgar la raíz correcta

if [ $XDG_SESSION_TYPE = "wayland" ]; then
    xhost +si:localuser:root
fi
eli chan
fuente
5

Si está utilizando Ubuntu 17.04 o superior, se recomienda utilizar el backend de administración de gvfs . Simplemente agregue admin: // al frente de la ruta de archivo completa que desea abrir en una aplicación como el Editor de texto o las aplicaciones Archivos .

Por ejemplo, para cambiar la configuración de arranque, abra

admin:///etc/default/grub

Este método usa PolicyKit y seguirá funcionando con el modo predeterminado Wayland de Ubuntu 17.10, mientras que sudo y gksu para aplicaciones GUI no lo harán.

Jeremy Bicha
fuente
1
Gracias. Para mí, esto funcionó mejor con gedit (excepto un comportamiento extraño cuando se usa simplemente como gedit admin:), muy extrañamente con nautilus (casi inútil), y totalmente fallido con synaptic . ¿Algunas ideas?
Sadi
No va a funcionar con synaptic. Sin embargo, debería funcionar bien en nautilus, pero debe elegir un directorio que no sea un archivo comoadmin:///etc/
Jeremy Bicha
Funciona un poco con nautilus, pero verá lo que quiero decir ("muy extraño", "casi inútil") incluso cuando abre directamente un directorio y comienza a intentar hacer esto y aquello ;-)
Sadi
@Sadi No tengo idea de qué es "esto y aquello". Puede presentar un error si no funciona correctamente.
Jeremy Bicha
3

Para las aplicaciones que usan su-to-root y pkexec, es posible que desee agregar este código a /etc/xdg/autostart(vea mi comentario en la plataforma de lanzamiento ) bajo su propio riesgo:

cat <<EOF | sudo tee /etc/xdg/autostart/xhost.desktop
[Desktop Entry]
Name=xhost
Comment=Fix graphical root applications
Exec="xhost +si:localuser:root"
Terminal=false
Type=Application
EOF

Otras aplicaciones raíz también están rotas en Wayland (vea el error 1713313 y el error 1713311 ).


Si no desea una solución permanente, puede usar el método de @ ravery:

simplemente escriba xhost +si:localuser:rootla terminal antes de iniciar la aplicación privilegiada

N0rbert
fuente
1

Si una aplicación es compatible con Wayland API, puede ejecutarla como root usando el sudo -EH applicationcomando.

El modificador -E le dice a sudo que conserve las variables de entorno (así como WAYLAND_SOCKET y XDG_RUNTIME_DIR) necesarias para las aplicaciones de wayland. Siempre es mejor usar esta opción sobre el desagradable hack de xhost propuesto en otras respuestas. xhost permite que la aplicación se ejecute desde debajo de X wrapper, que es menos seguro que usar Wayland (portapapeles compartido, registro de teclas, etc.). El truco sudo -EH no funcionará con una aplicación que no se haya reescrito para wayland, como gparted, por ejemplo, pero funcionaría con gedit, etc.

ZAB
fuente
0

En realidad, el siguiente código casi funciona:

#! /bin/bash
set -e 
if [ -z "$1" ] ; then
    echo "Application is not specified" ;  exit
fi 
if [ $XDG_SESSION_TYPE = "wayland" ]; then
    if [[ -t 1 ]]; then
       xhost +si:localuser:root
       sudo -u root "$@"
       xhost  -  
       exit 0
    fi 
fi
gksu "$@"

(Por favor, discúlpeme por el estilo ingenuo de codificación bash, soy una especie de novato con este tema). T no funciona estable desde Alt-F2, si la última selección no fue un terminal; en este caso, simplemente no podemos establecer el foco en el diálogo de contraseña Parece que funciona desde el menú Gnome. De todos modos <1. No es una solución al 100%. 2. Me parece que los arquitectos de Ubuntu piensan que se supone que no debemos buscar ninguna solución.

Alex Chapiro
fuente
1
Creo que quieres "$@"(en lugar de "$1" "$2" ...).
muru
Sí, por supuesto :-) Estos son solo rastros de mis experimentos
Alex Chapiro