369 Stimmen

Ausführen eines Skripts beim Anmelden in Mac OS X

Ich frage mich, ob jemand in der Lage ist, mir dabei zu helfen, ein Shell (.sh) Programm zu erstellen, das automatisch ausgeführt wird, sobald ich mich auf meinem Computer anmelde. Ich verwende Mac OS X 10.6.7.

Ich habe eine Datei "Beispiel.sh", die ich ausführen möchte, wenn ich mich auf meinem Computer anmelde. Es ist kein Problem, es auszuführen, wenn ich bereits angemeldet bin, aber ich möchte, dass dies automatisch geschieht.

532voto

jm666 Punkte 58205

Folge diesem:

  • starte Automator.app

  • wähle Anwendung

  • klicke auf Bibliothek anzeigen in der Symbolleiste (falls versteckt)

  • füge Shell-Skript ausführen hinzu (aus den Aktionen/Dienstprogramme)

  • kopiere und füge dein Skript in das Fenster ein

  • teste es

  • irgendwo speichern (zum Beispiel kannst du einen Anwendungen Ordner in deinem HOME erstellen, du wirst ein dein_name.app bekommen)

  • gehe zu Systemeinstellungen -> Benutzer & Gruppen -> Anmeldeobjekte (oder Systemeinstellungen -> Benutzer & Gruppen -> Anmeldeobjekte / je nach deiner MacOS-Version)

  • diese App hinzufügen

  • teste & fertig ;)

BEARBEITEN:

Ich habe kürzlich ein "Gute Antwort" Abzeichen für diese Antwort erhalten. Obwohl meine Lösung einfach und funktionierend ist, wird der sauberste Weg, jedes Programm oder Shell-Skript zur Anmeldezeit auszuführen, in @trisweb's Antwort beschrieben, es sei denn, du willst Interaktivität.

Mit der Automator-Lösung kannst du Dinge wie folgende tun: Automator-Screenshot Anwendung bei Anmeldung

also, um ein Skript auszuführen oder die App zu beenden, Passwörter abzufragen, andere Automator-Workflows zur Anmeldezeit auszuführen, bedingt Anwendungen zur Anmeldezeit auszuführen und so weiter...

2 Stimmen

@GregMiernicki LOL, guten Morgen... ;) Vor fast einem Jahr habe ich eine BEARBEITUNG zu meiner Antwort hinzugefügt, in der ich das auch gesagt habe. Aber das ist etwas einfacher für durchschnittliche Benutzer, weil das Erstellen von XML (plist) Dateien für viele Benutzer nicht sehr benutzerfreundlich ist. Trotzdem - danke für den Kommentar. ;)

4 Stimmen

@GregMiernicki und vergiss nicht, mit der Automator-Lösung kannst du INTERAKTIVE Anmelde-Scripts erstellen - z.B. ein Script, das dich um eine Eingabe (z.B. zusätzliches Passwort oder ähnliches) bittet. Die Welt ist nicht nur schwarz oder weiß - zumindest ist es wie ein Zebra... :) :)

0 Stimmen

Sagen wir, ich möchte ein Python-Skript automatisch ausführen (im Grunde wird es als Daemon fungieren) automatisch beim Start. Ist es möglich, das Shell-Skript so auszuführen, wie Sie sagten, und das Python-Skript von dort aus aufzurufen?

469voto

trisweb Punkte 8454

Tl;dr: Verwenden Sie den nativen Prozessstarter und -manager von OSX, launchd.

Dazu erstellen Sie einen launchctl-Daemon. Sie haben volle Kontrolle über alle Aspekte des Skripts. Sie können es einmal ausführen oder als Daemon am Leben halten. In den meisten Fällen ist dies der richtige Weg.

  1. Erstellen Sie eine .plist Datei gemäß den Anweisungen in den Apple Dev-Dokumenten hier oder weiter unten für mehr Details.
  2. Platzieren Sie es in ~/Library/LaunchAgents
  3. Melden Sie sich an (oder führen Sie es manuell über launchctl load [filename.plist] aus)

