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
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).
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.
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:
Besitzer | Gruppe | Andere | |
---|---|---|---|
keine Rechte | --- | --- | --- |
Lesen | r-- | r-- | r-- |
Lesen und Schreiben | rw- | rw- | rw- |
Lesen und Ausführen | r-x | r-x | r-x |
Lesen, Schreiben und Ausführen | rwx | rwx | rwx |
Oder in Zahlen:
Besitzer | Gruppe | Andere | |
---|---|---|---|
keine Rechte | 0 | 0 | 0 |
Lesen | 4 | 4 | 4 |
Lesen und Schreiben | 6 | 6 | 6 |
Lesen und Ausführen | 5 | 5 | 5 |
Lesen, Schreiben und Ausführen | 7 | 7 | 7 |
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.
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.
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
).
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
... 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