Unix Grundlagen

Dieses Kapitel ist eine generelle Einführung in die Arbeit auf der Linux-/Unixkommandozeile und Vorraussetzung für fast alle anderen Kapitel. Sollten Sie daher noch nie mit einem Unixartigen Betriebssystem auf der Kommandozeile gearbeitet haben, sollten Sie hier beginnen.

erste Schritte

Unixartige Betriebssysteme wie Linux, BSD oder Solaris haben zwar auch eine grafische Oberfläche, sind aber auch stark mit der Kommandozeile verbunden. Viele Unixserver haben keine grafische Oberfläche installiert und werden vollständig über die Kommandozeile bedient. Das Programm das die Kommandozeile auf Unixsystemen erzeugt und eingegebene Kommandos verarbeitet ist die Shell. Es gibt 2 Wege wie sie die Kommandozeile, bzw. eine Shell aufrufen können: Entweder sie haben sich bereits grafisch eingeloggt, dann können sie ein grafisches Fenster mit einer Shell aufrufen. Hierzu gibt es verschiedene Programme die grafische Shellfenster bieten, wie etwa Xterm, als einfachste fast überall verfügbare Lösung, rxvt, aterm, eterm, Gnome-Terminal oder das Programm "Konsole" aus der KDE Desktop-Umgebung. Die andere Möglichkeiten stellt der direkte Textlogin dar, entweder, wenn keine grafische Oberfläche gestartet ist und nur ein Textlogin-Prompt auf eine Eingabe wartet, oder über ein Netzwerk-Login, z. B. mit SSH.

In beiden Fällen wird man einen Prompt bekommen der z. B. so aussehen könnte:

user@host:~$

oder vielleicht auch einfach nur:

$

Dieser Prompt sagt aus das die Shell bereit ist für Eingaben und kann wie im ersten Fall auch noch ein paar Extra Informationen bereit stellen, wie den Namen des eingeloggten Benutzers und den Hostnamen. Unmittelbar nach dem Prompt tippe ich meine Kommandos ein. Habe ich ein Kommando fertig eingetippt schließe ich die Eingabe mit einem Druck auf die Return-Taste ab, womit das Kommando ausgeführt wird. Sobald das Kommando ausgeführt wurde, erhalte ich meinen Prompt wieder und kann neue Kommandos eingeben. Ein erstes Beipiel für die Eingabe eines Kommandos:

ls

Das Kommando ls listet Dateien in meinem momentanen Arbeitsverzeichnis auf. Was bedeutet momentanes Arbeitsverzeichnis? Wenn ich auf der Shell arbeite befinde ich mich immer in einem Verzeichnis. Beim starten der Shell befinde ich mich als erstes in meinem Heimatverzeichnis. Jeder Benutzer auf einem Unixsystem hat ein Heimatverzeichnis. Das ist das Verzeichnis in dem er Schreibrechte hat und seine eigenen Daten ablegen kann. Häufig liegt dieses Verzeichnis unter /home/benutzername (Linux und BSD) oder /export/home/benutzername (Solaris). Unixverzeichnisse gehen immer von der gemeinsamen Wurzel "/" aus. Laufwerksbuchstaben wie unter Windows, gibt es bei Unix nicht.

Um das Verzeichnis in dem ich mich befinde zu wechseln benutze ich das Kommando cd:

cd /tmp

Mit diesem Kommando wechsle ich in das Verzeichnis /tmp. Bei Pfadangaben z. B. für cd kann ich sowohl absolute Pfade, als auch relative Pfade verwenden. Absolute Pfade fangen immer mit "/" an. Relative Pfade lassen das "/" am Anfang weg und sind immer relativ zu meinem momentanen Arbeitsverzeichnis zu sehen. Befinde ich mich z. B. im Verzeichnis /home/user und es gibt hier ein Unterverzeichnis namens tmp, dann würde mich:

cd tmp

in dieses Unterverzeichnis führen, während mich:

cd /tmp

in das Verzeichnis namens tmp das direkt unter dem Wurzelverzeichnis "/" liegt, führen würde.

cd ..

Dieses Kommando bringt mich relativ eine Verzeichnisebene höher, als das momentane Arbeitsverzeichnis. Die 2 Punkte stehen immer für das übergeordnete Verzeichnis. Bitte beachten Sie, daß Sie nicht cd.. ohne Leerzeichen, wie in DOS verwenden können. Unix versteht nur die Variante mit Leerzeichen cd ...

