Wie kann ich nun in der Shell arbeiten? Den Befehl ls zum auflisten von Verzeichnisinhalt haben Sie in den Basics bereits kennen gelernt. ls kennt als Parameter auch noch -a um auch versteckte Dateien anzuzeigen, so wie -l für eine ausführlichere Anzeige (als Liste inklusive Dateigröße, Dateiberechtigungen, Dateibesitzer etc.). Beide Parameter zusammen können Sie auch so eingeben:

rene@thor:~> ls -la

Pager

Wie kann ich mir nun aber den Inhalt einer einzelnen Datei ansehen? Hierfür gibt es sogenannte Pager. Ein Pager ist ein Anzeigeprogramm für eine Textdatei. Auf fast allen Linuxsystemen finden Sie den Pager less. Geben Sie less datei.txt ein, wird die Datei "datei.txt" im aktuellen Verzeichnis angezeigt. Sie können sich mit den Pfeiltasten, sowie den Tasten Bild nach oben, Bild nach unten, Ende und Pos1 darin bewegen. Mit der taste "q" beenden Sie less wieder. Ein weiterer alternativer Pager ist auch more. more ist in seiner Bedienung einfacher. Man kann zum scrollen im Text nur die Leertaste verwenden. Ist man am Ende angelangt, beendet sich more von selbst. Ein Zurückscrollen ist nicht möglich. less ist daher deutlich komfortabler. Für den schnellen Überblick ist aber auch more interessant. Daneben gibt es zur Anzeige von Textdateien auch noch die Befehle cat, tail und head. cat ist eigentlich kein Pager. Der Befehl gibt einfach den gesamten Inhalt einer Textdatei auf der Standardausgabe wieder, ohne die Möglichkeit des Scrollens. Für sich alleine macht dies keinen Sinn, jedoch ist cat ideal um in einer Pipe mit anderen Befehlen kombiniert zu werden.

head und tail sind gewissermaßen, das Gegenteil voneinander: head gibt nur die ersten 10 Zeilen einer Datei zurück und tail die letzten 10 Zeilen. head dient dazu den Dateityp zu analysieren, der meist aus der Dateibeschreibung in den ersten paar Zeilen ersichtlich ist (denken Sie z. B. an HTML oder XML-Dateien). tail wiederrum kann praktisch sein um Logdateien auszuwerten, von denen man meist nur die letzten paar Zeilen wissen möchte. Möchte man an einer Logdatei die laufenden Veränderungen mitbetrachten, kann man den Parameter -f benutzen. Nun läuft tail in einer Art Schleife und zeigt sofort jede Veränderung am Dateiende an. Die Anzahl der Zeilen, die tail anzeigt kann über den Parameter -n eingestellt werden:

rene@thor:~> tail -n 20 /var/log/kdm.log

Schon bekomme ich die letzten 20 Zeilen der Datei kdm.log, die unter /var/log liegt (kdm ist der Displaymanager des Desktopsystems KDE).

Mit Dateien und Verzeichnissen spielen

Nun, gut wir können uns den Inhalt von Verzeichnissen und Dateien anzeigen lassen, was können wir sonst noch mit den Verzeichnissen und Dateien machen? Wir können Sie anlegen löschen und das Verzeichnis wechseln.

Das Verzeichnis wird mit cd gewechselt. Wer schon mal mit DOS gearbeitet hat, wird den Befehl kennen:

rene@thor:~> cd /etc

Dies wechselt ins Verzeichnis /etc. In /etc befinden sich übrigens Systemweite Konfigurationsdateien. Wieder zurück in unser Homeverzeichnis kommen wir mit:

rene@thor:/etc> cd ~

Wenn Sie nur cd alleine ohne Parameter angeben springen Sie ebenfalls in Ihr Heimatverzeichnis:

rene@thor:/etc> cd

Ebenso möglich:

rene@thor:/etc> cd /home/rene

