Linux Professional Institute Learning Logo.
Weiter zum Inhalt
  • Home
    • Alle Ressourcen
    • LPI Lernmaterialien
    • Mitmachen
    • Publishing Partner
    • Publishing Partner werden
    • Über uns
    • FAQ
    • Mitwirkende
    • Roadmap
    • Kontakt
  • LPI.org
105.1 Lektion 1
Thema 105: Shells und Shell-Skripte
105.1 Die Shell-Umgebung anpassen und verwenden
  • 105.1 Lektion 1
  • 105.1 Lektion 2
  • 105.1 Lektion 3
105.2 Einfache Skripte anpassen oder schreiben
  • 105.2 Lektion 1
  • 105.2 Lektion 2
Thema 106: Benutzerschnittstellen und Desktops
106.1 X11 installieren und konfigurieren
  • 106.1 Lektion 1
106.2 Grafische Desktops
  • 106.2 Lektion 1
106.3 Barrierefreiheit
  • 106.3 Lektion 1
Thema 107: Administrative Aufgaben
107.1 Benutzer- und Gruppenkonten und dazugehörige Systemdateien verwalten
  • 107.1 Lektion 1
  • 107.1 Lektion 2
107.2 Systemadministrationsaufgaben durch Einplanen von Jobs automatisieren
  • 107.2 Lektion 1
  • 107.2 Lektion 2
107.3 Lokalisierung und Internationalisierung
  • 107.3 Lektion 1
Thema 108: Grundlegende Systemdienste
108.1 Die Systemzeit verwalten
  • 108.1 Lektion 1
  • 108.1 Lektion 2
108.2 Systemprotokollierung
  • 108.2 Lektion 1
  • 108.2 Lektion 2
108.3 Grundlagen von Mail Transfer Agents (MTA)
  • 108.3 Lektion 1
108.4 Drucker und Druckvorgänge verwalten
  • 108.4 Lektion 1
Thema 109: Netzwerkgrundlagen
109.1 Grundlagen von Internetprotokollen
  • 109.1 Lektion 1
  • 109.1 Lektion 2
109.2 Persistente Netzwerkkonfiguration
  • 109.2 Lektion 1
  • 109.2 Lektion 2
109.3 Grundlegende Netzwerkfehlerbehebung
  • 109.3 Lektion 1
  • 109.3 Lektion 2
109.4 Clientseitiges DNS konfigurieren
  • 109.4 Lektion 1
Thema 110: Sicherheit
110.1 Administrationsaufgaben für Sicherheit durchführen
  • 110.1 Lektion 1
110.2 Einen Rechner absichern
  • 110.2 Lektion 1
110.3 Daten durch Verschlüsselung schützen
  • 110.3 Lektion 1
  • 110.3 Lektion 2
How to get certified
  1. Thema 105: Shells und Shell-Skripte
  2. 105.1 Die Shell-Umgebung anpassen und verwenden
  3. 105.1 Lektion 1

105.1 Lektion 1

Zertifikat:

LPIC-1

Version:

5.0

Thema:

105 Shells und Shell-Skripte

Lernziel:

105.1 Die Shell-Umgebung anpassen und verwenden

Lektion:

1 von 3

Einführung

Die Shell ist das wohl mächtigste Werkzeug in einem Linux-System und dient als Schnittstelle zwischen dem Benutzer und dem Kernel des Betriebssystems. Sie interpretiert die vom Benutzer eingegebenen Befehle — daher ist Shell ein Muss für alle Systemadministratoren. Wie wir bereits wissen, ist die Bourne Again Shell (Bash) die Standard-Shell für die große Mehrheit der Linux-Distributionen.

Nach dem Start führt die Bash — oder auch jede andere Shell — zunächst eine Reihe von Startskripten aus. Diese Skripte passen die Umgebung der Sitzung an. Es gibt sowohl systemweite als auch benutzerspezifische Skripte. In diesen Skripten hinterlegen wir Präferenzen und Einstellungen, die am besten zu den Bedürfnissen unserer Benutzer passen, in Form von Variablen, Aliassen und Funktionen.

Die genaue Abfolge dieser Startdateien hängt von einem sehr wichtigen Parameter ab: dem Shell-Typ. Werfen wir darum einen Blick auf die Vielfalt der Shells.

Shell-Typen: Interaktiv vs. nicht-interaktiv und Login vs. Non-Login

Klären wir zunächst die Konzepte interaktiv und Login im Zusammenhang mit Shells:

Interaktive / nicht-interaktive Shells

Diese Unterscheidung bezieht sich auf die Interaktion, die zwischen Benutzer und Shell stattfindet: Der Benutzer liefert Eingaben, indem er über die Tastatur Befehle in das Terminal eingibt. Die Shell liefert Ausgaben, indem sie Meldungen auf dem Bildschirm ausgibt.

Login / Non-Login Shells

Diese Art von Shell bezieht sich auf den Vorgang, dass ein Benutzer auf ein Computersystem zugreift und dafür seine Anmeldedaten wie Benutzername und Passwort eingibt.

Sowohl interaktive als auch nicht-interaktive Shells können entweder mit Login oder ohne Login konfiguriert sein, und jede mögliche Kombination dieser Typen hat ihre spezifischen Anwendungsfälle.