Eine besondere Bedeutung für Verzeichnisse unter Unix hat noch das Tilde-Symbol: ~. Das Zeichen ~ steht immer für das eigene Heimatverzeichnis. Ein cd ~ bringt mich daher immer automatisch ins Heimatverzeichnis zurück.

Wie kann ich nun feststellen in welchen Verzeichnis ich mich befinde? Sollte dies nicht bereits ohnehin im Prompt als zusätzliche Information stehen, kann ich hierfür das Kommando pwd (für "print working directory") verwenden.

Wichtig zu wissen ist auch das alle Unixsysteme strikt zwischen Groß- und Kleinschreibung unterscheiden. Die drei Befehle cd /tmp, cd /Tmp und cd /TMP sind unterschiedlich und führen in unterschiedliche Verzeichnisse (sofern diese so existieren). Auch der Befehlsname cd selbst muß zwingend in Kleinbuchstaben geschrieben werden.

Online-Hilfe

Die bisherigen Kommandos lassen sich leicht merken, werden oft verwendet und sind einfach zu verwenden. Da es aber nicht bei diesen Grundlegenden Kommandos bleibt und viele Kommandos zusätzliche Parameter kennen, gibt es auf jeden Unixsystem auch eine Online Hilfe die Befehle erklärt: Manpages. Manpages kurz für manual pages, also Handbuchseiten, gibt es für jeden Befehl und zum Teil auch für Konfigurationsdateien oder Spezialdateien. Aufgerufen werden Manpages mit dem Befehl man gefolgt von dem Befehlsnamen zu dem man etwas erfahren will:

man man

Mit diesem Befehl wird die Manpage zu man selbst aufgerufen. In jeder Manpage findet man mehrere Abschnitte: Name, mit dem Namen des Befehls oder der Konfigurationsdatei, Synopsis mit der Syntax aller Optionen für den Befehl, Description mit einer ausführlicheren Beschreibung des Befehls und/oder einer Auflistung aller Optionen mit Ihrer Bedeutung. Manchmal findet sich noch ein Examples Abschnitt mit Beispielen und am Ende gibt es meist noch einen See Also Abschnitt mit Hinweisen auf thematisch verwandte Manpages. Eine aufgerufene Manpage wieder verlassen kann ich mit einem Druck auf q.

Die existierenden Manpages teilen sich außerdem in mehrere Sektionen ein:

SektionBedeutung
1allgemeine Befehle
2Systemaufrufe (für Programmierer)
3Bibliotheksfunktionen (für Programmierer)
4Spezialdateien oder Gerätetreiber
5Dateiformate
6Spiele
7Verschiedenes
8Systemadministrationskommandos
9kernelinterne Routinen

Als normaler Benutzer sind nur die Sektionen 1, 5 und 6 interessant, als Systemverwalter zusätzlich auch noch 4 und 8. Lediglich Programmierer benötigen auch noch 2, 3 und 9. Meistens muß man sich nicht darum kümmern in welcher Sektion eine Manpage sich befindet. Gibt es jedoch den gleichen Namen für eine Manpage in mehreren Sektionen, muß man die Sektion mit angeben. Der Befehl passwd ist z. B. sowohl ein Befehl welcher eine Manpage in der Sektion 1 hat, als auch eine Datei mit einer Manpage in der Sektion 5. Möchte ich also die Manpage für die Datei passwd angezeigt bekommen, muß ich die Sektion vor dem Namen mit angeben:

man 5 passwd

Wie kann ich aber eine Manpage finden, wenn ich den Namen des Befehl gar nicht so genau weiß? man kann auch eine Suche in den Namen und Kurzbeschreibungen aller Manpages durchführen:

man -k suchbegriff

Mit dem Parameter -k sucht man in allen Kurzbeschreibungen von Manpages nach dem Suchbegriff. Parameter sind zusätzliche Optionen die für einen Befehl verwendet werden. Solche Optionen werden in den Manpages zu den Befehlen auch beschrieben und werden meist mit einem Minuszeichen eingeleitet und bestehen entweder aus einem einzelnen Buchstaben oder einem kurzen englischen Wort. Eine alternative Schreibweise für man -k ist auch der Befehl apropos.

Arbeiten mit Dateien

Besonders oft in der Shell benutzte Kommandos sind Kommandos zum kopieren, verschieben und löschen von Dateien oder auch um sich Textdateien anzeigen zu lassen.

