it-swarm-es.tech

¿Puedo iniciar un programa gráfico en el escritorio de otro usuario como root?

Las siguientes son otras preguntas que creo que necesito saber:

  • ¿De una sesión no X? (lo que significa que la raíz no está conectada a X)

  • Si varias personas iniciaran sesión en X, ¿podría detectar automáticamente quién estaba en qué pantalla y, por lo tanto, detectar programáticamente en qué pantalla necesito iniciar la aplicación?

  • ¿Puedo iniciar la aplicación como usuario? (ok, estoy 99.999% seguro de que esto es un sí)

  • ¿Puedo detectar si los usuarios del grupo X están conectados a X?

39
xenoterracide

Para iniciar un programa gráfico en el escritorio de un usuario, debe encontrar dos cosas: en qué pantalla se encuentra el escritorio del usuario (la dirección) y qué cookie de autorización usar (la contraseña).

El siguiente comando debe enumerar las pantallas locales en las que el usuario ha iniciado sesión (una por línea) en la mayoría de los dispositivos:

who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'

Encontrar la cookie de autorización es un poco más difícil. Debe buscar el archivo de cookies del usuario, que es ~/.Xauthority por defecto (todo lo que necesita es la ubicación del archivo de cookies, no necesita extraer la cookie de él). Eso funciona en muchos sistemas, pero no en todos; depende del administrador de pantalla y de cómo está configurado, y en particular Gdm (el predeterminado en Ubuntu) no usó la ubicación predeterminada la última vez que busqué. No puedo pensar en una forma portátil de descubrir el archivo de cookies X real. La forma más precisa de averiguarlo es averiguar el pid del proceso X y buscar el argumento para -auth opción. Otra forma es encontrar un proceso que se ejecute en ese servidor X y tomar su variable de entorno XAUTHORITY. Si tiene problemas para encontrar el archivo cookie, consulte Abrir una ventana en una pantalla X remota (¿por qué "No se puede abrir la pantalla")?

Una vez que tenga ambas informaciones, coloque la pantalla elegida en la variable de entorno DISPLAY, el archivo de cookie de autoridad X elegido en la variable de entorno XAUTHORITY, y estará listo. No importa a qué usuario se ejecuta el programa; combina con su si quieres.

No puedo probar esto por completo ya que todas mis máquinas tienen la raíz deshabilitada.

Para encontrar en qué pantalla está un usuario, puede usar el comando who. La última columna de salida suele ser la PANTALLA en la que el usuario ha iniciado sesión. Algo como esto podría usarse para tomar solo la pantalla (es probable que haya una forma mucho más eficiente de hacer esto, no dude en ofrecer ediciones):

who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'

Luego, para iniciar un comando gráfico X en esa pantalla:

DISPLAY=:0 firefox &

donde: 0 se reemplazaría con cualquier pantalla que encontraste en el primer comando y firefox se reemplazaría con cualquier comando que quieras ejecutar. Puede poner esto en un script de Shell y simplemente usar una variable.

La siguiente parte es la parte que no he probado, pero no veo por qué no debería ser posible:

su username -c "DISPLAY=:0 firefox"

para iniciar el comando X como ese usuario.

11
Steven D

Podrías ver cómo lo hace acpid. P.ej. cuando emite comandos xscreensaver o pone en blanco la pantalla para cada usuario que ejecuta X o X-session.

Por ejemplo, en Ubuntu, este archivo contiene cosas relacionadas:

/etc/acpi/lid.sh

Contiene este bucle:

for x in /tmp/.X11-unix/*; do
    displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
    getXuser;
    if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
        grep -q off-line /proc/acpi/ac_adapter/*/state
        if [ $? = 1 ]
            then
            if pidof xscreensaver > /dev/null; then 
                su $user -c "xscreensaver-command -unthrottle"
            fi
        fi
        if [ x$RADEON_LIGHT = xtrue ]; then
            [ -x /usr/sbin/radeontool ] && radeontool light on
        fi
        if [ `pidof xscreensaver` ]; then
            su $user -c "xscreensaver-command -deactivate"
        fi
        su $user -c "xset dpms force on"
    fi
done
4
maxschlepzig

Una extensión de la respuesta de Gilles es cómo encontrar el archivo cookie. Una forma de hacerlo puede ser después de configurar la variable de entorno DISPLAY (como lo describe Gilles), use strace para encontrar los archivos xhost acceso. Puedo pensar en algo como esto en BASH:

# Set the DISPLAY variable first
DISPLAY = :0.0
# Use strace on xhost
strace xhost 2>&1 | grep access

El resultado del código anterior se verá así:

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/home/someuser/.Xauthority", R_OK) = 0

Como puede ver claramente, el archivo de cookies aparecerá directamente aquí.

1
Bichoy

En mi investigación para encontrar una manera elegante de mostrar la GUI o la tarea X desde un entorno limitado, como las reglas de udev o del superusuario, recientemente creé una herramienta para encajar con ella ( para más detalles ).

xpub es un script de Shell para obtener las variables del entorno de visualización X con respecto al TTY actual o dado.

Este es un ejemplo con una regla udev:

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}: si el usuario actual tty inicia X, de lo contrario, elimínelo.

El principio es el mismo para una línea de comandos que usa export:

export $(xpub) ; su ${XUSER} -c 'notify-send Hello'
0
Thomas Venries