Interaktive Shells mit Login werden ausgeführt, wenn sich Benutzer am System anmelden, und dienen dazu, die Benutzerkonfigurationen bedarfsorientiert anzupassen. Ein gutes Beispiel für diese Art von Shell ist das einer Gruppe von Benutzern, die derselben Abteilung angehören und bestimmte Variablen in ihren Sitzungen benutzen.

Mit interaktiven Shells ohne Login sind alle anderen Shells gemeint, die der Benutzer nach der Anmeldung am System öffnet. Benutzer verwenden diese Shells während der Sitzungen, um Wartungs- und Verwaltungsaufgaben auszuführen, wie z.B. das Setzen von Variablen, der Uhrzeit, das Kopieren von Dateien, das Schreiben von Skripten usw.

Demgegenüber erfordern nicht-interaktive Shells keine menschliche Interaktion. Daher fragen diese Shells den Benutzer nicht nach einer Eingabe, und ihre Ausgabe erfolgt — wenn überhaupt — meist in ein Log.

Nicht-interaktive Shells mit Login werden so gut wie nie eingesetzt. Wir stellen sie hier nur vor, um einen Eindruck vom Verhalten der Shell zu bekommen. Seltene Beispiele sind das Erzwingen der Ausführung eines Skripts aus einer Shell mit Login mittels /bin/bash --login <some_script> oder das Piping der Standardausgabe (stdout) eines Befehls in die Standardeingabe (stdin) einer SSH-Verbindung:

<some_command> | ssh <some_user>@<some_server>

Bei der nicht-interaktiven Shell ohne Login findet weder eine Interaktion noch eine Anmeldung seitens des Benutzers statt — es geht hier also um die Ausführung automatisierter Skripte. Diese Skripte werden meist dazu verwendet, sich wiederholende Verwaltungs- und Wartungsaufgaben auszuführen, wie sie in Cronjobs enthalten sind. In solchen Fällen liest bash keine Startdateien.

Öffnen eines Terminals

In einer Desktopumgebung können wir entweder eine Terminalanwendung öffnen oder zu einer der Systemkonsolen wechseln. Daher ist eine neue Shell entweder eine pts Shell, wenn diese von einem Terminalemulator in der GUI geöffnet wird, oder eine tty Shell, wenn diese von einer Systemkonsole ausgeführt wird. Im ersten Fall haben wir es nicht mit einem Terminal, sondern mit einem Terminalemulator zu tun. Im Rahmen von grafischen Sitzungen sind Terminalemulatoren wie gnome-terminal oder konsole sehr funktionsreich und benutzerfreundlich im Vergleich zu Terminals mit textbasierter Benutzeroberfläche. Zu den weniger funktionsreichen Terminalemulatoren gehören — unter anderem — XTerm und sakura.

Mit den Tastenkombinationen Strg+Alt+F1-F6 wechseln Sie zur entsprechenden Konsolenanmeldung, die eine interaktive, textbasierte Anmeldeshell öffnet. Strg+Alt+F7 wechselt zurück zur Desktopsitzung.

Note

tty steht für “teletypewriter”, pts für “pseudo terminal slave”. Für weitere Informationen: man tty und man pts.

Starten von Shells mit bash

Geben Sie nach dem Einloggen bash in ein Terminal ein, um eine neue Shell zu öffnen. Technisch gesehen ist diese Shell ein Kindprozess der aktuellen Shell.

Beim Starten des bash-Kindprozesses können wir verschiedene Optionen angeben, um zu definieren, welche Art von Shell gestartet werden soll. Hier einige wichtige Aufrufoptionen von bash:

bash -l oder bash --login

ruft eine Shell mit Login auf.

bash -i

ruft eine interaktive Shell auf.

bash --noprofile

ignoriert bei Shells mit Login sowohl die systemweite Startdatei /etc/profile als auch die Startdateien auf Benutzerebene ~/.bash_profile, ~/.bash_login und ~/.profile.

bash --norc

ignoriert bei interaktiven Shells sowohl die systemweite Startdatei /etc/bash.bashrc als auch die Startdatei auf Benutzerebene ~/.bashrc.

bash --rcfile <file>

übernimmt <file> als Startdatei bei interaktiven Shells und ignoriert die systemweite /etc/bash.bashrc und die benutzerspezifische ~/.bashrc.

Im Folgenden werden wir die verschiedenen Startdateien besprechen.

Starten von Shells mit su und sudo

Über diese beiden ähnlichen Programme können wir bestimmte Typen von Shells aufrufen:

su

Benutzer-ID ändern oder Superuser (root) werden. Mit diesem Befehl können wir Shells sowohl mit und ohne Login aufrufen:

  • su - user2, su -l user2 oder su --login user2 startet eine interaktive Shell mit Login als user2.

  • su user2 startet eine interaktive Shell ohne Login als user2.

  • su - root oder su - startet eine interaktive Shell mit Login als root.

  • su root oder su startet eine interaktive Shell ohne Login als root.

sudo

Führt Befehle als ein anderer Benutzer (einschließlich des Superusers) aus. Da dieser Befehl hauptsächlich verwendet wird, um vorübergehend Root-Rechte zu erhalten, muss der Benutzer, der ihn verwendet, in der Datei sudoers aufgeführt sein. Um Benutzer zu sudoers hinzuzufügen, müssen wir root werden und dann Folgendes ausführen:

root@debian:~# usermod -aG sudo user2

