Как запустить команду launchd от имени пользователя root

У меня есть следующая команда launchctl как файл.plist. Он загружен и настроен на запуск один раз в день, но должен запускаться от имени пользователя root, и я не уверен, как это проверить.

Кроме того, это задание cron в основном копирует в каталог и запускает команду. Я уверен, что у launchd есть лучший способ указать каталог, в котором он должен запускать команду.

Как я знаю, что он запускается от имени root и есть ли лучший способ написать это?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>

5 ответов

Решение

Какая папка .plist Хранится в?

launchd запускает демонов (/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 для дополнительной информации.

Для Google, желающих специально запустить LaunchAgent с привилегиями root, например, от LaunchDaemon, это можно сделать следующим образом:

  • Создайте свой LaunchAgent в ~/Library/LaunchAgents
  • Запустите ваше приложение с sudo через ProgramArguments недвижимость в вашем списке
  • Установить NOPASSWD вариант для вашего приложения в /etc/resolvers.d

Для более подробной информации см. Этот и этот ответ.

Вы пытались использовать один из запущенных редакторов?

Чтобы убедиться, что он запускается с правами root, я уверен, что launchd запустит программы с правами root. Вы когда-нибудь задумывались о том, чтобы передать права собственности на скрипт руту с помощью chmod? Таким образом, он не будет работать, пока не будет запущен от имени пользователя root. Затем вам нужно убедиться, что он работает.

sudo chown root:admin script_to_run_by_launchd

Списки свойств в LaunchAgents также работают, но вы должны загрузить как агентов, так и демонов с помощью sudo:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

Если у plist нет отключенного ключа, он загружается при следующем входе в систему или перезапускается по умолчанию, и -w не обязательно.

Техническое примечание TN2083: Демоны и агенты:

Демон - это программа, которая работает в фоновом режиме как часть общей системы (то есть она не привязана к конкретному пользователю). Демон не может отображать никакой графический интерфейс; более конкретно, не разрешается подключаться к серверу окон.

[...]

Агент - это процесс, который выполняется в фоновом режиме от имени определенного пользователя. Агенты полезны, потому что они могут делать то, что демоны не могут, например, надежно получать доступ к домашнему каталогу пользователя или подключаться к серверу окон.

LaunchControl сделал это безболезненным для меня в Йосемити. Он имеет приятный графический интерфейс перетаскивания, чтобы помочь вам создавать или редактировать сервисы. Было удивительно видеть все работающие службы, о которых я не знал.

меры

  1. Запустить LaunchControl
  2. Вверху слева смените GlobalDeamons и введите свой пароль администратора
  3. File->New
  4. Под ярлыком дайте ему уникальное имя. Соглашение "com.company.appname"
  5. В разделе "Программа" для запуска используйте сценарий оболочки Unix или любую команду, которую вы предпочитаете БЕЗ аргументов
  6. Если вашему приложению требуются аргументы, измените раскрывающееся поле с "Argv по умолчанию" на "Custom argv"
    1. Теперь укажите аргумент, который вы обычно используете, как если бы вы запускали его из фактической командной строки.
  7. Run at Load не является обязательным, вы решаете.
  8. С правой стороны перетащите StartInterval и установите нужный интервал. FAQ в меню Help очень хорош.
Другие вопросы по тегам