Für weitere Informationen über launchd ist der Wikipedia-Artikel recht gut und beschreibt das System und seine Vorteile gegenüber anderen älteren Systemen.


Hier ist die spezifische plist-Datei, um ein Skript beim Anmelden auszuführen.

Aktualisiert 25.09.2017 für OSX El Capitan und neuer (Dank an José Messias Jr):

   Label
   com.user.loginscript
   ProgramArguments
   /path/to/executable/script.sh
   RunAtLoad

Ersetzen Sie das nach dem Program-Schlüssel durch Ihren gewünschten Befehl (beachten Sie, dass jedes durch diesen Befehl referenzierte Skript ausführbar sein muss: chmod a+x /path/to/executable/script.sh, um sicherzustellen, dass es für alle Benutzer ist).

Speichern Sie es als ~/Library/LaunchAgents/com.user.loginscript.plist

Führen Sie launchctl load ~/Library/LaunchAgents/com.user.loginscript.plist aus und melden Sie sich ab/ wieder an, um zu testen (oder um direkt zu testen, führen Sie launchctl start com.user.loginscript) aus

Überwachen Sie /var/log/system.log auf Fehlermeldungen.

Der Schlüssel ist, dass dies ein benutzerspezifischer launchd-Eintrag ist, der also beim Anmelden für den entsprechenden Benutzer ausgeführt wird. Systemspezifische launch-Daemons (platziert in /Library/LaunchDaemons) werden beim Start ausgeführt.

Wenn Sie möchten, dass ein Skript beim Anmelden für alle Benutzer ausgeführt wird, glaube ich, dass LoginHook Ihre einzige Option ist, und das ist wahrscheinlich der Grund, warum es existiert.

4 Stimmen

Ja. Für das, was es wert ist habe ich diesen Blog über die gleiche Technik hilfreich gefunden: developernotes.com/archive/2011/04/06/169.aspx

8 Stimmen

Sie vernachlässigen zu erwähnen, was an Automator-Aktionen zweifelhaft ist und warum sie 'nicht empfohlen' werden.

4 Stimmen

Hier ist ein guter Überblick über Ordneraktionen vs. launchctl: apple.stackexchange.com/a/63731/38290 - Und ein weiterer über eine der Einschränkungen von LoginHook (nur ein Skript erlaubt) - superuser.com/a/377401. Es ist nicht wirklich so, dass eine der Methoden fragwürdig oder schlecht ist, aber launchctl ist in den meisten Fällen einfach besser und gibt dir mehr Kontrolle über alle möglichen Aspekte beim Ausführen deines Skripts. Es geht eher darum, "warum eine weniger leistungsfähige Methode verwenden, wenn launchd existiert?" (Hinweis: Ich habe den ersten Satz geändert, um anzugeben, dass ich persönlich diese Methode nicht für diese Situation empfehle).

61voto

anubhava Punkte 713155
  1. Erstellen Sie ein Shell-Skript mit dem Namen login.sh in Ihrem $HOME-Verzeichnis.

  2. Fügen Sie das folgende Einzeilenskript in den Skript-Editor ein: do shell script "$HOME/login.sh"

  3. Speichern Sie es dann als Anwendung.

  4. Fügen Sie die Anwendung schließlich zu Ihren Anmeldeobjekten hinzu.

Wenn Sie die Ausgabe des Skripts visuell gestalten möchten, können Sie den Schritt 2 durch Folgendes ersetzen:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Wenn mehrere Befehle benötigt werden, kann etwas Ähnliches wie dies verwendet werden:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell

2 Stimmen

Ich habe diesen einen verlinkt, das einzige, was fehlt, ist ein Befehlszeilen-Installationsprogramm ;)

1 Stimmen

Gute Lösung. Wie kann ich das "Anmelden"-Fenster verstecken? Ich habe versucht, bei den Anmeldeoptionen ein Häkchen zu setzen.

1 Stimmen

@xgdgsc: Gehe zu Systemeinstellungen -> Benutzer & Gruppen -> Anmeldeobjekte und aktiviere das Ausblenden für diese Anwendung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X