cp datei /tmp

Das Kommando cp dient zum kopieren von Dateien. Dabei wird zuerst angegeben welche Datei ich kopieren will und danach in welches Zielverzeichnis. Dabei können auch mehrere Dateien zum kopieren angegeben werden, der letzte Parameter muß dann aber immer ein Zielverzeichnis sein. Möchte man ein Verzeichnis mitsamt Inhalt kopieren, muß zusätzlich der Parameter -R (für rekursiv) mit angegeben werden:

cp -R quellverzeichnis zielverzeichnis

Beim arbeiten in der Shell kann man sich Datei- und Verzeichnisnamen automatisch vervollständigen lassen. Möchte man z. B. tippen:

cp ein-ganz-langer-dateiname /dir

Dann genügt es unter Umständen zu schreiben:

cp ein-ganz

Drücken sie dann die Tab-Taste. Sofern der bisher angegebene Dateiname eindeutig ist, also z. B. nicht noch eine weitere Datei existiert die den Namen "ein-ganz-und-gar-nicht-kurzer-name" hat, dann vervollständigt die Shell den Dateinamen automatisch auf ein-ganz-langer-dateiname. Die Shell kann dies immer machen, sobald ein Dateiname so weit geschrieben wurde, das er für die Shell eindeutig ist.

Mit dem Kommando mv kann man verschieben statt kopieren:

mv quelle ziel

Dies verschiebt die Datei oder das Verzeichnis "quelle" nach "ziel". Dabei darf "quelle" durchaus auch ein Verzeichnis sein ohne das ein extra Parameter mit angegeben werden muß. Auch bei mv kann ich mehrere Quelldateien angeben, der letzte Parameter muß dann wiederrum ein Verzeichnis sein, in das alle angegebenen Dateien oder Verzeichnisse verschoben werden.

mv dient auch dem Umbennen. Umbennen ist eigentlich nichts anderes als ein verschieben ins gleiche Verzeichnis unter neuen Namen:

mv alt neu

Wenn "alt" eine bestehende Datei im momentanen Arbeitsverzeichnis ist und "neu" noch nicht existiert, dann wird "alt" einfach in "neu" umbenannt.

Bei Dateien mit Leerzeichen im Dateinamen muß der Dateiname auf der Shell in Anführungszeichen gesetzt werden. Sonst denkt die Shell es würde sich um mehrere getrennte Dateinamen handeln. Wenn es also eine Datei "meine Datei" im aktuellen Verzeichnis gibt und ich folgenden Befehl ausführe:

mv meine Datei Datendatei

Dann würde nicht etwa "meine Datei" in Datendatei umbenannt werden, sondern mv würde versuchen die beiden nicht existenten Dateien "meine" und "Datei" in das Unterverzeichnis Datendatei zu verschieben, was natürlich fehlschlägt. Korrekt wäre also dieser Befehl:

mv "meine Datei" Datendatei

Zum anlegen neuer Verzeichnisse gibt es den Befehl mkdir:

mkdir meindir

Dieser Befehl legt das neue Unterverzeichnis meindir an. Möchte man einen ganzen Verzeichnispfad mit mkdir auf einmal anlegen, geht dies mit dem Parameter -p:

mkdir -p meindir/unterdir

Dieser Befehl legt sowohl meindir als neues Unterverzeichnis an, als auch darin das Unterverzeichnis unterdir. Würde man das -p weglassen würde unterdir nur dann angelegt werden können, wenn meindir bereits existiert.

Zum löschen läßt sich der Befehl rm verwenden:

rm datei

Dieser Befehl löscht die Datei mit dem Namen "datei". Ein Verzeichnis würde nicht gelöscht werden. Zum Verzeichnis löschen gibt es den Befehl rmdir, der allerdings nur leere Verzeichnisse löscht. Möchte man ein Verzeichnis mitsamt Inhalt und eventuell vorhandenen Unterverzeichnissen löschen, benötigt man den Parameter -r für rm:

rm -r meindir

Dieser Befehl löscht das Verzeichnis meindir inklusive seines gesamten Inhaltes.

Mit dem Befehl cat kann man sich eine oder mehrere Dateien ausgeben lassen. cat steht dabei für concatenate, also aneinanderfügen. cat hat diesen Namen, weil man damit auch mehrere Dateien aneinanderreihen kann. Damit man eine längere Datei im ganzen durchblättern kann ist cat jedoch unpraktisch, da man keine Möglichkeit zum Zurückscrollen hat. Daher gibt es unter Unix auch spezielle Anzeigeprogramme für Textdateien, diese nennt man Pager.

