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
|
|
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
oderbash --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
odersu --login user2
startet eine interaktive Shell mit Login alsuser2
. -
su user2
startet eine interaktive Shell ohne Login alsuser2
. -
su - root
odersu -
startet eine interaktive Shell mit Login alsroot
. -
su root
odersu
startet eine interaktive Shell ohne Login alsroot
.
-
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 zusudoers
hinzuzufügen, müssen wirroot
werden und dann Folgendes ausführen:root@debian:~# usermod -aG sudo user2
Genau wie
su
erlaubt unssudo
, sowohl Shells mit und ohne Login aufzurufen:-
sudo su - user2
,sudo su -l user2
odersudo su --login user2
startet eine interaktive Shell mit Login alsuser2
. -
sudo su user2
startet eine interaktive Shell ohne Login alsuser2
. -
sudo -u user2 -s
startet eine interaktive Shell ohne Login alsuser2
. -
sudo su - root
odersudo su -
startet eine interaktive Shell mit Login alsroot
. -
sudo -i
startet eine interaktive Shell mit Login alsroot
. -
sudo su root
odersudo su
startet eine interaktive Shell ohne Login alsroot
. -
sudo -s
odersudo -u root -s
startet eine Shell ohne Login alsroot
.
-
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 |
Interaktive Shell mit Login
Globale Ebene
/etc/profile
-
Dies ist die systemweite Datei
.profile
für die Bourne Shell und Bourne-kompatible Shells (einschließlichbash
). Überif
-Anweisungen setzt diese Datei eine Reihe von Variablen wiePATH
undPS1
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 VariablePATH
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 |
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 vonuser2
. -
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 interaktivebash
-Shells. Durch ihre Ausführung stelltbash
sicher, dass sie interaktiv ausgeführt wird, prüft die Fenstergröße nach jedem Befehl (und aktualisiert ggf. die Werte vonLINES
undCOLUMNS
) 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 diebash
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.
-
Wir erstellen das Skript
test.sh
, das die Zeileecho '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
-
Wir machen unser Skript ausführbar:
user2@debian:~$ chmod +x ./test.sh
-
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:
-
Hello from /etc/bash.bashrc
bedeutet, dass/etc/profile
die Datei/etc/bash.bashrc
ausgewertet hat. -
Hello from /etc/profile
bedeutet, dass/etc/profile
vollständig gelesen und ausgeführt wurde. -
Hello from /home/user2/.bashrc
bedeutet, dass~/.profile
auf~/.bashrc
zurückgegriffen hat. -
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 |
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 ( |
-
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 |
Lassen Sie uns nun ein Verzeichnis in /etc/skel
für alle neuen Benutzer anlegen, in dem persönliche Skripte gespeichert werden können:
-
Als
root
betreten wir/etc/skel
:root@debian:~# cd /etc/skel/ root@debian:/etc/skel#
-
Wir listen seinen Inhalt auf:
root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc .profile
-
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
-
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.
-
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
-
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
-
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 Befehlecho $0
enthält -
Schreiben Sie die Befehle
su
undsudo
, 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
:
- Interaktive Shell mit Login als
-
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
-
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?
-
-
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?
-
-
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? -
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?
-
-
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
-
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 Befehlecho $0
enthältNein
Nein
./test.sh
-
Schreiben Sie die Befehle
su
undsudo
, um die angegebene Shell zu starten:- Interaktive Shell mit Login als
user2
su
-
su - user2
,su -l user2
odersu --login user2
sudo
-
sudo su - user2
,sudo su -l user2
odersudo su --login user2
- Interaktive Shell mit Login als
root
su
-
su - root
odersu -
sudo
-
sudo su - root
,sudo su -
odersudo -i
- Interaktive Shell ohne Login als
root
su
-
su root
odersu
sudo
-
sudo su root
,sudo su
,sudo -s
odersudo -u root -s
- Interaktive Shell ohne Login als
user2
su
-
su user2
sudo
-
sudo su user2
odersudo -u user2 -s
- Interaktive Shell mit Login als
-
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
-
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.
-
-
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.
-
-
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
-
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
-
-
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.