Ausführen des Skripts beim Anmelden mac [geschlossen]

280

Ich frage mich, ob mir jemand helfen kann, eine .sh-Datei zum Laufen zu bringen, wenn ich mich bei meinem Konto auf meinem Computer anmelde. Ich verwende Mac OS X 10.6.7.

Ich habe eine Datei "Example.sh", die ich ausführen möchte, wenn ich mich an meinem Computer anmelde. Ich habe kein Problem beim Ausführen, wenn ich bereits angemeldet bin, aber ich möchte, dass dies automatisch ausgeführt wird.

Die Leute sagen, sie sollen der Login-Shell-Datei hinzugefügt werden, aber ich weiß nicht, wo das ist. Bitte etwas Hilfe.

MZimmerman6
quelle
3
Dies ist kein Off-Topic ... Ich brauchte es, um meinen Emacs-Daemon zu starten;) Übrigens ist die beste Antwort meiner Meinung nach die Lingon X-App.
HappyFace
1
Es ist mir egal, ob dies nicht zum Thema gehört. Es ist die beste Antwort, die ich im Internet gefunden habe und die Respekt verdient. Ich habe es für andere ignoriert, als ich zum ersten Mal nach einer Lösung gesucht habe, und das war ein großer Fehler!
Sethmr

Antworten:

378

Folge dies:

  • Start Automator.app
  • wählen Application
  • Klicken Sie Show libraryin die Symbolleiste (falls ausgeblendet).
  • hinzufügen Run shell script(aus dem Actions/Utilities)
  • Kopieren Sie Ihr Skript und fügen Sie es in das Fenster ein
  • Probier es aus
  • irgendwo speichern (zum Beispiel können Sie einen ApplicationsOrdner in Ihrem HOME erstellen, Sie erhalten einen your_name.app)

  • gehe zu System Preferences-> Accounts->Login items

  • füge diese App hinzu
  • test & done;)

BEARBEITEN:

Ich habe kürzlich ein "Gute Antwort" -Abzeichen für diese Antwort erhalten. Während meine Lösung einfach ist und funktioniert, ist die sauberste Methode zum Ausführen eines Programms oder Shell-Skripts zur Anmeldezeit in der Antwort von @ trisweb beschrieben , es sei denn, Sie möchten Interaktivität .

Mit der Automator-Lösung können Sie folgende Aufgaben ausführen: Automator-Screenshot-Anmeldeanwendung

Fragen Sie nach einem Skript oder beenden Sie die App, fragen Sie nach Kennwörtern, führen Sie andere Automator-Workflows zur Anmeldezeit aus, führen Sie Anwendungen bedingt zur Anmeldezeit aus und so weiter ...

jm666
quelle
2
@ GregMiernicki LOL, guten Morgen ...;) Vor fast einem Jahr habe ich meiner Antwort eine BEARBEITUNG hinzugefügt, in der ich dies auch erzähle. Dies ist jedoch für durchschnittliche Benutzer etwas einfacher, da das Erstellen von XML-Dateien (Plist-Dateien) für viele Benutzer nicht sehr benutzerfreundlich ist. Wie auch immer - Danke für einen Kommentar. ;)
jm666
4
@GregMiernicki und nicht vergessen, mit der Automator-Lösung können Sie INTERAKTIVE Anmeldeskripte erstellen - z. B. ein Skript, das Sie nach einem Eintrag fragt (z. B. zusätzliches Passwort oder ähnliches). Die Welt ist nicht nur schwarz oder weiß - zumindest ist es wie ein Zebra ... :) :)
jm666
2
@Cupidvogel Das Ausführen eines Daemons zur Anmeldezeit ist genau die Aufgabe für die launchd-Lösung - siehe die Antwort von trisweb. Wenn Sie einen Python-Daemon verwalten können, können Sie sicher eine plist-Konfigurationsdatei verwalten, in der Sie alle Aspekte von Neustarts usw. verwalten können ...
jm666
3
Ein großes Lob dafür, dass die andere Antwort die sauberste ist. Das sollte ein gutes Staatsbürgerschaftsabzeichen bekommen :).
Studgeek
2
Erstaunliche Antwort. Exportieren Sie PATH = / usr / local / bin: $ PATH am Anfang des Skripts, wenn Sie beim Systemstart Befehle wie "Composer Global Update" ausführen möchten.
Leonardo
377

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

Erstellen Sie dazu einen launchctlDaemon. Sie haben die volle Kontrolle über alle Aspekte des Skripts. Sie können einmal ausführen oder als Daemon am Leben bleiben. In den meisten Fällen ist dies der richtige Weg.

  1. Erstellen Sie eine .plistDatei gemäß den Anweisungen in den Apple Dev-Dokumenten hier oder genauer unten.
  2. Platzieren in ~/Library/LaunchAgents
  3. Anmelden (oder manuell ausführen über launchctl load [filename.plist])

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


