LaunchAgentをルートとして実行するにはどうすればよいですか?


7

ユーザーログイン時にrootとしてプロセスを実行したい。

/System/Library/LaunchAgents/eXist.plistrx—r—r—権限で作成しました:

<?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>Disabled</key>
        <false/>
        <key>GroupName</key>
        <string>wheel</string>
        <key>Label</key>
        <string>eXist DB</string>
        <key>Program</key>
        <string>/Applications/eXist-db/bin/startup.sh</string>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/eXist DB.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/eXist DB.out</string>
        <key>UserName</key>
        <string>root</string>
    </dict>
</plist>

ただし、プロセスdaveaはルートではなくユーザーとして実行され続けます。他に何をする必要がありますか?

Mac 10.9.1を使用しています。


他のルートの観光名所と同じように、なぜデータベースがブート時に起動することはできません-で、特定のユーザがログインした後に実行すべきルートとして何かを実行するために奇数である
マーク

回答:


3

スクリプトを実行しているユーザーLaunchAgentがrootとして実行されるようにするには、以下を実行する必要があります。

スクリプトの権限を変更します。ユーザーのコンテキストでスクリプト(またはコマンド)をsudoersファイルに追加し、最後に適切な起動エージェントplistを追加してロードします。

このアプローチは、深刻なセキュリティホールを作り出す可能性があります


以下の例では、eXit-db 2.2のstartup.shを使用しています。

  • plistを作成します。

    <?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>Disabled</key>
        <false/>
        <key>Label</key>
        <string>org.eXist_DB</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/bin/sudo</string>
            <string>/Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/eXist_DB.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/eXist_DB.out</string>
        <key>ThrottleInterval</key>
        <integer>10</integer>
    </dict>
    </plist>
    

    そして、として保存org.eXist_DB.plist〜/ライブラリ/のLaunchAgentsで

    最後のキー:

        <key>ThrottleInterval</key>
        <integer>10</integer>
    

    必要ないかもしれません。私のVMでは、それは-不明な理由でした。

  • startup.shの権限を変更します。

    sudo chown root /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    sudo chmod 4755 /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    
  • sudoersファイルを変更します。

    sudo visudo
  • sudoパスワードを入力せずにコマンドを実行できるようにする行を追加します

    # User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL
    

    ->

    # User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL
    your_user_name ALL=(ALL) NOPASSWD: /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    
  • 最後に入力してください:

    launchctl load -w ~/Library/LaunchAgents/org.eXist_DB.plist

    起動エージェントをロードして起動するには


2

のキーと値のペアを追加しますUserName

<key>UserName</key>
<string>root</string>

置きlaunchdのジョブチケットでは/Library/LaunchDaemons/、この/SystemフォルダはAppleが使用するためだけに予約されています。

指定したユーザーとして実行するには、必ずジョブチケットをに配置してくださいLaunchDaemons。以下のコメントで@Manuが言及しているように、UserNameキーはのジョブでは無視されLaunchAgentsます。


2
レコードの場合、「UserName」キーを変更してもLaunchAgentに影響はなく、ログインしたユーザーとして実行されます。
マヌー

1
質問は、具体的にはLaunchAgentとログイン後のプロセスの実行を指します。LaunchDaemonsは、GUIのようにログイン後にのみ利用可能なものに依存するプロセスには不適切であり、@ Manuが指摘したように、この回答はLaunchAgentsでは機能しません。
コリークライン


0

launchd-oneshotを使用して、rootとして実行されるログインジョブをインストールできます。

brew install cybertk/formulae/launchd-oneshot
sudo launchd-oneshot <script> --on-login-as-root

0
  • /System/システムを台無しにする危険を冒さない限り、何もいじらないでください。真剣に。離れて。

  • /Library/LaunchDaemons/代わりに入れてください。


これの問題は、ログイン前に常に実行されることです。したがって、サービスが何らかのGUIに依存している場合、ログオフ時に中断します。私は現在、ログイン後に実行するオプションを探していますが、残念ながらまだ運がありません。
ニコライツェンコフ14

0

sudo / root特権で実行されるLaunchAgentの作成は、LaunchAgentが実行sudoするコマンドになるだけで実行できます。

PListファイルを作成する

この最小限の例を配置してみてください ~/Library/LaunchAgents/com.sudoexample.plist

<?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.sudoexample</string>
        <key>ProgramArguments</key>
        <array>
            <string>sudo</string>
            <string>touch</string>
            <string>/tmp/sudoexample</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardOutPath</key>
        <string>/tmp/sudoexample.log</string>
        <key>StandardErrorPath</key>
        <string>/tmp/sudoexample.log</string>
    </dict>
</plist>

注:通常、エージェントにはユーザーファイルの所有権が必要ですが、root所有権も同様に機能するようです。

上記の例が実行されsudo touch /tmp/sudoexample、出力がに記録され/tmp/sudoexample.logます。

launchctl load ~/Library/LaunchAgents/com.sudoexample.plistこの時点で実行sudoすると、パスワードの入力を試行し、パスワードプロンプトを提供するためのlaunchctl関連付けがないため、失敗しttyます。

$ ls /tmp/
sudoexample.log
$ cat /tmp/sudoexample.log
sudo: no tty present and no askpass program specified

昇格された特権を許可する

sudo touchパスワードなしで実行する許可をユーザーに付与する必要があります。

これは次のように実行できます。

echo "$(whoami) ALL=(ALL) NOPASSWD: $(which touch)" | sudo tee /etc/sudoers.d/touch

完了すると、ファイルは次のようになります。

$ sudo cat /etc/sudoers.d/touch
coryklein ALL=(ALL) NOPASSWD: /usr/bin/touch

テストする

$ launchctl load ~/Library/LaunchAgents/com.sudoexample.plist
$ ls -l /tmp
total 0
-rw-r--r-- 1 root      wheel 0 Jun 29 14:01 sudoexample
-rw-r--r-- 1 coryklein wheel 0 Jun 29 14:01 sudoexample.log

これで、所有ルートを作成することにより、LaunchAgentが正常に実行されたことがわかります/tmp/sudoexample

この基盤を提供してくれたklanomathの回答に感謝します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.