Die 2 meist verbreitetsten Pager sind more und less, die auf fast jeden System vorhanden sind. Auch die Manpages werden in einem Pager angezeigt, daher entspricht die Bedienung der Manpages, der des verwendeten Pagers.

more datei.txt

Dieser Befehl öffnet die Datei datei.txt im pager more. In more kann man mit der Spacetaste seitenweise nach unten blättern und mit der Enter-Taste Zeilenweise nach unten blättern. Auch die Pfeiltasten zum Zeilenweisen nach oben und unten scrollen funktionieren auf den meisten Systemen für more. Ist man am Ende der Datei angekommen, beendet sich more. less hingegen beendet sich am Ende einer Datei nicht, sondern muß über einen Tastendruck auf "q" (wie quit) beendet werden. Auch more läßt sich vor einem Dateiende mit "q" beenden. Ansonsten ist die Bedienung von less weitgehend identisch mit der von more.

Kein Pager aber trotzdem manchmal sehr nützlich zum betrachten von Textdateien ist der Befehl tail. Mit tail kann man sich die jeweils letzten Zeilen einer Textdatei anzeigen lassen. Die Standardeinstellung ist die letzten 10 Zeilen. Dies kann praktisch sein, wenn man sich das Ende einer Logdatei ansehen will um z. B. Fehlern auf die Spur zu kommen. Logdateien werden fortwährend weiter geschrieben, so das sich die neuesten Einträge immer unten befinden.

tail -20 /var/log/messages

In diesem Beispiel lasse ich mir die letzten 20 Zeilen der Logdatei /var/log/messages anzeigen. Gebe ich als Parameter eine Zahl bei tail an, wird diese Zahl als Anzahl der anzuzeigenden Zeilen interpretiert.

Den Befehl ls hatte ich bereits erwähnt. Mit ls kann man sich die Dateien in einem Verzeichnis anzeigen lassen. ls hat aber auch einige interessante Parameter:

ls -a

Der Parameter -a zu ls zeigt mir alle Dateien an, das heißt inklusive versteckter Dateien. Unter Unix sind alle Dateien deren Namen mit einem Punkt beginnt, versteckte Dateien und würden durch ein ls ohne -a nicht angezeigt werden. Versteckte Dateien werden z. B. verwendet um Einstellungen abzuspeichern. Meist befinden sich im Heimatverzeichnis eines Benutzers eine ganze Reihe versteckter Dateien, die Einstellungen zu benutzten Anwendungsprogrammen und ähnliches enthalten. Auch Verzeichnisse deren Name mit einem Punkt beginnt, sind versteckte Verzeichnisse.

ls -F

Der Parameter -F von ls zeigt durch angehängte Symbole die Typen von Dateien an. Dabei steht ein angehängter Schrägstrich z. B. für ein Verzeichnis, ein angehängter Stern für eine ausführbare Datei usw. Dieser Parameter kann also praktisch sein um sofort im Blick zu haben um welche Art von Datei es sich handelt. Einige Versionen von ls, wie etwa das unter Linux verwendete GNU ls, können auch Farben anzeigen um Dateitypen voneinander zu unterscheiden.

ls -l

Der Parameter -l von ls zeigt zu jeder Datei zusätzliche Eigenschaften an und bedarf einer etwas ausführlicheren Erklärung. Die Ausgabe könnte z. B. so aussehen:

-rw-r--r-- 1 rene rene 0 Jun 16 21:45 blabla
-rw-r--r-- 1 rene rene 0 Jun 16 21:45 datei1
-rw-r--r-- 1 rene rene 0 Jun 16 21:45 datei2
drwxr-xr-x 2 rene rene 512 Jun 16 21:46 dir1
drwxr-xr-x 2 rene rene 512 Jun 16 21:46 dir2
-rw-r--r-- 1 rene rene 0 Jun 16 21:45 test

