Übersicht: [anzeigen]
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.
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 Konkurrent aus Redmond. 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!
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.
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.
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).
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 bezeichnen 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.
bin | initrd.img | lost+found | run | usr |
boot | initrd.img.old | media | sbin | var |
dev | lib | mnt | srv | vmlinuz |
etc | lib32 | proc | sys | vmlinuz.old |
home | lib64 | root | tmp |
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.
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.
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.
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-Grundkurs ausgefü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 mond
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)
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
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
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 alt.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.
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:
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 n oder 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":
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:
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
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 aus. 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.
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
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
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
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. Unter Umständen ist es daher gar nicht erforderlich, den Pfad in .bashrc hinzuzufügen.
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.
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.
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!
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.
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!
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 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 nano) bearbeitet 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.
Das wär's nun schon fast, allerdings gibt es noch einige ganz unverzichtbare Programme, die ich hier vorstellen will:
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 cd, ls oder 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 denn nun 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