Bash/Start und beenden

Aus Foxwiki

Startdateien sind Skripte die gelesen und ausgeführt werden, wenn die Bash startet. Der Folgende Abschnitt beschreibt verschiedene Wege die Shell zu starten und welche Startdateien dabei gelesen werden.

Aufruf

  • Zusätzlich zu den kurzen Kommandozeilenoptionen, die über interne Kommandos konfiguriert werden können, gibt es diverse lange Optionen die genutzt werden können.
  • In den folgenden Abschnitten werden einige wichtige Optionen vorgestellt. Eine vollständige Liste der Optionen ist den Bash info pages zu entnehmen (Bash features->Invoking Bash).

Optionen beim Start

Datei:Grafik6.png

  • Die Bash ist ein Programm und nahezu jedes Programm unter Unix kann durch Optionen auf der Kommandozeile gesteuert werden.
  • So kennt auch die Bash eine Reihe von Optionen, deren wichtigste vorgestellt sein sollen:

-c Kommandofolge

Die Bash liest und startet die Kommandos aus "Kommandofolge", welche als eine einzelne Zeichenkette anzugeben ist.

Alles, was der Zeichenkette folgt, wird als Argument dem letzten Kommando der Kommandofolge übergeben:

bash date -u
date: /bin/date: cannot execute binary file
bash -c date -u
Sam Jul 8 10:16:17 MEST 2000

Wird der Bash ein Argument übergeben, das keine Option ist, so interpretiert sie das Argument als Datei, die die Kommandos enthält. date ist keine Datei, die Kommandos beinhaltet, also beschwert sich die Bash. Die Bash in Verbindung mit -c arbeitet als nicht-interaktive Shell.

-r, --restricted

Die Bash arbeitet als »Restricted« Shell.

-i

Die Bash arbeitet als interaktive Shell, d.h. die Standardein- und -ausgabe sind mit einem Terminal verbunden.

--login

Die Bash arbeitet wie eine Login-Shell, d.h. alle Konfigurationsdateien werden eingelesen. Eine Login-Shell hat nichts mit der Anzeige einer Login-Aufforderung zu tun, sie nennt sich nur so, weil die einzulesenden Dateien zumeist einmalig beim Start einer Sitzung geladen werden.

--noprofile

Unterdrückt das Einlesen der profile-Dateien.

--norc

Unterdrückt das Einlesen der ~/.bashrc«.

--posix

Die Bash verhält sich wie eine POSIX-Shell. Sie liest hierzu einzig die in der Umgebungsvariablen ENV angegebene Datei ein. Wird die Bash über den Link sh gerufen, startet sie ebenso im POSIX-Modus.

--rcfile Datei

Eine nicht-interaktive Bash liest die angegebene Datei ein (anstatt ~/.bashrc)

-v, --verbose

  • Schaltet die erweiterte Ausgabe ein. Sinnvoll ist diese Option in der Testphase von Shellskripten, um jede Zeile, die ausgeführt wird, angezeigt zu bekommen. Als weitere Optionen können zahlreiche Flags bereits beim Start der Bash aktiviert werden.
  • Da dies auch bei laufender Shell geschehen kann - und dies der gebräuchliche Weg ist, werden die Flags erst im Zusammenhang mit dem builtin-Kommando set behandeln.

Verhalten beim Start

Interaktiv / Nicht-Interaktiv

Datei:Grafik15.png

  • Ist eine Shell mit der Standardein- und Standardausgabe (mit einer (virtuellen) Konsole) verbunden, so bezeichnet man sie als interaktive Shell.
  • Die interaktive Bash teilt sich wiederum ein in die Login Bash, die Nicht-Login Bash und die Restricted Bash.
  • Alle drei unterscheiden sich im Einlesen von Initialisierungsdateien; Eine Restricted Bash schränkt die Befugnisse des Benutzers ein.
  • Wenn die Bash startet, entscheidet sie anhand des Ergebnisses von tty -s, ob es sich um eine interaktive Shell handelt (dann ist der Rückgabewert des Kommandos "0").
  • Eine Login-Shell führt die Kommandos aus der Datei /etc/profile und aus der ersten gefundenen Datei * ~/.bash_profile
    • ~/.bash_login oder
    • ~/.profile
  • aus, sofern die Dateien existieren, lesbar sind und die Bash nicht mit der Option --noprofile gestartet wurde.
  • Eine Nicht-Login Bash liest die Datei ~/.bashrc. Mit der Option --rcfile Diese_Datei« kann eine alternative Ressourcen-Datei benannt und mit --norc das Einlesen unterdrückt werden.
  • Eine Nicht-Interaktive Shell (typisch sind Shellskripte) wertet einzig die Umgebungsvariable BASH_ENV aus. Enthält sie den vollständigen Pfad zu einer Datei, so wird deren Inhalt gelesen und ausgeführt.

