Forum

Du musst dich anmelden um Beiträge und Themen zu erstellen.

BASH-Grundkurs

BASH-Grundkurs

Eine Shell (engl. Hülle, Schale, Außenhaut) bezeichnet die traditionelle Benutzerschnittstelle unter Unix-Betriebssystemen. Der Benutzer kann in einer Eingabezeile Kommandos eintippen, die der Computer dann sogleich ausführt. Man spricht darum auch von einem Kommandozeileninterpreter.

Die Bash (Bourne-again-shell - eine Weiterentwicklung der Bourne-Shell) ist die Standard-Shell auf den meisten Linux-Systemen und wurde auf fast alle Unix-Systeme portiert.

Bash? Wozu brauche ich das?!

Unter Windows spielen Kommandozeileninterpreter für den Durchschnittsbenutzer heute eine geringe Rolle. Für scheinbar alle Zwecke gibt es graphische Tools, die sämtliche Konfigurations- und Bedienungsschritte erledigen können. Scheinbar - denn auch unter Windows kommen professionelle Systemadministratoren nicht ohne Kommandozeile aus.

Unter Linux gibt es eine ähnliche Tendenz: So manche moderne Distribution versteckt die Shell heute ebensogut wie der große Konkurent aus Redmont. Dennoch ist sie ein wichtiges Instrument, mit dem sich jede/r vertraut machen sollte.

Es gibt viele nützliche Programme, für die es keine graphische Oberfläche gibt und auch Programme mit graphischer Oberfläche kennen oft Optionen, die nur von der Kommandozeile aus zugänglich sind.
Im Störungsfall ist eine Rettungs-Shell oft das einzige zur Verfügung stehende Mittel, um das Problem zu beheben, aber auch wenn das System nicht streikt, kommt es gelegentlich vor, dass ein Programm nach einem Update nicht mehr funktioniert. Unter Windows bleibt da meist nur warten und hoffen. Unter Linux starte ich das widerspenstige Programm einmal als Shell-Kommando und sehe mir an, was es zu sagen hat. Die Fehlermeldungen sind häufig schon aussagekräftig, aber wenn nicht, gebe ich sie in eine Suchmaschine ein und erfahre so nicht nur, warum das Programm nicht läuft, sondern auch meist, wie ich es zum Laufen bringen kann.

Was mich an Windows immer genervt hat, war, dass es Probleme gab, bei denen ich an einen Punkt kam, wo ich aufgeben musste. Unter Linux gibt es auch Probleme, aber ich weiß, dass ich, eventuell mit einigem Aufwand, die Lösung finden werde.

Geht nicht - gibt's nicht!

Die Bedeutung verschiedener Schriften:

In Schrift mit fester Breite werden Shell-Eingaben dargestellt. Die Shell-Eingaben sind, wenn abgesetzt vom Fließtext dargestellt, mit der ENTER-Taste (Return) abzuschließen.

Kursiv gesetzte Ausdücke sind durch einen ensprechenden Inhalt zu ersetzen - zum Beispiel benutzername durch den Namen des eigenen Benutzers.

Grau hinterlegt wird die Ausgabe von ausgeführten Kommandos dargestellt.

In roter Schrift werden vorgestellte Befehle dargestellt.

Noch einige Tipps:

  • Moderne Terminal-Emulationen beherrschen meist copy/paste. Das heißt, ich kann mit der linken Maustaste einen Teil der Ausgabe (zum Beispiel Dateinamen) markieren, mit der rechten Maustaste kopieren und wieder mit rechter Maustaste in der Befehlszeile einfügen. Auch aus anderen Dokumenten kopierter Text kann so eingefügt werden.
  • Die Bash speichert alle eingegebenen Befehle. Mit den Pfleiltasten  und  können sie zurückgerufen und (eventuell modifiziert) wieder abgesetzt werden. Sollen alle gespeicherten Befehle ausgegeben werden, genügt die Eingabe history, gefolgt von ENTER.
  • Tippt man den Anfang eines Befehls und drückt dann die Tabulatortaste, versucht die Bash den Befehl zu vervollständigen.
    Dies geschieht soweit der Befehl eindeutig ergänzt werden kann. Gibt es mehrere Möglichkeiten, so wird nur bis zu dem Punkt vervollständigt, ab dem sich die Möglichkeiten unterscheiden. Drückt man dann 2x die Tabulatortaste, werden die Möglichkeiten aufgelistet. Tippt man dann weiter und drückt abermals die Tabulatortaste, wird auch der Rest ergänzt.

↑ nach oben ↑

Kapitel 1: Das System erkunden

Zunächst öffnen wir ein Terminal-Fenster. Wenn im Menü nicht zu finden, können wir die Suchfuntion aufrufen und "terminal" suchen (die ersten drei Buchstaben einzutippen wird reichen).

Betrachten, Navigieren, Suchen - pwd, ls, cd und find

Nach dem Aufruf der Shell befinden wir uns in unserem Home-Verzeichnis. Am Anfang der Zeile, in die wir schreiben können, steht etwas wie benutzer@computer:~$ - vor dem $ können noch Pfadangaben zu finden sein, aber wenn dort nur eine Tilde steht, befinden wir uns im Home-Verzeichnis.
Um das zu überprüfen können wir uns mit pwd (print work-directory) den Pfad des aktuellen Verzeichnisses anzeigen lassen:

pwd

Wir sehen uns das "aktuelle" Verzeichnis an, das heißt, das Verzeichnis, in dem wir uns gerade befinden:

ls

Wir bekommen alle Dateien und Verzeichnisse im Home-Verzeichnis aufgelistet.
Die gleiche Ausgabe in detailierter Form erhalten wir mit:

ls -l

Das -l ist eine Option. Es steht hier für eine "lange" Ausgabe - zu jeder Datei bekommen wir Informationen über Größe und Dateirechte (zu diesen kommen wir etwas später).
Allgemein gibt ls (list) den Inhalt des angegebenen Verzeichnisses aus:

ls (-option) verzeichnisname

Wenn wir zuvor nur ls ohne Verzeichnisname ausgeführt haben, so geht das nur, weil dies als ls . interpretiert wird, wobei der Punkt immer für das aktuelle Verzeichnis steht.

Abhängig vom installierten System können die Benennungen der Verzeichnisse im Home-Verzeichnis unterschiedlich sein. Das Verzeichnis "Downloads" sollte aber auf jedem System vorhanden sein. Sonst müsste "Downloads" jeweils durch ein mit ls ausgegebenes Verzeichnis ersetzt werden.

Verzeichnis "Downloads" ausgeben:

ls Downloads

Wenn wir ein frisch installiertes System haben, wird da unter Umständen noch nicht viel zu sehen sein. Wenn wir noch gar nichts abgespeichert haben, wird die Ausgabe sogar leer sein.

Wir können dann schauen, ob überhaupt etwas in einem der Verzeichnisse liegt.
Den Inhalt aller Verzeichnisse ausgeben:

ls *

Ein Stern steht für alle Datei- oder Verzeichnisnamen und so sehen wir auch den Inhalt aller Verzeichnisse - ls gibt den Inhalt des angegeben Verzeichnisses aus und Stern bedeutet "alle"!
Wobei "alle" nicht ganz korrekt ist. Dateien und Verzeichnisse, die mit einem Punkt beginnen, werden unter Linux als "versteckt" betrachtet und normalerweise nicht angezeigt. Wollen wir auch versteckte Dateien anzeigen, müssen wir wieder eine Option benutzen.
Auch versteckte Dateien ausgeben:

ls -a

Jetzt haben wir wohl eine etwas umfangreichere Ausgabe! Um den Anfang zu sehen, müssen wir ein Stück hinaufscrollen. Dort sehen wir zwei seltsame Verzeichnisse: . und .. - diese bezeicnen das aktuelle Verzeichnis und das diesem übergeordnete Verzeichnis. Die beiden gibt es in jedem Verzeichnis! Über deren Bedeutung werden wir in Kürze mehr erfahren. Da es sie aber ohnehin überall gibt, wollen wir sie im Allgemeinen nicht anzeigen. Mit Option -A bekommen wir auch wieder versteckte Dateien ausgegeben, aber ohne . und ...
Auch versteckte Dateien ohne . und .. ausgeben:

ls -A

Optionen können wir auch kombinieren. Nach dem Minus müssen sie nur aneinandergereiht werden:

ls -lA

liefert versteckte und nicht versteckte Dateien in detailierter Form (mit großem "A" ohne die Verzeichnisse . und ..).

Nun wollen wir aber das Home-Verzeichnis auch verlassen. Mit cd (change directory) können wir uns zwischen den Verzeichnissen bewegen.

cd verzeichnisname

Wir wechseln ins Verzeichnis "Downloads":

cd Downloads

Mit ls -a können wir die Dateien dieses Verzeichnisses anzeigen lassen. Wenn es sonst keine Dateien gibt, so sehen wir jedenfalls wieder . und .. (das aktuelle und das übergeordnete Verzeichnis). Jetzt benützen wir .. um wieder zurück ins (übergeordnete) Home-Verzeichnis zu kommen.
Wechsel ins übergeordnete Verzeichnis:

cd ..

Wenn wir cd .. wiederholen erreichen wir das Verzeichnis, in dem als Unterverzeichnis auch unser Home-Verzeichnis liegt. ls zeigt uns das. Wir befinden uns jetzt im Verzeichnis /home. Würden wir cd .. nochmal wiederholen, wären wir im Wurzelverzeichnis, aber dort kommen wir auch anders hin.
Wechsel ins Wurzelverzeichnis:

cd /

Wenn wir jetzt ls ausführen, sehen wir alle hier vorhandenen Dateien und Verzeichnisse.

bininitrd.imglost+foundrunusr
bootinitrd.img.oldmediasbinvar
devlibmntsrvvmlinuz
etclib32procsysvmlinuz.old
homelib64roottmp

So oder so ähnlich sieht es an der Wurzel eines Linux-Systems aus. Viele der Verzeichnisse werden in der Einführung in das Linux-Betriebsystem erklärt. Wir können uns ruhig umsehen, denn wir können hier nichts kaputt machen. Dazu haben wir als gewöhnlicher Benutzer keine Berechtigung.

cd home
ls

Hier finden wir die Home-Verzeichnisse aller angelegten Benutzer, also zumindest unser eigenes. Selbst hier haben wir nicht die Berechtigung zu schreiben. Erst in unserem eigenen Verzeichnis benutzername dürfen wir schreiben und müssen vorsichtig sein.

cd /
cd bin
ls

Die umfangreiche Ausgabe beinhaltet alle Basis-Programme des Systems. Viele dieser Programme werden wir im Verlauf der Übung kennenlernen. Wir können mit cd auch in die meisten anderen Verzeichnisse und deren Unterverzeichnisse wechseln und mit ls auslisten. Mit cd .. kommen wir wieder ins übergeordnete Verzeichnis und mit cd / mit einem Schritt zurück an die Wurzel.

Wollen wir ins zuletzt benutzte Verzeichnis zurück, gibt es eine spezielle Option.
Wechsel ins vorherige Verzeichnis:

cd -

Um sofort ins Home-Verzeichnis zu gelangen, geben wir cd ohne Argument ein.
Wechsel ins Home-Verzeichnis:

cd

Wenn wir wissen, wo's hingehen soll, können wir auch direkt ein Verzeichnis angeben:

cd /usr/share/pixmaps

Nun sind wir in dem Verzeichnis, in dem die Bilddateien für die Programm- und Folder-Icons liegen. Mit ls können wir den Verzeichnisinhalt auslisten.

Will ich direkt in ein Unterverzeichnis meines Home-Verzeichnisses springen, zum Beispiel "Downloads", kann ich den Pfad cd /home/benutzername/Downloads benutzen. Ich kann aber auch die Tilde benutzen, um kürzer, dorthin zu gelangen.

cd ~/Downloads

Die Tilde steht für das Home-Verzeichnis. Wir könnten auch mit cd ~ ins eigene Home-Verzeichnis wechseln, aber nur "cd" ist kürzer.

Üben:

cd /
ls
cd var
pwd
ls *

usw.

Wir können auch nach Dateien suchen:

find verzeichnisname -name dateiname

Wir übergeben find dazu den Verzeichnisnamen, wo wir zu suchen beginnen wollen und den Namen der Datei - wir wählen "fonts.conf", da diese Konfigurations-Datei auf jedem System vorhanden sein sollte:

find /etc -name fonts.conf

Wahrscheinlich erhalten wir außer dem Aufenthaltsort der Datei noch einige Fehlermeldungen bezüglich Unterverzeichnissen, für die wir keine Leseberechtigung haben. Im Augenblick müssen wir das so hinnehmen.

Textdateien lesen - less

Jetzt wissen wir, wo "fonts.conf" zu finden ist, aber vielleicht möchten wir auch sehen, was darin geschrieben steht. Dabei hilft uns der Textbetrachter less:

less dateiname

Um fonts.conf zu lesen geben wir ein:

less /etc/fonts/fonts.conf

(um den Pfad nicht abtippen zu müssen, können wir ihn auch aus der vorherigen Ausgabe von find kopieren - siehe auch "Tipps" ganz oben)

Bedienung von less:
In less kann man mit den Pfeiltasten  und  scrollen, mit Bild und Bild blättern, mit [Ende] ans Ende und [Pos1] an den Anfang springen.
Beenden lässt sich less mit der Taste Q.

Absolute und relative Pfade

Unter "Pfad" verstehen wir die Angabe des Aufenthaltsorts einer Datei ("Datei" hier in einem allgemeinen Sinn - normale Dateien, Verzeichnisse, Links). Es gibt zwei Arten von Pfaden und wir haben beide schon benutzt.

Absolute Pfade werden von der Dateiwurzel aus angegeben. Sie beginnen mit einem /. Ein Beispiel:

ls /usr/bin

Der Aufruf kann unabhängig vom aktuellen Verzeichnis erfolgen. Eine spezielle Adressierung kann bei Dateien im Home-Verzeichnis erfolgen.

cd ~/Downloads

Auch das ist ein absoluter Pfad, obwohl er nicht mit / beginnt. Die Tilde ersetzt nämlich "/home/benutzername" und dieser Pfad beginnt sehr wohl mit /.

Ebenfalls ein absoluter Pfad ist die Angabe der Dateiwurzel selbst.

cd /

Relative Pfade werden vom aktuellen Verzeichnis aus angegeben. Sie beginnen mit einem Datei- oder Verzeichnis-Namen. Auch hierfür ein Beispiel: Hier ist wichtig, in welchem Verzeichnis wir uns gerade befinden. Ausgehend vom Wurzelverzeichnis können wir den folgenden relativen Pfad erfolgreich ausführen (wir haben diesen relativen Pfad zuvor schon benutzt).

cd home

Um das benachbarte Verzeichnis /lib anzuzeigen, können wir zur relativen Pfadangabe auch das in jedem Verzeichnis gespeicherte übergeordnete Verzeichnis .. verwenden.

ls ../lib

Auch das ist ein relativer Pfad, denn er beginnt NICHT mit /.

Wenn das aktuelle Verzeichnis die Dateiwurzel ist, unterscheiden sich relative und absolute Pfade nur durch den führenden Schrägstrich.

cd /
ls usr/share/fonts
ls /usr/share/fonts

Wir erhalten für beide Kommandos die gleiche Ausgabe.

↑ nach oben ↑

Kapitel 2: Dateimanipulationen

Dateien anlegen und kopieren -  touch, mkdir und cp

