У меня проблема с запуском моего LaunchAgent от имени обычного пользователя (не root). Все, что я прочитал, подразумевает, что это должно быть поведение по умолчанию. Ожидается, что если вы поместите plist в /Library /LaunchAgents, то при загрузке он загружается для пользователя, как пользователя, при входе пользователя в систему.

Однако я обнаружил, что если вы запускаете launchctl с помощью sudo ('sudo launchctl load /Library/LaunchAgents/myagent.plist'), тогда процесс запускается в сеансе пользователя с правами root. Это означает, что «ps u -ax» показывает процесс, выполняющийся как «root», а также файлы, созданные процессом, принадлежат root:staff

Я попытался погуглить по этому поводу и нашел тонну сообщений, как будто кто-то хочет, чтобы у их агента был root-доступ (что IMO "неправильно"), и они делают все эти сообщения на форуме о том « как я могу дать ему root », и все отвечая, чтобы объяснить " он не получает root, это пользовательский агент " ... Это то, чего я ожидаю, однако у меня возникла противоположная проблема: я не хочу, чтобы у этого агента был root-доступ, у него его не должно быть, но он есть.

Если ответ « вы просто не можете запустить launchctl с помощью sudo или это происходит », я не смог найти это нигде. И если это так, то как мне выполнить запуск / выгрузку launchctl на Агенте от демона, который должен иметь root-доступ, что мне нужно сделать, чтобы продукт сам обновился?

РЕДАКТИРОВАТЬ: Вот пример часто связанного сообщения, из-за которого кажется, что это не должно быть проблемой, из-за чего агенту кажется невозможным работать от имени root, даже если вы этого хотите ... https://superuser .com/ а / 36173/603140

1 ответ1

0

launchd поддерживает отдельный список элементов для каждого сеанса пользователя ("агенты запуска") и один для системного контекста ("демоны запуска"). Когда вы запускаете launchctl load от имени root, элемент загружается в системный список (то есть как демон запуска вместо агента) независимо от того, где находится файл. Что вам нужно сделать, зависит от того, что именно вы пытаетесь достичь:

  • Если вы пытаетесь получить элемент для загрузки в качестве агента запуска в будущих пользовательских сеансах (т. Е. При следующем входе в систему), просто поместите его в /Library /LaunchAgents, правильно установите разрешения, а затем расслабьтесь и расслабьтесь. Когда пользователь входит в систему, он сканирует этот каталог и загружает все, что он находит.

  • Если вы пытаетесь получить элемент для загрузки в существующий сеанс входа в систему, вам нужно запустить launchctl load в этом сеансе. Что именно это означает и как вы это делаете, сложно, и может зависеть от того, какую версию OS X вы используете (Apple продолжает изменять архитектуру запуска ...). По крайней мере, в более старых версиях OS X вам нужно будет найти идентификатор процесса какого-либо процесса, запущенного в целевом сеансе, и выполнить что-то вроде:

    sudo launchctl bsexec $PIDInTargetSession sudo -u $TargetUsername launchctl load /Library/LaunchAgents/youritem.plist
    

    Объяснение: сначала sudo переключается на root, затем launchctl bsexec $PIDInTargetSession переключается на контекст начальной загрузки mach целевых сессий (я сказал, что это сложно), затем sudo -u $TargetUsername переключает UID с root на целевого пользователя, а затем, наконец, launchctl load /Library/LaunchAgents/youritem.plist загружает агента в этом сеансе.

Если этого не произойдет, проверьте это сообщение для некоторых альтернатив.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .