Voici d'autres questions que je pense avoir besoin de savoir:
D'une session non-X? (signifiant que la racine n'est pas connectée à X)
Si plusieurs personnes étaient connectées à X, puis-je détecter automatiquement qui se trouvait sur quel écran et donc, par programme, sur quel écran je dois lancer l'application?
Puis-je lancer l'application en tant qu'utilisateur? (ok je suis sûr à 99,999% que c'est un oui)
Puis-je détecter si les utilisateurs du groupe X sont connectés à X?
naga_plugged.pl
script se termine (ou se place en arrière-plan), carudev
il attendra sa sortie.Réponses:
Pour lancer un programme graphique sur le bureau d'un utilisateur, vous devez rechercher deux éléments: l'affichage du bureau de l'utilisateur (l'adresse) et le cookie d'autorisation à utiliser (le mot de passe).
La commande suivante doit répertorier les affichages locaux sur lesquels l'utilisateur est connecté (un par ligne) sur la plupart des ordinateurs de bureau:
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 de cookie, vous n'avez pas besoin d'en extraire le cookie). Cela fonctionne sur de nombreux systèmes, mais pas tous; cela dépend du gestionnaire d'affichage et de la façon dont il est configuré, et en particulier Gdm (le paramètre par défaut sur Ubuntu) n'a pas utilisé l'emplacement par défaut que j'ai consulté en dernier. Je n'arrive pas à trouver un moyen portable de trouver le fichier de cookie X réel. Le moyen le plus précis de découvrir est de connaître le pid du processus X et de rechercher l'argument de l'-auth
option. Une autre méthode consiste à rechercher un processus s'exécutant sur ce serveur X et à récupérer saXAUTHORITY
variable d'environnement. Si vous ne parvenez pas à trouver le fichier cookie, voirOuvrir une fenêtre sur un affichage X distant (pourquoi "Impossible d'ouvrir l'affichage")?Une fois que vous avez les deux informations, placez l'affichage choisi dans la
DISPLAY
variable d'environnement, le fichier de cookie d'autorité X choisi dans laXAUTHORITY
variable d'environnement, et le tour est joué. Peu importe l'utilisateur du programme. combinez avecsu
si vous aimez.la source
ps
ouhtop
ou…pids=$(pgrep -u $target_user nautilus)
obtient le pid, et où dois-je mettre une-auth
option?-auth
option nulle part. Vous devrez peut-être le rechercher dans la ligne de commande du processus du serveur X pour déterminer ce qu'il faut mettre dans laXAUTHORITY
variable d'environnement. Si vous avez le processus d'un client, ce dont vous avez besoin n'est pas autre chose-auth
que la valeur de laXAUTHORITY
variable de ce client . Je ne comprends pas ce que vous essayez de faire. Vous voudrez peut-être poser une nouvelle question.Je ne peux pas essayer cela complètement car toutes mes machines ont la racine désactivée.
Pour rechercher l'affichage d'un utilisateur, vous pouvez utiliser la
who
commande. La dernière colonne de sortie est généralement l’AFFICHAGE auquel l’utilisateur est connecté. Quelque chose comme cela pourrait être utilisé pour ne saisir que l'écran (il existe probablement un moyen beaucoup plus efficace de le faire, n'hésitez pas à proposer des modifications):Ensuite, pour lancer une commande graphique X sur cet affichage:
où: 0 serait remplacé par tout ce que vous auriez trouvé dans la première commande et firefox serait remplacé par la commande que vous voulez exécuter. Vous pouvez mettre cela dans un script shell et simplement utiliser une variable.
La partie suivante est la partie que je n'ai pas testée, mais je ne vois pas pourquoi cela ne devrait pas être possible:
pour lancer la commande X en tant qu’utilisateur.
la source
sudo -i
et je ne pouvais pas être sûr que les résultats seraient différents de leur exécution après la connexion directe en tant qu'utilisateur root. :-)who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$
semble fonctionner ...Vous pourriez regarder comment acpid le fait. Par exemple, lorsqu’il émet des commandes xscreensaver ou vide l’écran pour chaque utilisateur exécutant X ou X-session.
Par exemple, sous Ubuntu, ce fichier contient des éléments connexes:
Contient cette boucle:
la source
/usr/share/acpi-support/power-funcs
. Il appellefgconsole
pour rechercher le vt Linux actif, puis recherche un serveur X à afficher sur cette console et recherche l'utilisateur à partir de là. Ensuite, il utilise~/.Xauthority
le cookie X, ce qui signifie qu'il ne pourra pas se connecter au serveur X (à moins que quelque chose ne me manque annuaire).getXuser: command not found
Une extension de Gilles pour répondre est comment trouver le fichier cookie. Une façon de le faire peut être après avoir défini la
DISPLAY
variable d'environnement (comme décrit par Gilles), utiliséestrace
pour trouver l'xhost
accès aux fichiers . Je peux penser à quelque chose comme ça dans BASH:La sortie du code ci-dessus ressemblera à:
Comme vous pouvez le voir clairement, le fichier cookie apparaîtra directement ici.
la source
Dans mes recherches pour trouver un moyen élégant d'afficher une tâche graphique ou X à partir d'environnements limités, tels que les règles udev ou le super-utilisateur, j'ai récemment créé un outil qui s'y adapterait ( pour plus de détails ).
xpub
est un script shell permettant d'obtenir les variables de l'environnement d'affichage X concernant le TTY actuel ou donné.Voici un exemple avec une règle udev:
$env{ENV}
: si l'utilisateur en cours lance X, sinon le supprime.Le principe est le même pour une ligne de commande utilisant
export
:la source