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

Добавить приложение в OSX «Элементы входа» из сценария bash

Мне нужен способ добавить приложение к элементам входа из сценария postflight, который запускается как часть моего установщика. Надо работать на 10.5+. Желательно, чтобы это работало в сценарии bash. Моему приложению уже требуются права администратора.

Подход, который я нашел здесь: https://stackoverflow.com/questions/4912212/mac-os-login-items-with-arguments казалось, на правильном пути (см. ниже) ... но не сработало, когда я попробовал его в командной строке, и я не уверен, как установить его для всех пользователей или мне нужно добавить логику, чтобы проверить, он уже добавлен в элементы автозагрузки перед вызовом этого кода.

#!/bin/bash
/usr/bin/osascript -e "tell application \"System Events\" to make new login item with properties { path: \"$1\", hidden:false } at end"

Подозреваю, что мог бы тоже что-нибудь сделать с launchd. Но я не уверен, какой подход лучше всего подходит для совместимости между версиями.

Если вы не против немного почитать, я бы посоветовал начать с Техническая записка Apple TN2083: Демоны и агенты.

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

Что-то вроде:

    #!/bin/sh
    cat > /Library/LaunchAgents/com.serverfault.myapp.plist << EOT
    <?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>com.serverfault.myapp</string>
            <key>ProgramArguments</key>
            <array>
                    <string>/Library/MyApp/myapp.app/Contents/MacOS/myapp</string>
            </array>
            <key>RunAtLoad</key>
            <true/>
    </dict>
    </plist>
    EOT

Другая возможность - это глобальный элемент входа. Из этой технической заметки, упомянутой выше, я сделал вывод:

  • А глобальный элемент входа это элемент входа в систему, который запускается, когда любой пользователь входит в систему.
  • В Mac OS X 10.5 и более поздних версиях вы можете установить глобальный элемент входа в систему, используя интерфейс общих списков файлов для Launch Services [API].
  • В более ранних системах вы можете установить элемент входа [не а глобальный элемент входа], отправив события Apple в System Events обработать. [Так, возможно, это больше не работает надежно с версии 10.5?]
  • До Mac OS X 10.5 не существовало поддерживаемого способа установки глобального элемента входа. [Вот это да! Это безумие.]

Я считаю, что много приложений (до launchd в 10.5) используется для управления loginwindow.plist файл напрямую. К сожалению, многие из них сделали это неправильно - я не могу сказать вам, сколько полу-XML-полу-двоичных-полностью-сломанных loginwindow.plist файлы, которые я видел.

Деление - это очень подходящее место.

В следующем сообщении stackoverflow есть некоторые дополнительные сведения о добавлении элементов входа в систему из bash:

https://stackoverflow.com/questions/6947925/add-app-to-osx-login-items-during-a-package-maker-installer-postflight-script/7643260#7643260