Я пытаюсь выяснить, как запустить приложение с графическим интерфейсом как другой пользователь, который вошел в систему в интерактивном режиме в графическом сеансе этого пользователя.
Например, скажем, у меня есть два пользователя, foo и bar. Оба вошли в систему, но текущий интерактивный пользователь foo. Я хотел бы запустить Calculator.app в качестве пользовательской "панели", чтобы при быстром переключении пользователя на панель я обнаружил, что окно калькулятора открыто в сеансе панели.
Вот что я попробовал, это не работает:
sudo -u bar /Applications/Calculator.app/Contents/MacOS/Calculator
Это запускает Calculator.app как панель, но окно открывается в графическом сеансе foo.
sudo -u bar osascript -e "tell application \"Calculator\" to activate"
Тот же эффект.
sudo -u bar open "/Applications/Calculator.app"
Запускает калькулятор как foo, а не как bar.
launchctl asuser [uid of bar] [any of the above commands]
Тот же эффект.
Есть ли способ сделать это? Я готов принять всевозможные возможные решения, включая сценарии bash, AppleScript, написание программы Core Foundation или Cocoa и так далее. В моей ситуации любая программа или скрипт может выполняться как любой пользователь, включая root.
Примечание. Я знаю, что возможно использование удаленных событий Apple, но я не могу использовать это, поскольку в ситуации, когда я пытаюсь это сделать, у меня нет гарантии, что «Удаленные события Apple» будут включены в настройках «Общий доступ».
Любая помощь будет принята с благодарностью!
источник
open
команду, используяSSH
?Ответы:
То, чего вы хотите достичь, возможно, но сложно. Вам необходимо запустить приложение в рамках соответствующего сеанса пользователя. Из соображений безопасности преодоление разрыва между сеансами пользователя затруднено.
Вам нужен процесс, уже запущенный в сеансе другого пользователя, чтобы прослушать ваш запрос и запустить приложение от вашего имени.
Bsexec запуска
К счастью, последние версии
launchd
имеют эту возможность; хотя инженеры Apple не рекомендовали его общее использование. Используйтеbsexec
опцию в launchctl, чтобы нацелиться на соответствующий сеанс пользователя:Рекомендуемый подход - написать заявку на запуск и перезапустить Mac или попросить пользователя выйти из системы и снова войти в нее.
Причина проблем
Проблемы связаны с тем, что приложение связано с неправильным
WindowServer
процессом. Каждый пользовательский сеанс имеет отдельный WindowServer; этот процесс обрабатывает пользовательский интерфейс. Ваши более ранние методы передают право собственности на процесс нужному пользователю, но связаны с вашим собственным процессом WindowServer.Эта проблема упоминается в технической заметке компании Daemons and Agents от Apple.
Опыт
Я знаю это по личному опыту. Для Power Manager я написал pmuser, чтобы он существовал в каждом сеансе пользователя.
pmuser
слушает нашего демона и обрабатывает пользовательские запуски и команды. Несмотря на то, что у нашего демона были права доступа root, нам все еще требовался отдельный процесс для надежной работы в пользовательских сеансах.источник
Ни один из ответов bsexec, описанных выше, не работает в El Capitan (10.11), поскольку защита интеграции системы (SIP) закрывает порты. "launchctl asuser" работает, но требует запуска от имени пользователя root. Команда ниже работает на El Capitan (и на последних версиях ОС):
Обратите внимание, что 501 - это идентификатор пользователя для моего другого пользователя.
источник
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>
. Тем не менее, я получаю другую ошибку,posix_spawn(): 13: Permission denied
даже если я запускаю с тем же идентификатором пользователя, для которого я вошел (иsudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
Наконец, 10.10 предоставляет правильную реализацию "launchctl bsexec", которую вы можете использовать:
человек говорит
Таким образом, в качестве параметра PID вы можете использовать pid соответствующего процесса loginwindow . UID - это идентификатор пользователя, которому принадлежит это окно входа в систему, а GID - его основная группа.
Это прекрасно работает для любой команды и, конечно, для запускаемых заданий (например, запускаемых агентов), например:
источник
task_for_pid(): 0x5
об ошибке, в котором я убедился, что PID верен.Вы можете использовать Finder в качестве хоста для правильных разрешений
osascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)"
. Таким образом, он будет запускаться через любой контекст GUI, запущенный Finder.источник
Это работает через SSH:
но если попробовать его через Terminal.app, то он открывает TextEdit в GUI текущего пользователя.
Если вы не уверены, что
ssh
это включено, возможно, вы можете временно включить егои отключить его снова, если это необходимо?
В противном случае я в тупике.
Проверено на 10.9.
источник
просто
затем выполните команды в обычном режиме.
источник
bar
, но все равно будут выполняться вfoo
графическом сеансе.