Genau wie su erlaubt uns sudo, sowohl Shells mit und ohne Login aufzurufen:

  • sudo su - user2, sudo su -l user2 oder sudo su --login user2 startet eine interaktive Shell mit Login als user2.

  • sudo su user2 startet eine interaktive Shell ohne Login als user2.

  • sudo -u user2 -s startet eine interaktive Shell ohne Login als user2.

  • sudo su - root oder sudo su - startet eine interaktive Shell mit Login als root.

  • sudo -i startet eine interaktive Shell mit Login als root.

  • sudo su root oder sudo su startet eine interaktive Shell ohne Login als root.

  • sudo -s oder sudo -u root -s startet eine Shell ohne Login als root.

Bei der Verwendung von su oder sudo ist es wichtig, spezielle Fallszenarien für den Start einer neuen Shell zu berücksichtigen: Brauchen wir die Umgebung des Zielbenutzers oder nicht? Wenn ja, würden wir die Optionen verwenden, die Shells mit Login aufrufen — wenn nicht, diejenigen, die Shells ohne Login aufrufen.

Welcher Shell-Typ ist es?

Um herauszufinden, mit welcher Art von Shell wir arbeiten, geben wir echo $0 in das Terminal ein und erhalten die folgende Ausgabe:

Interaktive Anmeldung

-bash oder -su

Interaktive Anmeldung ohne Login

bash or /bin/bash

Nicht-interaktive Anmeldung ohne Login (Skripte)

<Name_des_Skripts>

Wie viele Shells haben wir?

Um zu sehen, wie viele bash-Shells wir im System laufen haben, nutzen wir den Befehl ps aux | grep bash:

user2@debian:~$ ps aux | grep bash
user2       5270  0.1  0.1  25532  5664 pts/0    Ss   23:03   0:00 bash
user2       5411  0.3  0.1  25608  5268 tty1     S+   23:03   0:00 -bash
user2       5452  0.0  0.0  16760   940 pts/0    S+   23:04   0:00 grep --color=auto bash

user2 unter debian hat sich in einer GUI-Sitzung (oder X Window System) angemeldet und gnome-terminal geöffnet, dann hat er Strg+Alt+F1 gedrückt, um in eine tty Terminalsitzung zu wechseln. Schließlich ist er durch Drücken von Strg+Alt+F7 in die GUI-Sitzung zurückgekehrt und hat den Befehl ps aux | grep bash eingegeben. Die Ausgabe zeigt also eine interaktive Shell ohne Login über den Terminalemulator (pts/0) und eine interaktive Shell mit Login über das echte textbasierte Terminal (tty1). Beachten Sie auch das letzte Feld jeder Zeile (den Befehl): in der ersten Zeile bash und in der mittleren Zeile -bash.

Woher Shells ihre Konfiguration beziehen: Startup-Dateien

Da wir nun die Shell-Typen kennen, die in einem Linux-System zu finden sind, schauen wir uns jetzt an, welche Startdateien von welcher Shell ausgeführt werden. Beachten Sie, dass systemweite oder globale Skripte im Verzeichnis /etc/ abgelegt werden, während lokale oder benutzerspezifische Skripte im Homeverzeichnis des Benutzers (~) zu finden sind. Außerdem werden, wenn mehr als eine Datei zu durchsuchen ist, die anderen ignoriert, sobald eine gefunden und ausgeführt wurde. Erkunden Sie diese Dateien selbst mit Ihrem bevorzugten Texteditor oder durch Eingabe von less <startup_file>.

Note

Bei Startdateien unterscheiden wir Bash-spezifische (die nur auf bash-Konfigurationen und -Befehle beschränkt sind) und allgemeine (die sich auf die meisten Shells beziehen).

Interaktive Shell mit Login
Globale Ebene
/etc/profile

Dies ist die systemweite Datei .profile für die Bourne Shell und Bourne-kompatible Shells (einschließlich bash). Über if-Anweisungen setzt diese Datei eine Reihe von Variablen wie PATH und PS1 entsprechend und verarbeitet — falls vorhanden — sowohl die Datei /etc/bash.bashrc als auch jene im Verzeichnis /etc/profile.d.