Hier ist die spezifische plist-Datei, mit der beim Anmelden ein Skript ausgeführt werden kann .

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Label</key>
   <string>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Ersetzen Sie die <string>Taste nach dem Programm durch den gewünschten Befehl (beachten Sie, dass jedes Skript, auf das dieser Befehl verweist, ausführbar sein muss, chmod a+x /path/to/executable/script.shum sicherzustellen, dass es für alle Benutzer gilt).

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

Lauf launchctl load ~/Library/LaunchAgents/com.user.loginscript.plist und abmelden / anmelden, um zu testen (oder direkt testen, ausführen launchctl start com.user.loginscript)

Schwanz /var/log/system.log für Fehlermeldungen.

Der Schlüssel ist, dass dies ein benutzerspezifischer Starteintrag ist, der bei der Anmeldung für den angegebenen Benutzer ausgeführt wird. Systemspezifische Startdämonen (platziert in/Library/LaunchDaemons ) werden beim Booten ausgeführt.

Wenn Sie möchten, dass ein Skript bei der Anmeldung für alle Benutzer ausgeführt wird, ist LoginHook meiner Meinung nach Ihre einzige Option, und das ist wahrscheinlich der Grund, warum es existiert.

Trisweb
quelle
4
Ja. FWIW Ich fand diesen Blog mit der gleichen Technik hilfreich: Developernotes.com/archive/2011/04/06/169.aspx
Daniel James
8
Sie vernachlässigen es zu erwähnen, was an Automator-Aktionen zweifelhaft ist und warum sie nicht empfohlen werden.
Mike Campbell
4
Hier ist eine gute Übersicht über Ordneraktionen im Vergleich zu launchctl: apple.stackexchange.com/a/63731/38290 - Und eine weitere über eine der Einschränkungen von LoginHook (nur ein Skript zulässig) - superuser.com/a/377401 . Es ist nicht wirklich eine zweifelhafte oder schlechte Methode, aber launchctlin den meisten Fällen ist sie einfach weitaus besser und gibt Ihnen mehr Kontrolle über alle möglichen Aspekte der Ausführung Ihres Skripts. Es ist eher im Sinne von "Warum eine weniger leistungsfähige Methode verwenden, wenn Launchd existiert?" (Hinweis: Ich habe den ersten Satz geändert, um anzuzeigen, dass ich diese für diese Situation persönlich nicht empfehle.)
Trisweb
3
Sie fragen sich, wie Sie die LaunchDaemon-Liste erstellen, was jedes Mal ausgeführt wird, wenn sich der Benutzer anmeldet? . Also nicht beim Systemstart, sondern jedes Mal, wenn sich der Benutzer anmeldet (versuchen Sie es mit dem Abmelde-Anmelde -Zyklus). Können Sie bitte genau (nicht nur bla-bla) zeigen, wie die oben genannte (von Ihnen falsche) Automatorlösung mit launchctl implementiert wird?
Cajwine
9
Plist-Dateien in / Library / LaunchAgents / werden beim Anmelden mit der ID des angemeldeten Benutzers ausgeführt. Plist-Dateien in / Library / LaunchDaemons / werden beim Booten als root ausgeführt (ID kann mit dem Benutzerschlüssel geändert werden ).
Bain
42
  1. Erstellen Sie Ihr Shell-Skript wie login.shin Ihrem $ HOME-Ordner.

  2. Fügen Sie das folgende einzeilige Skript in den Skript-Editor ein:

    Shell-Skript "$ HOME / login.sh" ausführen

  3. Speichern Sie es dann als Anwendung.

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

Wenn Sie die Skriptausgabe visuell gestalten möchten, können Sie Schritt 2 dafür austauschen:

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

Wenn mehrere Befehle benötigt werden, kann Folgendes verwendet werden:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell
Anubhava
quelle
1
Ich habe dieses verlinkt, das einzige, was ein Kommandozeilen-Installationsprogramm fehlt;)
Sorin
1
Schöne Lösung. Wie kann ich das Anmeldefenster ausblenden? Ich habe versucht, Login-Elemente anzukreuzen.
xgdgsc
1
@xgdgsc: Gehe zu Go to System Preferences -> Accounts -> Login itemsund aktiviere das Kontrollkästchen für diese Anwendung.
Anubhava
1
@anubhava Wie gesagt, ich habe das Kontrollkästchen für diese Anmeldeanwendung bereits aktiviert. Es wird jedoch weiterhin angezeigt und muss beim Herunterfahren des Computers beendet werden.
xgdgsc
2
@xgdgsc: Oh ok, hast du den ~/Library/LaunchAgentsOrdner überprüft ?
Anubhava