J'essaie de comprendre comment lancer une application GUI en tant qu'un autre utilisateur connecté de manière interactive, dans la session graphique de cet utilisateur.
Par exemple, disons que j'ai deux utilisateurs, foo et bar. Les deux sont connectés, mais l'utilisateur interactif actuel est foo. Je voudrais lancer Calculator.app en tant que "barre" de l'utilisateur, de sorte que lorsque je passe rapidement de l'utilisateur à la barre, je trouve que la fenêtre de la calculatrice est ouverte dans la session de la barre.
Voici ce que j'ai essayé qui ne fonctionne pas:
sudo -u bar /Applications/Calculator.app/Contents/MacOS/Calculator
Cela lance Calculator.app sous forme de barre, mais la fenêtre s'ouvre dans la session graphique de foo.
sudo -u bar osascript -e "tell application \"Calculator\" to activate"
Même effet.
sudo -u bar open "/Applications/Calculator.app"
Lance la calculatrice comme foo, pas bar.
launchctl asuser [uid of bar] [any of the above commands]
Même effet.
Existe-t-il un moyen d'y parvenir? Je suis prêt à envisager toutes sortes de solutions possibles, y compris les scripts bash, AppleScript, l'écriture d'un programme Core Foundation ou Cocoa, etc. Dans ma situation, n'importe quel programme ou script peut s'exécuter comme n'importe quel utilisateur, y compris root.
Remarque: je suis conscient qu'il est possible d'utiliser des événements Apple distants, mais je ne peux pas l'utiliser car dans la situation où j'essaie de le faire, je n'ai aucune garantie que les "événements Apple distants" seront activés dans les préférences de partage.
Toute aide serait grandement appréciée!
la source
open
commande en utilisantSSH
?Réponses:
Ce que vous voulez réaliser est possible mais difficile. Vous devez lancer l'application dans la session utilisateur appropriée. Pour des raisons de sécurité, il est difficile de franchir le fossé de session utilisateur.
Vous avez besoin d'un processus déjà en cours d'exécution dans la session de l'autre utilisateur pour écouter votre demande et lancer l'application en votre nom.
Launchd's Bsexec
Heureusement, les versions récentes de
launchd
ont cette capacité; bien que les ingénieurs d'Apple n'aient pas recommandé son utilisation générale. Utilisez l'bsexec
option dans launchctl pour cibler la session utilisateur appropriée:L'approche recommandée consiste à écrire un ticket de travail launchd et à redémarrer le Mac - ou à demander à l'utilisateur de se déconnecter et de se reconnecter.
Cause des problèmes
Les problèmes proviennent du fait que l'application est connectée au mauvais
WindowServer
processus. Chaque session utilisateur a un WindowServer distinct; ce processus gère l'interface utilisateur. Vos méthodes antérieures placent la propriété du processus avec le bon utilisateur mais connecté à votre propre processus WindowServer.Ce problème est mentionné dans la note technique sur les démons et les agents d'Apple.
Expérience
Je le sais par expérience personnelle. Pour Power Manager, j'ai écrit pmuser pour exister dans chaque session utilisateur.
pmuser
écoute notre démon et gère les lancements et commandes par utilisateur. Bien que notre démon ait l'autorité root, nous avions toujours besoin d'un processus par utilisateur pour fonctionner de manière fiable dans les sessions utilisateur.la source
Aucune des réponses de bsexec ci-dessus ne fonctionne sur El Capitan (10.11), en raison de la protection de l'intégration du système (SIP) fermant les ports. "launchctl asuser" fonctionne, mais nécessite d'être exécuté en tant que root. La commande ci-dessous fonctionne sur El Capitan (et les OS les plus récents):
Notez que 501 est l'ID utilisateur de mon autre utilisateur.
la source
bruno.medeiros@brunojcm-macbook:~ $ sudo launchctl asuser 501 open /Applications/Firefox.app
LSOpenURLsWithRole() failed with error -600 for the file /Applications/Firefox.app
sudo launchctl asuser $(id -u <user_id_name>) <app>
. Cela dit, j'obtiens une erreur différente deposix_spawn(): 13: Permission denied
même si je lance avec le même ID utilisateur avec lequel je suis connecté (et propriétaire de la session) poursudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
Enfin, 10.10 fournit une implémentation correcte de "launchctl bsexec" que vous pouvez utiliser:
l'homme dit
Ainsi, en tant que paramètre PID, vous pouvez utiliser le pid du processus de connexion approprié . L'UID est l'ID utilisateur de l'utilisateur propriétaire de cette fenêtre de connexion et le GID est son groupe principal.
Cela fonctionne très bien pour n'importe quelle commande et bien sûr pour les jobs launchd (par exemple les lanceurs) également comme:
la source
task_for_pid(): 0x5
maintenant une erreur pour cela, où j'ai vérifié que le PID est correct.Vous pouvez utiliser le Finder comme hôte pour les bonnes autorisations
osascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)"
. De cette façon, il sera lancé via n'importe quel contexte GUI lancé Finder.la source
Cela fonctionne via ssh:
mais si vous l'essayez via Terminal.app, il ouvre TextEdit dans l'interface graphique de l'utilisateur actuel.
Si vous n'êtes pas sûr que ce
ssh
soit activé, vous pouvez peut-être l'activer temporairementet le désactiver à nouveau par la suite si nécessaire?
Sinon, je suis perplexe.
Testé le 10.9.
la source
Facile
puis exécutez les commandes normalement.
la source
bar
, mais s'exécuteraient toujours dansfoo
la session graphique de.