Das erste Zeichen der Ausgabe steht für den Dateityp. Ein - steht für eine normale Datei, ein d für ein Verzeichnis, ein b ist eine Blockgerätedatei, ein c eine Zeichengerätedatei und ein l ein symbolischer Link. Danach kommen 3 mal 3 Zeichen für die Rechte der Datei. Die erste drei Rechte stehen für die Rechte des Besitzers der Datei, die zweiten 3 Rechte für die Rechte der Gruppe der Datei und die dritten 3 Rechte für die Rechte die alle anderen an der Datei haben, die also weder Besitzer sind, noch zur Dateigruppe gehören. Dabei steht r für read, also lesen der Datei, w für write, also schreiben der Datei und x für execute, also ausführen der Datei. Das Ausführen Recht auf Verzeichnissen bedeutet dabei, das man das Verzeichnis betreten darf. Die im Beispiel aufgelisteten Dateien, können also nur vom Besitzer geschrieben werden, aber von allen anderen zumindest gelesen werden. Die nächste Spalte enthält einen Hardlinkzähler. Auf die Bedeutung von symbolischen Links und Hardlinks werde ich erst später eingehen. In der nächsten Spalte steht der Besitzer der Datei (im Beispiel überall rene). Danach steht die Gruppe der Datei, danach die Größe der Datei in Bytes. Die Dateien im Beispiel sind also alles leere Dateien (0 Bytes groß). Als nächstes kommt der Zeitpunkt, wann die Datei das letzte Mal geändert wurde und als letztes schließlich der Dateiname.

Möchte ich mir in der ausführlichen Anzeige zusätzlich auch die versteckten Dateien anzeigen, kann ich natürlich auch die Optionen -a und -l kombinieren. Benutzt man bei Befehlen mehrere Optionen, lassen sich diese meist zusammenziehen. Daher kann man statt ls -l -a auch folgendes schreiben:

ls -la

Rechte

Die Rechte auf Unixsystemen die ls -l anzeigt, bedürfen einer etwas genaueren Erklärung. Hier eine Tabelle mit den Rechten:

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

Bei Dateien sollten diese Rechte selbsterklärend sein. Bei Verzeichnissen bezieht sich das Leserecht auf das Anzeigen des Inhaltes eines Verzeichnisses (ls), das Schreibrecht auf das Anlegen und Löschen von Dateien innerhalb des Verzeichnisses und das Ausführrecht auf das Betreten des Verzeichnisses (cd). Das Schreibrecht auf eine Datei bedeutet das man den Dateiinhalt verändern darf, bezieht sich aber nicht auf das Recht diese auch zu löschen. Das Löschrecht für Dateien wird durch das Schreibrecht auf das Verzeichnis in dem sie liegt festgelegt. Es ist also durchaus möglich, das eine Datei von einem Benutzer zwar verändert werden kann, aber nicht gelöscht werden kann.

Für die Dateirechte gibt es noch eine alternative Schreibweise die darauf beruht das jedes Recht ein gesetztes Bit darstellt. Dadurch ergeben sich 3 mal 3 Bits die gesetzt sein können oder nicht. Stellt man dies als Binärzahl dar wäre rw- z. B. 110. Rechnet man diese Binärzahl wieder in eine Dezimalzahl um erhält man 6. Daher kann man die Rechte rw- auch als 6 darstellen. Die Rechte in Zahlen:

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

Die Rechte rw-r--r-- kann man also auch als 644 schreiben.

Der Befehl um Rechte zu ändern heißt chmod. chmod kann sowohl mit der Zahlenschreibweise von Rechten, als auch mit der symbolischen Schreibweise umgehen:

chmod 640 datei

chmod g+w,o-r datei

Der erste Befehl setzt die Dateirechte für datei auf 640 (rw-r-----), der zweite Befehl fügt für die Gruppe das Schreibrecht hinzu und entzieht gleichzeitig für alle anderen Nutzer das Leserecht. In der symbolischen Schreibweise kann man also außer Rechten exakt setzen, auch Rechte entziehen oder hinzufügen, egal wie die Rechte vorher waren. Dabei steht u für den Benutzer, g für die Gruppe, o für andere und a für alle. Ein + fügt dabei Rechte hinzu, ein - entzieht Rechte und ein = setzt sie exakt so. Einige weitere Beispiele:

chmod u+w,g=r datei

Dieser Befehl fügt das Schreibrecht für den Besitzer hinzu und setzt in jedem Fall das Leserecht für die Gruppe.

chmod a+x datei

Dieser Befehl fügt für alle das ausführen Recht hinzu.

chmod g-w,o-rw datei

Dieser Befehl entzieht der Gruppe das Schreibrecht und allen anderen sowohl das Schreibrecht, als auch das Leserecht.

Eine Besonderheit stellt noch das große X dar:

chmod a+rX datei