Was aber mehr zu tippen ist. Wenn Sie / eingeben wird der Pfad immer als absoluter Pfad behandelt. Sind Sie z. B. im Ordner /home/rene/bin und tippen cd /home ein, springen Sie in den Ordner /home und nicht etwa nach /home/rene/bin/home. Möchten Sie jedoch direkt in den Unterordner dessen Namen Sie eingeben lassen Sie das / weg:

rene@thor:~> cd Download
rene@thor:~/Download> _

Mit 2 Punkten kommen Sie in das Verzeichnis, das sich direkt über Ihnen in der Verzeichnishierarchie liegt:

rene@thor:~> cd ..
rene@thor:/home> _

Bitte beachten Sie: Unter DOS könen Sie auch cd.. ohne Leerschritt schreiben. Unter Linux ist dies nicht möglich. Sie können sich jedoch dafür einen Alias festlegen.

Und wenn ich mich nun in meinen Ordnern verlaufen habe? Dafür gibt es den Befehl pwd. Dieser Befehl zeigt Ihnen das aktuelle Verzeichnis an, in dem Sie sich gerade befinden.

Auch die nächsten Befehle werden Ihnen bekannt vorkommen, wenn Sie schon mal mit DOS gearbeitet haben: mkdir legt ein neues Verzeichnis an:

rene@thor:~> mkdir test
rene@thor:~> cd test
rene@thor:~/test> _

Das umgekehrte macht rmdir: Löschen von Verzeichnissen. Dies geht aber nur wenn sie leer sind:

rene@thor:~/test> cd ..
rene@thor:~> rmdir test
rene@thor:~> cd test
bash: cd: test: Datei oder Verzeichnis nicht gefunden

Wie sieht es nun mit Dateien aus? Diese werden mit touch angelegt und mit rm gelöscht:

rene@thor:~> mkdir test
rene@thor:~> cd test
rene@thor:~/test> ls
rene@thor:~/test> touch test
rene@thor:~/test> ls
test
rene@thor:~/test> cd ..
rene@thor:~> rmdir test
rmdir: »test«: Das Verzeichnis ist nicht leer
rene@thor:~> rm test/test
rene@thor:~> ls test
rene@thor:~> rmdir test

Eine ganze Verzeichnishierarchie, also ein Verzeichnis mitsamt seines Inhalts läßt sich durch den Befehl rm -r löschen.

Und was ist mit kopieren und verschieben? Dafür gibt es die Kommandos cp und mv. Mit cp können Sie eine Datei kopieren:

rene@thor:~> cp test.txt /public/Rene

Dies kopiert die Datei test.txt vom aktuellen Verzeichnis in das Verzeichnis /public/Rene (welches bei mir speziell ein Verzeichnis im Netzwerk auf einem Server ist).

Der Befehl mv funktioniert genauso, nur das er nicht kopiert sondern verschiebt. Außerdem kann mit diesem Befehl auch eine Datei umbenannt werden, wenn bei dem Ziel auch gleichzeitig der neue Dateiname angegeben wird:

rene@thor:~> mv test.txt text.txt

Dieser Befehl bennent die Datei test.txt in text.txt um.

Rechte

Auf einem Linuxsystem hat jede Datei und jeder Ordner einen Besitzer und bestimmte Rechte. Daher gibt es auch Befehle, diese Datei-Eigenschaften zu ändern. Hier sind die beiden Befehle chown und chmod das Mittel der Wahl.

Mit chown legen Sie den Besitzer und die Gruppenzugehörigkeit einer Datei fest. Als normaler Benutzer, können Sie mit chown nur die Gruppenzugehörigkeit der Dateien, von denen Sie Besitzer sind verändern und zwar auch nur zu Gruppen hin, in denen Sie selbst Mitglied sind. Einzig und allein der Systembenutzer Root, darf mit chown den Besitzer und die Gruppe einer Datei beliebig verändern.

