web-dev-qa-db-fra.com

Comment exécuter un programme X depuis l'extérieur de la session X (par exemple depuis la console ou SSH)

Sans être la personne connectée à la console, comment exécuter une application X et la faire afficher sur cette session X? Supposons que je suis root, ou que je suis le même utilisateur qui s'est connecté, donc en principe j'ai la permission de le faire. Mais comment en convaincre X?

Quelques exemples de situations comme celle-ci:

  • Connectez-vous avec SSH et exécutez un programme qui s'affiche sur l'écran de l'ordinateur distant ( pas tunnelé via SSH, ce qui est totalement différent)
  • Un travail cron pour prendre une capture d'écran de la session X via la commande import d'ImageMagick
  • Exécution d'un enregistreur de frappe à des fins d'audit

Ceci est une version plus simple de Lancer l'application OpenGL directement depuis un terminal Linux sans fenêtre

35
JasonSmith

La réponse courte est que vous devez définir la variable d'environnement DISPLAY, puis l'application s'exécutera.

La réponse longue est que nous avons Xauth, et à moins que vous n'exécutiez en tant que même utilisateur sur la même machine, cela ne fonctionnera probablement pas, sauf si vous exportez les informations d'identification Xauth du compte exécutant le serveur X vers le compte exécutant X client. ssh -X gère cela pour vous, c'est pourquoi c'est génial, mais la procédure manuelle implique d'exécuter xauth extract - $DISPLAY sur le compte du serveur X et alimentant ces données dans xauth merge - sur le compte client. (Attention: les données sont binaires.)

Sur les systèmes Linux modernes, il existe une session X à: 0 et le fichier de données d'autorité X11 est toujours $HOME/.Xauthority afin que vous puissiez le plus souvent définir deux variables d'environnement, par exemple, dans Bash:

export XAUTHORITY=/home/$your_username/.Xauthority
export DISPLAY=':0'
43
hobbs

Le résultat est que vous devez connaître l'affichage X (placé dans la variable d'environnement DISPLAY) et le cookie magique (placé dans un fichier, avec le nom de fichier dans la variable d'environnement XAUTHORITY).

La voie rapide et sale

Sur le système exécutant X, si vous êtes root ou si vous êtes le même utilisateur qui s'est connecté à X, supposez simplement les fichiers d'affichage et de cookies les plus courants (fonctionne sur presque toutes les installations de bureau standard de toutes les distributions).

env DISPLAY=:0 XAUTHORITY=/home/whoever/.Xauthority /path/to/my/X/program

Le moyen le plus sûr

Trouvez-les dans l'environnement d'un programme X déjà en cours d'exécution. Encore une fois, si vous êtes root ou le même utilisateur connecté, cela vous dira (si l'utilisateur utilise GNOME):

cat /proc/`pgrep -f ^x-session-manager`/environ \
  | Ruby -ne 'puts $_.split("\0").select { |e| e =~ /^(DISPLAY|XAUTHORITY)=/ }'
17
JasonSmith