Zunächst wollen wir ein Übungsverzeichnis anlegen, in dem alle weiteren Übungen ausgeführt werden. Zum Anlegen eines Verzeichnisses benutzen wir mkdir (make directory):

mkdir verzeichnisname

Im Home-Verzeichnis legen wir das Übungsverzeichnis "Bash-Grundkurs" an und wechseln danach in selbiges:

mkdir ~/Bash-Grundkurs
cd ~/Bash-Grundkurs

Das Übungsverzeichnis kann natürlich auch an anderer Stelle angelegt werden. Wenn wir später mit cd ~/Bash-Grundkurs ins Übungsverzeichnis zurückwechseln, muss anstelle cd eigener pfad/Bash-Grundkursausgeführt werden.

Mit touch können wir leere Dateien erzeugen:

touch dateiname

Wir erzeugen eine Testdatei "datei.txt":

touch datei.txt

Die lange Ausgabe von ls zeigt uns die neue Datei.

ls -l

insgesamt 0
-rw-r--r-- 1 benutzername benutzergruppe 0 Mär 27 12:41 datei.txt

Die Datei hat eine Größe von 0 Bytes, sie existiert nur als Verzeichniseintrag und belegt keinen Platz auf dem Datenträger. Auch "insgesamt" enthält das Verzeichnis noch keine Daten, die unsere Festplatte belegen.

Wir erzeugen ein neues Verzeichnis "mond" und sehen uns den Inhalt des aktuellen Verzeichnisses nochmals an.

mkdir mond
ls -l

insgesamt 4
-rw-r--r-- 1 benutzername benutzergruppe    0 Mär 27 12:41 datei.txt
drwxr-xr-x 2 benutzername benutzergruppe 4096 Mär 27 12:42 momd

Das neu angelegt Verzeichnis hat nicht 0 Bytes sondern eine (Mindest-)Verzeichnisgröße von 4 kiB und soviel enthält unser Verzeichnis jetzt auch insgesamt.

Die Dateigröße wird (per default) in Bytes angegeben, die Größe des gesamten Verzeichnisinhalts ("insgesamt") in kiB (kibi-Bytes, kilo binär Bytes), 4 x 1024 Bytes

Das Verzeichnis "mond" ist nämlich keinesfalls leer!

ls -a mond

.  ..

Von Anfang an enthält es als Einträge die versteckten "Dateien" . und .. und deshalb muss es auch auf der Festplatte gespeichert werden.

Mit cp (copy) können wir Dateien kopieren.

cp quelle ziel(verzeichnis)

Das funktioniert auch mit leeren Dateien. Wir kopieren datei.txt ins Verzeichnis mond.

cp datei.txt mond

Wir können der Datei aber auch einen neuen Namen geben. "datei.txt" wird als "kopie.txt" ins Verzeichnis "mond" kopiert.

cp datei.txt mond/kopie.txt

Die neuen Dateien zeigt uns ls verzeichnis.

ls mond

datei.txt  kopie.txt

An sich überschreibt cp Dateien ohne Rückfrage. Soll eine Rückfrage vor dem Überschreiben erfolgen, kann man die Option -i benutzen:

cp -i datei.txt mond/kopie.txt

Die Frage, ob wir die vorhandene Datei überschreiben wollen, können wir mit j(a) oder n(ein) beantworten.
Wir legen mit mkdir noch ein weiteres Verzeichnis an:

mkdir Mond

Unter Linux werden Groß- und Kleinschreibung unterschieden. "Mond" und "mond" sind verschiedene Dateien.

ls

datei.txt  mond  Mond

Mit cp kopieren wir zunächst nur gewöhnliche Dateien. Wollen wir auch Verzeichnisse kopieren, verwenden wir die Option -R. Wir kopieren das Verzeichnis "mond" mitsamt Inhalt in "Mond":

cp -R mond Mond