Was mache ich nun, wenn ich während meiner normalen Arbeit für eine Aktion mal kurz zu Root werden muß? Hierfür gibt es das Kommando su. Mit su kann ich meine Identität wechseln. Gebe ich keinen Benutzernamen hinter su an, wechsle ich automatisch zu Root, ansonsten zu dem angegebenen Benutzer. Danach muß ich natürlich noch das Passwort dieses Benutzers eingeben:

rene@thor:~> su
Password:
thor:/home/rene #

Das Passwort wird bei der Eingabe nicht angezeigt (auch nicht in Form eines *). Wie man sieht hat sich danach auch der Eingabeprompt verändert. Statt des > erscheint nun ein #. Dieses Zeichen soll mich warnen, das ich nun alle Aktionen, die ich ausführe als Root und somit privilegiert ausführe. Als Root kann ich auch Systemdateien löschen und somit dem System schweren Schaden zufügen. Daher ist es auch nicht ratsam dauerhaft als Root zu arbeiten. Mit exit kehre ich wieder zu meiner alten Identität zurück. Wenn ich als Root den Besitzer einer Datei ändern möchte, kann das so aussehen:

rene@thor:~> su
Password:
thor:/home/rene # chown rene:users test.txt

Hinter dem Befehl chown setze ich Benutzername und getrennt durch einen Doppelpunkt die Gruppe des neuen Besitzers. Danach kommt die Datei, auf die sich die Aktion bezieht. Sollte vorher die Datei test.txt z. B. Root gehört haben, so gehört Sie nun rene und der Gruppe users.

Der Befehl chmod verändert die Dateirechte. Es gibt dafür verschiedene Schreibweisen. Beispielsweise kann ich chmod mitteilen welche Rechte entzogen werden sollen oder welche hinzukommen sollen:

rene@thor:~> chmod g+w test.txt

In diesem Fall bekommt die Gruppe zusätzlich das Schreibrecht auf die Datei test.txt. Die Buchstaben u, g, o und a stehen für die Rechteinhaber und r, w und x wie gehabt für die Rechte. Ein + fügt ein Recht hinzu und ein Minus entfernt dieses. Das u steht für den Besitzer der Datei, das g für die Gruppe, das o für alle anderen und das a für alle auf einmal (also u, g und o). Außerdem läßt sich auch ein = verwenden was ausdrückt, daß die Rechte genau so sein sollen, z. B.:

rene@thor:~> chmod g=rw-,o=--- test.txt

Dies setzt für die Gruppe die Rechte rw- und für alle anderen keine Rechte auf die Datei, während die Rechte für den Besitzer unverändert bleiben.

Eine andere Möglichkeit besteht darin den Zahlenwert der Rechte für eine Datei anzugeben:

rene@thor:~> chmod 644 test.txt

Dies setzt die Rechte rw-r--r-- für die Datei test.txt.

Um die Rechte etwas besser zu erklären hier eine kleine Tabelle:

Unix Dateirechte
BesitzerGruppeAndere
keine Rechte---------
Lesenr--r--r--
Lesen und Schreibenrw-rw-rw-
Lesen und Ausführenr-xr-xr-x
Lesen, Schreiben und Ausführenrwxrwxrwx

Oder in Zahlen:

Unix Dateirechte
BesitzerGruppeAndere
keine Rechte000
Lesen444
Lesen und Schreiben666
Lesen und Ausführen555
Lesen, Schreiben und Ausführen777

Der Befehl chmod kann von einem normalen Benutzer für jede Datei deren Besitzer er ist ausgeführt werden. Root kann chmod auf alle Dateien anwenden.

Systemüberwachung

Wie viel freien Festplattenspeicher hat mein System noch? Wie groß ist die momentane Prozessorauslastung? Auch solche Fragen kann die Shell beantworten. Die erste Frage wird sehr einfach durch den Befehl df beantwortet. Der Befehl df listet den Plattenplatz aller gemounteten Datenträger auf:

