web-dev-qa-db-fra.com

Puis-je lancer un programme graphique sur le bureau d'un autre utilisateur en tant que root?

Voici d'autres questions que je pense avoir besoin de savoir:

  • D'une session non x? (signification racine n'est pas connectée à x)

  • Si plusieurs personnes ont été connectées sur X, puis-je détecter automatiquement qui était à quel écran et détecte donc programmatiquement quel écran je dois lancer l'application?

  • Puis-je lancer l'application comme utilisateur? (Ok j'ai 99,999% sûr que c'est un oui)

  • Puis-je détecter si les utilisateurs de groupe X sont connectés à x?

39
xenoterracide

Pour lancer un programme graphique sur le bureau d'un utilisateur, vous devez trouver deux choses: à quoi afficher le bureau de l'utilisateur (l'adresse) et quel cookie d'autorisation à utiliser (le mot de passe).

La commande suivante doit indiquer les affichages locaux que l'utilisateur est connecté (un par ligne) sur la plupart des unes:

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

Trouver le cookie d'autorisation est un peu plus difficile. Vous devez rechercher le fichier de cookie de l'utilisateur, qui est ~/.Xauthority Par défaut (tout ce dont vous avez besoin est l'emplacement du fichier cookie, vous n'avez pas besoin d'extraire le cookie de celui-ci). Cela fonctionne sur de nombreux systèmes, mais pas tous; Cela dépend du gestionnaire d'affichage et de la manière dont il est configuré, et en particulier GDM (la valeur par défaut sur Ubuntu) n'a pas utilisé l'emplacement par défaut du dernier, j'ai regardé. Je ne peux pas penser à une manière portable de trouver le fichier de cookie X. Le moyen le plus précis de découvrir est de trouver le PID du processus X et de rechercher l'argument sur le -auth option. Une autre solution consiste à trouver un processus en cours d'exécution sur ce serveur X et saisissez sa variable XAUTHORITY environnements. Si vous avez du mal à trouver le fichier de cookie, voir Ouvrez une fenêtre sur une affichage X à distance (pourquoi "impossible d'ouvrir l'affichage")?

Une fois que vous avez les deux informations, placez l'affichage choisi dans la variable d'environnement DISPLAY, le fichier de cookie de l'autorité X choisie dans la variable d'environnement XAUTHORITY et vous êtes défini. Peu importe quel utilisateur le programme fonctionne comme; Combinez avec su si vous le souhaitez.

Je ne peux pas essayer complètement cela puisque toutes mes machines ont une racine handicapée.

Pour trouver quel écran un utilisateur est activé, vous pouvez utiliser la commande who. La dernière colonne de sortie est généralement l'affichage que l'utilisateur est connecté. Quelque chose comme ça pourrait être utilisé pour saisir juste l'affichage (il est probable qu'un moyen beaucoup plus efficace de le faire, n'hésitez pas à offrir des modifications):

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

Ensuite, pour lancer une commande graphique x sur cet affichage:

DISPLAY=:0 firefox &

où: 0 serait remplacé avec tout l'affichage que vous avez trouvé dans la première commande et Firefox serait remplacé par la commande que vous souhaitez exécuter. Vous pouvez mettre cela dans un script shell et utiliser une variable.

La partie suivante est la partie que je n'ai pas testée, mais je ne vois pas pourquoi il ne devrait pas être possible de faire:

su username -c "DISPLAY=:0 firefox"

pour lancer la commande x comme cet utilisateur.

11
Steven D

Vous pourriez regarder comment ACPID le fait. Par exemple. Lorsque cela émet des commandes XScreensaver ou des ébauches, l'écran de chaque utilisateur exécutant X ou X-Session.

Par exemple sous Ubuntu ce fichier contient des éléments associés:

/etc/acpi/lid.sh

Contient cette boucle:

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

Une extension de Gilles réponds est la suivante: comment trouver le fichier de cookie. Une façon de le faire peut être une fois que vous avez défini la variable d'environnement DISPLAY (comme décrit par Gilles), utilisez strace pour trouver les fichiers xhost Accès. Je peux penser à quelque chose comme ça à bash:

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

La sortie du code ci-dessus ressemblera à:

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

Comme vous pouvez le voir clairement, le fichier de cookie apparaîtra directement ici.

1
Bichoy

Dans mes recherches de la recherche d'un moyen élégant d'afficher une tâche GUI ou X à partir d'un environnement limité tel que des règles UDEV ou du super-utilisateur, j'ai récemment créé un outil pour s'adapter à celui-ci ( pour plus de détails ).

xpub est un script shell pour obtenir les variables de l'environnement d'affichage X concernant le courant ou un TTY donné.

Ceci est un exemple avec une règle UDev:

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

$env{ENV}: Si l'utilisateur-UTT-ACTUNE-TTY commence x, sinon supprimez-le.

Le principe est le même pour une ligne de commande utilisant export:

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