Wir erhalten ein Verzeichnis "mond" im Verzeichnis "Mond". Will man nur den Inhalt und nicht auch das Verzeichnis kopieren, kann man als Quelle mond/* festlegen – die "Wildcard" * bedeutet wieder "alle Dateien im Quellverzeichnis":

cp -R mond/* Mond

(eigentlich ist -R hier nicht notwendig, da es im Quellverzeichnis "mond" keine Unterverzeichnisse gibt)

Jetzt haben wir die Dateien "datei.txt" und "kopie.txt" auch direkt in "Mond".

ls Mond

datei.txt  kopie.txt  mond

Beim Kopieren können auch die beiden Verzeichnisse . und .. verwendet werden. Wechseln wir zunächst ins Verzeichnis "Mond/mond":

cd Mond/mond

Wir kopieren die Datei "kopie.txt" unter dem Namen "neu.txt" ins übergeordnete Verzeichnis:

cp kopie.txt ../neu.txt

Auf diese Art können wir den Inhalt das übergeordneten Verzeichnisses ausgeben:

ls ..

datei.txt  kopie.txt  mond  neu.txt

Nun die Datei "neu.txt" zurück ins aktuelle Verzeichnis:

cp ../neu.txt .

Jetzt kopieren wir alle Dateien aus dem aktuellen Verzeichnis ins übergeordnete Verzeichnis. Weil dort schon die gleichnamigen Dateien liegen, müssen wir das Überschreiben mit j bestätigen:

cp -i * ..

(die Wildcard * steht wieder für alle Dateien im aktuellen Verzeichnis)

Verschieben und umbenennen - mv

Zum Verschieben, wie auch zum Umbenennen benutzen wir mv (move):

mv quelle ziel(verzeichnis)

Wir wechseln zunächst mit cd wieder ins Übungs-Verzeichnis. Anschließend verschieben wir "neu.txt" vom Verzeichnis "Mond" nach "mond":

cd ~/Bash-Grundkurs
mv Mond/neu.txt mond

Jetzt finden wir "neu.txt" nicht mehr im Verzeichnis "Mond", sondern nur noch in "mond".
Wir wollen aber nicht, dass sie dort "neu.txt" heißt, sondern "alt.txt":

mv mond/neu.txt mond/alt.txt

So heißt sie nun!

ls mond

alt.txt  datei.txt  kopie.txt

Weil das mit "Mond" und "mond" zu verwirrend ist, wollen wir "mond" überhaupt umbenennen. "mond" soll "Saturn" heißen:

mv mond Saturn

Und auch das Verzeichnis "mond" in "Mond" soll umbenannt werden und "Krater" heißen:

mv Mond/mond Mond/Krater

Ein ls bestätigt uns - kein "mond" mehr, dafür "Saturn" und "Krater".

ls *

datei.txt

Mond:
datei.txt  kopie.txt  Krater

Saturn:
alt.txt  datei.txt  kopie.txt

Dateien löschen - rm und rmdir

Zum Löschen von Dateien benutzen wir rm (remove):

rm (-optionen) dateiname

Achtung:rm hat keinen Papierkorb! Mit Administratorrechten ausgeführt, kann im schlimmsten Fall das gesamte Betriebssystem gelöscht werden. Und auch als normaler Benutzer kann ich immer noch das Home-Verzeichnis und alle darin befindlichen Dateien vernichten.

Wir wechseln zunächst ins Verzeichnis "Mond/Krater" und erzeugen dort noch einige Dateien:

cd ~/Bash-Grundkurs/Mond/Krater
touch datei1.txt datei2.csv datei3.log

Wir benutzen ls um zu sehen, welche Dateien nun vorhanden sind.

ls

datei1.txt  datei2.csv  datei3.log  datei.txt  kopie.txt  neu.txt

Eine einzelne Datei löschen wir relativ gefahrlos mit:

rm datei1.txt

Man kann aber auch hier wieder * benutzen, um mehrere Dateien auf einmal zu eliminieren. Wir löschen alle Datein im aktuellen Verzeichnis, die auf ".txt" enden.

rm *.txt
ls

datei2.csv  datei3.log

Noch gefährlicher ist es, alle Dateien im aktuellen Verzeichnis zu löschen. Wir sollten umbedingt zuvor überprüfen, in welchem Verzeichnis wir uns gerade befinden (pwd).

rm *

Jetzt befinden sich keine Dateien mehr im aktuellen Verzeichnis. Wir wechseln ins übergeordnete Verzeichnis "Mond":

cd ..

Normalerweise kann rm nur normale Dateien und Links löschen. Der Versuch ein Verzeichnis zu löschen wird mit einer Fehlermeldung quittiert.

rm Krater

rm: das Entfernen von 'Krater' ist nicht möglich: Ist ein Verzeichnis

Am Gefährlichsten ist rm, wenn wir die Option -R verwenden. "rm -R" löscht auch alle Unterverzeichnisse mit allen darin enthaltenen Dateien!
Also, immer vor dem ENTER innehalten und überlegen: Will ich das wirklich alles löschen?!

Zum Löschen von leeren Verzeichnissen gibt es auch rmdir (remove directory):

rmdir verzeichnisname

Dieser Befehl ist weniger effektiv als rm -R, aber auch erheblich weniger gefährlich.
Das zuvor leergeräumte Verzeichnis "Krater" lässt sich so einfach löschen:

rmdir Krater

Der Versuch, mit rmdir auch gleich das Verzeichnis "Saturn" zu löschen, scheitert, da sich dort noch Dateien befinden (diese möchten wir auch noch ein wenig behalten).

rmdir ../Saturn

rmdir: konnte '../Saturn' nicht entfernen: Das Verzeichnis ist nicht leer

Links erzeugen - ln

Manchmal ist es sinnvoll, eine Datei an mehreren Orten verfügbar zu haben. Oder aber, wir wünschen die Möglichkeit, die Datei auch unter einem anderen Namen vorliegen zu haben. Dazu erzeugen wir mit ln (link) symbolische Links:

ln -s ziel linkname

Die Datei neu.txt gibt es nur im Verzeichnis "Saturn":

cd ~/Bash-Grundkurs
ls *

datei.txt

Mond:
datei.txt  kopie.txt

Saturn:
alt.txt  datei.txt  kopie.txt

Um alt.txt auch im Verzeichnis "Mond" verfügbar zu haben, verlinken wir die Datei dort:

cd Mond
ln -s ../Saturn/alt.txt .

Der Punkt am Ende bezeichnet das aktuelle Verzeichnis. Die lange Ausgabe von ls zeigt uns den Link-Pfad:

ls -l

insgesamt 0
lrwxrwxrwx 1 benutzername benutzergruppe 17 Mär 27 13:43 alt.txt -> ../Saturn/alt.txt
-rw-r--r-- 1 benutzername benutzergruppe  0 Mär 27 13:25 datei.txt
-rw-r--r-- 1 benutzername benutzergruppe  0 Mär 27 13:25 kopie.txt

Genau so können wir auch Verzeichnisse verlinken. Wir wechseln ins Verzeichnis Saturn und verlinken darin "Mond".

cd ../Saturn
ln -s ../Mond .

Im Verzeichnis Saturn gibt es jetzt auch ein Verzeichnis Mond. Wir können über diesen Link vom Verzeichnis "Saturn" ins Verzeichnis "Mond" wechseln und den Inhalt anzeigen.

cd Mond
ls

alt.txt  datei.txt  kopie.txt

Welchen Pfad findet pwd nun für das aktuelle Verzeichnis?

pwd

/home/benutzername/Bash-Grundkurs/Saturn/Mond

Und wenn wir das übergeordnete Verzeichnis anzeigen?

ls ..

datei.txt  Mond  Saturn

Das ist der Inhalt von ~/Bash-Grundkurs und nicht ~/Bash-Grundkurs/Saturn. pwd folgt also dem aktuell verwendeten Pfad, ls zeigt das in .. gespeicherte Verzeichnis.

cd ..
pwd

/home/benutzername/Bash-Grundkurs/Saturn

cd folgt also dem Link auch wieder zurück.

Ähnlich wie cp kann ln Links unter einem anderen Namen anlegen. Das geht sowohl mit normalen Dateien, als auch mit Verzeichnissen.

ln -s ../Mond Ringe
ls Ringe

alt.txt  datei.txt  kopie.txt

Links lassen sich auch kopieren, verschieben und/oder umbenennen. Wir benennen den Link "Mond" in "Krater" um und kopieren ihn ins Verzeichnis ~/Bash-Grundkurs/Mond.

mv Mond Krater
cp -R Krater ~/Bash-Grundkurs/Mond

Was liegt nun in ~/Bash-Grundkurs/Mond?

cd ~/Bash-Grundkurs/Mond
ls -l

insgesamt 0
lrwxrwxrwx 1 benutzername benutzergruppe 17 Mär 27 13:43 alt.txt -> ../Saturn/alt.txt
-rw-r--r-- 1 benutzername benutzergruppe  0 Mär 27 13:25 datei.txt
-rw-r--r-- 1 benutzername benutzergruppe  0 Mär 27 13:25 kopie.txt
lrwxrwxrwx 1 benutzername benutzergruppe  7 Mär 27 14:12 Krater -> ../Mond

Auch dieser Link lässt sich benutzen, jedenfalls solange der angegebene Pfad vom Zielort aus gültig ist. In unserem Beispiel ist er das, denn das Verzeichnis "Mond" im übergeordneten Verzeichnis ist das aktuelle Verzeichnis selbst.

cd Krater
ls

alt.txt  datei.txt  kopie.txt  Krater

cd Krater
pwd

/home/benutzername/Bash-Grundkurs/Mond/Krater/Krater

Nur ls bleibt dabei - das übergeordnete Verzeichnis ist "Bash-Grundkurs".

ls ..

datei.txt  Mond  Saturn

Ohne -s aufgerufen erzeugt ln sogenannte "harte Links". Ein "harter Link" ist nicht bloß ein zusätzlicher Pfad zu einer anderswo befindlichen Datei, sondern die Datei selbst. Im Prinzip ist jede Datei ein "harter Link", wovon es eben auch mehrere geben kann. Die Datei belegt aber dennoch nur einmal Speicherplatz.
Harte Links sind nicht für Verzeichnisse möglich, da deren Pfad jeweils eindeutig bleiben muss (es kann im Verzeichnis nur ein Pfad für .. gespeichert sein - siehe ls ..).

Ob von einer (normalen) Datei mehrere "harte Links" existieren, sehen wir an der Zahl, die bei der Ausgabe von ls -l nach den "Dateirechten" angeführt ist - im Allgemeinen also "1" (z.B. -rw-r--r-- 1).
In der Praxis benötigen wir selten "harte Links" und finden meist mit ln -s, den "symbolischen Links", das Auslangen.

↑ nach oben ↑

Kapitel 3: Dateirechte

Dateirechte ändern - chmod

Unter Linux hat jede Datei (auch Verzeichnisse) einen Besitzer und bestimmte Zugriffsrechte. Wir unterscheiden zwischen Lese-, Schreib- und Ausführungsrechten. Diese können bei jeder Datei für den Besitzer selbst, für Angehörige einer definierten Gruppe und für alle anderen festgelegt werden.
Mit ls -l bekommen wir diese angezeigt. Nach dem ersten Zeichen, das für den Dateityp steht (also -d oder l), kommen 9 Zeichen, die genau jene Zugriffsrechte angeben:

(1.Zeichen=Typ)(2.-4.Zeichen=Besitzer)(5.-7.Zeichen=Gruppe)(8.-10.Zeichen=Andere)

Es gibt jeweils:

r

für Lesen (read)

w

für Schreiben (write)

x

für Ausführen (execute) - bzw. bei Verzeichnissen, den Inhalt auflisten

-

wenn das entsprechende Recht nicht vorhanden ist

Zum Beispiel:

-rw-r--r--

für eine normale Datei, die von allen gelesen, aber nur vom Besitzer geschrieben werden darf.

drwxr-xr-x

für ein Verzeichnis, das von allen gelesen und aufgelistet, aber wieder nur vom Besitzer geschrieben werden darf.

lrwxrwxrwx

für einen symbolischen Link, den jeder auch wieder löschen darf

Dies sind die häufigsten Fälle. Gelegentlich sieht man aber auch Berechtigungen wie:

-rw-rw----

hier dürfen Besitzer und Gruppe lesen und schreiben. Anderen ist es aber nicht gestattet, die Datei auch nur zu lesen.

Auch seine Berechtigung hat:

-r--------

hier darf nur der Besitzer lesen, aber auch er hat hier keine Schreibrechte, was ihn davor bewahrt, diese Datei eines Tages versehentlich zu löschen. Wenn er die Datei doch einmal löschen will, muss er zuerst die Rechte ändern.

Dazu gibt es chmod (change modus):

chmod modus dateiname

Es gibt 2 Methoden "modus" anzugeben:

1. ugoa-Methode

u

steht für den Besitzer (user)

g

steht für die Gruppe (group)

o

steht für Andere (others)

a

steht für alle (all)

Die Rechte r (lesen), w (schreiben) und x (ausführen) können jeweils hinzugefügt (+) oder entfernt (-) werden.

Wir wechseln zunächst ins Verzeichnis "Mond"

cd ~/Bash-Grundkurs

Die Rechte der Datei "datei.txt" sind jetzt wahrscheinlich -rw-r--r--. Mit ls -l können wir uns das ansehen.

ls -l datei.txt

-rw-r--r-- 1 benutzername benutzergruppe 0 Mär 27 12:41 datei.txt

Wir wollen der Datei die Ausführungsrechte für alle geben:

chmod a+x datei.txt

Ein ls -l offenbart, dass alle, Besitzer, Gruppe und Andere Ausführungsrechte (x) bekommen haben.

ls -l datei.txt

-rwxr-xr-x 1 benutzername benutzergruppe 0 Mär 27 12:41 datei.txt

Nun wollen wir auch dem Besitzer die Schreibrechte nehmen:

chmod u-w datei.txt

Die Rechte der Datei sind jetzt -r-xr-xr-x.

rm datei.txt

rm: reguläre leere Datei (schreibgeschützt) 'datei.txt' entfernen?

Wir dürfen als Besitzer die Datei dennoch löschen, müssen aber eine Rückfrage beantworten. Wir antworten mit noder nein, um datei.txt zu behalten.

Nun wollen wir Gruppe und Anderen die Ausführungsrechte wieder nehmen und gleichzeitig dem Besitzer die Schreibrechte einräumen:

chmod go-x,u+w datei.txt

Mit ls -l sehen wir -rwxr--r--. Wir können also u, g und o kombinieren, bzw. durch Komma getrennt, auch mehrere Änderungen beauftragen.

Zuletzt wollen wir Allen alle Rechte zugestehen:

chmod a+rwx datei.txt
ls -l datei.txt

-rwxrwxrwx 1 benutzername benutzergruppe 0 Mär 27 12:41 datei.txt

(es macht nichts, wenn Rechte hinzugefügt werden, die schon vorhanden sind - wir tun dies, wenn wir zuvor nicht einmal nachgesehen haben, welche Rechte die Datei wirklich hatte)

Häufig findet man aber auch eine andere Darstellung des "modus":

2. numerische Methode

Dabei gibt es für jedes Recht eine Zahl:

1

für Ausführen

2

für Schreiben

4

für Lesen

Für die vorhandenen Rechte werden die Zahlen addiert. Für den Besitzer, die Gruppe und Andere werden nun die addierten Zahlen zu einer 3-stelligen Ziffernfolge zusammengestellt:

644 entspricht a+r,u+w
der Besitzer darf Lesen und Schreiben (4+2), Gruppe und Andere dürfen nur Lesen (4)

755 entspricht a+rx,u+w
der Besitzer darf Lesen, Schreiben und Ausführen (4+2+1), Gruppe und Andere dürfen Lesen und Ausführen (4+1), aber nicht Schreiben.

chmod 600 datei.txt
ls -l datei.txt

-rw------- 1 benutzername benutzergruppe 0 Mär 27 12:41 datei.txt

Nur noch der Besitzer darf lesen und schreiben:

Besitzer ändern - chown und chgrp

chown besitzer dateiname

Eine Datei oder ein Verzeichnis wird auf den neuen Besitzer "besitzer" übertragen. Auch dies geht wieder für mehrere Dateien in einem Rutsch:

chown besitzer * (nicht ausprobieren!) überträgt alle Dateien im aktuellen Verzeichnis an "besitzer".

chown -R besitzer verzeichnis (nicht ausprobieren!)
ändert den Besitzer gleich auch in allen im Verzeichnis befindlichen Dateien und Unterverzeichnissen auf "besitzer".

Aber: Ich kann nicht verschenken, was mir nicht gehört. chown darf ich nur bei meinen eigenen Dateien ausführen (Dateien also, bei denen ich als Besitzer eingetragen bin). Dies gilt auch für das Ändern von Rechten über chmod.

Mit chown kann auch gleich die Gruppe geändert werden:

chown besitzer:gruppe dateiname (nicht ausprobieren!)
ändert den Besitzer auf "besitzer" und die Gruppe auf "gruppe".
Soll nur die Gruppe geändert werden gibt es chgrp:

chgrp gruppe dateiname

↑ nach oben ↑

Kapitel 4: Das System konfigurieren

Mit alias einen neuen Befehl erzeugen

Man kann der bash auch neue Kommandos beibringen, indem man einen Alias erzeugt:

alias aliasname='programm (-optionen ...)'

Das Kommando date gibt das aktuelle Datum mit Uhrzeit in einem Defaultformat. Die Ausgabe kann aber auch in einem selbstdefinierten Format erfolgen. Will man die Ausgabe von date für einen Zeitstempel einer Datei benutzen, ist eine kompaktere Ausgabe sinnvoll.

date +%Y%m%d-%H%M%S

Wir können aber auch ein neues Kommando definieren, dass uns bloß die Zeit ausgibt.

alias zeit='date +%H:%M:%S'

(Hochkomma-Umklammerung ist notwendig, wenn der Befehl aus mehr als einem Wort besteht - d.h. Leerzeichen enthält)

Ab jetzt können wir zeit eingeben, um die aktuelle Zeit anzuzeigen:

zeit

19:15:23

Ein so gesetzter Alias existiert nur bis zum Beenden der Shell, in der er gesetzt wurde.
Wenn man einen Alias ausdrücklich löschen will, gibt man folgendes ein:

unalias zeit

Und weg ist er! Der Befehl zeit wird ab jetzt mit der Meldung "bash: zeit: Kommando nicht gefunden." quittiert.

Mit nano die Konfigurationsdatei .bashrc editieren

Der Texteditor nano ist auf den meisten Systemen schon von Anfang an an Bord. Wenn nicht, sollte er für diese Übung nachinstalliert werden. Er ist leicht und intuitiv zu bedienen (in der Fußzeile stehen die verfügbaren Kommandos, die mit [Strg]+[Taste] ausgeführt werden) und mein Lieblingseditor. Er wird aufgerufen mit:

nano dateiname

Über einen Eintrag in der Datei .bashrc im Home-Verzeichnis können Aliase auch dauerhaft eingericht werden. Dazu öffnen wir .bashrc mit dem Editor nano:

nano ~/.bashrc

Mit der Pfleiltaste  gehen wir bis ans Ende der Datei.
Dort fügen wir eine neue Zeile mit der Alias-Zuweisung von zuvor ein:

alias zeit='date +%H:%M:%S'

Wir speichern mit den Tasten [Strg]+[O], gefolgt von ENTER ab und schließen den Editor mit [Strg]+[X] - fertig! Beim nächsten Aufruf der Bash steht der Befehl zur Verfügung.

Um zu sehen, welche Aliase bereits vorhanden sind, geben wir folgendes ein:

alias

Variablen definieren und mit echo ausgeben

Ein Programm, mit dem sich beliebige Inhalte auf den Bildschirm drucken lassen ist echo:

echo text

Wir testen das mal (wir setzen umklammernde Hochkommas, weil Leerzeichen im Text vorkommen):

echo "Hier sitze ich nun"

Hier sitze ich nun

Gut, das ist noch nicht so beeindruckend.
Wir können aber auch den Inhalt von Variablen ausgeben. Diese müssen wir zuvor definieren:

variable=wert

Der Aufruf der Variablen erfolgt dann immer mit einem vorangestellten $:

echo $variable

Das versuchen wir:

MeinText="Ich bin wiederverwendbar!"
echo $MeinText

Ich bin wiederverwendbar!

Auch Zahlen können in Variablen gespeichert werden. Um mit ihnen zu rechnen, verwenden wir let:

let argument

Argument ist hier eine Variablendefinition oder eine Rechenoperation.
Zum Beispiel:

let A=100
let B=150
let C=$A+$B
echo $C

250

Ohne let bekommen wir ein ganz anderes Ergebnis!

D=$A+$B
echo $D

100+150

Umgebungsvariablen

Es gibt auch viele spezielle Variablen. In diesen stehen bestimmte Informationen zur Verfügung, ohne, dass sie definiert werden müssen:

echo $HOME liefert den Pfad des Home-Verzeichnisses
echo $HOSTNAME den Rechnernamen
echo $LOGNAME den Benutzernamen
echo $UID die Benutzer ID

Sie werden vor allem bei Shell-Scripts benötigt.
Eine weitere, vordefinierte Variable ist $RANDOM, deren Aufruf Zufallszahlen liefert. Dennoch kann sie einen Wert zugewiesen bekommen. Dieser Wert dient dann als Startwert, denn ein Computer kennt keinen wirklichen Zufall und ohne verschiedene Startwerte würde der Algorithmus immer die gleichen Zahlenfolgen liefern.

RANDOM=123
echo $RANDOM

2877

echo $RANDOM

20955

echo $RANDOM

3231

Aufruf von Programmen - der Suchpfad $PATH

Programme (im weitesten Sinne) sind ausführbare Dateien bei deren Aufruf bestimmte Funktionalitäten zur Verfügung gestellt werden. In der Bash erfolgt der Aufruf durch Angabe des Pfads der Datei.

pfad/programm (-optionen parameter)

Es kann sich beim "Pfad" wieder um einen "relativen", ausgehend vom aktuellen Verzeichnis
(verzeichnis/programm)
oder einen "absoluten", ausgehend vom Wurzelverzeichnis (/verzeichnis/programm) handeln.

Auch wenn ich direkt im aktuellen Verzeichnis ein Programm aufrufen möchte, muss ich den Pfad angeben - hierbei wird das aktuelle Verzeichnis . benötigt: ./programm

Um das Programm ls, welches sich im Verzeichnis /bin befindet, auszuführen, müsste ich also /bin/ls aufrufen. Warum genügt es aber, nur ls aufzurufen?

Die Antwort ist in der Variablen $PATH gespeichert:

echo $PATH

/usr/local/bin:/usr/bin:/bin:/usr/games

So oder so ähnlich sieht der aktuelle Suchpfad aus. Programme, die in Verzeichnissen liegen, die in dieser durch ":" getrennten Liste aufgeführt sind, können direkt durch Angabe ihres Dateinamens aufgerufen werden. Die Reihenfolge legt fest, wo die Bash zuerst nachsieht. Wird in /usr/local/bin ein Programm des angegebenen Namens gefunden, wird in /usr/bin nicht mehr nachgesehen und ein vorhandenes gleichnamiges Programm bleibt unberücksichtigt.

Anders als die fest belegten Umgebungsvariablen zuvor lässt sich $PATH jedoch verändern. Wir erzeugen zunächst ein neues Verzeichnis in unserem Home-Verzeichnis und integrieren es in den Suchpfad:

mkdir ~/bin
PATH=~/bin:$PATH
echo $PATH

/home/benutzername/bin:/usr/local/bin:/usr/bin:/bin:/usr/games

Wir können jetzt in "~/bin" von uns selbst erstellte Scripts ablegen und sie durch einfachen Aufruf ihres Namens ausführen ... etwas später!
Das Verzeichnis muss nicht unbedingt "bin" heißen, aber es ist eine Konvention, dass ausführbare Dateien in "bin" (binaries) liegen.

Um zu sehen, wie sich das System ohne Suchpfad verhält, können wir $PATH einmal löschen. Um sie nachher nicht wieder neu eingeben zu müssen, speichern wir sie vorher in $Backup:

Backup=$PATH
PATH=
ls

bash: ls: Datei oder Verzeichnis nicht gefunden

Für den Aufruf von ls benötigen wir jetzt tatsächlich den vollen Pfad:

/bin/ls

Rückgängig machen wir das mit unserem Backup:

PATH=$Backup

Wie schon bei Alias besprochen, ist auch die angepasste $PATH nur in dieser Shell verfügbar und auf deren Lebensdauer beschränkt.

Wollen wir ~/bin dauerhaft im Suchpfad haben, müssen wir auch dies in .bashrc eintragen:

nano ~/.bashrc

Fügen wir am Ende einfach diese Zeile hinzu:

PATH=~/bin:$PATH

Achtung: In einigen Systemen ist ein ~/bin-Verzeichnis schon vorgesehen und wird $PATH hinzugefügt, sobald es existiert. Nach dem Anlegen des Verzeichnisses ~/bin sollten wir also ein neues Terminal öffnen und mit echo $PATH überprüfen, ob das Verzeichnis nicht schon im Suchpfad vorhanden ist.

↑ nach oben ↑

Kapitel 5: Umleitungen

Ausgabe in Datei umleiten - > und >>

Manchmal wollen wir die normale Ausgabe nicht am Bildschirm sehen, sondern lieber in eine Datei schreiben.

programm (-optionen parameter) > dateiname

Wir wechseln zunächst wieder in unser Übungsverzeichnis.

cd ~/Bash-Grundkurs

Dort leiten wir die Ausgabe von ls -l in eine Datei um:

ls -l > info.txt

Diese Datei können wir später nach Lust und Laune lesen, ausdrucken, oder einem Freund per Mail schicken. Allerdings funktioniert dieses Verfahren nur mit Programmen, welche die Standardausgabe (die normalerweise auf den Bildschirm druckt) für ihre Ausgabe benutzen.

Den Inhalt der Datei können wir uns mit less ansehen:

less info.txt

insgesamt 8
-r-xr-xr-x 1 benutzername benutzergruppe    0 Mär 27 12:41 datei.txt
-rw-r--r-- 1 benutzername benutzergruppe    0 Mär 27 21:40 info.txt
drwxr-xr-x 2 benutzername benutzergruppe 4096 Mär 27 19:19 Mond
drwxr-xr-x 2 benutzername benutzergruppe 4096 Mär 27 18:52 Saturn
~
~
~

Wir können der Datei auch noch etwas hinzufügen. > überschreibt eine bestehende Datei, >> fügt ihr etwas hinzu:

programm (-optionen parameter) >> dateiname

Das Programm uname gibt Informationen zum Kernel (Betriebssystemkern) aus. Wir fügen diese unserer Datei "info.txt" hinzu:

uname -r >> info.txt

Jetzt sehen wir mit less am Ende der Datei "info.txt" noch die Version des Linux-Kernels.

Fehlerausgabe von normaler Ausgabe trennen

Wir erinnern uns an das Problem mit den angezeigten Fehlermeldungen von find. Wenn wir dem "Umleitungszeichen" eine Ziffer voran stellen, können wir nur normale oder nur Fehlermeldungen umleiten.

Um die  Fehlermeldungen (2) nicht mehr zu sehen, können wir sie in eine ganz spezielle Datei umleiten. "/dev/null" ist ein "schwarzes Loch" und alles, was wir dort hin schreiben, ist unwiederbringlich verschwunden.

find /var -name syslog 2> /dev/null

Wir können aber auch die normalen Ausgaben (1) in eine Datei schreiben und Fehlermeldungen verwerfen:

find /var -name syslog 2> /dev/null 1> syslogpfad.txt

Ein less syslogpfad.txt überzeugt uns, dass nur der Pfad von "syslog" in die Datei geschrieben wurde.

Inhalt einer Datei für die Eingabe nutzen - <

Auch der umgekehrte Weg ist möglich: die Eingaben eines Programmes aus einer Datei entnehmen:

programm < datei

Natürlich geht das nur, wenn das Programm auf Eingaben wartet. Beispiel gefällig?

Beim Überschreiben einer Datei mit cp -i gibt es eine Rückfrage die ja oder nein erwartet.
Wir legen in unserem Übungsverzeichnis eine Datei mit dem Inhalt ja an:

echo ja > input.txt

ja wird hier nicht auf den Bildschirm ausgegeben, wie dies bei echo eigentlich üblich ist, sondern in die Datei "input.txt" geschrieben (siehe oben). Nun wollen wir eine bestehende Datei "datei1.txt" mit "datei2.txt" überschreiben. Zunächst benutzen wir nochmals echo um die beiden Test-Dateien zu erzeugen:

echo "Erste Datei" > datei1.txt
echo "Zweite Datei" > datei2.txt

Anführungszeichen können immer verwendet werden, sind aber nicht notwendig, wenn es sich nur um ein Wort handelt. Nun kopieren wir:

cp -i datei2.txt datei1.txt < input.txt

"datei1.txt" wird ohne Rückfrage überschrieben, das heißt, die Rückfrage kommt schon, aber wir haben sie mit dem Inhalt von "input.txt" bereits beantwortet!

Rohrleitungen zu einem anderen Programm - |

Pipes (engl., Rohrleitungen) leiten den Datenstrom eines Programms an ein anderes weiter. Der Befehl lautet:

programm1 (...) | programm2 (...)

Wir verwenden wieder die Ausgabe von ls -l, leiten aber diesmal an less weiter:

ls -l | less

Das Zeichen | macht die Ausgabe von ls -l zur Eingabe von less.

Auslesen und filtern - cat und grep

Zuletzt noch zu zwei Programmen, die bislang noch gefehlt haben - cat und grep:

cat dateiname

cat liest Dateien bitweise aus und gibt sie auf die Standardausgabe aus. Dies können wir benutzen, um das Ende langer Textdateien anzusehen. Bei log-Dateien interessieren uns häufig vor allem die letzten Einträge und cat spult die Datei bis zum Ende ab.

cat /var/log/syslog

Fehlermeldung bei cat /var/log/syslog:
Die zentralen Log-Dateien dürfen meist nur von Mitgliedern der Gruppe der Administratoren (adm) gelesen werden und man selbst ist wohl nicht dabei. Das ist aber kein Schaden, denn im nächsten Kapitel werden wir uns mit su oder sudo zum "root"-Benutzer machen und auf Gruppenberechtigungen nicht mehr angewiesen sein.
Und von uns gestartete Programme - eventuell nicht-quelloffene Binär-Files mit nicht überprüfbarer Funktionalität - müssen nicht ohne Rückfrage solche Informationen sehen können.

Wenn wir nicht über die Berechtigung zum Lesen von "syslog" verfügen, können wir mit ls -l nachsehen, welche Log-Dateien mit einfacher Benutzerberechtigung gelesen werden können.

ls -l /var/log

insgesamt 7220
-rw-r--r-- 1 root   root      0 Apr  6 07:35 alternatives.log
-rw-r--r-- 1 root   root   9345 Apr  5 17:20 alternatives.log.1
drwxr-xr-x 2 root   root   4096 Apr  5 17:16 apt
-rw-r----- 1 root   adm   33656 Apr 14 13:17 auth.log
-rw-r----- 1 root   adm   44219 Apr  9 07:30 auth.log.1
u.s.w.

Der am Anfang jeder Zeile ausgegebene Berechtigungs-Code sollte in der letzten 3er-Gruppe ein r enthalten, um auch ohne "adm"-Gruppenzugehörigkeit zum Lesen zu berechtigen. Die vermutlich sehr lange Liste können wir auch filtern. Dafür lässt sich grep nutzen:

grep (-optionen) muster dateiname

Man kann grep verwenden, um mit der Standardausgabe eines anderen Befehls als Quelle, Zeilen mit einem bestimmten Muster herauszufiltern und auszugeben.

ls -l /var/log | grep rw-r--r--

Dieser Befehl liefert alle Zeilen, in denen genau dieses Muster vorkommt. Dateien mit geringfügig anderen Berechtigungsmustern entgehen uns so. Wir können aber auch Zeilen ausschließen. Die Option -v liefert uns nur Zeilen, wo das angegebene Muster nicht vorkommt.

ls -l /var/log | grep -v r-----

Damit haben wir alle Dateien ausgeschlossen, die hinter der lesenden Gruppenberechtigung keine weiteren Berechtigungen haben. Trotz deutlicher Einschränkung entgehen uns so keine Log-Files mit allgemeiner Leseberechtigung.

Das Filtern nach dem Muster ----- würde einen Fehler verursachen. Ein einleitendes "-" wird fälschlich als Option interpretiert. Um das zu verhindern, muss entwertet werden - hier mit zwei vorangestellten Rückschrägstrichen.
Beispiel: ls -l /var/log | grep -v \\-----

Häufig wollen wir beim Filtern Ergebnisse ungeachtet von Groß- und Kleinschreibung erhalten. Dafür gibt es die Option -i.

ls -l /var/log | grep -i xorg

-rw-r--r-- 1 root   root 43167 Apr 14 07:35 Xorg.0.log
-rw-r--r-- 1 root   root 35699 Apr 13 08:39 Xorg.0.log.old
... oder so ähnlich

Aber zurück zu cat. Mit cat lassen sich auch mehrere Dateien auf einmal verarbeiten.

cat dateiname dateiname ...

Im Übungsverzeichnis ~/Bash-Grundkurs haben wir genügend Text-Dateien.

cd ~/Bash-Grundkurs
cat datei1.txt datei2.txt

Zweite Datei
Zweite Datei

(Anm.: wir haben zuvor datei1.txt mit datei2.txt überschrieben)

Es können auch wieder Wildcards für beliebige Zeichen verwendet werden. Wir schreiben die Ausgabe von cat in eine neue Datei.

cat *.txt > alle_textdateien.txt

In "alle_textdateien.txt" sind die Inhalte aller zuvor geschriebenen Textdateien zusammengefasst. Mit less könnten wir das anzeigen ... oder mit cat:

cat alle_textdateien.txt

Zweite Datei
Zweite Datei
insgesamt 8
-r-xr-xr-x 1 benutzername benutzergruppe    0 Mär 27 12:41 datei.txt
-rw-r--r-- 1 benutzername benutzergruppe    0 Mär 27 21:40 info.txt
drwxr-xr-x 2 benutzername benutzergruppe 4096 Mär 27 19:19 Mond
drwxr-xr-x 2 benutzername benutzergruppe 4096 Mär 27 18:52 Saturn
4.8.0-2-amd64
ja

So ähnlich wird die Ausgabe aussehen.

Und cat funktioniert nicht nur für Text-Dateien:

cat musik.mp3 > kopie.mp3

wobei "musik.mp3" für eine beliebige mp3-Datei steht. Allerdings dürfen Multimedia-Dateien so normalerweise nicht miteinander verbunden werden!

↑ nach oben ↑

Kapitel 6: Systemadministration

Bisher haben wir uns nur im Wirkungsfeld eines einfachen Benutzers bewegt. Wenn wir an einem System arbeiten, das von einem professionellen Administrator betreut wird, könnten wir es auch dabei belassen. Auf dem eigenen PC müssen wir aber wohl selbst Hand anlegen und uns in den "Superuser" verwandeln.

Der Superuser - su und sudo

Der Administrator heißt auf UNIX-Systemen eigentlich "root" (engl. Wurzel), wird aber von Programmen oft auch als Superuser bezeichnet. Wir könnten uns beim Login gleich als "root" anmelden. Das wird aber nicht empfohlen, denn der Superuser ist sehr mächtig und ganz leicht kann ein kleiner Fehler zur Zerstörung des gesamten Systems führen. Deshalb melden wir uns immer als einfacher Benutzer an und werden nur im Bedarfsfall zum User "root". Das Programm su (switch user) erlaubt uns, die Identität zu wechseln:

su (-) (benutzername)

Ohne Benutzerangabe wird zu "root" gewechselt, was wahrscheinlich auch der häufigste Fall ist. Nach Absetzen des Befehls wird man zur Passworteingabe aufgefordert. Wir müssen das Administratorpasswort, welches wir bei der Installation vergeben haben, eingeben. Bei Ubuntu und auf Ubuntu basierenden Betriebssystemen wird zunächst gar kein Passwort für "root" vergeben und das ist auch nicht vorgesehen. Ubuntu-User können diesen Absatz überspringen und bei sudo fortfahren:

cd ~/Bash-Grundkurs
su -
pwd

/root

Das - sorgt dafür, dass wir eine Login-Shell öffnen, während wir andernfalls nur an Ort und Stelle als "root" weiter arbeiten. Wir erkennen den Unterschied daran, dass wir uns mit su - im Home-Verzeichnis des "root"-Users, also /root und nicht mehr im zuletzt aktiven Verzeichnis wiederfinden.
Wollen wir die Administratorrolle wieder ablegen, beenden wir die "root"-Shell (wie übrigens jede Shell) mit exit:

exit

Wenn wir gerade ein Programm kompiliert haben und unser aktuelles Verzeichnis das entsprechende Programmverzeichnis ist, müssen wir hier auch den Installationsschritt make install setzen und wollen nicht ins Home-Verzeichnis von "root". Hier wechseln wir sinnvollerweise ohne Minus:

cd ~/Bash-Grundkurs
su
pwd

/home/benutzername/Bash-Grundkurs

Ehe wir aber mehr Sicherheit im Umgang mit der Shell erlangt haben, wollen wir noch nicht zum Üben an gobalen Systemdateien herumspielen und ansonst besteht überhaupt kein Unterschied zum normalen User. Wir beenden:

exit

Um etwas mit Administratorrechten ausführen zu können, ohne deshalb wechseln zu müssen, gibt es das Programm sudo. Auf manchen Systemen wird dies allerdings gar nicht installiert sein und ohne ein wenig Erfahrung sollte es vorerst auch nicht nachinstalliert werden. Die folgenden Befehle können auch ohne sudo ausgeführt werden, wenn wir mit su in die Administratorrolle schlüpfen. Bei Ubuntu ist sudo allerdings das Standardmittel zur Administration:

sudo programm (-optionen ...)

Wir setzen vor den jeweiligen Befehl einfach sudo.

cd ~/Bash-Grundkurs

(ohne sudo hier mit su in die Administratorrolle wechseln)

sudo touch rootdatei.txt

Das geforderte Passwort ist diesmal das Benutzerpasswort!

ls -l rootdatei.txt

-rw-r--r-- 1 root root 0 Mär 27 18:40 rootdatei.txt

Die Datei gehört "root", aber auch als normaler Benutzer können wir in unserem Home-Verzeichnis löschen. Dazu erfolgt allerdings wieder eine Sicherheits-Rückfrage.

Ohne Rückfrage entfernen wir sie mit root-Rechten:

sudo rm rootdatei.txt

Nun können wir (auch ohne spezielle Gruppenzugehörigkeit) das System-Logfile "/var/log/syslog" ansehen und vielleicht auch gleich nach "info", "warn" oder "error" filtern.

sudo cat /var/log/syslog
sudo cat /var/log/syslog | grep -i error
sudo cat /var/log/syslog | grep -i warn
sudo cat /var/log/syslog | grep -i info

Die Option -i gewährleistet Treffer unabhängig von Groß- und Kleinschreibung.

Wer mit sudo was machen darf, steuert die Datei /etc/sudoers.

Die Datei /etc/sudoers darf NICHT direkt (mit nanobearbeitet werden!
Ein kleiner Konfigurationsfehler würde verhindern, dass sudo weiter verwendet werden kann und bei Betriebssystemen, auf denen sich kein Administrator anmelden kann (z.B. Ubuntu), würde das zu ernsten Schwierigkeiten führen.
Zur Bearbeitung gibt es "visudo", bei dem eine geänderte Konfiguration zuerst getestet wird, ehe die alte überschrieben wird, aber ich empfehle, /etc/sudoers vorerst unverändert zu verwenden.

↑ nach oben ↑

Kapitel 7: Hilfe!

Das wär's nun schon fast, allerdings gibt es noch einige ganz unverzichtbare Programme, die ich hier vorstellen will:

Programmdokumentationen - man, info und help

Wir haben bislang nur wenige Optionen verwendet und oft ist das auch nicht notwendig. Für gewisse Aufgaben ist es aber unerlässlich, mehr aus den Programmen herauszuholen. Dazu gibt es zu fast jedem Programm eine Dokumentation. Diese kann ich mir mit man (manual) anzeigen lassen kann:

man programmname

Die Dokumentation von ls erhalte ich mit:

man ls

Viele man-Seiten sind auf Deutsch verfügbar und wenigstens bei den grundlegenden Programmen, die wir hier überwiegend besprochen haben, von sehr guter Qualität. Bei spezielleren Programmen aus Fremdquellen kann die man-Seite aber auch unverständlich oder völlig unübersichtlich daherkommen, bzw. gar nicht vorhanden sein. Ein Blick hinein lohnt dennoch fast immer.

Achtung: Um deutschsprachige "manpages" für die hier besprochenen grundlegenden Programme zu bekommen, muss unter Umständen noch ein eigenes Paket (manpages-de) installiert werden.

Alternativ können wir auch info versuchen:

info (programmname)

Beispiel:

info ls

Ohne Programmangabe erhalten wir zunächst eine Übersicht, aus der wir durch auswählen mit dem Cursor und ENTER den gewünschten Eintrag angezeigt bekommen:

info

Etwas einfacher und nur für ganz grundlegenden Programme, die schon anfangs bei jeder Installation verfügbar sind, ist help:

help (programmname)

Es enthält allerdings weniger die bisher überwiegend besprochenen, ständig verwendeten Programme wie cdlsoder cp, sondern beschränkt sich mehr auf Programme, deren Optionen auch der geübtere Anwender nicht im Kopf behält. Die Informationen sind auch bewusst knapp und sollen mehr erinnern als lehren:

help echo

Ohne Programmname aufgerufen, erhalten wir auch hier wieder eine Auflistung verfügbarer Programme (bzw. hier ganze Befehle):

help

Und help gibt es fast bei jeder Shell - sogar der Windows-Shell! Wenn wir also eimal vor einer fremden Shell sitzen und schon den dritten Versuch absolviert haben, der command not found hervorgebracht hat, lohnt praktisch immer ein help, das uns dann mitteilt, welche commands uns denn zur Verfügung stehen.

Die hier erlernten Befehle werden übrigens beinahe unverändert auf allen UNIX-Shells und den meisten anderen Shells in ähnlicher Form (nicht allerdings in der Windows-Shell!) funktionieren!!!

Nun, das war's für den Anfang. Wir beenden mit

exit