rene@thor:~> df
Filesystem           1K-Blöcke   Benutzt Verfügbar Ben% Eingehängt auf
/dev/hda3             10079356 5563912   4003432  59% /
/dev/hda1                18998    4333     13684  25% /boot
/dev/hda4             17746284 5760036  11084772  35% /home
tmpfs                   253144       0    253144   0% /dev/shm
artus.maroufi:/public
                       9702956 5635672   4067284  59% /public

In meinem Fall liefert mir df also die Übersicht über die Belegung meiner 3 Festplattenpartitionen und meines Serverlaufwerks im Netzwerk. Hätte ich mein Zip-Diskettenlaufwerk ebenfalls gemountet, würde es auch hier angezeigt werden. Ihnen sind die Zahlen zu unübersichtlich? Dann lassen Sie es sich in Megabyte angeben:

rene@thor:~> df -m
Filesystem           1M-Blöcke   Benutzt Verfügbar Ben% Eingehängt auf
/dev/hda3                 9844      5434      3910  59% /
/dev/hda1                   19         5        14  25% /boot
/dev/hda4                17331      5626     10825  35% /home
tmpfs                      248         0       248   0% /dev/shm
artus.maroufi:/public
                          9476      5504      3972  59% /public

Der Zusatz -m bewirkt die Ausgabe in Megabyte statt Kilobyte.

Die momentane Auslastung des Systems und die rechenintensivsten Prozesse lassen sich mit top anzeigen. Die Liste die top ausgibt wird laufend aktualisiert. Mit q können Sie top wieder verlassen.

Etwas anders funktioniert der Befehl ps. Mit ps erhalten Sie die Liste aller momentanen Prozesse in der aktuellen Shell. Mit ps ax werden alle Prozesse angezeigt (also auch Prozesse die in X oder anderen Shells oder ohne Shell laufen):

rene@thor:~> ps
 PID TTY          TIME CMD
3091 pts/8    00:00:00 bash
4123 pts/8    00:00:00 ps

Wie Sie sehen zeigt ps auch sich selbst als Prozeß an. In der letzten Spalte ist der Name des Prozesses zu sehen und in der ersten die PID, das ist die Prozess-Identität.

Wenn wir nun rabiat werden wollen und einen (eventuell amoklaufenden) Prozeß stoppen wollen, gibt es dafür die beiden Kommandos kill und killall. Bei kill, geben Sie die PID, also die Prozeß-Identität an, während Sie bei killall den Namen des Programms angeben:

rene@thor:~> kill 4123

oder z. B.:

rene@thor:~> killall mozilla-bin

Sowohl killall, als auch kill senden ein bestimmtes Signal an einen Prozeß. Dieses Signal läßt sich über Parameter steuern. Wird kein bestimmtes Signal angegeben, dann wird das Signal SIGTERM gesendet, was ein normales Stop-Signal für den Prozeß ist. Sie können ein anderes Signal über den Parameter -s senden. Mit dem Parameter -l, erhalten Sie eine Liste aller Signale:

rene@thor:~> kill -l

Das Signal SIGKILL, wirkt noch rabiater, als das Signal SIGTERM, da es einen Prozeß einfach abwürgt. Die Signale haben auch Nummern die mit einem Minus davor als Parameter angegeben werden können:

rene@thor:~> kill -9 2345

Das Signal 9 bedeutet SIGKILL. Mit diesem Befehl wird der Prozeß mit der PID 2345 einfach "gekillt".

Vorsicht mit killall! Dieser Befehl hat auf anderen Unixsystemen außerhalb von Linux eine andere Bedeutung und wird beim Herunterfahren des Systems aufgerufen.

Als die beiden letzten Befehle dieser Kategorie möche ich noch die Befehle free und uptime vorstellen. Der Befehl free zeigt die momentane Ausnutzung des Arbeitsspeichers, inklusive des virtuellen Arbeitsspeichers (Swap) an:

rene@thor:~> free
             total       used       free     shared    buffers     cached
Mem:        506288     400076     106212          0      39736     197248
-/+ buffers/cache:     163092     343196
Swap:      1013032          0    1013032