Bash als Login-Shell

Datei:Grafik7.png

  • In den meisten Konfigurationen, die die Distributoren ausliefern, dürfte die Bash als Login-Shell voreingestellt sein.
  • Ist dem nicht so, kann der Benutzer mit Hilfe des Kommandos chsh die Bash in die Passwortdatei eintragen.
  • Dies funktioniert jedoch nur, wenn die Bash in der Datei /etc/shells eingetragen ist.
  • Ist dem nicht so, könnte einem entweder der Administrator aus der Patsche helfen, indem er den Eintrag in obiger Datei ergänzt oder man baut in einem der Startup-Skripte seiner bisherigen Login-Shell den Aufruf exec /usr/bin/bash --login ein.
  • Bei dem zuletzt beschriebenen Vorgehen sollten Sie sicher stellen, dass das Skript mit dem Aufruf nicht auch von der Login-Bash ausgeführt wird, sonst hängt die Shell in einer Schleife mit Reinitialisierungen fest.
  • Am besten fragen Sie im Skript ab, ob der Name des aktuell ausgeführten Programms die Bash ist:
...
 case "$0" in
    *bash)
       ;;
    *)
       test -x /usr/bin/bash && exec /usr/bin/bash –-login
       ;;
 esac
 ...

Interaktive Login-Shell

Interaktiv bedeutet, dass Kommandos eingegeben werden können. Login-Shell meint, dass die Shell nach der Anmeldung vom Anmeldeprozess (getty oder ein Desktopmanager) oder mit ‑‑login gestartet wurde.

Eingelesene Dateien* /etc/profile

  • ~/.bash_profile, ~/.bash_login or ~/.profile: die erste existierende lesbare Datei wird gelesen
  • ~/.bash_logout nach der Abmeldung

Fehlermeldungen werden ausgegeben, wenn Konfigurationsdateien existieren aber nicht lesbar sind. Wenn eine Datei nicht existiert, such die Bash nach der nächsten.

Interaktive Nicht-Login-Shell

  • Eine Nicht-Login-Shell wird gestartet, wenn der Anwender bereits am System angemeldet ist. Beispielsweise, wenn von einer grafischen Oberfläche aus ein Terminal-Fenster gestartet wird.
  • Eingelesene Dateien:* ~/.bashrc
  • Diese Datei wird üblicher Weise in ~/.bash_profile referenziert:
if [ -f ~/.bashrc ] ; then . ~/.bashrc ; fi

Nicht-interaktiver Aufruf

Alle Skripte nutzen Nicht-interaktive Shells. Sie wurden geschrieben um bestimmte Aufgaben zu erledigen und können nicht angewiesen werden andere Aufgaben zu erledigen als für welche sie programmiert wurden.

Eingelesene Dateien:* Festgelegt in der Umgebungsvariable BASH_ENV

Die PATH-Variable wird nicht für die Suche nach Dateien genutzt, daher sollten Dateien ggf. mit absolutem Pfad referenziert werden.

Aufruf mit dem Kommando sh

Die Bash versucht sich zu verhalten wie das hitorische Bourne sh Programm und auch konform zum POSIX Standard zu sein.

Eingelesene Dateien* /etc/profile

  • ~/.profile

Bei interaktivem Aufruf kann die Umgebungsvariable ENV auf eine zusätzliche Startdatei zeigen.

POSIX Modus

  • Diese Option kann mit dem internen Befehl set gesetzt werden,
