Abfolge der Skripte, die bei der Anmeldung erstellt wurden

41

Ich möchte meine gesamte Login - Konfiguration in meiner ~/.bash_profile. ~/.bashrcStandardmäßig gab es ein dort, aber ich habe es durch ein ersetzt ~/.bash_profile.

Wenn ich mich jedoch ~/.bash_profileanmelde, wird zunächst Folgendes angezeigt:

Linux ubnt10-dev1 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Fri May  9 12:17:39 EDT 2014

  System load:  0.01              Processes:           74
  Usage of /:   5.5% of 18.58GB   Users logged in:     0
  Memory usage: 4%                IP address for eth0: 123.x.x.x
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri May  9 12:11:52 2014 from 123.x.x.x

Ich möchte das entfernen, damit nur meine eigene Begrüßung ~/.bash_profileangezeigt wird, die in my gets definiert ist. Ich bin mir jedoch nicht sicher, welche Logik / Sequenz von Skripten bei der Anmeldung eines Benutzers verwendet / ausgeführt wird. Können Sie mich aufklären?

Als Bonus möchte ich auch die Reihenfolge der automatisierten Sourcing- / Exec-Vorgänge beim Systemstart kennen, nicht nur, wenn ein Benutzer eine Sitzung durch Anmelden startet, auch wenn dies für mich derzeit von geringerer Bedeutung ist.

amphibient
quelle

Antworten:

53

Das ist ziemlich komplex. Zuallererst hängen die Details davon ab, welche Art von Shell Sie ausführen. Um mich selbst zu plagiieren :

  • Wenn Sie beispielsweise einen Terminalemulator öffnen gnome-terminal, führen Sie eine sogenannte interaktive Shell ohne Anmeldung aus .

  • Wenn Sie sich über die Befehlszeile bei Ihrem Computer anmelden oder einen Befehl ausführen, wie z. B. su - username, führen Sie eine interaktive Anmeldeshell aus .

  • Wenn Sie sich grafisch anmelden, wird etwas völlig anderes ausgeführt. Die Details hängen von Ihrem System und Ihrer grafischen Umgebung ab, aber im Allgemeinen ist es die grafische Shell , die sich um Ihre Anmeldung kümmert. Während viele grafischen Schalen (einschließlich der Standard - Ubuntu) werden gelesen /etc/profileund ~/.profilenicht alle von ihnen tun.

  • Wenn Sie ein Shell-Skript ausführen, wird es in einer nicht interaktiven Shell ohne Anmeldung ausgeführt .

Die Dateien, die beim Start von bash gelesen werden, hängen vom Typ der Shell ab, unter der es ausgeführt wird. Das Folgende ist ein Auszug aus dem Abschnitt INVOCATION von man bash(Schwerpunkt Mine):

Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login 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 Datei aus, die vorhanden und lesbar ist. Die Option --noprofile kann verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu unterbinden.

Wenn eine interaktive Shell , das ist kein Login - Shell gestartet wird, bash liest und führt Befehle aus /etc/bash.bashrc und ~ / .bashrc , wenn diese Dateien vorhanden sind . Dies kann mit der Option --norc verhindert werden. Die Option --rcfile file erzwingt, dass Bash anstelle von /etc/bash.bashrc und ~ / .bashrc Befehle aus der Datei liest und ausführt.

Das sind die Initialisierungsdateien. Sie haben auch die /etc/environmentMöglichkeit, globale Umgebungsvariablen festzulegen, die jedoch eher gelesen als bezogen werden (darin enthaltene Befehle werden nicht ausgeführt, aber Variablendefinitionen werden festgelegt).

Jetzt ist die Begrüßung, die Sie sehen, wieder etwas anderes. Das ist eingestellt /etc/motdund wird durch angezeigt pam_motd. Wie erklärt in man motd:

Der Inhalt von / etc / motd wird von pam_motd (8) nach einer erfolgreichen Anmeldung angezeigt, jedoch kurz bevor die Anmeldeshell ausgeführt wird.

Die Abkürzung "motd" steht für "Nachricht des Tages", und diese Datei wird traditionell genau dafür verwendet (sie benötigt viel weniger Speicherplatz als Mail an alle Benutzer).

Unter Debian GNU / Linux wird auch der Inhalt von /run/motd.dynamic angezeigt. Diese Datei wird beim Booten von /etc/init.d/motd generiert.

Um die Nachricht zu entfernen, leeren Sie einfach die /etc/motdDatei und stellen Sie sicher, dass von nichts generiert wird, /etc/init.d/motdfalls vorhanden.


Wie auch immer, basierend auf der Ausgabe, die Sie anzeigen, scheinen Sie sich über anzumelden, sshwas bedeutet, dass Sie eine interaktive Anmeldeshell ausführen (siehe oben). Zusammenfassend gesagt, werden die Dinge, die Sie interessieren, beim Anmelden bezogen (und in dieser Reihenfolge):

  1. Der SSH-Dämon zeigt über das pam_motdModul der PAM-Bibliothek den Inhalt von an /etc/motd. Über das pam_envModul setzt es die Umgebungsvariablen von /etc/environmentund ~/.pam_environment.
  2. Eine Anmeldeshell wird gestartet und die folgenden Dateien werden der Reihe nach gelesen:
    1. /etc/profile
    2. /etc/bash.bashrc(die Standard Ubuntu /etc/profileQuellen /etc/bash.bashrc).
    3. ~/.bash_profile. Die anderen Dateien, die hier ( ~/.profileund ~/.bash_login) hätte gelesen werden können, werden ignoriert, da sie ~/.bash_profilevorhanden sind.
terdon
quelle
5
Ein guter Trick, um diese Dinge selbst zu entdecken, ist das Umstellen von Sentinel-Variablen. Ich meine, ich trage export SET_IN_ETC_PROFILE=yesein /etc/profile, export SET_IN_HOME_ZSHRC=yesin ~/.zhshrc(ich bin ein zsh-Benutzer), etc ... Dann starte neu und ein netter env|grep SET_INwird dir die ganze Geschichte erzählen. Informationen dazu, welche Variablen von den Desktop-Anwendungen angezeigt werden (die Sie vom Dash oder der WM aus starten, ohne ein Terminal zu verwenden), finden Sie unter askubuntu.com/a/356973/16395
Rmano,
1
Also, wenn Sie ssh, wäre das eine interaktive Shell, richtig?
Amphibient
@amphibient eine interaktive Login-Shell, ja. Wenn Sie ein Terminal auf einem lokalen Tour-Computer öffnen, handelt es sich um eine interaktive Shell ohne Anmeldung.
terdon
@ Rmano Ich habe Ihre Kommentare positiv bewertet. Aber Momente später stellte sich heraus, dass der Befehl in envkeiner Beziehung zur Ausführungsreihenfolge steht.
Penghe Geng
2
@ Xiaobai natürlich nicht, der Punkt ist, dass SET_INSie zeigen, welche Dateien gelesen wurden, nicht in welcher Reihenfolge sie gelesen wurden. Die Reihenfolge ist Standard, es ist das, was in den Auszügen der Manpage gezeigt wird, die ich in meiner Antwort habe.
Terdon
1

Die Informationen, die Sie sehen, wenn Sie sich über ssh anmelden, werden erstellt, bevor / etc / profile überhaupt angezeigt wird. Schauen Sie sich die Reihenfolge der Dateien in /etc/update-motd.d an. Das zeigt Ihnen, wo die Nachrichten, die Sie sehen, von verschiedenen Skripten generiert werden.

Reese
quelle
1
Dies wird bereits in der oberen Antwort behandelt, aber ich schätze Ihre Kürze. +1 :)
wjandrea