Die Angaben sind in Kilobyte.

Der Befehl uptime zeigt genau das an wie er heißt: Die Zeitdauer wie lange der Rechner ohne Neustart läuft. Außerdem die momentane Uhrzeit, die Zahl der Benutzer und die durchschnittliche Systemlast in den letzten 1, 5 und 15 Minuten.

Benutzerverwaltung

Wo wir gerade bei administrativen Tätigkeiten sind: Eine weitere, auf einem Mehrbenutzersystem wichtige administrative Tätigkeit ist die Benutzerverwaltung. Hierfür stellt die Shell wiederrum verschiedene Kommandos zur Verfügung. Die meisten dieser Kommandos sind selbstverständlich nur für den Benutzer Root ausführbar. Ein neuer Benutzer wird durch den Befehl useradd angelegt:

thor:/home/rene # useradd -m testuser

Dies legt den Benutzer testuser an und auch sein Homeverzeichnis. Der Parameter -m ist für das anlegen des Homeverzeichnisses zuständig. Benutzernamen dürfen keine Sonderzeichen enthalten und dürfen nur aus Kleinbuchstaben und Zahlen bestehen. Zusätzlich kann noch über den Parameter -c der vollständige Name oder ein Kommentar für den Benutzer angelegt werden:

thor:/home/rene # useradd -m -c "Test User" testuser

Mehrere Wörter (wie etwa Vor- und Nachname) müssen dabei in Anführungszeichen gesetzt werden. Der Benutzeraccount ist jetzt jedoch noch nicht aktiv. Dazu muß erst noch ein Passwort zugewiesen werden. Der Befehl für Passwörter lautet passwd:

thor:/home/rene # passwd testuser
Changing password for testuser.
New password:
Bad password: too short
Re-enter new password:
Password changed

Das Passwort wird bei der Eingabe nicht angezeigt. Zur Sicherheit muß die Eingabe des Passworts wiederholt werden. Wie man sieht wird einem als Warnung auch gemeldet, wenn das Passwort gewissen Sicherheitskriterien nicht genügt. Die meisten Systeme sind jedoch so eingestellt, daß sie das Passwort dennoch akzeptieren.

Der Befehl passwd kann von jedem Benutzer aufgerufen werden. Jedoch können normale Benutzer damit nur ihr eigenes Passwort ändern. Lediglich Root kann das Passwort für alle Benutzer ändern. Möchte man sein eigenes Passwort ändern, kann man passwd ohne weitere Parameter aufrufen.

Der Befehl userdel ist das Gegenteil von useradd. Er löscht einen Benutzer. Der Benutzer kann jedoch nur gelöscht werden, wenn er nicht gerade angemeldet ist. Der zusätzliche Parameter -r sorgt dafür, das auch das Homeverzeichnis des Benutzers gelöscht wird:

thor:/home/rene # userdel -r testuser

Daneben gibt es selbstverständlich noch weitere Befehle, wie etwa zum anlegen von Gruppen, die sie allesamt auch in den Manpages nachschlagen können (probieren Sie es mit groupadd, usermod, groupdel, groupmod, newgrp und chsh).

Archivierung

Wenn Sie z. B. ein Programm aus dem Internet heruntergeladen haben, wird dieses meist in einem komprimierten Archiv vorliegen. Wie entpackt man solche Archive und wie erstellt man selber solche Archive? Dateien zu komprimieren ist die Aufgabe von gzip:

rene@thor:~> gzip test.txt

Dieser einfache Befehl macht aus der vormals unkomprimierten Datei test.txt die komprimierte Datei test.txt.gz. Die Endung .gz wird automatisch angehängt. Die Komprimierung von gzip ist meist ein gutes Stück besser als die des Windows-Pendants Zip.

Nun möchten wir unsere Datei aber auch wieder auspacken:

rene@thor:~> gunzip test.txt.gz

