Как запустить команду launchd от имени пользователя root
45495
Emmanuel Mwangi
У меня есть следующая команда launchctl как файл .plist. Он загружен и настроен на запуск один раз в день, но должен запускаться от имени пользователя root, и я не уверен, как это проверить.
Кроме того, это задание cron в основном копирует в каталог и запускает команду. Я уверен, что у launchd есть лучший способ указать каталог, в котором он должен запускать команду.
Как я знаю, что он запускается от имени root и есть ли лучший способ написать это?
launchdзапускает Daemons ( /Library/LaunchDaemonsили /System/Library/LaunchDaemons) от имени пользователя root и запускает их независимо от того, вошли пользователи или нет. Агенты запуска ( /Library/LaunchAgents/или ~/Library/LaunchAgents/) запускаются, когда пользователь вошел в систему как этот пользователь. Вы не можете использовать setuid для смены пользователя, запускающего скрипт на демонах.
Поскольку вы захотите добавить его, /Library/LaunchDaemonsвам нужно убедиться, что вы загружаете его launchdс правами администратора (например, sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist).
Проверьте man launchdдля получения дополнительной информации.
Спасибо. Это именно то, что я искал, чтобы ответить на корень проблемы. Сценарий находится в / Library / LaunchDaemons, поэтому он уже был запущен от имени пользователя root.
Emmanuel Mwangi 15 лет назад
0
Вопрос новичка: требуется ли запуск 'launchctl` для установки демона? Я имею в виду, не достаточно ли скопировать файл plist в соответствующий путь?
Claudix 10 лет назад
0
@Claudix: Это правильно. Копирование конфигурации launchd на месте не достаточно - вам все еще нужно «включить» (загрузка launchctl)
Chealion 10 лет назад
0
4
hanleyp
Вы пытались использовать один из запущенных редакторов?
Lingon (заброшенный, но предположительно работает на Leopard и Snow Leopard)
Чтобы убедиться, что он запускается с правами root, я уверен, что launchd запустит программы с правами root. Когда-нибудь задумывались о том, чтобы передать право владения скриптом пользователю root с помощью chmod? Таким образом, он не будет работать, пока не будет запущен от имени пользователя root. Затем вам нужно убедиться, что он работает.
sudo chown root:admin script_to_run_by_launchd
Я использовал Lingon для написания этого сценария. И я могу подтвердить, что это хорошо работает в Leopard.
Emmanuel Mwangi 15 лет назад
0
3
user495470
Property lists in LaunchAgents also work, but you have to load both agents and daemons with sudo:
A daemon is a program that runs in the background as part of the overall system (that is, it is not tied to a particular user). A daemon cannot display any GUI; more specifically, it is not allowed to connect to the window server.
[...]
An agent is a process that runs in the background on behalf of a particular user. Agents are useful because they can do things that daemons can't, like reliably access the user's home directory or connect to the window server.
3
Cory Klein
Для Google, желающих специально запустить Launch Agent с привилегиями root, например, от Launch Daemon, это можно сделать следующим образом:
Создайте свой LaunchAgent в ~/Library/LaunchAgents
Запустите ваше приложение с sudoпомощью ProgramArgumentsсвойства в вашем списке
Установите NOPASSWDопцию для вашего приложения в/etc/resolvers.d
Для более подробной информации смотрите этот и этот ответ.
2
Jose Leon
LaunchControl сделал это безболезненным для меня в Йосемити. Он имеет приятный графический интерфейс перетаскивания, чтобы помочь вам создавать или редактировать сервисы. Было удивительно видеть все запущенные службы, о которых я не знал.
меры
Запустить LaunchControl
В верхнем левом углу выберите GlobalDeamons и введите свой пароль администратора.
File-> New
Под ярлыком дайте ему уникальное имя. Соглашение "com.company.appname"
В разделе «Программа» для запуска используйте сценарий оболочки Unix или любую команду, которую вы предпочитаете, без аргументов
Если вашему приложению требуются аргументы, измените раскрывающееся поле с «Argv по умолчанию» на «Custom argv»
Теперь укажите аргумент, который вы обычно используете, как если бы вы запускали его из фактической командной строки.
Run at Load не является обязательным, вы решаете.
С правой стороны перетащите StartInterval и установите нужный интервал. FAQ в меню Help очень хорош.
Можете ли вы отредактировать свое сообщение, чтобы оно включало шаги, которые может предпринять заявитель для решения своей проблемы?
Cfinley 9 лет назад
0