Назад | Перейти на главную страницу

Как запустить процесс от имени конкретного пользователя при запуске в OS X?

Я хотел бы запустить сценарий от имени конкретного пользователя при запуске (не при входе в систему). Я думал, что LaunchDaemon при запуске сделает это, но man launchd говорит:

"Если вы хотите, чтобы ваша служба запускалась от имени определенного пользователя в среде этого пользователя, создание ее агентом launchd является ЕДИНСТВЕННЫМ поддерживаемым средством достижения этой цели в Mac OS X. Другими словами, недостаточно выполнить setuid (2 ), чтобы стать пользователем Mac OS X в прямом смысле слова ».

Они не шутят - когда я пытаюсь запустить свой скрипт как LaunchDaemon, он не работает. В частности, я пытаюсь автоматизировать некоторые операции с связкой ключей с помощью команды security, и она не позволяет мне изменить связку ключей по умолчанию, когда я запускаю сценарий через LaunchDaemon, хотя сценарий отлично работает при запуске с использованием sudo из оболочки.

LaunchAgent не будет работать, потому что цель состоит в том, чтобы процесс запускался без входа пользователя в систему, а LaunchAgents запускаются только тогда, когда кто-то входит в систему. Я посмотрел на cron и директиву @reboot, и это выглядит многообещающе, но я читал, что cron - это устарело в OSX.

У меня были похожие проблемы, пытаясь заставить длительный процесс использовать связку ключей по умолчанию. По сути, LaunchAgent, похоже, не запускается в среде полного входа для выполнения команд безопасности, поэтому изменение связки ключей по умолчанию не работает и возвращается с ошибкой разрешений на /Library/Preferences/ каталог.

Секретный соус - добавить:

<key>SessionCreate</key>
<true/>

в ваш список. Это недокументированная функция, которая создаст правильную среду и позволит вам установить связку ключей по умолчанию. Кредит на Joensson на этот вопрос за то, что указал мне в правильном направлении.

Сохранить как глобальный демон (/Library/LaunchDaemons) и укажите пользователя ключом UserName:

<key>UserName</key>
<string>Put username here</string>

Есть ряд других мест где вы можете скрыть элементы автозагрузки в OS X (большинство из которых полностью не поддерживаются). Я бы попробовал /etc/rc.local; Кажется, я припоминаю, что работал в Panther, так что есть вероятность, что он все еще может работать сегодня.