Wie führe ich ein Skript beim Anmelden in * nix aus?

70

Ich weiß, dass ich einmal weiß, wie das geht, aber ... wie führt man ein Skript (Bash ist in Ordnung) beim Anmelden unter Unix aus?

Nate
quelle
1
Welcher Login? UI-Login? wie Gnom, GTK, Einheit? Vielleicht ein neues Shell-Login vom tty? Was ist der Unterschied zwischen ihnen?
AlikElzin-Kilaka

Antworten:

112

Aus Wikipedia Bash

Wenn Bash gestartet wird, werden die Befehle in verschiedenen Skripten ausgeführt.

Wenn Bash als interaktive Anmeldeshell aufgerufen wird, werden zuerst Befehle aus der Datei / etc / profile gelesen und ausgeführt, sofern diese Datei vorhanden ist. Nach dem Lesen dieser Datei sucht sie in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle von der ersten vorhandenen und lesbaren aus.

Wenn eine Anmeldeshell beendet wird, liest Bash Befehle aus der Datei ~ / .bash_logout und führt sie aus, falls vorhanden.

Wenn eine interaktive Shell gestartet wird, die keine Anmeldeshell ist, liest Bash Befehle von ~ / .bashrc und führt sie aus, sofern diese Datei vorhanden ist. Dies kann durch Verwendung der Option --norc verhindert werden. Die Option --rcfile file zwingt Bash, Befehle aus der Datei anstelle von ~ / .bashrc zu lesen und auszuführen.

Svet
quelle
3
Nur ein Jahrzehnt zu spät, aber: Was ist, wenn für diesen Befehl sudo erforderlich ist (z. B. das Mounten einer Netzwerkfreigabe von einem NAS in das Home
-Verzeichnis
@ Mike'Pomax'Kamermans ausgezeichnete Frage, vielleicht wird das Sudo angenommen, da es in den Systemdateien ist?
Webwoman
vielleicht, aber vielleicht auch nicht - hoffentlich kann das noch jemand für uns beantworten = (
Mike 'Pomax' Kamermans
29

Bei der Anmeldung führen die meisten Shells ein Anmeldeskript aus, mit dem Sie Ihr benutzerdefiniertes Skript ausführen können. Das Anmeldeskript, das die Shell ausführt, hängt natürlich von der Shell ab:

  • Bash: .bash_profile, .bash_login, .profile (für Rückwärtskompatibilität)
  • sh: .profile
  • tcsh und csh: .login
  • zsh: .zshrc

Sie können wahrscheinlich herausfinden, welche Shell Sie verwenden, indem Sie dies tun

echo $SHELL

von der Eingabeaufforderung.

Für eine etwas umfassendere Definition von "Login" ist es hilfreich zu wissen, dass in den meisten Distributionen beim Start von X Ihre .xsessionrc ausgeführt wird, wenn Ihre X-Sitzung gestartet wird.

pjz
quelle
1
echo $ 0 sollte zeigen, welche Shell verwendet wird, obwohl ich gelegentlich 'sh' gesehen habe, wenn es wirklich 'ksh' ist - unter HP-UX oder Solaris, denke ich.
Dr.-Jan
10

Bei der Verwendung von Bash, den ersten ~/.bash_profile, ~/.bash_loginund ~/.profilewird für ein interaktiv Login - Shell ausgeführt werden. Ich glaube, dass ~/.profileBix neben Shash im Allgemeinen von Unix-Shells betrieben wird. Bash wird ~/.bashrcfür eine interaktive Shell ohne Anmeldung ausgeführt.

Normalerweise setze ich alles ein, was ich immer einrichten möchte, .bashrcund führe es dann aus .bash_profile. Dort richte ich auch einige Dinge ein, die nur ausgeführt werden sollen, wenn ich mich anmelde, z. B. Einrichten ssh-agentoder Ausführen screen.

Michael Johnson
quelle
5

Wenn Sie ein Skript und nur ein Skript ausführen möchten , können Sie festlegen, dass der Benutzer die Standard-Shell verwendet.

echo "/usr/bin/uptime" >> /etc/shells
vim /etc/passwd  
  * username:x:uid:grp:message:homedir:/usr/bin/uptime

kann interessante Effekte haben :) (es ist nicht sicher, also vertraue ihm nicht zu sehr. Nichts wie das Festlegen deiner Standard-Shell als Skript, das dein Laufwerk löscht. ... obwohl ... Ich kann mir ein Szenario vorstellen, in dem das so ist könnte erstaunlich nützlich sein)

Kent Fredric
quelle
3

Wenn Sie unter OSX arbeiten, ist dies der Fall ~/.profile

Craig B.
quelle
3

Platziere es in deinem Bash-Profil :

~/.bash_profile
gbjbaanb
quelle
3

Launchd ist der bevorzugte Weg in OS X.

Wenn Sie möchten, dass es bei Ihrem Login ausgeführt wird, geben Sie es ein ~/Library/LaunchAgents

Start launchdArtikel

launchctl load /Library/LaunchDaemons/com.bob.plist

Gegenstand stoppen

launchctl unload /Library/LaunchDaemons/com.bob.plist

Beispiel com.bob.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.bob</string>
<key>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/java</string>
<string>-jar</string>
<string>/Users/user/program.jar</string>
</array>
</dict>
</plist>
Milhous
quelle
3

Ich war tagelang mit diesem Problem frustriert. Bei Ubuntu hat nichts funktioniert. Wenn ich den Anruf in / etc / profile schreibe, stürzt alles beim Anmeldeversuch ab. Ich konnte "Startup Applications" nicht verwenden, da dies nicht das war, was ich wollte. Dadurch wird nur das Skript für diesen aktuellen Benutzer festgelegt.

Schließlich fand ich diesen kleinen Artikel: http://standards.freedesktop.org/autostart-spec/autostart-spec-0.5.html

Die Lösung wäre:

  1. Finden Sie den Pfad $ XDG_CONFIG_DIRS heraus:

    echo $ XDG_CONFIG_DIRS

  2. Legen Sie Ihr Skript in dieses Verzeichnis

user568021
quelle
2

Fügen Sie einen Eintrag hinzu /etc/profile, der das Skript ausführt. Dies wird bei jeder Anmeldung ausgeführt. Wenn Sie dies nur für Ihr eigenes Konto tun, verwenden Sie eines Ihrer Anmeldeskripte (z. B. .bash_profile), um es auszuführen.

ConcernedOfTunbridgeWells
quelle
2

Durchsuchen Sie die Bash-Manpage Ihres lokalen Systems nach ^ INVOCATION, um Informationen darüber zu erhalten, welche Datei beim Start gelesen werden soll.

man bash
/^INVOCATION

Auch im Abschnitt DATEIEN,

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

Fügen Sie Ihr Skript der richtigen Datei hinzu. Stellen Sie sicher, dass sich das Skript im $ PATH befindet, oder verwenden Sie den absoluten Pfad zur Skriptdatei.

jtimberman
quelle
1

Das Skript ~/.bash_profilewird beim Login ausgeführt.

William Keller
quelle