Detaillierte Erklärung des Initialisierungsmechanismus in Bash

Detaillierte Erklärung des Initialisierungsmechanismus in Bash

Bash-Initialisierungsdateien

Interaktive Login-Shell

In den folgenden Fällen können wir eine Login-Shell erhalten:

  • Die Shell der obersten Ebene, die Sie erhalten, wenn Sie sich beim System anmelden, sei es über ein lokales Terminal oder per SSH über das Netzwerk. Die in diesem Fall erhaltene Login-Shell ist eine interaktive Shell.
  • Rufen Sie bash mit der Option --login in einem Terminal auf, um eine interaktive Anmelde-Shell zu erhalten.
  • Wenn Sie bash mit der Option --login in einem Skript aufrufen (zum Beispiel: #!/bin/bash --login), wird eine nicht interaktive Anmelde-Shell erstellt.
  • Wenn Sie mit su - zu einem angegebenen Benutzer wechseln, erhalten Sie die Login-Shell dieses Benutzers. Ohne - erhalten Sie eine Shell ohne Anmeldung.

Wenn die Login-Shell startet, liest sie zuerst die globale Systemkonfiguration /etc/profile, sucht dann nacheinander nach den drei Konfigurationsdateien ~/.bash_profile, ~/.bash_login und ~/.profile und liest die erste gefundene lesbare Datei.

Wenn die Login-Shell beendet wird, liest und führt sie die Befehle in ~/.bash_logout aus. Wenn die Konfigurationsdatei vorhanden, aber nicht lesbar ist, wird eine Fehlermeldung angezeigt. Wenn die Datei nicht existiert, sucht bash automatisch nach der nächsten Datei.

Standardmäßig werden globale Umgebungsvariablen wie PATH, USER, MAIL, HOSTNAME, HISTSIZE usw. in der Datei /etc/profile definiert. Die Datei /etc/bash.bashrc (die Shell-Funktionen und Aliase auf Systemebene enthält) und alle *.sh-Dateien im Pfad /etc/profile.d, die zum Initialisieren bestimmter Programme verwendet werden, werden ebenfalls automatisch importiert.

Interaktive Shell ohne Anmeldung

Eine Shell ohne Anmeldung bedeutet, dass Sie sich beim Systemstart nicht authentifizieren müssen. Das vom Benutzer in der GUI geöffnete Terminal ist standardmäßig eine Nicht-Login-Shell, was durch den Abmeldebefehl festgestellt werden kann:

# Öffnen Sie ein Terminal auf dem Ubuntu-GUI-Desktop > Abmelden
Bash: Abmelden: keine Anmeldung Shell: Verwenden Sie „exit“.
> bash --login
> logout # Melde dich normal ab und es wird nichts ausgegeben

Wenn eine Nicht-Login-Shell initialisiert wird, liest sie nur die Ressourcendatei ~/.bashrc, und die Datei ~/.bashrc wird automatisch von ~/.bash_profile oder ~/.profile geladen. Um sicherzustellen, dass die Login-Shell und die interaktive Nicht-Login-Shell dieselbe Konfiguration erhalten, werden die Umgebungsvariablen daher im Allgemeinen in der Datei ~/.bashrc definiert.

> echo "export sflag=\"Login-Shell wird diese Nachricht sehen\"" >> ~/.profile  
> Schlag 
> echo $sflag 
          # Wenn die Variable nicht gefunden wird, wird eine leere Zeile gedruckt> exit 
> bash --login 
> echo $sflag 
Die Login-Shell wird diese Meldung sehen 
> Abmelden

Nicht interaktive Shell

Wenn das Skript über den Bash-Befehl ausgeführt wird, wird die Shell nicht-interaktiv gestartet. Dadurch wird sichergestellt, dass der Benutzer während der Ausführung nicht in das Skript eingreift. Wenn ein nicht interaktives Skript gestartet wird, wird nur die Datei geladen, auf die die Variable BASH_ENV zeigt. Beachten Sie jedoch, dass der Wert der Variablen BASH_ENV ein absoluter Pfad sein sollte, da die Variable PATH standardmäßig nicht von nicht-interaktiven Shells geladen wird.

Sie können den aktuellen Shell-Modus über die spezielle Variable - anzeigen:

> echo $-
himBHs # mit 'i' ist eine interaktive Shell

Eine andere einfache Möglichkeit besteht darin, zu prüfen, ob die Eingabeaufforderungsumgebungsvariable PS1 in der aktuellen Shell vorhanden ist.

wenn [ -z "$PS1" ]; dann echo "nicht-interaktiv";sonst echo "interaktiv";fi

Besondere Umstände

Kompatibilitätsmodus

Wenn Sie den Befehl sh zum Aufrufen von bash verwenden, wird bash auf die gleiche Weise wie sh initialisiert, um die Kompatibilität sicherzustellen. Wenn Bash als Anmelde-Shell gestartet wird, liest es die Konfigurationsdateien /etc/profile und ~/.profile in dieser Reihenfolge. Wenn Bash als Shell ohne Anmeldung gestartet wird, liest es nur die Datei, auf die die Umgebungsvariable ENV zeigt.

POSIX-Modus

Beim Starten von Bash über:

  1. set -o posix oder export POSIXLY_CORRECT=1
  2. bash --posix

Bash versucht, gemäß dem POSIX-Standard zu initialisieren und nur die Datei zu lesen, auf die die Umgebungsvariable ENV zeigt.

Remote-Startskript

Wenn Sie rshd verwenden, um das Skript remote zu starten, wird nur die Datei ~/.bashrc geladen. Beachten Sie jedoch, dass Sie möglichst keine Remote-Befehle wie rlogin, telnet, rsh, rcp usw. verwenden sollten, da diese Befehle unverschlüsselte Klartextinformationen übertragen. Wenn Sie Fernzugriff benötigen, versuchen Sie, SSH zu verwenden.

UID und EUID stimmen nicht überein

Wenn ein Prozess erstellt wird, werden die für die Ausführung des Prozesses erforderlichen Informationen in task_struct aufgezeichnet. Die UID (Real User ID) wird verwendet, um die ID des Benutzers aufzuzeichnen, der den Prozess erstellt hat, und die EUID (Effective User ID) wird verwendet, um die Zugriffsebene des aktuellen Prozesses auf die Datei zu bestimmen. Im Allgemeinen gilt: UID = EUID. Wenn das Set-User-ID: SUID-Bit einer ausführbaren Datei gültig ist (zum Beispiel: -rwsr-xr-x, wobei das x des Benutzers durch s ersetzt wird), bedeutet dies, dass der Prozess beim Ausführen der Datei die Berechtigungen des Dateibesitzers und nicht des Ausführers hat (der Wert von EUID ist die ID des Dateibesitzers).

Wenn wir das Flag „set-user-id“ für die ausführbare Bash-Datei setzen, ist die UID des Prozesses nicht identisch mit der EUID, da der Standardbesitzer root ist. Wenn andere Nicht-Root-Benutzer Bash ausführen, ist die UID des Prozesses nicht identisch mit der EUID. In diesem Fall lädt Bash aus Sicherheitsgründen während der Initialisierungsphase keine Dateien.

Eingeschränkte Schale

Beim Start über rbash oder bash --restricted oder bash -r wird eine Shell mit eingeschränkter Funktionalität wie folgt generiert:

  • Der Befehl cd kann nicht verwendet werden und der Befehl darf nicht / enthalten.
  • Die Umgebungsvariablen SHELL, PATH, ENV und BASH_ENV können nicht geändert werden
  • Der Quellbefehlsparameter darf keine Dateien mit / enthalten.
  • Die Parameter des Befehls, der zum Aliasen des Pfads verwendet wird, dürfen nicht / enthalten.
  • Funktionen in der Datei werden während der Initialisierung nicht importiert und SHELLOPTS wird ignoriert.
  • Die Umleitung kann nicht verwendet werden
  • Der Exec-Befehl kann nicht verwendet werden
  • Mit „enable -f/-d“ können keine Befehle hinzugefügt oder gelöscht werden.
  • Sie können den Befehl -p nicht verwenden, um den zum Ausführen des Befehls erforderlichen Pfad anzugeben.
  • Der eingeschränkte Modus kann nicht automatisch deaktiviert werden

Theoretisch ermöglicht diese Funktion Benutzern, bestimmte Dateien in einem bestimmten Ordner auszuführen, um eingeschränkte Funktionen auszuführen. Wenn die Umgebungsvariablen jedoch nicht richtig eingestellt sind, können Benutzer die Einschränkungen problemlos entfernen:

> rbasch
> cd /usw.
rbash: cd: eingeschränkt
> Schlag
> cd /etc # Dies kann erfolgreich ausgeführt werden, da wir uns in einer Bash-Umgebung befinden und keine Einschränkungen bestehen.

Ein effektiver Ansatz besteht darin, die Befehle zu begrenzen, die der neu erstellte Benutzer ausführen kann. Beispielsweise können wir einen Benutzer erstellen, der nur FTP-Befehle ausführen kann:

> useradd -s /bin/rbash ruser # Stellen Sie die Shell ein, die bereitgestellt wird, wenn sich der Benutzer anmeldet
> chown -R root:ruser /home/ruser/.bashrc /home/ruser/.bash_profile
# Setzen Sie root als Eigentümer und ruser group als Gruppeneigentümer (der neue ruser wird standardmäßig als ruser group eingetragen)
>chmod 640 /home/ruser/.bashrc /home/ruser/.bash_profile
# Root kann lesen und schreiben, Benutzer in der Gruppe „ruser“ können nur lesen, andere Benutzer können nichts tun> mkdir /home/ruser/bin # vom Benutzer ausführbare Dateien oder Links speichern> echo "export PATH=/home/ruser/bin" >> /home/ruser/.bash_profile
> ln -s /Benutzer/bin/ftp /home/ruser/bin/ftp

Dies ist das Ende dieses Artikels mit der detaillierten Erklärung des Initialisierungsmechanismus in Bash. Weitere relevante Inhalte zur Bash-Initialisierung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung des Skript-Debugging-Mechanismus in Bash
  • Linux Bash: ./xxx: Fehler „Binärdatei kann nicht ausgeführt werden“
  • So zählen Sie das Datum mit Bash herunter
  • Mit dem Bash-Skript können Sie bei jeder Anmeldung an der Shell Linux-Systeminformationen anzeigen
  • Lösung - BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: Unzureichende Berechtigungen
  • So führen Sie Linux Bash-Befehle in Python3 aus
  • Detaillierte Erklärung, wie man ein Passwort an den SSH/SCP-Befehl im Bash-Skript übergibt
  • Zusammenfassung zum Erstellen und Verwenden von Array-Methoden in Bash-Skripten
  • Detaillierte Erklärung der Verwendung des Bash-Befehls

<<:  Die Vue-Konfigurationsdatei generiert automatisch Routing- und Menüinstanzcode

>>:  MySQL-Datenbank implementiert MMM-Hochverfügbarkeitsclusterarchitektur

Artikel empfehlen

7 coole dynamische Website-Designs zur Inspiration

Im Bereich Design gibt es jedes Jahr unterschiedl...

Detaillierte Erläuterung des MySql-Beispiels für automatische Kürzung

Detaillierte Erläuterung des MySql-Beispiels für ...

So zeigen Sie den Speicherort von MySQL-Datendateien an

Wir haben möglicherweise eine Frage: Nachdem wir ...

Lösen Sie das Problem, dass Docker Elasticsearch7.x startet und einen Fehler meldet

Verwenden des Docker-Befehls „run“ docker run -d ...

Detaillierte Erklärung zur Verwendung von $props, $attrs und $listeners in Vue

Inhaltsverzeichnis Hintergrund 1. Dokumentbeschre...

Einfaches Grafik-Tutorial zur Verwendung von Adobe Brackets

Adobe Brackets ist eine Open Source-, einfache un...

...

Konvertieren von XHTML-CSS-Seiten in Druckerseiten

<br />In der Vergangenheit musste zum Erstel...

Beispiele für die Verwendung von Docker und Docker-Compose

Docker ist eine Open-Source-Container-Engine, mit...

Erstellen der Benutzererfahrung

<br />Vielleicht sind Sie gerade in ein Unte...

So verwenden Sie Nginx zum Simulieren der Canary-Freigabe

Dieser Artikel stellt die Blue-Green-Bereitstellu...