Dieser Befehl setzt für alle das Leserecht und nur dann das Ausführrecht wenn es sich entweder um ein Verzeichnis handelt oder wenn bereits ein Teil der Benutzer (z. B. nur der Besitzer) bereits das Ausführrecht haben. Besonders gut kombiniert sich dies mit der Option -R:

chmod -R o+rX dir

Die Option -R steht für das rekursive Durchlaufen eines Verzeichnisbaumes. Der obenstehende Befehl fügt also das Leserecht und auf Verzeichnisse und bereits teilweise ausführbare Dateien auch das Ausführrecht nicht nur für das Verzeichnis dir hinzu, sondern auch für alle Dateien und Unterverzeichnisse unterhalb von dir.

Die Benutzer von Unixsystemen haben also durch dieses System begrenzte Rechte im Dateisystem und dürfen normalerweise nur in Ihrem Heimatverzeichnis und dem temporären Verzeichnis /tmp schreiben und in den meisten anderen Verzeichnissen nur lesen oder nicht mal das. Es gibt jedoch eine Ausnahme von dieser Regel: Den Benutzer root. root ist allmächtig im System und kann jedes Recht brechen. Auch wenn eine Datei von ihren Rechten her nicht mal lesbar wäre für root, kann der Benutzer root dennoch sogar in sie schreiben. Der root Benutzer ist daher als Systemverwalter gedacht. Dieses Benutzerkonto sollte nicht als allgemeines Arbeitskonto für den Systemverwalter benutzt werden sondern nur dann, wenn er auch wirklich administrative Aufgaben am System durchführt. Alle Einstellungen die sich auf Systemfunktionen beziehen und nicht benutzerspezifisch sind, können nur von root gemacht werden. Wenn aber auch der Administrator selbst nicht dauerhaft als root eingeloggt ist, sondern nur einzelne Befehle als root ausführen soll, muß es auch einen Mechanismus geben, durch den man kurzzeitig root-Rechte erlangen kann. Dafür gibt es den Befehl su:

su

Mit diesem Befehl wird man so lange in der aktuellen Shell zu root bis man wieder mit exit zu seinem bisherigen User zurückkehrt. Über den Befehl exit kann man sich als normaler User auch ganz ausloggen.

Der Befehl su fragt nach dem Passwort für root. Manche Unixsysteme sind außerdem so eingeschränkt, das sie es nur Mitgliedern einer bestimmten Gruppe erlauben su zu benutzen um root zu werden. Auf BSD Systemen ist dies beispielsweise die Gruppe wheel. Die meisten Linuxdistributionen verlangen dies jedoch nicht.

Ein Spezialfall ist noch die Linuxdistribution Ubuntu: Unter Ubuntu wird sudo statt su benutzt. Möchte man ein Kommando mit root-Rechten ausführen wird dem Kommando selbst einfach sudo vorangestellt. Dann wird nach dem Benutzerpasswort (nicht dem root-Passwort gefragt) und bei korrektem Passwort der Befehl mit root-Rechten ausgeführt. Ob der Benutzer die Berechtigung dazu hat wird dabei nicht anhand des root-Passwortes (das ja gar nicht erfragt wird) ermittelt, sondern anhand einer Konfigurationsdatei (/etc/sudoers) die dem System mitteilt, welcher User oder welche Gruppe, welche Kommandos mit root-Rechten ausführen darf. Möchte ein Benutzer mehrere Kommandos hintereinander als root ausführen kann er auch sudo -s verwenden um eine root-Shell zu öffnen. Unter Ubuntu können alle Mitglieder der Gruppe admin alle Kommandos per sudo mit root-Rechten ausführen. Mac OS X verwendet ein ähnliches System.

Möchte man das Passwort seines Users ändern, benutzt man passwd:

passwd

passwd fragt dann zunächst nach dem bisherigen Passwort und verlangt dann 2 mal das neue Passwort. Die Eingabe des Passwortes wird dabei nicht am Bildschirm angezeigt.

root kann auch das Passwort für andere Benutzer ändern, indem dem passwd Befehl der Benutzername zusätzlich mitgegeben wird. In diesem Fall ist natürlich nicht das alte Passwort mit anzugeben:

passwd user

Außer den Rechten einer Datei läßt sich natürlich auch der Besitzer ändern:

chown user datei

