In diesem Teil möchte ich dir den bash Startvorgang bei einem Login über ssh näher bringen. Die Datei ~/.bashrc ist ein wichtiger Teil davon, allerdings ist es bis dahin ein „weiter“ Weg.
1 | Einführung |
---|---|
2 | Der bash Prompt |
3 | key bindings |
4 | Der Startvorgang |
5 | Environment Variablen |
6 | builtin commands |
7 | Arbeiten mit Dateien |
8 | nano |
9 | bash Scripting |
10 | Variablen |
11 | Verzweigungen (if) |
12 | Schleifen |
13 | Kommandozeilenparameter |
14 | exit Codes bash Tutorial Teil 14 |
15 | von der Idee zum Script |
16 | grep |
17 | Piping und Redirection |
18 | tee |
Der bash Startvorgang
Beim Startvorgang sind mehrere Dateien beteiligt, die du kennen solltest.
/etc/passwd
In der /etc/passwd
ist neben UserID und Username auch die verwendete Shell vermerkt.
pi:x:1000:1000:,,,:/home/pi:/bin/bash
^ ^ ^ ^ ^ ^
| | | | | |
| | | | | |
| | | | | +----------Login-Shell
| | | | +-----------------------Homeverzeichnis
| | | +-------------------------------Userinformationen
| | +--------------------------------------GroupID
| +-------------------------------------------UserID
+------------------------------------------------------Username
In dem Beispiel für den Standarduser von Raspberry Pi OS siehst du folgende Einträge, die durch einen Doppelpunkt voneinander getrennt sind:
pi
– Der Username, er steht immer an erster Stelle und wird zur Anmeldung benötigt.x
– Das Passwort. früher stand das Passwort des Users an dieser Stelle. Heutzutage steht dort das x und das eigentliche Passwort ist in /etc/shadow abgelegt.1000
– UserID, diese ID benutzt Linux zur Identifikation des Users.1000
– GroupID, der zweite nummerische Wert gibt die ID der Gruppe an, die diesem User zugeordnet ist, an. Sie muss nicht zwangsläufig mit der UserID übereinstimmen.- Userinformationen – hier können bei der Anlage eines Users Daten wie echter Name, Telefonnummer und Anschrift eingetragen werden. Ich lass diese meistens leer
- Homeverzeichnis – das Heimatverzeichnis wird hier festgelegt, du könntest es auch auf ein Netzwerklaufwerk konfigurieren und ein gemeinsames Homeverzeichnis für alle Raspberry Pis benutzen.
- Login-Shell – hier steht, welche Shell beim Login gestartet werden soll, /bin/bash ist die Bash.
/etc/profile
Das Skript /etc/profile wird von der bash als erstes gestartet, es ist systemweit und kann benutzt werden, um Konfigurationen für alle User des Raspberry Pi zu setzen. Als erstes wird für alle User die PATH
Variable mit den Verzeichnissen gesetzt, in denen sich die ausführbaren Programme befinden.
if [ "$(id -u)" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games"
fi
export PATH
Der root User (UserID == 0) hat eine andere $PATH
als alle anderen.
Danach wird geprüft, ob die bash Variable PS1
gesetzt ist, falls diese nicht leer, handelt es sich um eine interaktive Login Shell und das Skript /etc/bash.bashrc
wird gestartet.
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "$(id -u)" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
Zum Abschluss folgt noch ein Block, in dem alle Skripts, die unter /etc/profile.d liegen gestartet werden. falls du eigene Skripts im Startprozess der Bash unterbringen musst, ist dies der richtige Ort dafür. Sie müssen nur die Endung .sh haben, um berücksichtigt zu werden.
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Nach der Installation von Raspberry Pi OS sind dort bereits einige Skripts abgelegt. Da dies von OS zu OS unterschiedlich ist, betrachte ich diese in diesem Post nicht weiter.
/etc/bash.bashrc
Wie ich eben erwähnte, wird das Skript /etc/bash.bashrc nur bei Login-Shells ausgeführt und ist daher für Konfigurationen geeignet, die nur Login-Shells betreffen sollen. Hier wird der endgültige Prompt in PS1 definiert und das Skript bash_completion.sh gestartet, mit der die eingebaute Kommandovervollständigung erweitert werden kann.
~/.profile und ~/.bash_profile
Die bash selbst schaut nun im Homeverzeichnis des Users nach, ob dort die Datei .bash_profile existiert. Falls ja, wird diese gestartet, ansonsten ~./profile. Durch diesen Mechanismus kannst du Kommandos ausführen, die für jede Shell gelten (.profile) oder nur speziell bei der bash (.bash_profile) und kommt damit zum letzten Schritt.
~/.bashrc
In der ~/.bashrc werden die endgültigen Einstellungen für den User vorgenommen. Meistens sie der beste Weg für dich, Kommandos zu starten und Konfigurationen vorzunehmen. Bei der Anlage eines neuen Users wird eine Standardversion ins Homeverzeichnis kopiert, in der ich zunächst immer diese Änderung vornehme:
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
Damit habe kannst du dir ein Dateilisting mit allen Informationen ausgeben lassen, ohne immer irgendwelche Optionen mit zu übergeben. ll
habe ich in anderen Posts schon benutzt.
Da der Startvorgang schwierig zu beschreiben ist, habe ich das mal in einem Ablaufplan grob visualisiert:
Das Wissen über den bash Startvorgang der bash hilft dir, die Shell noch besser für deine Bedürfnisse zu konfigurieren und effizienter zu nutzen.
Im nächsten Teil zeig ich dir, wie du deine bash Sitzung mit Hilfe von Environment Variablen konfigurieren kannst.