set -o posix 
  • oder durch den Aufruf der Bash mit der Option ‑‑posix.
  • Die Bash wird sich so kompatibel wie möglich zu dem POSIX standard for shells zu verhalten.
  • Das setzten der Umgebungsvariable POSIXLY_CORRECT aktiviert den Posix-Modus ebenfalls.
  • Eingelesene Dateien:* Festgelegt in der Umgebungsvariable ENV

Entfernter Aufruf

Dateien, die gelesen werden, wenn der Aufruf über rshd erfolgt.* ~/.bashrc

Die r-tools sollten nicht mehr genutzt werden!

Die Nutzung veralteter Tools wie rlogin, telnet, rsh und rcp birgt große Risiken.

Sie sind unsicher, weil sie Passwörter und Daten unverschlüsselt übertragen und keinen Schutz gegen Abhören, Manipulation oder Übernahme der Verbindung bieten.

Entfernte Shells sollten mit Werkzeugen wie ssh aufgerufen werden.

UID nicht gleich EUID

Wenn sich User-ID (UID) und Effektive User-ID (EUID) unterscheiden, werden keine Startdateien gelesen.

Dieser Fall kann eintreten, wenn ein Skript mit gesetztem setuid-Bit gestartet wird.

Eingeschränkte Shell

Datei:Grafik8.png

  • Wird die Bash als rsh, bash, mit --restricted oder -r aufgerufen, so startet sie als eingeschränkte (restricted) Shell.
  • Der Anwender unterliegt dann verschiedenen Einschränkungen.
Achtung
* Das Einrichten einer abgesicherten Umgebung für Benutzer ist eine anspruchsvolle Aufgabe. Das Einrichten einer einschränken Shell kann dabei nur eine von vielen Maßnahmen darstellen. In einigen Fällen mag es sinnvoller erscheinen, eine chroot-Umgebung einzurichten. 
* Stellen Sie sicher, dass die exportierte PATH-Variable keine Verzeichnisse enthält, die eine Shell enthalten. Es ist sinnvoll, zu diesem Zweck ein eigenes Binary-Verzeichnis mit »unkritischen« Kommandos (analog zu FTP) anzulegen und einzig dieses in PATH aufzunehmen. 
* Es muss sicher gestellt sein, das erlaubte Programme nicht in der Lage sind die von der restricted shell gesetzten Einschränkungen zu umgehen. Achten Sie dabei besonders auf Programme, die es erlauben eine Shell zu starten (z. B. Editoren).

Einschränkungen

  • Der eingebaute cd Befehl ist abgeschaltet