Sofort wird die Datei test.txt.gz wieder zur Datei test.txt und ist unkomprimiert. Probieren Sie auch mal gunzip *. Dadurch werden einfach alle *.gz-dateien im aktuellen Verzeichnis entpackt. Die anderen Dateien werden einfach übersprungen.

Sie werden jedoch feststellen, daß Sie auf diese Weise keine Archive mit mehreren Dateien erstellen können. gzip kann immer nur eine Datei packen.

Für diese Aufgabe gibt es tar. tar ist ursprünglich zur direkten Sicherung auf ein Bandlaufwerk gedacht gewesen. Es faßt viele Dateien zu einem Archiv als einzige Datei zusammen. tar kann aber auch verwendet werden um eine Archivdatei auf der Festplatte oder einem anderen Medium zu speichern. Der Parameter c legt ein Archiv an, während x ein Archiv entpackt. Zusätzlich ist auch noch der Parameter f notwendig um tar mitzuteilen, das es um eine Datei und nicht um ein Bandlaufwerk geht:

rene@thor:~> tar cf archiv.tar Documents

Dieser Befehl speichert den gesamten Unterordner Documents, samt aller Dateien darin in das Archiv archiv.tar. Zum auspacken dieses Archives in das aktuelle Verzeichnis können wir:

rene@thor:~> tar xf archiv.tar

eingeben. tar kann jedoch noch mehr: Es ist in der Lage selber komprimierte Archive zu entpacken, bzw. zu erstellen. Dadurch erspart man sich das doppelte Vorgehen, erst zusammenpacken mit tar und dann komprimieren mit gzip:

rene@thor:~> tar xzf neuesprogramm-1.4.7.tar.gz

Dies entpackt das komprimierte Archiv neuesprogramm-1.4.7.tar.gz im aktuellen Verzeichnis. Für das komprimieren, wie auch das entkomprimieren ist der Parameter z zuständig. Wie Sie sehen kann man bei tar das sonst übliche "-" bei den Parametern weglassen.

Was nun wenn ich mir ein Archiv erst mal ansehen will, bevor ich es entpacke? Hiefür gibt es den Parameter t:

rene@thor:~> tar tzf test.tar.gz
test.txt

Und zum Schluß...

... wollen wir das Sytem herunterfahren. Dafür gibt es in der Shell den Befehl shutdown. Dieser Befehl dient sowohl zum Herunterfahren, als auch zum neu Starten. Daher muß man immer noch definieren was man tun möchte: shutdown -h (h, wie halt) für Herunterfahren und shutdown -r (r, wie reboot) für neu Starten. shutdown erwartet jedoch auch noch einen dritten Parameter: Wann soll die Aktion ausgeführt werden?

Linux ist ein Mehrbenutzersystem und es können parallel mehrere Benutzer am System angemeldet sein (auch über Netzwerk). Daher kann man den Zeitpunkt des Herunterfahrens auch um einige Minuten herauszögern um allen Benutzern die Möglichkeit zu geben, ihre Daten vorher noch zu sichern und Ihre Arbeit zu beenden. Daher ist es auch nur als Benutzer root möglich den Befehl shutdown aufzurufen:

rene@thor:~> su
Password:
thor:/home/rene # shutdown -h now

Dieses Kommando fährt den Rechner sofort herunter.

thor:/home/rene # shutdown -r 3

Während in diesem Fall noch 3 Minuten gewartet wird, bis der Rechner neu gestartet wird. Die angemeldeten Benutzer bekommen eine Warnmeldung die Ihnen mitteilt wann der Rechner neu gestartet wird.

Auf manchen Systemen (z. B. so erlebt bei Red Hat) funktioniert der einfache Aufruf von shutdown nicht. In diesem Fall ist das Verzeichnis /sbin nicht im Pfad für ausführbare Programme. Dann muß der komplette Pfad zu dem Befehl angegeben werden:

thor:/home/rene # /sbin/shutdown -h now
Zurück nach oben
Shell mit Kommandoprompt