Mit dem Befehl chown wird der Besitzer von datei auf user geändert. Nur root kann den Besitzer einer Datei ändern, selbst der bisherige Besitzer einer Datei kann eine Datei nicht jemand anderen "vermachen". Rechte hingegen können außer von root auch vom Besitzer einer Datei geändert werden.

Auch chown versteht den Parameter -R zum rekursiven ändern des Besitzers über ganze Verzeichnisebenen hinweg.

Mit chgrp kann man die Gruppe einer Datei ändern:

chgrp testgruppe datei

Dies ändert die Gruppe von datei nach testgruppe. Die Gruppe kann außer von root auch vom Besitzer einer Datei geändert werden, aber nur hin zu einer Gruppe der er selbst angehört. Auch chgrp versteht den Parameter -R zum rekursiven durchlaufen ganzer Verzeichnisbäume.

Editoren

Häufig muß man bei der Arbeit auf einem Unixsystem auch Textdateien bearbeiten, z. B. Konfigurationsdateien. Dazu benötigt man einen Editor. Es gibt Editoren für die grafische Oberfläche, aber wenn man auf der Kommandozeile arbeitet, benötigt man auch hier einen Texteditor. Für unixartige Betriebssysteme gibt es zahlreiche Editoren. Letztendlich muß sich jeder den Editor für sich heraussuchen, der ihm am besten gefällt. Arbeitet man jedoch auf einem fremden System, muß man den Editor nehmen der dort installiert ist. Der Standardeditor aller unixartigen Betriebssysteme ist vi. Irgend eine Variante des vi ist auf fast jedem unixartigen System installiert. Daher ist es gut zumindest grundlegende Kenntnisse im Umgang mit dem vi zu haben auch wenn man sonst lieber einen anderen Editor benutzt. Als Alternative zum vi werde ich noch den vor allem auf Linuxsystemen recht verbreiteten nano vorstellen. Weitere Editoren die man nutzen kann sind z. B. emacs und joe.

vi

Der vi wird von vielen gehaßt, da er sich komplett anders bedient als andere Editoren. Er kennt einen Befehlsmodus und einen Eingabemodus, in denen er sich jeweils anders verhält. Das Umschalten zwischen beiden Modi, ist meist das, was den meisten Leuten Probleme macht. Hat man sich allerdings erst mal richtig an den vi gewöhnt bereitet es einem Schwierigkeiten andere Editoren zu bedienen (so geht es mir).

vi datei

Dieser Befehl startet den vi und lädt die Datei datei. Sollte die Datei "datei" noch nicht existieren, wird sie als neue Datei beim nächsten speichern im vi angelegt. Nach dem Start des vi befindet man sich zunächst im Befehlsmodus. In diesem Modus nimmt der vi alle Tastatureingaben als Befehle entgegen. Möchte man in die Datei etwas schreiben, muß man erst in den Eingabemodus wechseln. Der Wechsel in den Eingabemodus kann durch verschiedene Tastaturkommandos erfolgen, je nachdem wo vom Cursor aus gesehen man losschreiben will. Drückt man a wechselt man in den Einfügemodus indem man hinter die momentane Cursorposition schreiben kann. Mit i wechselt man in den Einfügemodus und schreibt vor die momentane Cursorposition. Mit o wechselt man zum schreiben in die nächste Zeile nach der momentanen Cursorposition. Im Einfügemodus werden alle Tastatureingaben in die Datei geschrieben. Um wieder in den Kommandomodus zu kommen, muß man die Escape-Taste drücken.

Um zu speichern benutzt man ein Doppelpunktkommando: Sobald man im Befehlsmodus den Doppelpunkt gedrückt hat erscheint dieser in der untersten Zeile. Nun lassen sich die Doppelpunktkommandos eingeben. Ein w dient zum speichern, ein q zum verlassen des vi. Diese beiden Befehle lassen sich auch kombinieren: :wq im Befehlsmodus eingegeben speichert das Dokument und verläßt den vi dann.

Innerhalb des vi kann ich die normalen Pfeiltasten zum bewegen im Dokument verwenden, alternativ funktioniert im Befehlsmodus auch die Tasten h, j, k und l um sich links, abwärts, aufwärts und nach rechts zu bewegen. Mit der Taste x kann man im Befehlsmodus einzelne Zeichen löschen. Befehle lassen sich im vi grundsätzlich durch die Angabe einer Zahl auch wiederholen: 3x löscht 3 Zeichen auf einmal. Mit dd wird eine ganze Zeile gelöscht.