/etc/profile.d/*

Dieses Verzeichnis kann Skripte enthalten, die von /etc/profile ausgeführt werden.

Lokale Ebene
~/.bash_profile

Diese Bash-spezifische Datei dient dem Konfigurieren der Benutzerumgebung. Sie kann auch genutzt werden, um ~/.bash_login und ~/.profile aufzurufen und auszuführen.

~/.bash_login

Auch diese Datei ist Bash-spezifisch und wird nur ausgeführt, falls die Datei ~/.bash_profile nicht existiert. Ihr Name deutet darauf hin, dass sie zum Ausführen von Befehlen verwendet werden sollte, die bei einem Login benötigt werden.

~/.profile

Diese Datei ist nicht Bash-spezifisch und wird nur ausgewertet, wenn weder ~/.bash_profile noch ~/.bash_login existieren — was normalerweise der Fall ist. Der Hauptzweck von ~/.profile besteht also darin, zu prüfen, ob eine Bash Shell ausgeführt wird und, falls ja, ~/.bashrc zu verarbeiten, falls diese existiert. Normalerweise wird damit die Variable PATH so erweitert, dass das private Verzeichnis ~/bin des Benutzers mit aufgenommen wird, falls es existiert.

~/.bash_logout

Falls vorhanden, führt diese Bash-spezifische Datei beim Beenden der Shell einige Aufräumarbeiten durch. Dies kann z.B. in Remote-Sitzungen praktisch sein.

Konfigurationsdateien der interaktiven Shell mit Login

Lassen Sie uns einige dieser Dateien in Aktion zeigen, indem wir /etc/profile und /home/user2/.profile modifizieren. Wir werden an jede eine Zeile anhängen, die uns zeigt, welche Datei gerade ausgeführt wird:

root@debian:~# echo 'echo Hello from /etc/profile' >> /etc/profile
root@debian:~# echo 'echo Hello from ~/.profile' >> ~/.profile
Note

Zwei Umleitungsoperatoren >> hängen die Ausgabe eines Befehls an eine bestehende Datei an — ohne diese zu überschreiben. Wenn die Datei nicht existiert, wird sie erstellt.

Durch die Ausgabe der jeweiligen echo-Befehle wissen wir also, wann jede dieser Dateien gelesen und ausgeführt wird. Um das zu beweisen, sehen wir uns an, was passiert, wenn sich user2 über ssh von einem anderen Rechner aus anmeldet:

user2@debian:~$ ssh user2@192.168.1.6
user2@192.168.1.6's password:
Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Nov 27 19:57:19 2018 from 192.168.1.10
Hello from /etc/profile
Hello from /home/user2/.profile

Wie die letzten beiden Zeilen zeigen, hat es funktioniert. Beachten Sie außerdem drei Dinge:

  • Die globale Datei wurde zuerst ausgeführt.

  • Es gab keine Dateien .bash_profile oder .bash_login im Heimatverzeichnis von user2.

  • Die Tilde (~) erweitert zum absoluten Pfad der Datei (/home/user2/.profile).

Interaktive Shell ohne Login
Globale Ebene
/etc/bash.bashrc

Dies ist die systemweite Datei .bashrc für interaktive bash-Shells. Durch ihre Ausführung stellt bash sicher, dass sie interaktiv ausgeführt wird, prüft die Fenstergröße nach jedem Befehl (und aktualisiert ggf. die Werte von LINES und COLUMNS) und setzt einige Variablen.

Lokale Ebene
~/.bashrc

Diese Bash-spezifische Datei führt nicht nur ähnliche Aufgaben aus, wie sie für /etc/bash.bashrc auf Benutzerebene beschrieben sind (z.B. die Überprüfung der Fenstergröße oder ob sie interaktiv ausgeführt wird), sondern setzt in der Regel auch einige History-Variablen und führt ~/.bash_aliases aus (falls vorhanden). Abgesehen davon wird diese Datei normalerweise verwendet, um benutzerspezifische Aliasse und Funktionen zu speichern.

Ebenso ist erwähnenswert, dass ~/.bashrc gelesen wird, wenn die bash erkennt, dass es sich bei ihrer <stdin> um eine Netzwerkverbindung handelt (wie es bei der Secure Shell (SSH) Verbindung im obigen Beispiel der Fall war).

Konfigurationsdateien der interaktiven Shell ohne Login

Lassen Sie uns nun /etc/bash.bashrc und /home/user2/.bashrc ändern:

root@debian:~# echo 'echo Hello from /etc/bash.bashrc' >> /etc/bash.bashrc
root@debian:~# echo 'echo Hello from ~/.bashrc' >> ~/.bashrc

Und das passiert, wenn user2 eine neue Shell startet:

user2@debian:~$ bash
Hello from /etc/bash.bashrc
Hello from /home/user2/.bashrc

Auch hier wurden die beiden Dateien gelesen und ausgeführt.

Warning

Denken Sie daran, dass aufgrund der Reihenfolge, in der die Dateien ausgeführt werden, die lokalen Dateien Vorrang vor den globalen Dateien haben.

Nicht-interaktive Shell mit Login

Eine nicht-interaktive Shell mit den Optionen -l oder --login wird gezwungen, sich wie eine Shell mit Login zu verhalten, so dass die auszuführenden Startdateien die gleichen sind wie die für interaktive Shells mit Login.

Um das zu belegen, schreiben wir ein einfaches Skript und machen es ausführbar. Wir werden keine Shebangs einfügen, weil wir die bash-Ausführungsdatei (/bin/bash mit Login-Option) von der Kommandozeile aus aufrufen werden.

  1. Wir erstellen das Skript test.sh, das die Zeile echo 'Hello from a script' enthält, damit wir beweisen können, dass das Skript erfolgreich ausgeführt wurde:

    user2@debian:~$ echo "echo 'Hello from a script'" > test.sh
  2. Wir machen unser Skript ausführbar:

    user2@debian:~$ chmod +x ./test.sh
  3. Schließlich rufen wir bash mit der Option -l auf, um das Skript auszuführen:

    user2@debian:~$ bash -l ./test.sh
    Hello from /etc/profile
    Hello from /home/user2/.profile
    Hello from a script

    Es funktioniert! Bevor das Skript ausgeführt wurde, fand die Anmeldung statt, und sowohl /etc/profile als auch ~/.profile wurden ausgeführt.

Note

Wir werden in künftigen Lektionen mehr über Shebangs und alle anderen Aspekte des Shell Scripting lernen.

Lassen Sie uns nun die Standardausgabe (stdout) des echo-Befehls mittels einer Pipe (|) in die Standardeingabe (stdin) einer ssh-Verbindung weiterleiten:

user2@debian:~$ echo "Hello-from-a-noninteractive-login-shell" | ssh user2@192.168.1.6
Pseudo-terminal will not be allocated because stdin is not a terminal.
user2@192.168.1.6's password:
Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Hello from /etc/profile
Hello from /home/user2/.profile
-bash: line 1: Hello-from-a-noninteractive-login-shell: command not found

Wieder werden /etc/profile und ~/.profile ausgeführt. Aufschlussreich sind die erste und die letzte Zeile der Ausgabe, was das Verhalten der Shell angeht.

Nicht-interaktive Shell ohne Login

Skripte lesen keine der oben aufgeführten Dateien, sondern suchen nach der Umgebungsvariablen BASH_ENV, erweitern ihren Wert bei Bedarf und verwenden ihn als Namen einer Startdatei zum Lesen und Ausführen von Befehlen. Wir werden in der nächsten Lektion mehr über Umgebungsvariablen erfahren.

Wie oben erwähnt, sorgen typischerweise /etc/profile und ~/.profile dafür, dass sowohl /etc/bash.bashrc als auch ~/.bashrc nach einer erfolgreichen Anmeldung ausgeführt werden. Die Ausgabe des folgenden Befehls zeigt dieses Phänomen:

root@debian:~# su - user2
Hello from /etc/bash.bashrc
Hello from /etc/profile
Hello from /home/user2/.bashrc
Hello from /home/user2/.profile

Unter Berücksichtigung der Zeilen, die wir zuvor an die Startskripte angehängt haben — und dem Aufruf einer interaktiven Shell mit Login auf Benutzerebene mit su - user2 — lassen sich die vier Zeilen der Ausgabe wie folgt erklären:

  1. Hello from /etc/bash.bashrc bedeutet, dass /etc/profile die Datei /etc/bash.bashrc ausgewertet hat.

  2. Hello from /etc/profile bedeutet, dass /etc/profile vollständig gelesen und ausgeführt wurde.

  3. Hello from /home/user2/.bashrc bedeutet, dass ~/.profile auf ~/.bashrc zurückgegriffen hat.

  4. Hello from /home/user2/.profile bedeutet, dass ~/.profile vollständig gelesen und ausgeführt wurde.

Beachten Sie, wie wir mit su - <username> (auch su -l <username> und su --login <username>) den Aufruf einer Shell mit Login sicherstellen, während su <username> nur /etc/bash.bashrc und ~/.bashrc aufgerufen hätte.

Sourcing von Dateien

In den vorherigen Abschnitten haben wir besprochen, dass einige Startskripte andere Skripte einbinden oder ausführen. Dieser Mechanismus wird als Sourcing bezeichnet und hier erläutert.

Sourcing von Dateien mit .

Der Punkt (.) befindet sich normalerweise in Startdateien.

In der Datei .profile unseres Debian-Servers finden wir z.B. den folgenden Block:

    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi

Wir haben bereits gesehen, wie die Ausführung eines Skripts zu der eines anderen führen kann. Die if-Anweisung garantiert also, dass die Datei $HOME/.bashrc — falls sie existiert (-f) — bei der Anmeldung gesourced (d.h. gelesen und ausgeführt) wird:

. "$HOME/.bashrc"
Note

Wie wir in der nächsten Lektion sehen werden, ist $HOME eine Umgebungsvariable, die sich auf den absoluten Pfad des Homeverzeichnisses des Benutzers bezieht.

Außerdem können wir den . immer dann verwenden, wenn wir eine Startdatei geändert haben und die Änderungen ohne einen Neustart wirksam machen wollen. Zum Beispiel:

  • einen Alias zu ~/.bashrc hinzufügen:

    user2@debian:~$ echo "alias hi='echo We salute you.'" >> ~/.bashrc
Warning

Wenn Sie die Ausgabe eines Befehls in eine Datei senden, denken Sie daran, Anhängen (>>) nicht mit Überschreiben (>) zu verwechseln.

  • die letzte Zeile von ~/.bashrc ausgeben, um zu überprüfen, ob alles geklappt hat:

    user2@debian:~$ tail -n 1 !$
    tail -n 1 ~/.bashrc
    alias hi='echo We salute you.'
    Note

    !$ gibt das letzten Argument des vorherigen Befehls wieder, in unserem Fall: ~/.bashrc.

  • Sourcen Sie die Datei von Hand:

    user2@debian:~$ . ~/.bashrc
  • und rufen Sie den Alias auf, um zu beweisen, dass er funktioniert:

    user2@debian:~$ hi
    We salute you.
Note

In der nächsten Lektion erfahren Sie mehr über Aliasse und Variablen.

Sourcing von Dateien mit source

Der Befehl source ist ein Synonym für .. Um ~/.bashrc zu sourcen, können wir also auch wie folgt vorgehen:

user2@debian:~$ source ~/.bashrc

Der Ursprung der Startup-Dateien einer Shell: SKEL

SKEL ist eine Variable, die den Wert des absoluten Pfads zum Verzeichnis skel enthält. Dieses Verzeichnis dient als Vorlage für die Dateisystemstruktur der Homeverzeichnisse der Benutzer. Es enthält die Dateien, die an alle neu angelegten Benutzerkonten vererbt werden (natürlich einschließlich der Konfigurationsdateien für Shells). SKEL und andere zugehörige Variablen werden in /etc/adduser.conf gespeichert, der Konfigurationsdatei für adduser:

user2@debian:~$ grep SKEL /etc/adduser.conf
# The SKEL variable specifies the directory containing "skeletal" user
SKEL=/etc/skel
# If SKEL_IGNORE_REGEX is set, adduser will ignore files matching this
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"

SKEL ist auf /etc/skel gesetzt — darin liegen also die Startskripte, die unsere Shells konfigurieren:

user2@debian:~$ ls -a /etc/skel/
.  ..  .bash_logout  .bashrc  .profile
Warning

Denken Sie daran, dass Dateien, die mit einem . beginnen, versteckt sind, so dass wir ls -a verwenden müssen, um diese beim Auflisten von Verzeichnisinhalten zu sehen.

Lassen Sie uns nun ein Verzeichnis in /etc/skel für alle neuen Benutzer anlegen, in dem persönliche Skripte gespeichert werden können:

  1. Als root betreten wir /etc/skel:

    root@debian:~# cd /etc/skel/
    root@debian:/etc/skel#
  2. Wir listen seinen Inhalt auf:

    root@debian:/etc/skel# ls -a
    .  ..  .bash_logout  .bashrc  .profile
  3. Wir erstellen unser Verzeichnis und prüfen, ob alles wie erwartet funktioniert:

    root@debian:/etc/skel# mkdir my_personal_scripts
    root@debian:/etc/skel# ls -a
    .  ..  .bash_logout  .bashrc  my_personal_scripts  .profile
  4. Jetzt löschen wir user2 zusammen mit seinem Homeverzeichnis:

    root@debian:~# deluser --remove-home user2
    Looking for files to backup/remove ...
    Removing files ...
    Removing user `user2' ...
    Warning: group `user2' has no more members.
    Done.
  5. Wir fügen user2 wieder hinzu, damit er ein neues Homeverzeichnis erhält:

    root@debian:~# adduser user2
    Adding user `user2' ...
    Adding new group `user2' (1001) ...
    Adding new user `user2' (1001) with group `user2' ...
    Creating home directory `/home/user2' ...
    Copying files from `/etc/skel' ...
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    Changing the user information for user2
    Enter the new value, or press ENTER for the default
    	Full Name []:
    	Room Number []:
    	Work Phone []:
    	Home Phone []:
    	Other []:
    Is the information correct? [Y/n] y
  6. Zum Schluss melden wir uns als user2 an und listen alle Dateien in /home/user2 auf, um zu sehen, ob alles wie erwartet funktioniert hat:

    root@debian:~# su - user2
    user2@debian:~$ pwd
    /home/user2
    user2@debian:~$ ls -a
    .  ..  .bash_history  .bash_logout  .bashrc  my_personal_scripts  .profile

    Das hat es.

Geführte Übungen

  1. Sehen Sie in der Spalte “Shell gestartet mit …​”, wie die Shells gestartet wurden, und ergänzen Sie die erforderlichen Informationen:

    Shell gestartet mit…​ Interaktiv? Login? Ergebnis von echo $0

    sudo ssh user2@machine2

    Ctrl+Alt+F2

    su - user2

    gnome-terminal

    Ein normaler Benutzer verwendet konsole, um eine Instanz von sakura zu starten

    Ein Skript namens test.sh, das den Befehl echo $0 enthält

  2. Schreiben Sie die Befehle su und sudo, um die angegebene Shell zu starten:

    Interaktive Shell mit Login als user2

    su:

    sudo:

    Interaktive Shell mit Login als root

    su:

    sudo:

    Interaktive Shell ohne Login als root

    su:

    sudo:

    Interaktive Shell ohne Login als user2

    su:

    sudo:

  3. Welche Startdatei wird gelesen, wenn die Shell unter “Shell-Typ” gestartet wird?

    Shell-Typ /etc/profile /etc/bash.bashrc ~/.profile ~/.bashrc

    Interaktive Shell mit Login als user2

    Interaktive Shell mit Login als root

    Interaktive Shell ohne Login als root

    Interaktive Shell ohne Login als user2

Offene Übungen

  1. In Bash können wir eine einfache Hello world!-Funktion schreiben, indem wir den folgenden Code in eine leere Datei einfügen:

    function hello() {
    	 echo "Hello world!"
    }
    • Was sollten wir als nächstes tun, um die Funktion für die Shell verfügbar zu machen?

    • Wenn diese in der aktuellen Shell verfügbar ist, wie würden Sie diese aufrufen?

    • Um die Dinge zu automatisieren, in welcher Datei würden Sie die Funktion und ihren Aufruf ablegen, damit diese ausgeführt wird, wenn user2 ein Terminal aus einer X Window Sitzung öffnet? Um welche Art von Shell handelt es sich?

    • In welcher Datei würden Sie die Funktion und ihren Aufruf ablegen, damit diese ausgeführt wird, wenn root eine neue interaktive Shell startet, unabhängig davon ob mit oder ohne Login?

  2. Schauen Sie sich das folgende einfache Hello world! bash-Skript an:

    #!/bin/bash
    
    #hello_world: a simple bash script to discuss interaction in scripts.
    
    echo "Hello world!"
    • Angenommen, wir machen das Skript ausführbar und führen es aus. Wäre das ein interaktives Skript? Warum?

    • Was macht ein Skript interaktiv?

  3. Stellen Sie sich vor, Sie haben die Werte einiger Variablen in ~/.bashrc geändert und wollen, dass diese Änderungen ohne einen Neustart wirksam werden. Wie könnten Sie das von Ihrem Heimatverzeichnis aus auf zwei verschiedene Arten erreichen?

  4. John hat gerade eine X Window-Sitzung auf einem Linux-Server gestartet. Er öffnet einen Terminalemulator, um einige administrative Aufgaben auszuführen, aber überraschenderweise friert die Sitzung ein und er muss eine Text-Shell öffnen.

    • Wie kann er eine tty-Shell öffnen?

    • Welche Startdateien werden ausgeführt?

  5. Linda ist eine Benutzerin eines Linux-Servers. Sie bittet den Administrator freundlich um eine ~/.bash_login-Datei, damit sie beim Anmelden die Uhrzeit und das Datum auf dem Bildschirm ausgeben lassen kann. Andere Benutzer finden die Idee gut und folgen dem Beispiel. Der Administrator hat Schwierigkeiten, die Datei für alle anderen Benutzer auf dem Server zu erstellen, also beschließt er, eine neue Richtlinie hinzuzufügen und ~/.bash_login für alle potenziellen neuen Benutzer erstellen zu lassen. Wie kann der Administrator diese Aufgabe erledigen?

Zusammenfassung

In dieser Lektion haben wir gelernt:

  • Shells legen die Benutzerumgebung in einem Linux-System fest.

  • Bash ist die Nummer eins unter den Shells der GNU/Linux-Distributionen.

  • Die erste Aufgabe, die eine Shell ausführt, ist das Lesen und Ausführen einer oder mehrerer Startdateien.

  • Die Konzepte von Interaktion und Login in Bezug auf Shells.

  • Wie man verschiedene Arten von Shells mit bash, su, sudo und Strg+Alt+F1-F6 startet.

  • Wie man den Typ der Shell mit echo $0 überprüft.

  • Die lokalen Startdateien ~/.bash_profile, ~/.profile, ~/.bash_login, ~/.bash_logout und ~/.bashrc.

  • Die globalen Startdateien /etc/profile, /etc/profile.d/*, /etc/bash.bashrc.

  • Lokale Dateien haben Vorrang vor globalen Dateien.

  • Umleiten der Ausgabe eines Befehls mit > (überschreiben) und >> (anhängen).

  • Die Bedeutung des Verzeichnisses skel.

  • Das Sourcing von Dateien.

In dieser Lektion verwendete Befehle:

bash

Erstellt eine neue Shell.

su

Erstellt eine neue Shell.

sudo

Erstellt eine neue Shell.

usermod

Modifizieren eines Benutzerkontos.

echo

Gibt eine Textzeile aus.

ps

Liefert eine Momentaufnahme der aktuell laufenden Prozesse.

less

Ein Pager für lange Dateien.

ssh

Startet eine SSH-Verbindung (remote).

chmod

Ändert die Modus-Bits einer Datei und macht sie z.B. ausführbar.

grep

Liefert Zeilen, die einem Muster entsprechen.

ls

Listet Verzeichnisinhalte auf.

cd

Wechselt das Verzeichnis.

mkdir

Erstellt ein Verzeichnis.

deluser

Löscht einen Benutzer.

adduser

Fügt einen neuen Benutzer hinzu.

.

Liest eine Datei ein.

source

Liest eine Datei ein.

tail

Gibt den letzten Teil von Dateien aus.

Lösungen zu den geführten Übungen

  1. Sehen Sie in der Spalte “Shell gestartet mit …​”, wie die Shells gestartet wurden, und ergänzen Sie die erforderlichen Informationen:

    Shell gestartet mit…​ Interaktiv? Login? Ergebnis von echo $0

    sudo ssh user2@machine2

    Ja

    Ja

    -bash

    Ctrl+Alt+F2

    Ja

    Ja

    -bash

    su - user2

    Ja

    Ja

    -bash

    gnome-terminal

    Ja

    Nein

    bash

    Ein normaler Benutzer verwendet konsole, um eine Instanz von sakura zu starten

    Ja

    Nein

    /bin/bash

    Ein Skript namens test.sh, das den Befehl echo $0 enthält

    Nein

    Nein

    ./test.sh

  2. Schreiben Sie die Befehle su und sudo, um die angegebene Shell zu starten:

    Interaktive Shell mit Login als user2
    su

    su - user2, su -l user2 oder su --login user2

    sudo

    sudo su - user2, sudo su -l user2 oder sudo su --login user2

    Interaktive Shell mit Login als root
    su

    su - root oder su -

    sudo

    sudo su - root, sudo su - oder sudo -i

    Interaktive Shell ohne Login als root
    su

    su root oder su

    sudo

    sudo su root, sudo su, sudo -s oder sudo -u root -s

    Interaktive Shell ohne Login als user2
    su

    su user2

    sudo

    sudo su user2 oder sudo -u user2 -s

  3. Welche Startdatei wird gelesen, wenn die Shell unter “Shell-Typ” gestartet wird?

    Shell-Typ /etc/profile /etc/bash.bashrc ~/.profile ~/.bashrc

    Interaktive Shell mit Login als user2

    Ja

    Ja

    Ja

    Ja

    Interaktive Shell mit Login als root

    Ja

    Ja

    Nein

    Nein

    Interaktive Shell ohne Login als root

    Nein

    Ja

    Nein

    Nein

    Interaktive Shell ohne Login als user2

    Nein

    Ja

    Nein

    Ja

Lösungen zu den offenen Übungen

  1. In Bash können wir eine einfache Hello world!-Funktion schreiben, indem wir den folgenden Code in eine leere Datei einfügen:

    function hello() {
    	 echo "Hello world!"
    }
    • Was sollten wir als nächstes tun, um die Funktion für die Shell verfügbar zu machen?

      Um die Funktion für die aktuelle Shell verfügbar zu machen, müssen wir die Datei einlesen.

    • Wenn diese in der aktuellen Shell verfügbar ist, wie würden Sie diese aufrufen?

      Wir rufen sie auf, indem wir ihren Namen in das Terminal eingeben.

    • Um die Dinge zu automatisieren, in welcher Datei würden Sie die Funktion und ihren Aufruf ablegen, damit diese ausgeführt wird, wenn user2 ein Terminal aus einer X Window Sitzung öffnet? Um welche Art von Shell handelt es sich?

      Die beste Datei dafür ist /home/user2/.bashrc. Die aufgerufene Shell wäre eine interaktive Shell ohne Login.

    • In welcher Datei würden Sie die Funktion und ihren Aufruf ablegen, damit diese ausgeführt wird, wenn root eine neue interaktive Shell startet, unabhängig davon ob mit oder ohne Login?

      In /etc/bash.bashrc, da diese Datei für alle interaktiven Shells ausgeführt wird — ob angemeldet oder nicht.

  2. Schauen Sie sich das folgende einfache Hello world! bash-Skript an:

    #!/bin/bash
    
    #hello_world: a simple bash script to discuss interaction in scripts.
    
    echo "Hello world!"
    • Angenommen, wir machen das Skript ausführbar und führen es aus. Wäre das ein interaktives Skript? Warum?

      Nein, da es keine menschliche Interaktion gibt und keine Befehle vom Benutzer eingegeben werden.

    • Was macht ein Skript interaktiv?

      Die Tatsache, dass es eine Benutzereingabe erfordert.

  3. Stellen Sie sich vor, Sie haben die Werte einiger Variablen in ~/.bashrc geändert und wollen, dass diese Änderungen ohne einen Neustart wirksam werden. Wie könnten Sie das von Ihrem Heimatverzeichnis aus auf zwei verschiedene Arten erreichen?

    $ source .bashrc

    oder

    $ . .bashrc
  4. John hat gerade eine X Window-Sitzung auf einem Linux-Server gestartet. Er öffnet einen Terminalemulator, um einige administrative Aufgaben auszuführen, aber überraschenderweise friert die Sitzung ein und er muss eine Text-Shell öffnen.

    • Wie kann er eine tty-Shell öffnen?

      Dies ist möglich durch betätigen von Strg+Alt+F1-F6, um eine der sechs tty-Shells aufzurufen.

    • Welche Startdateien werden ausgelagert?

      /etc/profile
      /home/john/.profile

  5. Linda ist eine Benutzerin eines Linux-Servers. Sie bittet den Administrator freundlich um eine ~/.bash_login-Datei, damit sie beim Anmelden die Uhrzeit und das Datum auf dem Bildschirm ausgeben lassen kann. Andere Benutzer finden die Idee gut und folgen dem Beispiel. Der Administrator hat Schwierigkeiten, die Datei für alle anderen Benutzer auf dem Server zu erstellen, also beschließt er, eine neue Richtlinie hinzuzufügen und ~/.bash_login für alle potenziellen neuen Benutzer erstellen zu lassen. Wie kann der Administrator diese Aufgabe erledigen?

    Er kann .bash_login in das Verzeichnis /etc/skel legen.

Linux Professional Insitute Inc. Alle Rechte vorbehalten. Besuchen Sie die LPI Learning Website: https://learning.lpi.org
Dieses Werk steht unter der Lizenz Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.

Nächste Lektion

105.1 Die Shell-Umgebung anpassen und verwenden (105.1 Lektion 2)

Nächste Lektion lesen

Linux Professional Insitute Inc. Alle Rechte vorbehalten. Besuchen Sie die LPI Learning Website: https://learning.lpi.org
Dieses Werk steht unter der Lizenz Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.

LPI ist eine Non-Profit-Organisation.

© 2023 Linux Professional Institute (LPI) ist eine globale Organisation für Zertifizierungsstandards und zur Karriereplanung für Open-Source-Profis. Mit mehr als 200.000 Zertifikatsinhabern ist es die weltweit erste und größte herstellerneutrale Linux- und Open-Source-Zertifizierungsstelle. LPI verfügt über zertifizierte Fachleute in über 180 Ländern, bietet Prüfungen in mehreren Sprachen an und hat Hunderte von Trainingspartnern.

Unser Ziel ist es, wirtschaftliche und kreative Möglichkeiten für alle zu ermöglichen, indem wir Open-Source-Wissens- und Kompetenzzertifizierungen allgemein zugänglich machen.

  • LinkedIn
  • flogo-RGB-HEX-Blk-58 Facebook
  • Twitter
  • Kontaktieren Sie uns
  • Datenschutz und Cookie-Richtlinien

Haben Sie einen Fehler entdeckt oder möchten Sie helfen, diese Seite zu verbessern? Lassen Sie es uns wissen.

© 1999–2023 The Linux Professional Institute Inc. Alle Rechte vorbehalten.