Jak uruchomić uruchomioną komendę jako root

32

Mam następujące polecenie launchctl jako plik .plist. Jest ładowany i skonfigurowany do uruchamiania raz dziennie, ale musi działać jako root i nie jestem pewien, jak to sprawdzić.

Ponadto to zadanie crona zasadniczo CD do katalogu i uruchamia polecenie. Jestem pewien, że uruchomione ma lepszy sposób na określenie katalogu, w którym ma uruchomić polecenie.

Skąd mam wiedzieć, że jest uruchamiany jako root i czy istnieje lepszy sposób na napisanie tego?

<?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>
Emmanuel Mwangi
źródło

Odpowiedzi:

46

W którym folderze jest .plistprzechowywany?

launchduruchamia demony ( /Library/LaunchDaemonslub /System/Library/LaunchDaemons) jako root i uruchamia je bez względu na to, czy użytkownicy są zalogowani, czy nie. Agenty uruchamiania ( /Library/LaunchAgents/lub ~/Library/LaunchAgents/) są uruchamiane, gdy użytkownik jest zalogowany jako ten użytkownik. Nie można użyć setuid do zmiany użytkownika uruchamiającego skrypt na demonach.

Ponieważ chcesz go dodać, /Library/LaunchDaemonsupewnij się, że załadowałeś go launchdz uprawnieniami administratora (np. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist)

Sprawdź, man launchdaby uzyskać więcej informacji.

Chealion
źródło
Dziękuję Ci. Właśnie tego szukałem, jeśli chodzi o odpowiedź na główny problem. Skrypt znajduje się w / Library / LaunchDaemons, więc działał już jako root.
Emmanuel Mwangi,
Pytanie dla początkujących: czy launchctldo zainstalowania demona wymagane jest uruchomienie ? Mam na myśli, czy nie wystarczy skopiować plik plist do odpowiedniej ścieżki?
Claudix
@ Claudix: Zgadza się. Skopiowanie uruchomionej konfiguracji na miejscu nie wystarczy - nadal musisz ją „włączyć” (ładowanie Launctl)
Chealion
4

Czy próbowałeś użyć jednego z uruchomionych edytorów?

Aby upewnić się, że jest uruchamiany jako root, jestem pewien, że uruchomione programy będą uruchamiały się jako root. Czy kiedykolwiek myślałeś o przekazaniu własności skryptu do rootowania za pomocą chmod? W ten sposób nie będzie działać, dopóki nie zostanie uruchomiony jako root. Następnie musisz sprawdzić, czy działa.

sudo chown root:admin script_to_run_by_launchd
Hanleyp
źródło
Użyłem Lingona do napisania tego skryptu. I mogę potwierdzić, że działa dobrze w Leopardzie.
Emmanuel Mwangi,
3

Listy właściwości w LaunchAgents również działają, ale musisz załadować zarówno agentów, jak i demony za pomocą sudo:

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

Jeśli lista nie ma wyłączonego klucza, jest ładowana przy następnym logowaniu lub domyślnie restartuje i -wnie jest konieczna.

Uwaga techniczna TN2083: Demony i pełnomocnicy :

Demon to program działający w tle jako część całego systemu (tzn. Nie jest powiązany z konkretnym użytkownikiem). Demon nie może wyświetlić żadnego GUI; dokładniej, nie można połączyć się z serwerem Windows.

[...]

Agent to proces działający w tle w imieniu określonego użytkownika. Agenci są przydatni, ponieważ mogą wykonywać rzeczy, których demony nie mogą, na przykład niezawodnie uzyskiwać dostęp do katalogu domowego użytkownika lub łączyć się z serwerem Windows.

Lri
źródło
3

W przypadku Googlersów, którzy chcą w szczególności uruchomić agenta uruchamiania z uprawnieniami roota zamiast demona uruchamiania , można to zrobić przez:

  • Utwórz LaunchAgent w ~/Library/LaunchAgents
  • Uruchom aplikację za sudopomocą ProgramArgumentswłaściwości w swoim plist
  • Ustaw NOPASSWDopcję dla swojej aplikacji w/etc/resolvers.d

Aby uzyskać więcej informacji, zobacz i odpowiedź.

Cory Klein
źródło
2

LaunchControl sprawił, że stało się to dla mnie bezbolesne w Yosemite. Ma ładny interfejs GUI typu „przeciągnij i upuść”, który pomaga tworzyć lub edytować usługi. Zaskakujące było, że działały wszystkie usługi, o których nie wiedziałem.

Kroki

  1. Uruchom LaunchControl
  2. W lewym górnym rogu zmień GlobalDeamons i wprowadź hasło administratora
  3. Plik-> Nowy
  4. Pod etykietą nadaj mu unikalną nazwę. Konwencja to „com.company.appname”
  5. W celu uruchomienia programu użyj skryptu powłoki Unix lub dowolnej innej komendy BEZ argumentów
  6. Jeśli aplikacja wymaga argumentów, zmień pole rozwijane z „Domyślny argument” na „Niestandardowy argument”
    1. teraz podaj argument, który byłbyś normalny, tak jakbyś uruchomił go z rzeczywistego wiersza poleceń.
  7. Uruchom przy obciążeniu jest opcjonalny, zdecydujesz.
  8. Z prawej strony przeciągnij i upuść StartInterval i ustaw żądany interwał. FAQ w menu Pomoc jest bardzo dobra.
Jose Leon
źródło
Czy możesz edytować swój post, aby uwzględnić kroki, które pytający może podjąć, aby rozwiązać swój problem?
Cfinley,