Mit dem Doppelpunktbefehl :u läßt sich die letzte Änderung wieder ungeschehen machen. Möchte man den Cursor auf eine bestimmte Zeile setzen, kann man auch die Zeilennummer als Doppelpunktbefehl benutzen: :23 setzt den Cursor auf die Zeile Nr. 23. Mit yy kann eine Zeile kopiert werden. Ein p fügt die Zeile dann nach der aktuellen Cursorposition ein.

Vom vi gibt es mehrere Varianten wie etwa nvi und vim. Diese unterscheiden sich im Funktionsumfang teilweise deutlich. Die obenstehenden Grundlagen zum editieren mit dem vi sind bei allen vi-Varianten gleich. Für weitere Funktionen sollte die Dokumentation zur jeweiligen Variante des vi benutzt werden.

Die jeweiligen vi-Varianten haben auch eine Konfigurationsdatei: Für die meisten vi-Varianten ist dies ~/.exrc, speziell für vim ist dies ~/.vimrc. In dieser Datei lassen sich eigene Tastaturabkürzungen definieren und einige allgemeine Angaben zum Verhalten des vi machen. Sehr praktisch ist z. B. das Anzeigen des momentanen Modus: Mit folgender Zeile in der ~/.exrc läßt sich unten in der Statuszeile anzeigen ob man momentan im Einfügemodus oder im Befehlsmodus ist:

set showmode

Möchte man im vi Zeilennummern anzeigen hilft folgende Zeile in der ~/.exrc:

set number

Diese Befehle können innerhalb des vi auch als Doppelpunktbefehle benutzt werden.

nano

nano kennt keine unterschiedlichen Modi. Tastatureingaben werden direkt geschrieben. Steuerungskommandos sind immer Tastenkombinationen mit der Strg-Taste. Die entsprechenden Tastenkombinationen werden unten in nano angezeigt, nach dem man ihn gestartet hat. Strg+o speichert die Datei. Dabei fragt nano nach dem Dateinamen. Strg+g zeigt eine ausführliche Hilfe innerhalb von nano an. Mit Strg+x kann man nano wieder verlassen.

nano bietet bei weitem nicht so viele Funktionen wie der vi wird von vielen jedoch als angenehmer zu bedienen empfunden.

Herunterfahren

Am Ende möchte ich noch den Rechner herunterfahren. Dafür gibt es das Kommando shutdown. Als Mehrbenutzersystem warnt shutdown auch alle eingeloggten Benutzer, das der Rechner herunter gefahren wird, durch eine Meldung auf dem Terminal jedes eingeloggten Benutzers. Um Benutzern Zeit zu geben ihre Arbeit vor dem Herunterfahren noch zu speichern läßt sich auch eine zeitliche Verzögerung für das Herunterfahren mit shutdown angeben:

shutdown -h +3

Dieses Kommando fährt den Rechner nach 3 Minuten herunter. Die +3 ist die Zeitangabe in Minuten. Möchte man das der Rechner sofort herunter gefahren wird, kann man als Zeitangabe auch "now" verwenden. Der Parameter -h fährt den Rechner einfach herunter. Möchte man rebooten gibt es den Parameter -r:

shutdown -r now

Dieses Kommando rebootet den Rechner sofort. Der Parameter -h fährt den Rechner nur herunter, ohne ihn auszuschalten. Möchte man das der Rechner auch gleich ausgeschaltet wird, gibt es je nach verwendeten Unixsystem meist noch einen weiteren Parameter um dies zu bewirken:

shutdown -P now

shutdown -hp now

Das erste Kommando fährt einen Linuxrechner herunter mit anschließenden Poweroff. Das zweite Kommando macht das selbe auf einem OpenBSD System. Unter Solaris lauten die Parameter für shutdown teilweise wieder ganz anders. Hier sollte die Manpage für die verfügbaren Optionen zu Rate gezogen werden.

Da das Herunterfahren eines Rechners auf einem Mehrbenutzersystem, eine Aktion ist, die alle Benutzer betrifft, kann dies nur mit root-Rechten aufgerufen werden. Der shutdown Befehl muß also entweder als root eingegeben werden, oder manche Systeme haben auch eine spezielle Gruppe die berechtigt ist shutdown aufzurufen (unter OpenBSD z. B. die Gruppe operator).

Literatur

Arnold Robbins: vi-Editor kurz und gut, O'Reilly Verlag 1999.


René Maroufi, dozent (at) maruweb.de
Creative Commons By ND