cd..
bash: cd: restricted* Setzten, ändern und löschen der Variablen SHELL, PATH, ENV oder BASH_ENV ist nicht möglich. 
export PATH=./:$PATH
bash: PATH: readonly variable
unset SHELL
bash: unset: SHELL: cannot unset: readonly variable* Kommandoaufrufe mit absolutem Pfad sind nicht möglich. Nur Kommandos die in den Pfaden der Variable PATH enthalten sind können aufgerufen werden. Dies kann nicht mit dem eingebauten Befehl command umgangen werden.
/bin/ls
bash: /bin/ls: restricted: cannot specify `/' in command names* Dateinamen, die einen Slash „/“ enhaten sind nicht erlaubt (auch nicht mit dem include-Operator „.“:
. /etc/profile
bash:.: /etc/profile: restricted* Umleitungen (>, >|, ><, >&, &> und >>) sind abgeschaltet.
ls > ls.log
bash: ls.log: restricted: cannot redirect output* Import-Funkionen beim Start sind abgeschaltet, SHELLOPTS wird ignoriert beim Start. 
  • Der eingebaute Befehl exec ist deaktiviert, um es nicht zu ermöglichen, die Shell durch einen anderen Prozess zu ersetzen und dadurch die Privilegien zu erhöhen.
  • builtin-Kommandos zu aktivieren bzw. zu deaktivieren (also ihren momentanen Status zu ändern)
  • Abschalten des restricted-Modus ist nicht möglich.
  • Der interne Befehl hash akzeptiert kein „/“ (slash).
  • Die ‑f und ‑d Optionen des eingebauten Befehls sind deaktiviert.

Wenn ein Kommando ein Shellscript ist, schaltet rbash alle Beschränkungen für die ausführende Shell ab.

Beenden der Bash

exit

exit [n] 

Beendet die Shell mit dem Exit-Status N. Wird N weggelassen wird, ist der Exit-Status der des letzten ausgeführten Befehls. Alternativ kann auch die Tastenkombination [Strg] + [d] verwendet werden.

Logout

logout [n] 
  • Beendet die Shell mit dem Exit-Status N. Wird N weggelassen wird, ist der Exit-Status der des letzten ausgeführten Befehls. Liefert einen Fehler, wenn es nicht in einer Login-Shell ausgeführt wird.
  • Ob die Bash nun mittels exit oder logout verlassen oder sie mit einem Signal (Ausnahme: KILL) zum Ende gebracht wird, so wird sie abschließend noch das ihr auferlegte Pensum erledigen.
  • Handelt es sich um eine Login-Shell, so lässt sich die Bash sogar vor ihrem Ende zu einem letzten Groß-Reine-Machen motivieren.

~/.bash_logout

Alle Aktionen, die die Shell vor ihrem Ableben noch erledigen soll, sind hierzu in eine Datei .bash_logout zu schreiben.

Ersetzen des aktuellen Prozesses

Ein Ersetzen des Programms durch ein anderes mittels exec kommt einer Beendigung gleich.

exec wird Im Kapitel ‚Eingebauten Kommandos‘ behandelt.

Zusammenfassung

Die Bash ist die GNU Shell, kompatibel mit der Bourne Shell. Sie enthält viele nützliche Funktionen anderer Shells. Wenn die Shell startet, liest sie ihre Konfigurationsdateien ein.

Die wichtigsten sind:

  • /etc/profile
  • ~/.bash_profile
  • ~/.bashrc

Die Bash verhält sich anders, wenn sie interaktiv, restricted oder POSIX-Kompatibel gestartet wird.

Shell-Kommandos können in drei Gruppen eingeteilt werden* Shell-Funktionen

  • Interne Befehle (shell built-ins)
  • Im Dateisystem enthaltene Kommandos

Die Bash unterstützt zusätzliche interne Kommandos, die in der ursprünglichen Bourne-Shell nicht enthalten waren.

Shellskripte bestehen aus solchen Kommandos verbunden durch Shell-Syntax. Sie werden Zeile für Zeile gelesen und ausgeführt und sollten eine logische Struktur besitzen.

Übungen

1. Wo ist das bash Programm auf dem System abgelegt?

2. Benutzen Sie die --version Option um die Version Ihrer bash herauszufinden.

3. Welche Konfigurationsdateien werden eingelesen, wenn Sie sich grafisch anmelden und dort ein Terminal-Fenster öffnen?

4. Sind die folgenden Shells interaktiv? Sind es Login-Shells?

  • Eine Shell, die von einer grafischen Oberfläche aus gestartet wird, beispielsweise dur starten eines Terminal-Programms.
  • Eine Shell die nach dem Aufruf von ssh localhost aufgerufen wird.
  • Eine Shell, die nach einer Anmeldung an einer Textkonsole aufgerufen wird.
  • Eine Shell, die durch den Befehl xterm & aufgerufen wird.
  • Eine Shell die durch das Skript mysystem.sh geöffnet wird.
  • Eine Shell von einem entfernten Host, an dem Sie sich anmelden müssen, weil Sie SSH benutzen oder sich mit SSH keys authentifizieren.

5. Können Sie erklären, warum die Bash nicht beendet wird, wenn Sie Ctrl+C drücken?

6. Lassen Sie den Inhalt des directory stack anzeigen.

7. Löschen Sie die Variable für den primären Prompt.

8. Setzen Sie jetzt PS1 so, dass der Prompt den aktuellen Pfad enthält. Beispielsweise indem Sie der Datei ~/.bashrc folfende Zeile hinzufügen: export PS1="\u@\h \w> "

9. Probieren Sie auch andere Konfiguration der Eingabeaufforderung.

10. Lassen Sie sich die hashed commands für die aktuelle Sitzung anzeigen.

11. Wie viele Prozesse laufen aktuell auf Ihrem System? Benutzen Sie ps und wc. Die erste Zeile der Ausgabe von ps ist kein Prozess!

12. Wie können Sie sich den system hostname anzeigen lassen? Nur den Namen, nicht mehr!