Inhaltsverzeichnis
Ich denke, ein Computersystem zu erlernen ist wie das Lernen einer neuen Sprache. Obwohl Anleitungen und Dokumentation hilfreich sind, müssen Sie es selbst einüben. Um Ihnen bei einem sanften Start zu helfen, werde ich einige grundsätzliche Dinge hier ausführen.
Das kraftvolle Design von Debian GNU/Linux stammt von dem Unix-Betriebssystem, d. h. einem Multiuser- und Multitasking-Betriebssystem. Sie müssen lernen, die Vorteile aus der Kraft dieser Funktionalitäten und den Ähnlichkeiten zwischen Unix und GNU/Linux zu ziehen.
Scheuen Sie sich nicht, Unix-orientierte Texte zu lesen und stützen Sie sich nicht ausschließlich auf GNU/Linux-orientierte Texte, da Ihnen so viele nützliche Informationen geraubt würden.
![]() |
Anmerkung |
---|---|
Falls Sie bereits irgend ein Unix-ähnliches System für eine Weile mit Befehlszeilenwerkzeugen genutzt haben, wissen Sie möglicherweise bereits alles, was ich hier beschreibe. Bitte nutzen Sie dies als Realitätscheck und zur Auffrischung. |
Nach dem Starten des Systems wird Ihnen ein zeichenbasierter
Anmeldebildschirm präsentiert, sofern Sie nicht das X-Window-System mit einem Displaymanager wie
gdm3
installiert haben. Angenommen Ihr Rechnername ist
foo
, so sieht der Anmeldebildschirm wie folgt aus:
foo login:
Falls Sie eine Umgebung mit grafischer Benutzerschnittstelle (GUI) wie GNOME oder KDE installiert haben, können Sie solch einen Anmeldebildschirm bekommen, indem Sie Strg-Alt-F1 drücken; mit Strg-Alt-F7 kehren Sie zur GUI-Umgebung zurück (mehr dazu unten unter Abschnitt 1.1.6, „Virtuelle Konsolen“).
In dem Anmeldebildschirm geben Sie Ihren Benutzernamen ein,
z.B. penguin
und drücken die Enter-Taste, dann geben Sie
Ihr Passwort ein und drücken nochmals die Enter-Taste.
![]() |
Anmerkung |
---|---|
Folgend der Unix-Tradition ist bei Benutzername und Passwort die Groß- und Kleinschreibung relevant. Im Benutzernamen werden gewöhnlich nur Kleinbuchstaben verwendet. Das erste Benutzerkonto wird normalerweise während der Installation angelegt. Weitere Benutzerkonten können mit adduser(8) durch root erstellt werden. |
Das System startet mit der Grußnachricht, die in
"/etc/motd
" (Message Of The Day, Meldung des Tages)
gespeichert ist, und präsentiert einen Befehls-Prompt.
Debian GNU/Linux jessie/sid foo tty1 foo login: penguin Password: Last login: Mon Sep 23 19:36:44 JST 2013 on tty3 Linux snoopy 3.11-1-amd64 #1 SMP Debian 3.11.6-2 (2013-11-01) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. foo:~$
Hierbei kann der Hauptteil der Grußnachricht über das Editieren der Datei
"/etc/motd.tail
" angepasst werden. Die erste Zeile wird
aus den Systeminformationen mittels "uname -snrvm
"
erzeugt.
Jetzt sind Sie in der Shell. Die Shell interpretiert die Befehle, die Sie eingeben.
Falls bei Ihnen das X-Window-System mit
einem Displaymanager wie GNOMEs
gdm3
installiert ist, weil Sie während der Installation
die Programmgruppe "Arbeitsplatzumgebung" (Desktop environment) ausgewählt
haben, bekommen Sie nach dem Systemstart einen grafischen
Anmeldebildschirm. Geben Sie Ihren Benutzernamen und Ihr Passwort ein, um
sich mit dem unprivilegierten Benutzerkonto anzumelden. Verwenden Sie dabei
die TAB-Taste, um zwischen Benutzername und Passwort zu wechseln, oder
benutzen Sie die Maus.
Unter X bekommen Sie eine Shell-Eingabeaufforderung, indem Sie einen
X-Terminal-Emulator
wie
gnome-terminal(1),
rxvt(1)
oder
xterm(1)
starten. In der GNOME-Arbeitsplatzumgebung kommen Sie per Klicken auf
"Anwendungen" → "Systemwerkzeuge" → "Terminal" zum Ziel.
Lesen Sie auch unten den Abschnitt 1.1.6, „Virtuelle Konsolen“.
Bei einigen anderen Arbeitsplatz-Umgebungen (wie fluxbox
)
gibt es möglicherweise keine offensichtliche Möglichkeit, um ein Menü zu
bekommen. Falls dies passiert, versuchen Sie einfach einen Rechtsklick auf
den Desktop-Hintergrund und hoffen darauf, dass ein Menü erscheint.
Das root-Benutzerkonto wird auch Superuser oder privilegierter Benutzer genannt. Mit diesem Benutzerkonto können Sie die folgenden Aufgaben zur Systemadministration erledigen:
Lesen, schreiben und löschen aller Dateien auf dem System unabhängig von deren Zugriffsrechten
Setzen von Eigentümer und Zugriffsrechten jeglicher Dateien auf dem System
Setzen des Passworts von jedem unprivilegierten Benutzer auf dem System
Anmeldung an jedem Benutzerkonto ohne deren Passwort
Diese uneingeschränkte Kraft des root-Benutzerkontos erfordert von Ihnen, dass Sie sich besonnen und verantwortungsvoll verhalten, wenn Sie es benutzen.
![]() |
Warnung |
---|---|
Teilen Sie das root-Passwort nie anderen mit. |
![]() |
Anmerkung |
---|---|
Dateizugriffsrechte einer Datei (inklusive Hardware-Geräte wie CD-ROM usw., die auf einem Debian-System nichts anderes wie eine Datei sind) können sie für nicht-root-Benutzer unbenutzbar machen. Obwohl die Verwendung des root-Benutzerkontos ein schneller Weg ist, solche Situationen zu testen, sollte die Lösung über eine korrekte Einstellung der Datei-Zugriffsrechte und die Mitgliedschaft des Benutzers in entsprechenden Gruppen führen (siehe dazu Abschnitt 1.2.3, „Dateisystem-Berechtigungen“). |
Hier ein paar grundlegende Methoden, um mittels root-Passwort eine root-shell-Eingabeaufforderung zu erhalten:
Geben Sie root
im zeichenbasierten Anmeldebildschirm ein.
Innerhalb der GNOME-Arbeitsplatz-Umgebung klicken Sie auf "Anwendungen" → "Zubehör" → "Root Terminal".
Tippen Sie in jeglicher Benutzer-Shell-Eingabeaufforderung "su
-l
" ein.
Dies behält NICHT die Umgebung des derzeitigen Benutzers bei.
Tippen Sie in jeglicher Benutzer-Shell-Eingabeaufforderung
"su
" ein.
Dies behält teilweise die Umgebung des derzeitigen Benutzers bei.
Wenn sich über Ihr Arbeitsplatz-Menü keine GUI-Systemadministrations-Werkzeuge automatisch mit den benötigten Rechten starten lassen, können Sie diese von der root-shell-Eingabeaufforderung aus starten, wie z.B. von gnome-terminal(1), rxvt(1) oder xterm(1). Lesen Sie dazu Abschnitt 1.1.4, „Die root-shell-Eingabeaufforderung“ und Abschnitt 7.8.4, „Running X clients as root“.
![]() |
Warnung |
---|---|
Starten Sie niemals das X-Display/den Sitzungsmanager über das
root-Benutzerkonto, indem Sie |
![]() |
Warnung |
---|---|
Lassen Sie niemals vertrauensunwürdige GUI-Programme mit Fernanbindung in einem X-Window laufen, wenn dort kritische Daten angezeigt werden, da diese Programme Ihren grafischen Bildschirminhalt abgreifen können. |
In einem Standard-Debian-System sind sechs VT100-ähnliche zeichenbasierte Konsolen verfügbar,
zwischen denen Sie hin und her schalten können, und in denen die
Befehls-Shell direkt auf dem Linux-Host ausgeführt werden kann. Solange Sie
sich nicht in einer GUI-Umgebung befinden, können Sie zwischen den
virtuellen Konsolen umschalten, indem Sie die Linke
Alt-Taste
gleichzeitig mit einer der Tasten F1
— F6
drücken. Jede zeichenbasierte Konsole erlaubt eine
eigenständige Anmeldung mit einem Benutzerkonto und bietet eine
Mehrbenutzer-Umgebung. Diese Mehrbenutzer-Umgebung ist eine tolle
Unix-Funktionalität und macht sehr leicht süchtig.
Wenn Sie sich in einer X-Window-Umgebung befinden, können Sie Zugang zur
zeichenbasierten Konsole 1 bekommen, indem Sie
Strg-Alt-F1
drücken, d.h. die linke
Strg-Taste
, die linke Alt-Taste
und die
F1-Taste
gleichzeitig drücken. Sie können zum
X-Window-System zurück gelangen, das normalerweise auf der virtuellen
Konsole 7 läuft, indem Sie Alt-F7
drücken.
Alternativ können Sie auch von der Befehlszeile aus zu einer anderen virtuellen Konsole wechseln, z.B. zur Konsole 1:
# chvt 1
Drücken Sie Strg-D
, also die linke
Strg-Taste
und die d-Taste
gleichzeitig, in der
Eingabeaufforderung, um die Shell-Aktivitäten zu beenden. Wenn Sie sich auf
der zeichenbasierten Konsole befinden, kehren Sie hiermit zum
Anmeldebildschirm zurück. Obwohl bei diesen Steuerzeichen von "control D"
mit großem D gesprochen wird, müssen Sie hier nicht die Umschalt-Taste
drücken. Auch die kurze Ersetzung ^D
wird für
Strg-D
benutzt. Alternativ können Sie auch "exit"
eingeben.
Wenn Sie sich in einem
X-Terminal-Emulator(1)
befinden, können Sie hiermit das
X-Terminal-Emulator
-Fenster schließen.
Wie jedes andere moderne Betriebssystem, bei dem Dateioperationen das Zwischenspeichern (Caching) beinhalten, um die Performance zu erhöhen, erfordert auch das Debian-System eine Prozedur zum sauberen Herunterfahren, bevor die Energie sicher abgeschaltet werden kann. Dies dient dazu, die Integrität der Dateien aufrecht zu erhalten, indem alle Änderungen im Speicher auf die Platte geschrieben werden. Falls Energiekontrolle per Software verfügbar ist, wird im Rahmen des Herunterfahrens die Spannung automatisch abgeschaltet. (Andernfalls müssen Sie den Ein-/Ausschaltknopf mehrere Sekunden gedrückt halten, nachdem das Herunterfahren abgeschlossen ist).
Sie können das System im normalen Mehrbenutzermodus auf der Befehlszeile herunterfahren:
# shutdown -h now
Sie können das System im Einzelbenutzermodus auf der Befehlszeile herunterfahren:
# poweroff -i -f
Alternativ, können Sie Strg-Alt-Entf
drücken (die
linke-Strg-Taste
, die linke-Alt-Taste
und die Entf-Taste
gleichzeitig), um das System
herunterzufahren, falls "/etc/inittab
" folgendes enthält:
"ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h
now
". Details dazu finden Sie unter
inittab(5).
Lesen Sie auch Abschnitt 6.9.6, „How to shutdown the remote system on SSH“.
Wenn der Bildschirm verrückt spielt, nachdem Sie lustige Dinge wie
"cat <some-binary-file>
" gemacht haben, geben Sie
"reset
" an der Eingabeaufforderung ein. Sie können den
Befehl möglicherweise nicht sehen, während Sie ihn eingeben. Mit
"clear
" können Sie bei Bedarf auch den Bildschirm
leerräumen.
Obwohl selbst die Minimal-Installation eines Debian-Systems ohne jegliche
Arbeitsplatz-Umgebung die grundlegenden Unix-Funktionalitäten bietet, ist es
eine gute Idee, mittels
apt-get(8)
einige Befehlszeilen- und curses-basierte Zeichen-Terminal-Pakete zusätzlich
zu installieren, wie z.B. mc
und vim
;
Anfänger können dazu für einen ersten Versuch folgendes verwenden:
# apt-get update ... # apt-get install mc vim sudo ...
Falls Sie diese Pakete bereits installiert haben, werden keine neuen Pakete installiert.
Tabelle 1.1. Liste interessanter Textmodus-Programm-Pakete
Paket | Popcon | Größe | Beschreibung |
---|---|---|---|
mc
|
V:87, I:236 | 1292 | Ein Textmodus-Dateimanager mit Vollbildschirm-Ansicht |
sudo
|
V:374, I:763 | 2472 | Ein Programm, das Benutzern eingeschränkte root-Privilegien einräumt |
vim
|
V:150, I:378 | 2006 | Unix Texteditor Vi IMproved, ein Texteditor für Programmierer (Standardversion) |
vim-tiny
|
V:99, I:962 | 931 | Unix Texteditor Vi IMproved, ein Texteditor für Programmierer (Kompaktversion) |
emacs23
|
V:46, I:98 | 13103 | Emacs vom GNU-Projekt, der Lisp-basierte erweiterbare Texteditor (Version 23) |
w3m
|
V:256, I:882 | 2076 | Textmodus-WWW-Browser |
gpm
|
V:19, I:31 | 500 | Unix-ähnliches Kopieren-und-Einfügen auf der Textkonsole (Daemon) |
Es könnte eine gute Idee sein, einiges an informativer Dokumentation zu lesen.
Tabelle 1.2. Liste informativer Dokumentationspakete
Paket | Popcon | Größe | Beschreibung |
---|---|---|---|
doc-debian
|
I:864 | 142 | Dokumentation des Debian-Projekts, (Debian FAQ) und andere Dokumente |
debian-policy
|
I:92 | 3664 | Debian Policy-Handbuch und zugehörige Dokumente |
developers-reference
|
I:9 | 1179 | Richtlinien und Informationen für Debian-Entwickler |
maint-guide
|
I:7 | 765 | Leitfaden für neue Debian-Betreuer |
debian-history
|
I:2 | 4625 | Vergangenheit des Debian-Projekts |
debian-faq
|
I:836 | 1288 | Debian FAQ |
sysadmin-guide
|
I:1 | 964 | Das Handbuch für Linux-Systemadministratoren |
Sie können einige dieser Pakete installieren, indem Sie folgendes eingeben:
# apt-get install paketname
Falls Sie Ihr Haupt-Benutzerkonto nicht für die folgenden
Trainingsaktivitäten nutzen möchten, können Sie mit folgendem Befehl ein
Trainings-Benutzerkonto erstellen, hier z.B. fish
:
# adduser fish
Beantworten Sie alle Fragen.
Dadurch wird ein neues Konto namens fish
erstellt. Nach
Ihren Übungen können Sie dieses Benutzerkonto und das dazugehörige
Heimatverzeichnis entfernen, indem Sie folgendes verwenden:
# deluser --remove-home fish
Für ein typisches Einzelbenutzer-Arbeitsplatzsystem wie ein
Debian-Desktop-System auf einem Laptop ist es gängig, eine einfache
Konfiguration für
sudo(8)
wie folgt einzurichten, um dem nicht-privilegierten Benutzer,
z.B. penguin
, lediglich mit dessen Benutzer-Passwort,
aber ohne das root-Passwort, administrative Privilegien zu verschaffen:
# echo "penguin ALL=(ALL) ALL" >> /etc/sudoers
Alternativ dazu ist es auch verbreitet, dem nicht-privilegierten Benutzer,
hier penguin
, wie folgt administrative Privilegien ohne
irgendein Passwort zu gewähren:
# echo "penguin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Dieser Trick sollte nur für einen Einzelbenutzer-Arbeitsplatz angewandt werden, den Sie selbst administrieren und auf dem Sie der einzige Benutzer sind.
![]() |
Warnung |
---|---|
Richten Sie keine Benutzerkonten regulärer Benutzer auf Mehrbenutzersystemen derartig ein, da dies sehr schlecht für die Systemsicherheit wäre. |
![]() |
Achtung |
---|---|
Das Passwort und Benutzerkonto von |
![]() |
Achtung |
---|---|
Administrative Rechte in diesem Zusammenhang gehören zu jemandem, der berechtigt ist, Systemadministrationsaufgaben auf dem Arbeitsplatzsystem auszuführen. Gewähren Sie niemals einem Manager in der Administrationsabteilung Ihrer Firma oder Ihrem Chef derartige Privilegien, außer diese sind dazu autorisiert und befähigt. |
![]() |
Anmerkung |
---|---|
Um Leuten Zugriffsrechte auf limitierte Geräte und Dateien zu verschaffen, sollten Sie die Verwendung von group in Betracht ziehen, um eingeschränkte Rechte einzurichten, statt die root-Privilegien via sudo(8) dafür zu nutzen. |
![]() |
Anmerkung |
---|---|
Mit einer durchdachteren und vorsichtigeren Konfiguration kann sudo(8) auf einem System, das Sie sich mit mehreren Leuten teilen, limitierte administrative Rechte einräumen, ohne dass Sie anderen das root-Passwort mitteilen müssen. Dies kann Ihnen auf Systemen helfen, wo Sie sich die Verantwortung mit mehreren Administratoren teilen, so dass Sie sagen können, wer was gemacht hat. Auf der anderen Seite möchten Sie vielleicht nicht, dass irgendjemand sonst solche Privilegien hat. |
Jetzt sind Sie soweit, dass Sie mit dem Debian-System ohne Risiko herumspielen können, solange Sie das nicht-privilegierte Benutzerkonto verwenden.
Das liegt daran, dass sogar nach einer Standardinstallation Ihr Debian-System mit korrekten Dateiberechtigungen konfiguriert ist, die verhindern, dass nicht-privilegierte Benutzer das System beschädigen. Natürlich könnte es immer noch einige Lücken geben, die ausgenutzt werden können, aber diejenigen, die sich darüber Sorgen machen, sollten nicht dieses Kapitel lesen, sondern die Anleitung zum Absichern von Debian (Securing Debian Manual).
Wir lernen das Debian-System mit folgenden Aspekten eines Unix-ähnliches Systems kennen:
Abschnitt 1.2, „Unix-ähnliches Dateisystem“ (Basiskonzept)
Abschnitt 1.3, „Midnight Commander (MC)“ (Überlebensmethode)
Abschnitt 1.4, „Die grundlegende Unix-ähnliche Arbeitsumgebung“ (Basismethode)
Abschnitt 1.5, „Der einfache Shell-Befehl“ (Shell-Mechanismen)
Abschnitt 1.6, „Unix-artige Textverarbeitung“ (Textverarbeitungsmethode)
In GNU/Linux und anderen Unix-ähnlichen
Betriebssystemen sind Dateien in Verzeichnissen organisiert. Alle Dateien und
Verzeichnisse sind in einem großen Verzeichnisbaum unterhalb von
"/
" eingeordnet. Dies wird Baum genannt, weil das
Dateisystem, wenn Sie es aufmalen, wie ein Baum aussieht, nur dass er auf
dem Kopf steht.
Diese Dateien und Verzeichnisse können auf mehrere Geräte verteilt
sein.
mount(8)
dient dazu, Dateisysteme, die auf anderen Geräten erkannt werden, in den
großen Verzeichnisbaum einzubinden. Umgekehrt dient
umount(8)
dazu, es wieder daraus zu entfernen. Auf aktuellen Linux-Kernel kann
mount(8)
mit bestimmten Optionen Teile des Verzeichnisbaums zusätzlich an anderer
Stelle anknüpfen oder ein Dateisystem als geteilt, privat, slave oder
nichtverknüpfbar einbinden. Unterstützte mount-Optionen für jeden
Dateisystemtyp sind in
"/share/doc/linux-doc-*/Documentation/filesystems/
"
verfügbar.
Verzeichnisse auf Unix-Systemen werden
unter einigen anderen Betriebssystemen Ordner genannt. Bitte beachten Sie auch, dass es
auf einem Unix-System kein Konzept für Laufwerke wie "A:
" gibt. Es gibt
ein Dateisystem, und dort ist alles enthalten. Dies ist ein gewaltiger
Unterschied verglichen mit Windows.
Hier einige Grundlagen zu Dateien unter Unix:
Bei Dateinamen ist Groß-/Kleinschreibung immer
relevant. Das heißt, "MEINEDATEI
" und
"MeineDatei
" sind zwei unterschiedliche Dateien.
Das Wurzel-Verzeichnis (root) bedeutet
Wurzel des Dateisystems und wird einfach als "/
"
dargestellt. Verwechseln Sie dies nicht mit dem Heimatverzeichnis des
root-Benutzers "/root
".
Jedes Verzeichnis hat einen Namen, der jegliche Buchstaben oder Symbole
außer "/
" enthalten
kann. Das Wurzelverzeichnis root ist eine Ausnahme; dessen Name ist
"/
" (ausgesprochen "slash" oder "das root-Verzeichnis")
und es kann nicht umbenannt werden.
Jede Datei oder Verzeichnis ist über einen voll qualifizierten Dateinamen, absoluten Dateinamen oder Pfad gekennzeichnet, der die Abfolge der Verzeichnisse enthält, die zu dessen Erreichen passiert werden müssen. Die drei oben angegebenen Ausdrücke sind alle gleichbedeutend.
Alle voll qualifizierten Dateinamen
beginnen mit dem "/
"-Verzeichnis, und zwischen jedem
Verzeichnis oder Datei ist ein weiteres "/
". Das erste
"/
" ist das Wurzelverzeichnis, und die anderen
"/
" sind jeweils Trenner zwischen den einzelnen
Unterverzeichnissen, bis der letzte Eintrag erreicht ist, was der Name der
eigentlichen Datei ist. Die Wörter, die hier verwendet werden, können
verwirrend sein. Nehmen Sie den folgenden voll
qualifizierten Dateinamen als Beispiel:
"/usr/share/keytables/de.map.gz
". Allerdings sprechen die
Leute von "de.map.gz
" alleine als Dateiname.
Das Wurzelverzeichnis enthält eine Anzahl von Abzweigungen, wie
"/etc/
" und "/usr/
". Diese
Unterverzeichnisse haben wiederum nochmals weitere Abzweigungen,
z. B. "/etc/init.d/
" und
"/usr/local/
". Das Ganze komplett betrachtet wird als
Verzeichnisbaum bezeichnet. Sie können
den absoluten Dateinamen als Route vom Grund des Baums
("/
") zu dessen Ende einer Abzweigung (einer Datei)
betrachten. Manchmal hören Sie auch, wie Leute vom Verzeichnisbaum reden,
als wäre es ein Familien-Stammbaum, der
alle direkten Nachkommen einer einzigen Figur (genannt das Wurzelverzeichnis
"/
") einschließt: demzufolge haben die Unterverzeichnisse
Eltern, und ein Pfad zeigt die
vollständige Herkunft einer Datei. Es gibt auch relative Pfade, die irgendwo
beginnen (nicht beim Wurzelverzeichnis). Sie sollten dabei in Erinnerung
behalten, dass "../
" immer das jeweils übergeordnete
Verzeichnis (Eltern-Verzeichnis) bezeichnet. Diese Bezeichnungsweise gilt
auch für andere Strukturen, die dem Verzeichnisbaum ähnlich sind, wie
hierarchische Datenstrukturen.
Es gibt keine spezielle Verzeichnispfad-Namenskomponente, die einem
physikalischen Gerät, wie einer Festplatte, entspricht. Dies unterscheidet
sich von RT-11, CP/M,
OpenVMS, MS-DOS,
AmigaOS und Microsoft Windows, wo der Pfad einen
Gerätenamen wie "C:\
" enthält. (Allerdings existieren
Verzeichniseinträge, die sich als Teil des normalen Dateisystems auf
physikalische Geräte beziehen. Siehe dazu Abschnitt 1.2.2, „Dateisystem-Internas“.)
![]() |
Anmerkung |
---|---|
Obwohl Sie nahezu alle Buchstaben oder Symbole in einem Dateinamen verwenden
können, ist es in der Praxis eine
schlechte Idee, dies zu tun. Es ist besser, alle Zeichen zu vermeiden, die
auf der Befehlszeile oft eine spezielle Bedeutung haben, darunter
Leerzeichen, Tabulatoren, Newlines, und andere spezielle Zeichen wie
|
![]() |
Anmerkung |
---|---|
Das Wort "root" kann entweder "root-Benutzer" oder "root-Verzeichnis" (Wurzelverzeichnis) bedeuten. Der Zusammenhang bei der Verwendung sollte die Bedeutung deutlich machen. |
![]() |
Anmerkung |
---|---|
Das Wort Pfad wird nicht nur wie oben für voll qualifizierte Dateinamen verwendet, sondern auch für den Befehls-Suchpfad. Die gewünschte Bedeutung erschließt sich für gewöhnlich aus dem Zusammenhang. |
Detaillierte bewährte Methoden für die Dateihierarchie sind im Filesystem
Hierarchy Standard beschrieben
("/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz
" und
unter
hier(7)).
Sie sollten die folgenden Fakten als Ansatzpunkt nehmen.
Tabelle 1.3. Auflistung der Verwendung von wichtigen Verzeichnissen
Verzeichnis | Verwendung des Verzeichnisses |
---|---|
/
|
das Wurzelverzeichnis (root-Verzeichnis) |
/etc/
|
systemweite Konfigurationsdateien |
/var/log/
|
System-Protokolldateien |
/home/
|
die Heimatverzeichnisse aller nicht-privilegierten Benutzer |
Gemäß der Unix-Tradition stellt das
Debian GNU/Linux-System ein Dateisystem
bereit, unterhalb dessen alle physikalischen Daten auf Festplatten und
anderen Speichermedien liegen; alles für das Zusammenspiel mit
Hardware-Geräten wie Konsolenbildschirmen und von fern zugreifenden
seriellen Konsolen benötigte wird in vereinheitlichter Art und Weise
unterhalb von "/dev/
" repräsentiert.
Alle Dateien, Verzeichnisse, benannten Pipes (named pipes; ein Verfahren,
mit dem zwei Progamme Daten austauschen können) oder physikalischen Geräte
auf einem Debian GNU/Linux-System haben eine Datenstruktur, Inode genannt, die die mit ihr verbundenen Attribute
beschreibt, wie der Benutzer, der deren Eigentümer (owner) ist, die Gruppe,
der sie angehören, der Zeitpunkt des letzten Zugriffs usw. Wenn Sie wirklich
Interesse daran haben, finden Sie in
"/usr/include/linux/fs.h
" die genaue Definition von
"struct inode
" im Debian GNU/Linux-System. Die Idee,
nahezu alles im Dateisystem darzustellen, war eine Unix-Innovation, und
moderne Linux-Kernel haben diese Idee sogar noch weiterentwickelt. Jetzt
kann man sogar Informationen über die Prozesse, die auf dem Computer laufen,
im Dateisystem finden.
Die abstrakte und vereinheitlichte Abbildung von physikalischen Datensätzen und internen Prozessen ist sehr leistungsfähig, da sie es uns erlaubt, für die gleiche Funktion auf vielen total unterschiedlichen Geräten denselben Befehl zu verwenden. Es ist sogar möglich, die Art und Weise, wie der Kernel arbeitet, zu verändern, indem man Daten in spezielle Dateien schreibt, die mit laufenden Prozessen verbunden sind.
![]() |
Tipp |
---|---|
Falls Sie das Zusammenwirken zwischen dem Verzeichisbaum und den physikalischen Datensätzen bestimmen müssen, führen Sie mount(8) ohne Argumente aus. |
Dateisystem-Berechtigungen auf Unix-ähnlichen Systemen werden für drei Kategorien beteiligter Benutzer festgelegt.
Der Benutzer (user), der Eigentümer der Datei ist (u)
Andere Benutzer der Gruppe (group), zu der die Datei gehört (g)
Alle anderen (other) Benutzer (o), auch "world" (Welt) oder "everyone" (jeder) genannt.
Für die Datei erlaubt jede zugehörige Berechtigung die folgenden Aktionen:
Die Lese-Berechtigung (read) (r) erlaubt dem Rechteinhaber, den Inhalt der Datei zu betrachten.
Die Schreib-Berechtigung (write) (w) erlaubt dem Rechteinhaber, die Datei zu verändern.
Die Ausführungs-Berechtigung (execute) (x) erlaubt dem Rechteinhaber, die Datei als Befehl auszuführen.
Für das Verzeichnis erlaubt jede zugehörige Berechtigung die folgenden Aktionen:
Die Lese-Berechtigung (read) (r) erlaubt dem Rechteinhaber, den Inhalt des Verzeichnisses aufzulisten.
Die Schreib-Berechtigung (write) (w) erlaubt dem Rechteinhaber, Dateien zu dem Verzeichnis hinzuzufügen oder Dateien zu löschen.
Die Ausführungs-Berechtigung (execute) (x) erlaubt dem Rechteinhaber, auf Dateien in dem Verzeichnis zuzugreifen.
Hierbei bedeutet die Ausführungs-Berechtigung für ein Verzeichnis nicht nur, dass der Inhalt der Dateien in diesem Verzeichnis betrachtet werden kann, sondern auch deren Attribute, wie die Dateigröße und der Zeitpunkt der letzten Änderung.
ls(1)
wird verwendet, um Informationen über die Zugriffsrechte (und mehr) von
Dateien und Verzeichnissen anzuzeigen. Wenn es mit der Option
"-l
" aufgerufen wird, werden die folgenden Informationen
in der angegebenen Reihenfolge angezeigt:
Typ der Datei (erstes Zeichen)
Berechtigungen der Datei (neun Zeichen, bestehend aus drei Zeichen jeweils für Benutzer, Gruppe und andere, in dieser Reihenfolge)
Anzahl der harten Links zu der Datei
Name des Benutzers, der Eigentümer der Datei ist
Name der Gruppe, zu der die Datei gehört
Größe der Datei in Zeichen (Byte)
Datum und Zeit der Datei (mtime)
Name der Datei
Tabelle 1.4. Auflistung des ersten Zeichens der "ls -l
"-Ausgabe
Zeichen | Bedeutung |
---|---|
-
|
normale Datei |
d
|
Verzeichnis |
l
|
symbolischer Link |
c
|
Geräte-Node für zeichenorientierte Geräte |
b
|
Geräte-Node für blockorientierte Geräte |
p
|
benannte Pipe (named pipe) |
s
|
Socket |
chown(1)
wird von dem root-Benutzerkonto verwendet, um den Eigentümer der Datei zu
ändern.
chgrp(1)
wird vom Eigentümer der Datei oder von root benutzt, um die Gruppe zu
ändern, zu der die Datei
gehört.
chmod(1)
wird vom Eigentümer oder dem root-Benutzerkonto verwendet, um die
Zugriffsberechtigungen für die Datei und das Verzeichnis zu ändern. Die
grundsätzliche Syntax, um die Datei foo
zu bearbeiten,
ist wie folgt:
# chown <neuereigentümer> foo # chgrp <neuegruppe> foo # chmod [ugoa][+-=][rwxXst][,...] foo
Sie können zum Beispiel mit folgenden Befehlen einen Verzeichnisbaum so
manipulieren, dass foo
sein Eigentümer wird und
bar
die Gruppe:
# cd /some/location/ # chown -R foo:bar . # chmod -R ug+rwX,o=rX .
Es gibt noch drei weitere, spezielle Zugriffs-Bits:
Das setze Benutzer-ID-Bit (s, oder S statt dem x des Benutzers)
Das setze Gruppen-ID-Bit (s, oder S statt dem x der Gruppe)
Das sticky (klebrig)-Bit (t, oder T statt dem x der "anderen")
Hierbei enthält die Ausgabe von "ls -l
" für diese Bits
die jeweiligen Großbuchstaben, wenn die
Ausführungs-Bits, die bei dieser Ausgabe versteckt sind, nicht gesetzt sind.
Das Setzen des setze Benutzer-ID-Bits bei einer ausführbaren Datei erlaubt dem Benutzer, die ausführbare Datei mit der Benutzer-ID der Datei (zum Beispiel root) auszuführen. Ähnlich dazu erlaubt das Setzen des Bits setze Gruppen-ID bei einer ausführbaren Datei dem Benutzer, die ausführbare Datei mit der Gruppen-ID der Datei (zum Beispiel root) auszuführen. Da diese Einstellungen Sicherheitsrisiken verursachen können, erfordert deren Aktivierung besondere Vorsicht.
Das Setzen des setze Gruppen-ID-Bits bei einem Verzeichnis aktiviert das BSD-ähnliche Dateierstellungs-Schema, bei dem alle in dem Verzeichnis erzeugten Dateien der gleichen Gruppe angehören wie das Verzeichnis selbst.
Das Setzen des sticky (klebrig)-Bits bei
einem Verzeichnis verhindert, dass eine Datei in dem Verzeichnis von einem
Benutzer gelöscht wird, der nicht Eigentümer der Datei ist. Um den Inhalt
einer Datei in einem für alle schreibbaren Verzeichnis wie
"/tmp
" oder in durch die Gruppe schreibbaren
Verzeichnissen sicherzustellen, muss nicht nur die Schreib-Berechtigung für die Datei zurückgenommen
werden, sondern auch das sticky
(klebrig)-Bit für das Verzeichnis. Ansonsten könnte von jedem
Benutzer, der Schreibberechtigung in dem Verzeichnis hat, die Datei gelöscht
und eine neue Datei mit dem gleichen Namen erstellt werden.
Hier einige interessante Beispiele von Dateiberechtigungen:
$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4 crw------T 1 root root 108, 0 Oct 16 20:57 /dev/ppp -rw-r--r-- 1 root root 2761 Aug 30 10:38 /etc/passwd -rw-r----- 1 root shadow 1695 Aug 30 10:38 /etc/shadow -rwsr-xr-x 1 root root 973824 Sep 23 20:04 /usr/sbin/exim4 $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src drwxrwxrwt 14 root root 20480 Oct 16 21:25 /tmp drwxrwsr-x 10 root staff 4096 Sep 29 22:50 /usr/local drwxr-xr-x 10 root root 4096 Oct 11 00:28 /usr/src drwxrwsr-x 2 root mail 4096 Oct 15 21:40 /var/mail drwxrwxrwt 3 root root 4096 Oct 16 21:20 /var/tmp
Es gibt eine alternative numerische Möglichkeit, um Dateiberechtigungen mit chmod(1) darzustellen. Dieser numerische Modus verwendet 3 oder 4 einstellige Oktalzahlen (Basis=8).
Tabelle 1.5. Der numerische Modus für Dateiberechtigungen in chmod(1)-Befehlen
Ziffer | Bedeutung |
---|---|
1. Ziffer (optional) | Summe der Bits setze Benutzer-ID (=4), setze Gruppen-ID (=2) und sticky (klebrig) (=1) |
2. Ziffer | Summer der Rechte lesen (=4), schreiben (=2) und ausführen (=1) für den Benutzer |
3. Ziffer | das gleiche für die Gruppe |
4. Ziffer | das gleiche für alle anderen |
Dies klingt kompliziert, aber es ist letztendig ganz einfach. Wenn Sie die
ersten paar Spalten (2-10) der "ls -l
"-Ausgabe anschauen
und sie als Binärdarstellung (Basis=2) der Dateiberechtigungen lesen ("-"
ist "0" und "rwx" sind "1"), werden Sie die letzten 3 Ziffern des
numerischen Modus als Oktaldarstellung (Basis=8) der Dateirechte erkennen.
Versuchen Sie zum Beispiel folgendes:
$ touch foo bar $ chmod u=rw,go=r foo $ chmod 644 bar $ ls -l foo bar -rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar -rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo
![]() |
Tipp |
---|---|
Wenn Sie mit einem Shell-Skript auf Informationen von " |
Welche Berechtigungen einer neu erzeugten Datei oder einem neu erzeugten
Verzeichnis zugewiesen werden, wird durch den in die Shell integrierten
Befehl umask
beschränkt. Lesen Sie dazu
dash(1),
bash(1)
und
builtins(7).
(Dateiberechtigungen) = (angeforderte Dateiberechtigungen) & ~(umask-Wert)
Tabelle 1.6. Beispiele für umask-Werte
umask | erzeugte Dateirechte | erzeugte Verzeichnisrechte | Verwendung |
---|---|---|---|
0022
|
-rw-r--r--
|
-rwxr-xr-x
|
schreibbar nur durch den Benutzer |
0002
|
-rw-rw-r--
|
-rwxrwxr-x
|
schreibbar durch die Gruppe |
Das Debian-System verwendet standardmäßig ein User-Private-Group-Schema
(UPG, private Gruppe für jeden Benutzer). Eine UPG wird erstellt, immer wenn
ein Benutzer dem System hinzugefügt wird. Eine UPG hat den gleichen Namen,
wie der Benutzer, für den sie erstellt wurde, und dieser Benutzer ist das
alleinige Mitglied in dieser UPG. Durch das UPG-Schema ist es sicher, die
umask auf 0002
zu setzen, da jeder Benutzer seine eigene
private Gruppe hat. (Bei einigen Unix-Varianten ist es gängig, alle normalen
Benutzer so einzurichten, dass sie einer einzigen users
-Gruppe angehören und es
ist in solchen Fällen eine gute Idee, umask aus Sicherheitsgründen auf
0022
zu setzen.)
![]() |
Tipp |
---|---|
Sie aktivieren UPG, indem Sie " |
Um zu erreichen, dass Gruppenberechtigungen für bestimmte Benutzer
übernommen werden, muss der Benutzer ein Mitglied dieser Gruppe werden
(mittels "sudo vigr
" für /etc/group
und "sudo vigr -s
" für
/etc/gshadow
). Sie müssen sich abmelden und neu anmelden,
damit die neue Gruppenkonfiguration übernommen wird (oder führen Sie
"exec newgrp
" aus).
![]() |
Anmerkung |
---|---|
Alternativ können Sie Benutzer während des Authentifizierungsprozesses
dynamisch zu Gruppen hinzufügen, indem Sie die Zeile " |
Hardware-Geräte sind nur eine andere Art von Datei auf dem Debian-System. Wenn Sie Probleme haben, von einem Benutzerkonto aus auf Geräte wie CD-ROM-Laufwerke oder USB-Memory-Sticks zuzugreifen, sollten Sie den Benutzer zu einem Mitglied der entsprechenden Gruppe machen.
Einige erwähnenswerte systemweite Gruppen erlauben ihren Mitglieder, auf die
jeweiligen Dateien und Geräte ohne root
-Privilegien
zuzugreifen.
Tabelle 1.7. Liste erwähnenswerter systemweiter Gruppen für Dateizugriff
Gruppe | Beschreibung der Dateien und Geräte, auf die zugegriffen werden kann |
---|---|
dialout
|
voller und direkter Zugriff auf serielle Ports
("/dev/ttyS[0-3] ")
|
dip
|
eingeschränkter Zugriff auf serielle Ports für Dialup IP-(Einwahl-IP-)Verbindungen zu vertrauenswürden Gegenstellen |
cdrom
|
CD-ROM- und DVD+/-RW-Laufwerke |
audio
|
Audiogeräte (z.B. Soundkarten) |
video
|
Videogeräte (z.B. Grafikkarten) |
scanner
|
Scanner |
adm
|
Systemüberwachungs-Protokolle |
staff
|
einige Verzeichnisse für untergeordnete administrative Arbeiten:
"/usr/local ", "/home "
|
![]() |
Tipp |
---|---|
Sie müssen der Gruppe |
Einige erwähnenswerte, vom System angebotene Gruppen erlauben Ihren
Mitgliedern, besondere Befehle ohne root
-Rechte
auszuführen.
Tabelle 1.8. Liste erwähnenswerter, vom System angebotener Gruppen für die Ausführung besonderer Befehle
Gruppe | Befehle, die ausgeführt werden können |
---|---|
sudo
|
sudo ohne sein Passwort ausführen
|
lpadmin
|
Befehle ausführen, um Drucker zur Druckerdatenbank hinzuzufügen, zu modifizieren und zu entfernen |
Eine vollständige Liste der vom System angebotenen Benutzer und Gruppen
finden Sie in der letzten Version des Dokuments "Users and Groups" in
"/usr/share/doc/base-passwd/users-and-groups.html
" aus
dem Paket base-passwd
.
Lesen Sie passwd(5), group(5), shadow(5), newgrp(1), vipw(8), vigr(8) und pam_group(8) für Informationen über Befehle zur Verwaltung des Benutzer- und Gruppensystems.
Es gibt drei Arten von Zeitstempeln für eine GNU/Linux-Datei.
Tabelle 1.9. Liste der Arten von Zeitstempeln
Art | Bedeutung |
---|---|
mtime |
Zeitpunkt der letzten Änderung an der Datei (ls -l )
|
ctime |
Zeitpunkt der letzten Statusänderung der Datei (ls -lc )
|
atime |
Zeitpunkt des letzten Zugriffs auf die Datei (ls -lu )
|
![]() |
Anmerkung |
---|---|
ctime ist nicht der Zeitpunkt der Dateierzeugung. |
Das Überschreiben einer Datei ändert die mtime-, ctime- und atime-Attribute der Datei.
Das Ändern von Eigentümer oder Zugriffsrechten ändert die ctime- und atime-Attribute der Datei.
Das Lesen einer Datei ändert das atime-Attribut der Datei.
![]() |
Anmerkung |
---|---|
Sogar das einfache Lesen einer Datei erzeugt auf einem Debian-System
normalerweise eine Dateischreib-Operation, um die atime-Information im Inode zu aktualisieren. Durch das Einbinden des
Dateisystems mit der Option " |
Verwenden Sie den Befehl touch(1), um die Zeitstempel von vorhandenen Dateien zu ändern.
Bei Zeitstempeln unterscheidet sich die Ausgabe des
ls
-Befehls, wenn ein nicht-englisches Gebietsschema
(Locale) wie "de_DE.UTF-8
" eingestellt ist, von der
Ausgabe bei der alten Locale "C
".
$ LANG=de_DE.UTF-8 ls -l foo -rw-rw-r-- 1 penguin penguin 0 16. Okt 21:35 foo $ LANG=C ls -l foo -rw-rw-r-- 1 penguin penguin 0 Oct 16 21:35 foo
![]() |
Tipp |
---|---|
Lesen Sie Abschnitt 9.2.5, „Customized display of time and date“, um die
Ausgabe von " |
Es gibt zwei Methoden, um die Datei "foo
" mit einem
anderen Dateinamen, z.B. "bar
" zu verbinden:
Doppelter Name für eine existierende Datei
"ln foo bar
"
Symbolischer Link (auch Symlink genannt)
Eine spezielle Datei, die auf eine andere Datei über deren Namen verweist
"ln -s foo bar
"
Schauen Sie sich folgendes Beispiel bezüglich Änderungen bei der Linkanzahl
und den feinen Unterschieden im Resultat des rm
-Befehls
an:
$ umask 002 $ echo "Original-Text" > foo $ ls -li foo 1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo $ ln foo bar # harter Link $ ln -s foo baz # Symlink $ ls -li foo bar baz 1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar 1450180 lrwxrwxrwx 1 penguin penguin 3 Oct 16 21:47 baz -> foo 1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo $ rm foo $ echo "Neuer Text" > foo $ ls -li foo bar baz 1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar 1450180 lrwxrwxrwx 1 penguin penguin 3 Oct 16 21:47 baz -> foo 1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo $ cat bar Original-Text $ cat baz Neuer Text
Der harte Link kann innerhalb des gleichen Dateisystems erstellt werden und
teilt sich die gleiche Inode-Nummer mit der Originaldatei, welche Sie
mittels der Option "-i
" mit dem Befehl
ls(1)
herausfinden können.
Der Symlink hat immer nominal die Dateiberechtigungen
"rwxrwxrwx
", wie in dem obigen Beispiel zu sehen, wobei
die letztlich wirksamen Zugriffsrechte durch die Berechtigungen der Datei,
auf die verwiesen wird, bestimmt werden.
![]() |
Achtung |
---|---|
Es ist grundsätzlich eine gute Idee, keine komplizierten symbolischen oder harten Link zu erstellen, außer Sie haben einen sehr guten Grund dafür. Es könnte Ihnen sonst Albträume bescheren, wenn die logische Kombination von symbolischen Links zu Schleifen im Dateisystem führt. |
![]() |
Anmerkung |
---|---|
Im allgemeinen sollten Sie symbolische Links gegenüber harten Links bevorzugen, außer Sie haben einen guten Grund, einen harten Link zu verwenden. |
Das Verzeichnis ".
" verweist auf das Verzeichnis, in dem
es erscheint, daher steht die Anzahl der Links in jedem neuen Verzeichnis
auf 2. "..
" verweist auf das jeweilige Elternverzeichnis,
daher erhöht sich die Anzahl der Links für dieses Verzeichnis mit jedem
Hinzufügen von neuen Unterverzeichnissen.
Wenn Sie gerade von Windows zu Linux wechseln, wird Ihnen bald klar werden, wie gut das Verfahren zum Verknüpfen von Dateinamen bei Unix aufgebaut ist, verglichen mit dem Windows-Equivalent der "Shortcuts". Weil es im Dateisystem implementiert ist, bemerken Anwendungen keinen Unterschied zwischen der verknüpften Datei und dem Original. Im Fall eines harten Links gibt es auch tatsächlich keinen Unterschied.
Eine benannte Pipe (named pipe) ist eine Datei, die sich wie ein Rohr verhält: wenn Sie etwas in die Datei hineingeben, kommt es am anderen Ende wieder heraus. Daher wird sie auch FIFO genannt, vom englischen First-In-First-Out: das erste, was Sie in das Rohr hineingeben, kommt als erstes wieder am anderen Ende heraus.
Wenn Sie in eine benannte Pipe schreiben, wird der Prozess, der in die Pipe
schreibt, nicht eher beendet, als bis die zu schreibenden Informationen von
der Pipe gelesen wurden. Wenn Sie aus einer benannten Pipe lesen, wartet der
lesende Prozess, bis es nichts mehr zu lesen gibt, bevor er beendet
wird. Die Größe der Pipe ist immer Null --- sie speichert keine
Informationen, sie verbindet lediglich zwei Prozesse, wie dies die Shell mit
"|
" tut. Da diese Pipe allerdings einen Namen hat, müssen
die beiden Prozesse nicht auf der gleichen Befehlszeile und nicht einmal
unter dem gleichen Benutzerkonto laufen. Pipes waren eine sehr einflußreiche
Innovation von Unix.
Versuchen Sie zum Beispiel folgendes:
$ cd; mkfifo mypipe $ echo "hallo" >mypipe & # in den Hintergrund schieben [1] 8022 $ ls -l mypipe prw-rw-r-- 1 penguin penguin 0 Oct 16 21:49 mypipe $ cat mypipe hallo [1]+ Done echo "hallo" >mypipe $ ls mypipe mypipe $ rm mypipe
Sockets werden von allen Internet-Übertragungen, Datenbanken und dem Betriebssystem selbst umfassend genutzt. Sie sind den benannten Pipes (FIFO) ähnlich und erlauben Prozessen, Informationen sogar zwischen verschiedenen Computern auszutauschen. Für den Socket müssen diese Prozesse nicht zur gleichen Zeit laufen und müssen auch nicht Kindprozesse desselben Urprozesses sein. Er ist der Endpunkt für die Interprozesskommunikation (IPC). Der Austausch von Informationen kann über das Netzwerk zwischen verschiedenen Rechnern stattfinden. Die beiden meist verwendeten sind der Internet-Socket und der Unix-Domain-Socket.
![]() |
Tipp |
---|---|
" |
Gerätedateien verweisen auf physikalische
oder virtuelle Geräte auf Ihrem System, wie Ihre Festplatte, Grafikkarte,
Bildschirm oder Tastatur. Ein Beispiel für ein virtuelles Gerät ist die
Konsole, repräsentiert durch "/dev/console
".
Es gibt zwei Arten von Gerätedateien:
Zeichenorientierte Geräte
Zugriff immer nur auf ein Zeichen gleichzeitig
1 Zeichen = 1 Byte
z.B. Tastatur, serieller Port, …
Blockorientierte Geräte
Zugriff in größeren Einheiten, Blocks genannt
1 Block > 1 Byte
z.B. Festplatten, …
Sie können Gerätedateien lesen und schreiben, allerdings enthalten diese
möglicherweise Binärdaten, die für Menschen nur unverständliches
Kauderwelsch darstellen. Daten direkt in diese Dateien zu schreiben, ist
manchmal zur Fehlersuche bei Hardware-Verbindungen nützlich. Zum Beispiel
können Sie eine Textdatei zum Drucker-Gerät "/dev/lp0
"
schicken oder Modembefehle an den entsprechenden seriellen Port
"/dev/ttyS0
" senden. Aber wenn hierbei nicht mit Vorsicht
gearbeitet wird, kann dies eine große Katastrophe verursachen. Seien Sie
also auf der Hut.
![]() |
Anmerkung |
---|---|
Für den normalen Zugriff auf den Drucker verwenden Sie lp(1). |
Die Geräte-Node-Nummer wird angezeigt, indem Sie ls(1) wie folgt ausführen:
$ ls -l /dev/sda /dev/sr0 /dev/ttyS0 /dev/zero brw-rw---T 1 root disk 8, 0 Oct 16 20:57 /dev/sda brw-rw---T+ 1 root cdrom 11, 0 Oct 16 21:53 /dev/sr0 crw-rw---T 1 root dialout 4, 64 Oct 16 20:57 /dev/ttyS0 crw-rw-rw- 1 root root 1, 5 Oct 16 20:57 /dev/zero
"/dev/sda
" hat die major-Gerätenummer 8 und die
minor-Gerätenummer 0. Es ist lesbar/schreibbar für Benutzer, die der Gruppe
disk
angehören.
"/dev/sr0
" hat die major-Gerätenummer 11 und die
minor-Gerätenummer 0. Es ist lesbar/schreibbar für Benutzer, die der Gruppe
cdrom
angehören.
"/dev/ttyS0
" hat die major-Gerätenummer 4 und die
minor-Gerätenummer 64. Es ist lesbar/schreibbar für Benutzer, die der Gruppe
dialout
angehören.
"/dev/zero
" hat die major-Gerätenummer 1 und die
minor-Gerätenummer 5. Es ist lesbar/schreibbar für jeden.
Auf modernen Linux-Systemen wird das Dateisystem unterhalb von
"/dev/
" automatisch durch den
udev(7)-Mechanismus
bestückt.
Es gibt einige spezielle Gerätedateien:
Tabelle 1.10. Liste spezieller Gerätedateien
Gerätedatei | Aktion | Beschreibung der Antwort |
---|---|---|
/dev/null
|
lesen | gibt das "end-of-file"-(EOF-)Zeichen zurück |
/dev/null
|
schreiben | gibt nichts zurück (ein bodenloses Loch für Datenmüll) |
/dev/zero
|
lesen |
gibt das "\0 "-(NUL-)Zeichen zurück (das ist nicht
dasselbe wie die Zahl Null in ASCII)
|
/dev/random
|
lesen | gibt zufällige Zeichen von einem realen Zufallszahlengenerator zurück, der echte Entropie liefert (langsam) |
/dev/urandom
|
lesen | gibt zufällige Zeichen von einem kryptografischen sicheren Pseudo-Zufallszahlengenerator zurück |
/dev/full
|
schreiben | gibt den "disk-full"-(ENOSPC-)Fehler (Platte voll) zurück |
Diese werden oft in Verbindung mit der Shell-Umleitung genutzt (lesen Sie Abschnitt 1.5.8, „Typische Befehlssequenzen und Shell-Weiterleitungen“).
procfs und sysfs,
eingebunden unter "/proc
" und "/sys
",
sind Pseudo-Dateisysteme und bringen interne Datenstrukturen des Kernel in
den Userspace. Mit anderen Worten: diese Einträge sind virtuell, sie agieren
als komfortables Fenster zu den Operationen des Betriebssystems.
Das Verzeichnis "/proc
" enthält (neben anderen Dingen)
ein Unterverzeichnis für jeden Prozess, der auf dem System läuft, welches
nach der Prozess-ID (PID) benannt ist. Systemwerkzeuge, die auf
Prozessinformationen zugreifen, wie
ps(1),
bekommen ihre Informationen aus dieser Verzeichnisstruktur.
Die Verzeichnisse unterhalb von "/proc/sys/
" enthalten
Schnittstellen, um bestimmte Kernel-Parameter zur Laufzeit zu ändern. (Sie
können dies möglicherweise auch mit dem spezialisierten Befehl
sysctl(8)
oder seiner Preload-/Konfigurationsdatei
"/etc/sysctl.conf
" erreichen.)
Die Leute geraten regelmäßig in Panik, wenn Sie eine bestimmte Datei
bemerken - "/proc/kcore
" - die wirklich riesig ist. Dies
ist (mehr oder weniger) eine Kopie des Inhalts vom Arbeitsspeicher Ihres
Rechners. Sie wird für Fehlersuche im Kernel verwendet. Es ist eine
virtuelle Datei, die auf den Arbeitsspeicher verweist, sorgen Sie sich daher
nicht über ihre Größe.
Das Verzeichnis unterhalb von "/sys
" enthält vom Kernel
exportierte Datenstrukturen, deren Attribute sowie die Anbindungen zwischen
ihnen. Es enthält auch Schnittstellen, um bestimmte Kernel-Parameter zur
Laufzeit zu ändern.
Lesen Sie "proc.txt(.gz)
",
"sysfs.txt(.gz)
" sowie weitere dazugehörige Dokumente aus
der Linux-Kernel-Dokumentation
("/usr/share/doc/linux-doc-*/Documentation/filesystems/*
")
aus dem Paket linux-doc-*
.
tmpfs ist ein temporäres Dateisystem, das alle Dateien im virtuellen Speicher hält. Die Daten des tmpfs im page cache des Speichers können - falls nötig - in den Swap-Bereich auf der Festplatte ausgelagert werden.
Das Verzeichnis "/run
" wird im frühen Stadium des
Boot-Prozesses als tmpfs eingebunden. Dadurch ist es möglich, in dieses
Verzeichnis zu schreiben, auch wenn "/
" als read-only
(nur lesen) eingebunden ist. Dies ist der neue Ablageort für die Speicherung
kurzlebiger Statusdateien und ersetzt verschiedene Orte, die im Filesystem Hierarchy Standard
Version 2.3 beschrieben sind:
"/var/run
" → "/run
"
"/var/lock
" → "/run/lock
"
"/dev/shm
" → "/run/shm
"
Lesen Sie "tmpfs.txt(.gz)
" in der
Linux-Kernel-Dokumentation
("/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*
")
aus dem Paket linux-doc-2.6.*
.
Midnight Commander (MC) ist ein GNU "Schweizer Messer" für die Linux-Konsole und andere Terminal-Umgebungen. Er bringt Neulingen eine Erfahrung mit einer menügeführten Konsole, die viel einfacher zu erlernen ist wie die Standard-Unix-Befehle.
Sie müssen möglicherweise wie folgt das Midnight Commander-Paket mit Namen
"mc
" installieren:
$ sudo apt-get install mc
Verwenden Sie den mc(1)-Befehl, um das Debian-System zu erforschen. Dies ist der beste Weg, um zu lernen. Entdecken Sie einige interessante Orte lediglich durch Verwendung der Pfeiltasten und der Enter-Taste.
"/etc
" und dessen Unterverzeichnisse
"/var/log
" und dessen Unterverzeichnisse
"/usr/share/doc
" und dessen Unterverzeichnisse
"/sbin
" und "/bin
"
Um beim Schließen des MC das Arbeitsverzeichnis zu speichern und beim
nächsten Start mit cd
dorthin zu wechseln, empfehle ich,
"~/.bashrc
" zu modifizieren, um ein Skript dort zu
integrieren, das vom mc
-Paket bereitgestellt wird:
. /usr/lib/mc/mc.sh
Den Grund finden Sie unter
mc(1)
(unter der Option "-P
"). (Falls Sie nicht verstehen,
wovon ich hier genau spreche, können Sie dies später erledigen.)
MC kann wie folgt gestartet werden:
$ mc
MC kümmert sich über sein Menü um alle Dateioperationen und erfordert dabei nur minimale Anstrengungen des Benutzers. Drücken Sie einfach F1, um die Hilfe-Seiten zu bekommen. Sie können mit dem MC herumspielen, indem Sie einfach die Pfeiltasten und Funktionstasten drücken.
![]() |
Anmerkung |
---|---|
In einigen Konsolen, wie
gnome-terminal(1),
könnten Tastendrücke der Funktionstasten vom Konsolenprogramm "gestohlen"
werden. Sie können diese Funktionalität bei
|
Wenn Sie Probleme mit der Zeichenkodierung feststellen und dabei Zeichenmüll
angezeigt wird, kann das Hinzufügen von "-a
" zur
MC-Befehlszeile helfen, Probleme zu vermeiden.
Falls dies Ihre Anzeigeprobleme mit MC nicht löst, lesen Sie Abschnitt 9.4.6, „The terminal configuration“.
Die Standardanzeige sind zwei Verzeichnisfenster, welche die Dateilisten enthalten. Ein anderer nützlicher Modus ist, das rechte Fenster auf "Info" einzustellen, um dort Informationen zu Dateizugriffsrechten und anderem zu erhalten. Wenn der gpm(8)-Daemon läuft, kann man auch auf zeichenbasierten Linux-Konsolen eine Maus verwenden. (Stellen Sie sicher, dass Sie die Umschalt-Taste drücken, um im MC das normale Ausschneiden-und-Einfügen-Verhalten zu bekommen.)
Tabelle 1.11. Die Tastaturbefehle von MC
Taste | Tastaturbefehl |
---|---|
F1
|
Hilfe-Menü |
F3
|
interner Dateibetrachter |
F4
|
interner Texteditor |
F9
|
Aufklapp-Menü aktivieren |
F10
|
Midnight Commander beenden |
Tab
|
zwischen zwei Fenstern hin- und her schalten |
Einfg oder Strg-T
|
Datei für eine mehrere Dateien betreffende Operation wie Kopieren markieren |
Entf
|
Datei löschen (seien Sie vorsichtig --- stellen Sie MC auf "sicheres Löschen") |
Pfeiltasten | selbsterklärend |
cd
-Befehl wechselt das Verzeichnis, das im gewählten
Fenster angezeigt wird.
Strg-Enter
oder Alt-Enter
kopiert
einen Dateinamen auf die Befehlszeile. Nutzen Sie dies mit
cp(1)
und
mv(1)
zusammen mit dem Editieren auf der Befehlszeile.
Alt-Tab
zeigt Auswahlmöglichkeiten für die
Auto-Vervollständigung von Dateinamen.
Die Start-Verzeichnisse für beide Fenster können MC als Argumente angegeben
werden, zum Beispiel "mc /etc /root
".
Esc
+ n-Taste
→ Fn
(d.h. Esc
+ 1
→ F1
,
usw.; Esc
+ 0
→
F10
).
Das Drücken von Esc
vor einer anderen Taste hat den
gleichen Effekt wie das Drücken von Alt
und der anderen
Taste zusammen, d. h. drücken Sie Esc
+
c
für Alt-C
. Esc
wird Meta-Taste genannt und manchmal als "M-
"
dargestellt.
Der interne Editor hat ein interessantes Ausschneiden-und-Einfügen-Schema:
das Drücken von F3
setzt den Startpunkt einer zu
markierenden Auswahl, ein weiteres F3
markiert das Ende
der Auswahl und hebt die Auswahl hervor. Dann können Sie Ihren Cursor
verschieben. Wenn Sie F6
drücken, wird der ausgewählte
Bereich an die Cursor-Position verschoben. Wenn Sie F5
drücken, wird der ausgewählte Bereich kopiert und an der Cursor-Position
gespeichert. F2
sichert die Datei. F10
beendet das Ganze. Die meisten Pfeiltasten funktionieren intuitiv.
Dieser Editor kann direkt mit einer Datei gestartet werden, indem einer der folgenden Befehle benutzt wird:
$ mc -e name_der_zu_editierenden_Datei
$ mcedit name_der_zu_editierenden_Datei
Dies ist kein Multi-Fenster-Editor, aber man kann mehrere Linux-Konsolen verwenden, um den gleichen Effekt zu erreichen. Um Inhalte zwischen verschiedenen Fenstern hin und her zu kopieren, verwenden Sie die Alt-F<n>-Tasten, um zwischen den virtuellen Konsolen zu wechseln, und "File→Insert file" oder "File→Copy to file", um Teile einer Datei in eine andere Datei zu kopieren.
Dieser interne Editor kann auf Wunsch durch jeden anderen externen Editor ersetzt werden.
Außerdem verwenden viele Programme die Umgebungsvariablen
"$EDITOR
" oder "$VISUAL
", um
festzulegen, welcher Editor genutzt wird. Wenn Ihnen
vim(1)
oder
nano(1)
nicht behagen, möchten Sie diese vielleicht auf "mcedit
"
setzen, indem Sie folgende Zeilen zu "~/.bashrc
"
hinzufügen:
export EDITOR=mcedit export VISUAL=mcedit
Ich empfehle, diese wenn möglich auf "vim
" zu setzen.
Wenn Sie vim(1) nicht mögen, können Sie trotzdem mcedit(1) für die meisten Systemwartungsaufgaben benutzen.
MC ist ein sehr toller Dateibetrachter. Er ist ein großartiges Werkzeug, um
nach Wörtern in Dokumenten zu suchen. Ich verwende ihn immer für Dateien im
/usr/share/doc
-Verzeichnis. Dies ist der schnellste Weg,
um Massen von Linux-Informationen zu durchsuchen. Dieser Betrachter kann
direkt gestartet werden, indem einer der folgenden Befehle benutzt wird:
$ mc -v pfad/zur/zu_betrachtenden_datei
$ mcview pfad/zur/zu_betrachtenden_datei
Drücken Sie Enter auf einer Datei und das zugehörige Programm wird den Inhalt der Datei verarbeiten (lesen Sie Abschnitt 9.3.11, „Customizing program to be started“). Dies ist eine sehr praktische MC-Funktionalität.
Tabelle 1.12. Die Reaktion auf die Enter-Taste in MC
Dateityp | Reaktion auf die Enter-Taste |
---|---|
ausführbare Datei | Befehl ausführen |
Handbuchseiten-Datei | Inhalt an Betrachter-Software weiterleiten |
html-Datei | Inhalt an Webbrowser weiterleiten |
"*.tar.gz "- und "*.deb "-Datei
|
den Inhalt anzeigen, als wäre es ein Unterverzeichnis |
Damit diese Betrachter- und virtuellen Dateifunktionalitäten korrekt funktionieren können, sollte bei Dateien, deren Inhalt betrachtet werden kann, nicht die Ausführungs-Berechtigung gesetzt sein. Ändern Sie deren Status ansonsten mit chmod(1) oder über das MC-Dateimenü.
MC kann verwendet werden, um auf Dateien über das Internet via FTP
zuzugreifen. Rufen Sie über F9
das Menü auf, drücken Sie
dann "p
", um das virtuelle FTP-Dateisystem zu
aktivieren. Geben Sie eine URL in der Form
"benutzername:passwort@rechnername.domänenname
" ein,
wodurch ein in der Ferne liegendes Verzeichnis abgerufen wird, das wie ein
lokales erscheint.
Versuchen Sie "[ftp.de.debian.org/debian/]" als URL und durchsuchen Sie das Debian-Archiv.
Obwohl MC es Ihnen erlaubt, fast alles zu tun, ist es sehr wichtig für Sie, zu lernen, wie die Befehlszeilenwerkzeuge auf dem Shell-Prompt aufgerufen werden, und mit der Unix-ähnlichen Arbeitsumgebung vertraut zu werden.
Sie können Ihre Login-Shell mit chsh(1) auswählen.
Tabelle 1.13. Liste von Shell-Programmen
Paket | Popcon | Größe | POSIX-Shell | Beschreibung |
---|---|---|---|---|
bash
|
V:860, I:999 | 3942 | Ja | Bash: die GNU Bourne Again SHell (De-Facto-Standard) |
tcsh
|
V:25, I:89 | 1378 | Nein | TENEX C Shell: eine erweiterte Version der Berkeley csh |
dash
|
V:831, I:920 | 212 | Ja | Debian Almquist Shell, gut für Shell-Scripting |
zsh
|
V:28, I:65 | 1830 | Ja | Z Shell: die Standard-Shell mit vielen Erweiterungen |
pdksh
|
V:1, I:12 | 44 | Ja | Public Domain-Version der Korn Shell |
csh
|
V:3, I:15 | 340 | Nein | OpenBSD C-Shell, eine Version der Berkeley csh |
sash
|
V:1, I:7 | 1008 | Ja | Stand-alone Shell mit integrierten
Befehlen (nicht gedacht für Standard "/bin/sh ")
|
ksh
|
V:6, I:28 | 3145 | Ja | die echte AT&T-Version der Korn Shell |
rc
|
V:0, I:8 | 169 | Nein | Implementierung der AT&T Plan 9 rc-Shell |
posh
|
V:0, I:0 | 201 | Ja |
Policy-compliant (grundsatz-konforme) Ordinary SHell
(pdksh -Abkömmling)
|
![]() |
Tipp |
---|---|
Obwohl sich POSIX-konforme Shells die grundsätzliche Syntax teilen, können sie sich beim Verhalten für Dinge wie Shell-Variablen oder Glob-Ersetzungen unterscheiden. Bitte konsultieren Sie ihre Dokumentation bezüglich weiterer Details. |
In dieser Lehrstunde ist mit interaktiver Shell immer
bash
gemeint.
Sie können das Verhalten von
bash(1)
mittels "~/.bashrc
" anpassen.
Versuchen Sie zum Beispiel folgendes:
# Verzeichniswechsel über das Schließen von MC hinaus . /usr/lib/mc/mc.sh # CDPATH auf einen guten Wert setzen CDPATH=.:/usr/share/doc:~:~/Desktop:~ export CDPATH PATH="${PATH}":/usr/sbin:/sbin # PATH setzen, so dass ein privates bin des Benutzers (falls vorhanden) enthalten ist if [ -d ~/bin ] ; then PATH=~/bin:"${PATH}" fi export PATH EDITOR=vim export EDITOR
![]() |
Tipp |
---|---|
Es gibt weitere Tipps zur Anpassung der |
In einer Unix-ähnlichen Umgebung gibt es ein
paar Tastendrücke, die spezielle Bedeutungen haben. Bitte beachten Sie, dass
auf einer normalen zeichenbasierten Linux-Konsole nur die linke
Strg
- und Alt
-Taste wie erwartet
funktionieren. Hier ein paar erwähnenswerte Tastendrücke, die Sie sich
merken sollten:
Tabelle 1.14. Liste der Tastaturbefehle für bash
Taste | Beschreibung des Tastaturbefehls |
---|---|
Strg-U
|
alle Zeichen vor dem Cursor löschen |
Strg-H
|
ein Zeichen vor dem Cursor löschen |
Strg-D
|
Eingabe beenden (Shell beenden, wenn Sie shell benutzen) |
Strg-C
|
einen laufenden Prozess beenden |
Strg-Z
|
Programm vorübergehend stoppen, indem es zum Hintergrund-Job geschoben wird |
Strg-S
|
Ausgabe auf den Bildschirm anhalten |
Strg-Q
|
Ausgabe auf den Bildschirm wieder starten |
Strg-Alt-Entf
|
Neu starten/anhalten des Systems, siehe dazu inittab(5) |
Linke-Alt-Taste (optional
Windows-Taste )
|
Meta-Taste für Emacs und ähnliche Benutzerschnittstellen |
Pfeiltaste aufwärts
|
Suche in den zuletzt ausgeführten Befehlen der bash
|
Strg-R
|
Inkrementelle Suche in den zuletzt ausgeführten Befehlen der
bash
|
Tab
|
Auto-Vervollständigung des Dateinamens auf der Befehlszeile in der
bash
|
Strg-V Tab
|
Eingabe von Tab ohne Auto-Vervollständigung auf der
Befehlszeile in der bash
|
![]() |
Tipp |
---|---|
Die Terminal-Funktionalität von |
Die Mausoperationen im Unix-Stil basieren auf dem 3-Knopf-Maus-System.
Tabelle 1.15. Liste der Mausoperationen im Unix-Stil
Aktion | Reaktion |
---|---|
Links-Klick und Ziehen der Maus | auswählen und in die Zwischenablage kopieren |
Links-Klick | Start der Auswahl festlegen |
Rechts-Klick | Ende der Auswahl festlegen und Auswahl in die Zwischenablage kopieren |
Mittel-Klick | Inhalt der Zwischenablage an der Cursor-Position einfügen |
Das Mittelrad auf einer modernen Radmaus wird als mittlerer Mausknopf betrachtet und kann für den Mittel-Klick verwendet werden. Das gleichzeitige Drücken des rechten und linken Maus-Knopfes wirkt in einem 2-Knopf-Maus-System wie ein Mittel-Klick. Um eine Maus in zeichenbasierten Linux-Konsolen verwenden zu können, müssen Sie gpm(8) als Daemon laufen haben.
Der
less(1)-Befehl
ist ein erweiterter Pager (Dateiinhalt-Browser). Er liest die Datei, die per
Befehlsargument oder Standardeingabe angegeben wird. Drücken Sie
"h
", wenn Sie beim Anzeigen von Dateiinhalten mit
less
Hilfe benötigen. Er hat viel mehr Fähigkeiten als
more(1)
und kann sogar noch weiter aufgebohrt werden, indem "eval
$(lesspipe)
" oder "eval $(lessfile)
" im
Shell-Startskript ausgeführt wird. Weiteres dazu finden Sie in
"/usr/share/doc/lessf/LESSOPEN
". Die Option
"-R
" erlaubt die Ausgabe von Rohformat-Zeichen und
aktiviert ANSI-Color-Escape-Sequenzen. Lesen Sie dazu
less(1).
Sie sollten sich darin üben, eine der Varianten von Vim oder Emacs zu nutzen, die auf Unix-ähnlichen Systemen beliebt sind.
Ich denke, sich an Vim-Befehle zu gewöhnen, ist das richtige, da der
Vi-Editor in der Linux-/Unix-Welt immer vorhanden ist. (Eigentlich sind der
originale vi
oder auch der neue nvi
Programme, die Sie überall finden. Ich habe stattdessen für Neulinge Vim
ausgewählt, da es über F1
eine Hilfe anbietet, den
anderen sehr ähnlich und gleichzeitig noch leistungsfähiger ist.)
Wenn Sie stattdessen entweder Emacs oder XEmacs als Ihren Editor auswählen, ist dies in der Tat eine andere gute Wahl, speziell zum Programmieren. Emacs enthält ebenso eine Fülle an weiteren Funktionen, dazu gehört die Arbeit als Newsreader, Verzeichnis-Editor, Mail-Programm usw. Wenn Sie ihn zum Programmieren oder Editieren von Shell-Skripten verwenden, erkennt er intelligent das Format, an dem Sie arbeiten, und versucht Ihnen dabei zu assistieren. Einige Leute behaupten, dass das einzige Programm, dass Sie unter Linux benötigen, Emacs sei. Jetzt zehn Minuten Emacs lernen kann später Stunden an Zeit sparen. Es wird dringend empfohlen, beim Erlernen von Emacs das GNU Emacs-Handbuch als Referenz zur Hand zu haben.
All diese Programme enthalten gewöhnlich Unterrichtseinheiten für Sie, damit
Sie sie erlernen können. Starten Sie Vim, indem Sie "vim
"
eingeben, und drücken Sie die F1-Taste. Sie sollten zumindest die ersten 35
Zeilen lesen. Absolvieren Sie dann den Online-Trainingskurs, indem Sie mit
dem Cursor auf "|tutor|
" gehen, und drücken Sie
Strg-]
.
![]() |
Anmerkung |
---|---|
Gute Editoren wie Vim und Emacs können Texte mit UTF-8 und anderen exotischen Kodierungen korrekt darstellen. Es ist eine gute Idee, die X-Umgebung in der UTF-8-Locale zu verwenden und benötigte Programme und Schriften dafür zu installieren. Editoren haben Optionen, um die Dateikodierung unabhängig von der X-Umgebung zu setzen. Bitte ziehen Sie deren Dokumentation bezüglich Multibyte-Text zurate. |
Debian enthält eine Reihe verschiedener Editoren. Wir empfehlen wie oben
bereits erwähnt, das vim
-Paket zu installieren.
Debian bietet über den Befehl "/usr/bin/editor
" einen
einheitlichen Zugriff auf den Standard-Editor des Systems, so dass andere
Programme
(z.
B.
reportbug(1))
ihn aufrufen können. Sie können ihn wie folgt ändern:
$ sudo update-alternatives --config editor
Ich empfehle Neulingen, die Auswahl "/usr/bin/vim.basic
"
gegenüber /usr/bin/vim.tiny
zu bevorzugen, da er
Syntaxhervorhebung beherrscht.
![]() |
Tipp |
---|---|
Viele Programme nutzen die Umgebungsvariablen " |
Sie können das Verhalten von
vim(1)
mittels "~/.vimrc
" anpassen.
Versuchen Sie zum Beispiel folgendes:
" ------------------------------- " Lokale Konfiguration " set nocompatible set nopaste set pastetoggle=<f2> syn on if $USER == "root" set nomodeline set noswapfile else set modeline set swapfile endif " Füllzeile, um zu vermeiden, dass die obige Zeile als modeline erkannt wird " Füllzeile " Füllzeile
Die Ausgabe eines Shell-Befehls könnte aus Ihrem Bildschirm herauslaufen und für immer verloren sein. Es ist nützlich, Shell-Aktivitäten in einer Datei zu protokollieren, damit Sie sie später kontrollieren können. Diese Art der Aufzeichnung ist besonders wichtig für alle Systemadministrationsaufgaben.
Die grundsätzliche Methode, um die Aktivitäten auf der Shell aufzuzeichnen ist, sie via script(1) laufen zu lassen.
Versuchen Sie zum Beispiel folgendes:
$ script Script started, file is typescript (Script gestartet, die Datei heißt typescript)
Führen Sie alle gewünschten Shell-Befehle via script
aus.
Drücken Sie Strg-D
, um script
zu
beenden.
$ vim typescript
Lesen Sie Abschnitt 9.2.3, „Recording the shell activities cleanly“ .
Lassen Sie uns einige grundlegende Unix-Befehle lernen. Ich verwende hier
"Unix" in seiner allgemeinen Bedeutung. Alle Unix-Clone-Betriebssysteme
bieten normalerweise entsprechende gleichbedeutende Befehle. Das
Debian-System ist hier keine Ausnahme. Sorgen Sie sich nicht, wenn einige
Befehle jetzt bei Ihnen nicht wie gewünscht funktionieren. Falls
alias
in der Shell verwendet wird, sind die zugehörigen
Befehlsausgaben unterschiedlich. Diese Beispiele sind nicht dazu gedacht, in
dieser Reihenfolge ausgeführt zu werden.
Versuchen Sie die folgenden Befehle von einem nicht-privilegierten Benutzerkonto:
Tabelle 1.16. Liste grundlegender Unix-Befehle
Befehl | Beschreibung |
---|---|
pwd
|
Name des derzeitigen/Arbeits-Verzeichnisses |
whoami
|
derzeitigen Benutzernamen anzeigen |
id
|
derzeitige Benutzeridentität anzeigen (Name, uid (Benutzer-ID), gid (Gruppen-ID) und zugehörige Gruppen) |
file <foo>
|
den Dateityp der Datei "<foo> " anzeigen
|
type -p <befehlsname>
|
den Speicherort des Befehls "<befehlsname> "
anzeigen
|
which <befehlsname>
|
" |
type <befehlsname>
|
Informationen zum Befehl "<befehlsname> " anzeigen
|
apropos <schlüsselwort>
|
Befehle mit Bezug zu "<schlüsselwort> " finden
|
man -k <schlüsselwort>
|
" |
whatis <befehlsname>
|
eine einzeilige Kurzbeschreibung des Befehls
"<befehlsname> " anzeigen
|
man -a <befehlsname>
|
Beschreibung zum Befehl "<befehlsname> " anzeigen
(Unix-Stil)
|
info <befehlsname>
|
eher lange Beschreibung zum Befehl "<befehlsname> "
anzeigen (GNU-Stil)
|
ls
|
Inhalte eines Verzeichnisses auflisten (keine versteckten Dateien und Verzeichnisse) |
ls -a
|
Inhalte eines Verzeichnisses auflisten (alle Dateien und Verzeichnisse) |
ls -A
|
Inhalte eines Verzeichnisses auflisten (nahezu alle Dateien und
Verzeichnisse, d. h. ".. " und ". "
überspringen)
|
ls -la
|
alle Inhalte eines Verzeichnisses mit detaillierten Informationen auflisten |
ls -lai
|
alle Inhalte eines Verzeichnisses mit Inode-Nummer und detaillierten Informationen auflisten |
ls -d
|
alle Verzeichnisse im derzeitigen Verzeichnis auflisten |
tree
|
Verzeichnisbaum-Inhalte anzeigen |
lsof <foo>
|
"geöffnet"-Status der Datei "<foo> " anzeigen
|
lsof -p <pid>
|
Dateien auflisten, die von dem Prozess mit der ID
"<pid> " geöffnet wurden
|
mkdir <foo>
|
ein neues Verzeichnis "<foo> " im derzeitigen
Verzeichnis erstellen
|
rmdir <foo>
|
das Verzeichnis "<foo> " im derzeitigen Verzeichnis
löschen
|
cd <foo>
|
in das Verzeichnis "<foo> " im derzeitigen
Verzeichnis oder im in der Variable "$CDPATH " enthaltenen
Verzeichnis wechseln
|
cd /
|
in das root-Verzeichnis wechseln |
cd
|
in das Heimatverzeichnis des derzeitigen Benutzers wechseln |
cd /<foo>
|
in das Verzeichnis mit dem absoluten Pfad "/<foo> "
wechseln
|
cd ..
|
in das übergeordnete Verzeichnis (Eltern-Verzeichnis) wechseln |
cd ~<foo>
|
in das Heimatverzeichnis des Benutzers "<foo> "
wechseln
|
cd -
|
in das vorherige Verzeichnis wechseln |
</etc/motd pager
|
Inhalt von "/etc/motd " mit dem Standard-Pager anzeigen
|
touch <leeredatei>
|
eine leere Datei mit Namen "<leeredatei> " erzeugen
|
cp <foo> <bar>
|
die vorhandene Datei "<foo> " in eine neue Datei
"<bar> " kopieren
|
rm <unnützedatei>
|
die Datei "<unnützedatei> " entfernen
|
mv <foo> <bar>
|
die vorhandene Datei "<foo> " umbenennen zum neuen
Namen "<bar> " ("<bar> "
darf nicht existieren)
|
mv <foo> <bar>
|
die vorhandene Datei "<foo> " an einen neuen Ort
"<bar>/<foo> " verschieben (das Verzeichnis
"<bar> " muss existieren)
|
mv <foo> <bar>/<baz>
|
die vorhandene Datei "<foo> " an einen neuen Ort
verschieben und gleichzeitig umbenennen nach
"<bar>/<baz> " (das Verzeichnis
"<bar> " muss existieren, aber der Dateiname
"<bar>/<baz> " darf nicht existieren)
|
chmod 600 <foo>
|
die vorhandene Datei "<foo> " als nicht lesbar und
nicht schreibbar für andere Benutzer einstellen (und nicht ausführbar für
alle)
|
chmod 644 <foo>
|
die vorhandene Datei "<foo> " als lesbar, aber nicht
schreibbar für andere Benutzer einstellen (und nicht ausführbar für alle)
|
chmod 755 <foo>
|
die vorhandene Datei "<foo> " als lesbar, aber nicht
schreibbar für andere Benutzer einstellen (und als ausführbar für alle)
|
find . -name <suchmuster>
|
passende Dateinamen finden durch Verwendung eines
Shell-<suchmuster> s (langsamer)
|
locate -d . <suchmuster>
|
passende Dateinamen finden durch Verwendung eines
Shell-<suchmuster> s (schneller, nutzt eine
regelmäßig erstellte Datenbank)
|
grep -e "<suchmuster>" *.html
|
das "<suchmuster> " in allen Dateien finden, die im
derzeitigen Verzeichnis auf ".html " enden, und dann
anzeigen
|
top
|
Prozessinformationen im Vollbildschirm-Ansicht anzeigen, drücken Sie
"q " zum Beenden
|
ps aux | pager
|
Informationen über alle laufenden Prozesse im BSD-Ausgabestil anzeigen |
ps -ef | pager
|
Informationen über alle laufenden Prozesse im Unix-System-V-Ausgabestil anzeigen |
ps aux | grep -e "[e]xim4*"
|
alle Prozesse anzeigen, die "exim " oder
"exim4 " ausführen
|
ps axf | pager
|
Informationen über alle laufenden Prozesse in künstlerischem ASCII-Ausgabestil anzeigen |
kill <1234>
|
einen Prozess abbrechen, identifiziert über die Prozess-ID "<1234>" |
gzip <foo>
|
"<foo> " mittels Lempel-Ziv-Codierung (LZ77)
komprimieren und "<foo>.gz " erzeugen
|
gunzip <foo>.gz
|
"<foo>.gz " dekomprimieren und
"<foo> " erzeugen
|
bzip2 <foo>
|
"<foo> " mittels Burrows-Wheeler Block-Sorting
Textkompressions-Algorithmus und Huffman-Codierung komprimieren und
"<foo>.bz2 " erzeugen (bessere Kompression als
gzip )
|
bunzip2 <foo>.bz2
|
"<foo>.bz2 " dekomprimieren und
"<foo> " erzeugen
|
xz <foo>
|
"<foo> " mittels Lempel–Ziv–Markov-Algorithmus
komprimieren und "<foo>.xz " erzeugen (bessere
Kompression als bzip2 )
|
unxz <foo>.xz
|
"<foo>.xz " dekomprimieren und
"<foo> " erzeugen
|
tar -xvf <foo>.tar
|
Dateien aus dem Archiv "<foo>.tar " extrahieren
|
tar -xvzf <foo>.tar.gz
|
Dateien aus dem gzip-komprimierten Archiv
"<foo>.tar.gz " extrahieren
|
tar -xvjf <foo>.tar.bz2
|
Dateien aus dem Archiv "<foo>.tar.bz2 " extrahieren
|
tar -xvJf <foo>.tar.xz
|
Dateien aus dem Archiv "<foo>.tar.xz " extrahieren
|
tar -cvf <foo>.tar <bar>/
|
Inhalte des Verzeichnisses "<bar>/ " in das Archiv
"<foo>.tar " archivieren
|
tar -cvzf <foo>.tar.gz <bar>/
|
Inhalte des Verzeichnisses "<bar>/ " in das
komprimierte Archiv "<foo>.tar.gz " archivieren
|
tar -cvjf <foo>.tar.bz2 <bar>/
|
Inhalte des Verzeichnisses "<bar>/ " in das Archiv
"<foo>.tar.bz2 " archivieren
|
tar -cvJf <foo>.tar.xz <bar>/
|
Inhalte des Verzeichnisses "<bar>/ " in das Archiv
"<foo>.tar.xz " archivieren
|
zcat README.gz | pager
|
Archivinhalte des komprimierten "README.gz "-Archivs
mittels Standard-Pager anzeigen
|
zcat README.gz > foo
|
eine Datei "foo " mit dem dekomprimierten Inhalt von
"README.gz " erstellen
|
zcat README.gz >> foo
|
den dekomprimierten Inhalt von "README.gz " an das Ende
der Datei "foo " anfügen (Datei vorher erzeugen, falls sie
nicht existiert)
|
![]() |
Anmerkung |
---|---|
Unix hat eine Tradition, Dateinamen zu verstecken, die mit einem
" |
![]() |
Anmerkung |
---|---|
Bezüglich des |
![]() |
Anmerkung |
---|---|
Der Standard-Pager auf einem reinen Debian-System ist
more(1),
der nicht rückwärts scrollen kann. Indem Sie das
|
![]() |
Anmerkung |
---|---|
Die Zeichen " |
Bitte durchlaufen Sie zur Übung verschiedene Verzeichnisse und erforschen Sie das System. Wenn Sie Fragen zu einem der Konsolenbefehle haben, seien Sie sicher, dass Sie die Handbuchseite gelesen haben.
Versuchen Sie zum Beispiel folgendes:
$ man man $ man bash $ man builtins $ man grep $ man ls
An den Stil der Handbuchseiten kann man sich eventuell etwas schwer gewöhnen, da sie eher knapp gehalten sind, speziell die älteren, traditionellen. Aber wenn Sie sich einmal daran gewöhnt haben, werden Sie die knappe Form zu schätzen wissen.
Bitte beachten Sie, dass viele der Unix-ähnlichen Befehle von GNU und BSD eine kurze Hilfe anzeigen, wenn Sie auf eine der folgenden Arten aufgerufen werden (oder in einigen Fällen ohne jegliche Argumente):
$ <befehlsname> --help $ <befehlsname> -h
Jetzt haben Sie ein Gefühl, wie das Debian-System genutzt wird. Lassen Sie uns tiefer in den Mechanismus der Befehlsausführung in einem Debian-System einsteigen. Eine genaue Beschreibung finden Sie unter bash(1).
Ein einfacher Befehl ist eine Abfolge mehrerer Komponenten.
Zuweisung von Variablen (optional)
Befehlsname
Argumente (optional)
Weiterleitungen (optional: >
,
>>
, <
,
<<
usw.)
Steuer-Operator (optional: &&
,
||
, <newline> , ;
,
&
, (
, )
)
Die Werte einiger Umgebungsvariablen verändern das Verhalten einiger Unix-Befehle.
Die Standardwerte von Umgebungsvariablen werden ursprünglich vom PAM-System gesetzt und dann werden einige von ihnen von manchen Anwendungsprogrammen zurückgesetzt.
Display-Manager wie z.B. gdm3
setzen Umgebungsvariablen
zurück.
Die Shell setzt durch Ihre Startmechanismen in
"~/.bash_profile
" und "~/.bashrc
"
Umgebungsvariablen zurück.
Der vollständige Wert für das Gebietsschema (Locale), der an die
"$LANG
"-Variable übergeben wird, besteht aus drei Teilen:
"xx_YY.ZZZZ
".
Tabelle 1.17. Die drei Teile des locale-Wertes
locale-Wert | Bedeutung |
---|---|
xx
|
Sprach-Code laut ISO 639 (in Kleinbuchstaben) wie z.B. "de" |
YY
|
Länder-Code laut ISO 3166 (in Großbuchstaben) wie z.B. "DE" |
ZZZZ
|
Zeichenkodierung (ist immer auf "UTF-8" gesetzt) |
Einschlägige Beschreibungen zu Sprach- und Länder-Codes finden Sie unter
"info gettext
".
Auf dem modernen Debian-System sollten Sie die Zeichenkodierung immer auf
UTF-8
setzen, außer
Sie möchten aus einem guten Grund speziell eine der historischen Kodierungen
verwenden und haben dazu ausreichende Hintergrundkenntnisse.
Tolle Details zur Konfiguration des Gebietsschemas finden Sie in Abschnitt 8.3, „The locale“.
![]() |
Anmerkung |
---|---|
" |
Tabelle 1.18. Liste mit Empfehlungen zum Gebietsschema
empfohlenes Gebietsschema | Sprache (Gebiet) |
---|---|
en_US.UTF-8
|
Englisch (USA) |
en_GB.UTF-8
|
Englisch (Großbritannien) |
fr_FR.UTF-8
|
Französisch (Frankreich) |
de_DE.UTF-8
|
Deutsch (Deutschland) |
it_IT.UTF-8
|
Italienisch (Italien) |
es_ES.UTF-8
|
Spanisch (Spanien) |
ca_ES.UTF-8
|
Katalanisch (Spanien) |
sv_SE.UTF-8
|
Schwedisch (Schweden) |
pt_BR.UTF-8
|
Portugiesisch (Brasilien) |
ru_RU.UTF-8
|
Russisch (Russland) |
zh_CN.UTF-8
|
Chinesisch (Volksrepublik China) |
zh_TW.UTF-8
|
Chinesisch (Taiwan) |
ja_JP.UTF-8
|
Japanisch (Japan) |
ko_KR.UTF-8
|
Koreanisch (Republik Korea) |
vi_VN.UTF-8
|
Vietnamesisch (Vietnam) |
Eine typische Befehlsausführung verwendet eine Shell-Sequenz wie die folgende:
$ date Sun Jun 3 10:27:39 JST 2007 $ LANG=fr_FR.UTF-8 date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
Hier wird das Programm
date(1)
mit verschiedenen Werten für die Umgebungsvariable
"$LANG
" ausgeführt:
Die meisten Befehlsausführungen haben keine voreingestellten Definitionen für Umgebungsvariablen. Bei dem obigen Beispiel können Sie alternativ auch das folgende ausführen:
$ LANG=fr_FR.UTF-8 $ date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
Wie Sie hier sehen können, wird die Ausgabe des Befehls von der Umgebungsvariable beeinflußt, um eine französische Ausgabe zu erzeugen. Wenn Sie möchten, dass die Umgebungsvariable von Unterprozessen übernommen wird (z.B. beim Aufruf eines Shell-Skriptes), müssen Sie sie stattdessen wie folgt mit export exportieren:
$ export LANG
![]() |
Anmerkung |
---|---|
Wenn Sie ein typisches Konsolen-Terminal verwenden, ist die
" |
![]() |
Tipp |
---|---|
Wenn Sie einen Fehlerbericht einreichen und als Umgebung nicht Englisch
verwenden, ist es eine gute Idee, den Befehl mit
" |
Informationen zu "$LANG
" und anderen zugehörigen
Umgebungsvariablen finden Sie in
locale(5)
und
locale(7).
![]() |
Anmerkung |
---|---|
Ich empfehle Ihnen, die Systemumgebung direkt über die
" |
Wenn Sie einen Befehl in die Shell eingeben, sucht die Shell nach dem Befehl
in der Liste der Verzeichnisse, die in der Umgebungsvariable
"$PATH
" enthalten sind. Der Wert der Umgebungsvariablen
"$PATH
" wird auch als Shell-Suchpfad bezeichnet.
In der Standard-Debian-Installation enthält die Umgebungsvariable
"$PATH
" für Benutzerkonten nicht die Verzeichnisse
"/sbin
" und "/usr/sbin
". Zum Beispiel
muss der ifconfig
-Befehl mit dem vollständigen Pfad
aufgerufen werden, also "/sbin/ifconfig
". (Ähnlich dazu
ist der ip
-Befehl in "/bin
" abgelegt.)
Sie können die Umgebungsvariable "$PATH
" der Bash-Shell
über die Dateien "~/.bash_profile
" oder
"~/.bashrc
" verändern.
Viele Befehle speichern benutzerspezifische Konfigurationen im
Heimatverzeichnis und ändern ihr Verhalten abhängig von deren Inhalt. Das
Heimatverzeichnis wird über die Umgebungsvariable "$HOME
"
bestimmt.
Tabelle 1.19. Liste der Werte von "$HOME
"
Wert von "$HOME "
|
Situation bei Programmausführung |
---|---|
/
|
Programm ausgeführt vom init-Prozess (Daemon) |
/root
|
Programm ausgeführt von der root-Shell |
/home/<normaler_benutzer>
|
Programm ausgeführt von der Shell des normalen Benutzers |
/home/<normaler_benutzer>
|
Programm ausgeführt vom GUI-Desktop-Menü des normalen Benutzers |
/home/<normaler_benutzer>
|
Programm ausgeführt von root mittels "sudo program "
|
/root
|
Programm ausgeführt von root mittels "sudo -H program "
|
![]() |
Tipp |
---|---|
Die Shell expandiert " |
Einige Befehle akzeptieren Argumente. Argumente, die mit
"-
" oder "--
" beginnen, werden
Optionen genannt und steuern das Verhalten des Befehls.
$ date Mon Oct 27 23:02:09 CET 2003 $ date -R Mon, 27 Oct 2003 23:02:40 +0100
Hier ändert das Befehlszeilen-Argument "-R
" das Verhalten
von
date(1)
zwecks Ausgabe einer RFC2822-konformen
Datumsangabe.
Oft möchten Sie einen Befehl auf eine Gruppe von Dateien anwenden, ohne all die Dateinamen einzutippen. Die Dateinamen-Suchmuster mittels Shell-Glob (manchmal auch Wildcards genannt) erfüllen diese Bedürfnisse.
Tabelle 1.20. Shell-Glob-Suchmuster
Shell-Glob-Suchmuster | Beschreibung der Regel |
---|---|
*
|
Dateiname (Segment), der nicht mit ". " beginnt
|
.*
|
Dateiname (Segment), der mit ". " beginnt
|
?
|
genau ein Zeichen |
[…]
|
genau eines von den in Klammern eingeschlossenen Zeichen |
[a-z]
|
genau ein Zeichen von denen zwischen "a " und
"z "
|
[^…]
|
genau ein Zeichen von denen, die nicht in Klammern eingeschlossen sind
(außer "^ ")
|
Versuchen Sie zum Beispiel folgendes:
$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt $ echo *.txt 1.txt 2.txt $ echo * 1.txt 2.txt 3.c 4.h $ echo *.[hc] 3.c 4.h $ echo .* . .. .5.txt ..6.txt $ echo .*[^.]* .5.txt ..6.txt $ echo [^1-3]* 4.h $ cd ..; rm -rf junk
Weitere Details finden Sie in glob(7).
![]() |
Anmerkung |
---|---|
Anders als die normale Dateinamenerweiterung der Shell findet das
Shell-Suchmuster " |
![]() |
Anmerkung |
---|---|
BASH kann dahin getrimmt werden, sein glob-Verhalten mittels seiner
integrierten shopt-Optionen wie " |
Jeder Befehl gibt seinen Beendigungsstatus (Exit-Status) (Variable:
"$?
") als Rückgabewert zurück.
Tabelle 1.21. Befehls-Beendigungscodes
Befehls-Beendigungsstatus | numerischer Rückgabewert | logischer Rückgabewert |
---|---|---|
Erfolg | Null, 0 | WAHR |
Fehler | nicht-Null, -1 | FALSCH |
Versuchen Sie zum Beispiel folgendes:
$ [ 1 = 1 ] ; echo $? 0 $ [ 1 = 2 ] ; echo $? 1
![]() |
Anmerkung |
---|---|
Bitte beachten Sie, dass im logischen Zusammenhang für die Shell Erfolg als logisches WAHR betrachtet wird, was 0 (Null) als Wert hat. Dies ist nicht ganz intuitiv und daher soll hier daran erinnert werden. |
Versuchen wir, uns an die folgenden Abfolgen von Shell-Befehlen zu erinnern, die als Teil eines Shell-Befehls in einer Zeile eingegeben werden.
Tabelle 1.22. Abfolgen von Shell-Befehlen
Befehlsabfolge | Beschreibung |
---|---|
befehl &
|
Ausführung von befehl im Hintergrund in der Subshell
|
befehl1 | befehl2
|
Weiterleitung (pipe) der Standardausgabe
von befehl1 an die Standardeingabe von
befehl2 (gleichzeitige
Ausführung)
|
befehl1 2>&1 | befehl2
|
Weiterleitung (pipe) der Standardausgabe
und Standardfehler von befehl1 an die Standardeingabe von
befehl2 (gleichzeitige
Ausführung)
|
befehl1 ; befehl2
|
Aufeinander folgende Ausführung von
befehl1 und befehl2
|
befehl1 && befehl2
|
Ausführung von befehl1 ; falls erfolgreich, anschließend Ausführung von
befehl2 (Erfolg zurückgeben, wenn beide
(befehl1 und
befehl2 ) erfolgreich sind)
|
befehl1 || befehl2
|
Ausführung von befehl1 ; falls nicht erfolgreich,
anschließend Ausführung von
befehl2 (Erfolg zurückgeben, wenn
befehl1 oder
befehl2 erfolgreich sind)
|
befehl > foo
|
Weiterleitung der Standardausgabe von befehl in eine
Datei foo (Datei überschreiben)
|
befehl 2> foo
|
Weiterleitung des Standardfehlers von befehl in eine
Datei foo (Datei überschreiben)
|
befehl >> foo
|
Weiterleitung der Standardausgabe von befehl in eine
Datei foo (an Datei anhängen)
|
befehl 2>> foo
|
Weiterleitung des Standardfehlers von befehl in eine
Datei foo (an Datei anhängen)
|
befehl > foo 2>&1
|
Weiterleitung der Standardausgabe und Standardfehler von
befehl in eine Datei foo
|
befehl < foo
|
Weiterleitung der Standardeingabe von befehl in eine
Datei foo
|
befehl << begrenzung
|
Weiterleitung der Standardeingabe von befehl in die
folgenden Zeilen, bis "begrenzung " erreicht ist (hier
Dokument)
|
befehl <<- delimiter
|
Weiterleitung der Standardeingabe von befehl in die
folgenden Zeilen, bis "begrenzung " erreicht ist (hier
Dokument, die führenden Tab-Zeichen werden von den Eingabezeilen entfernt)
|
Das Debian-System ist ein Multi-Tasking-System. Hintergrundprozesse erlauben
es Benutzern, mehrere Programme in einer einzigen Shell laufen zu
lassen. Bei der Verwaltung des Hintergrundprozesses sind die Shell-Builtins
jobs
, fg
, bg
und
kill
involviert. Bitte lesen Sie Abschnitte von bash(1)
bezüglich "SIGNALS", "JOB CONTROL" und
builtins(1).
Versuchen Sie zum Beispiel folgendes:
$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager
Obwohl alle 4 Beispiele von Shell-Weiterleitungen dasselbe anzeigen, führt
das letzte Beispiel einen extra cat
-Befehl aus und
verschwendet ohne Grund zusätzliche Ressourcen.
Die Shell erlaubt Ihnen, Dateien mittels dem exec
-Builtin
mit einem frei wählbaren Datei-Deskriptor zu öffnen.
$ echo Hallo >foo $ exec 3<foo 4>bar # Dateien öffnen $ cat <&3 >&4 # stdin an 3 weiterleiten und stdout an 4 $ exec 3<&- 4>&- # Dateien schließen $ cat bar Hallo
Die Datei-Deskriptoren 0-2 sind vordefiniert.
Tabelle 1.23. Vordefinierte Datei-Deskriptoren
Gerät | Beschreibung | Datei-Deskriptor |
---|---|---|
stdin
|
Standardeingabe | 0 |
stdout
|
Standardausgabe | 1 |
stderr
|
Standardfehler | 2 |
Sie können einen Alias für häufig verwendete Befehle definieren.
Versuchen Sie zum Beispiel folgendes:
$ alias la='ls -la'
Jetzt funktioniert "la
" als Kurzform für "ls
-la
", was alle Dateien in einem langen Listenformat auflistet.
Sie können alle vorhandenen Alias-Definitionen mit alias
anzeigen (lesen Sie dazu
bash(1)
unter "SHELL BUILTIN COMMANDS").
$ alias ... alias la='ls -la'
Sie können den exakten Pfad oder die Identität des Befehls mit
type
herausfinden (lesen Sie dazu
bash(1)
unter "SHELL BUILTIN COMMANDS").
Versuchen Sie zum Beispiel folgendes:
$ type ls ls is hashed (/bin/ls) $ type la la is aliased to ls -la $ type echo echo is a shell builtin $ type file file is /usr/bin/file
Hier wurde kürzlich nach "ls
" gesucht, nach
"file
" hingegen nicht, daher ist "ls
"
"hashed", d.h. die Shell hat einen internen Eintrag für einen schnellen
Zugriff auf den Speicherort des "ls
"-Befehls.
![]() |
Tipp |
---|---|
Lesen Sie Abschnitt 9.2.7, „Colorized commands“. |
In Unix-ähnlichen Arbeitsumgebungen wird Textverarbeitung erledigt, indem Text durch Abfolgen mehrerer Standard-Textverarbeitungswerkzeuge geleitet wird. Dies war eine weitere bedeutende Unix-Innovation.
Es gibt ein paar Standard-Textverarbeitungswerkzeuge, die auf Unix-ähnlichen Systemen sehr oft verwendet werden.
Ohne Verwendung regulärer Ausdrücke:
cat(1) verkettet Dateien und gibt den vollständigen Inhalt aus.
tac(1) verkettet Dateien und gibt den Inhalt in umgekehrter Reihenfolge aus.
cut(1) wählt Teile von Zeilen und ausgegebenen Inhalten aus.
head(1) gibt die ersten Zeilen von Dateien aus.
tail(1) gibt die letzten Zeilen von Dateien aus.
sort(1) sortiert Zeilen von Textdateien.
uniq(1) entfernt doppelte Zeilen aus einer sortierten Datei.
tr(1) übersetzt oder löscht Zeichen.
diff(1) vergleicht Dateien Zeile für Zeile.
Mit Verwendung grundlegender regulärer Ausdrücke (basic regular expressions / BRE):
grep(1) findet Text über Suchmuster.
ed(1) ist ein primitiver Zeilen-Editor.
sed(1) ist ein Stream-Editor.
vim(1) ist ein Bildschirm-gestützter Editor.
emacs(1) ist ein Bildschirm-gestützter Editor (eine Art erweiterter BRE)
Mit Verwendung erweiterter regulärer Ausdrücke (extended regular expressions / ERE):
egrep(1) findet Text über Suchmuster.
awk(1) führt einfache Textverarbeitung durch.
tcl(3tcl) kann jede erdenkliche Art von Textverarbeitung durchführen. lesen Sie dazu re_syntax(3). Oft zusammen mit tk(3tk) verwendet.
perl(1) kann jede erdenkliche Art von Textverarbeitung durchführen. Lesen Sie dazu perlre(1).
pcregrep(1)
aus dem pcregrep
-Paket findet Text über Perl-kompatible reguläre Ausdrücke
(PCRE).
python(1)
mit dem re
-Modul kann jede erdenkliche Art von
Textverarbeitung durchführen. Lesen Sie dazu
"/usr/share/doc/python/html/index.html
".
Wenn Sie sich nicht sicher sind, was genau diese Befehle tun, verwenden Sie
bitte "man befehl
", um es selbst herauszufinden.
![]() |
Anmerkung |
---|---|
Sortierreihenfolge und Bereichsausdruck sind abhängig vom Gebietsschema
(Locale). Wenn Sie das traditionelle Verhalten eines Befehls erreichen
möchten, verwenden Sie statt der UTF-8-Locales die C-Locale, indem Sie dem Befehl
" |
![]() |
Anmerkung |
---|---|
Perl regular expressions
(perlre(1)),
Perl-kompatible reguläre
Ausdrücke (PCRE) und Python regular
expressions, bereitgestellt durch das |
Reguläre Ausdrücke werden in vielen Textverarbeitungswerkzeugen verwendet. Sie sind den Shell Globs ähnlich, aber viel komplexer und leistungsfähiger.
Der reguläre Ausdruck beschreibt das passende Muster und besteht aus Textzeichen und Metazeichen.
Ein Metazeichen ist einfach ein Zeichen mit einer speziellen Bedeutung. Es gibt zwei Hauptgruppen, BRE und ERE, abhängig von den Textwerkzeugen, wie unten beschrieben.
Tabelle 1.24. Metazeichen für BRE und ERE
BRE | ERE | Beschreibung des regulären Ausdrucks |
---|---|---|
\ . [ ] ^ $ *
|
\ . [ ] ^ $ *
|
allgemeine Metazeichen |
\+ \? \( \) \{ \} \|
|
nur bei BRE: durch "\ " geschützte Metazeichen
|
|
+ ? ( ) { } |
|
nur bei ERE: nicht durch "\ " geschützte Metazeichen
|
|
c
|
c
|
findet Nicht-Metazeichen
"c "
|
\c
|
\c
|
findet den Buchstaben "c ", auch wenn
"c " selbst ein Metazeichen ist
|
.
|
.
|
findet jegliches Zeichen inklusive Newline |
^
|
^
|
Position am Anfang einer Zeichenkette |
$
|
$
|
Position am Ende einer Zeichenkette |
\<
|
\<
|
Position am Anfang eines Wortes |
\>
|
\>
|
Position am Ende eines Wortes |
[abc…]
|
[abc…]
|
findet irgendein Zeichen von "abc… "
|
[^abc…]
|
[^abc…]
|
findet irgendein Zeichen außer "abc… "
|
r*
|
r*
|
findet keinen oder mehr reguläre Ausdrücke festgelegt durch
"r "
|
r\+
|
r+
|
findet einen oder mehr reguläre Ausdrücke festgelegt durch
"r "
|
r\?
|
r?
|
findet keinen oder einen regulären Ausdruck festgelegt durch
"r "
|
r1\|r2
|
r1|r2
|
findet einen der regulären Ausdrücke festgelegt durch
"r1 " oder "r2 "
|
\(r1\|r2\)
|
(r1|r2)
|
findet einen der regulären Ausdrücke festgelegt durch
"r1 " oder "r2 " und behandelt es als
einen in Klammern gesetzten regulären
Ausdruck
|
Die regulären Ausdrücke von emacs
gehören grundsätzlich zu
den BRE, sind aber erweitert worden,
damit "+
" und "?
" wie bei den
ERE als Metazeichen behandelt werden. Es ist daher nicht
nötig, sie bei den regulären Ausdrücken von emacs
mit
"\
" zu schützen.
grep(1) kann verwendet werden, um eine Textsuche mittels regulärer Ausdrücke durchzuführen.
Versuchen Sie zum Beispiel folgendes:
$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE Yoyodyne, Inc., hereby disclaims all copyright interest in the program
![]() |
Tipp |
---|---|
Lesen Sie Abschnitt 9.2.7, „Colorized commands“. |
Bei den Ersetzungsausdrücken haben einige Zeichen spezielle Bedeutungen.
Tabelle 1.25. Der Ersetzungsausdruck
Ersetzungsausdruck | Beschreibung des Textes, der den Ersetzungsausdruck ersetzen soll |
---|---|
&
|
was der reguläre Ausdruck gefunden hat (benutzen Sie
\& in emacs )
|
\n
|
was der n-te in Klammern gesetzte reguläre Ausdruck gefunden hat ("n" ist ein Zahl) |
Bei Perl wird in Ersetzungs-Zeichenketten "$n
" statt
"\n
" verwendet und "&
" hat keine
besondere Bedeutung.
Versuchen Sie zum Beispiel folgendes:
$ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/' zzz=1abc2efg3hij4= $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/' zzz=&=
Achten Sie hier bitte besonders auf die Art der in Klammern gesetzten regulären Ausdrücke und wie die gefundenen Zeichenketten im Textersetzungsvorgang mit verschiedenen Werkzeugen genutzt werden.
Diese regulären Ausdrücke können in einigen Editoren auch zur Cursor-Verschiebung und Textersetzung verwendet werden.
Der Back-Slash "\
" am Ende der Zeile in der
Shell-Befehlszeile schützt das Newline als Leerraum-Zeichen und erlaubt die
Fortsetzung der Shell-Befehlszeileneingabe in die nächste Zeile.
Bitte lesen Sie alle zugehörigen Handbuchseiten, um diese Befehle zu erlernen.
Der Befehl
ed(1)
kann alle Vorkommen von "VON_REGEX
" in
"datei
" durch "ZU_TEXT
" ersetzen.
$ ed datei <<EOF ,s/VON_REGEX/ZU_TEXT/g w q EOF
Der Befehl
sed(1)
kann alle Vorkommen von "VON_REGEX
" in
"datei
" durch "ZU_TEXT
" ersetzen.
$ sed -ie 's/VON_REGEX/ZU_TEXT/g' datei
Der Befehl
vim(1)
kann durch Verwendung der
ex(1)-Befehle
alle Vorkommen von "VON_REGEX
" in
"datei
" durch "ZU_TEXT
" ersetzen.
$ vim '+%s/VON_REGEX/ZU_TEXT/gc' '+w' '+q' datei
![]() |
Tipp |
---|---|
Die " |
Mehrere Dateien ("datei1
", "datei2
"
und "datei3
") können auf ähnlichem Wege mittels regulärer
Ausdrücke mit
vim(1)
oder
perl(1)
verarbeitet werden.
$ vim '+argdo %s/VON_REGEX/ZU_TEXT/ge|update' '+q' datei1 datei2 datei3
![]() |
Tipp |
---|---|
Die " |
$ perl -i -p -e 's/VON_REGEX/ZU_TEXT/g;' datei1 datei2 datei3
In dem perl(1)-Beispiel steht "-i
" für direkte
Bearbeitung (in-place editing) der jeweiligen Zieldatei und
"-p
" für implizites Abarbeiten aller angegebenen Dateien
mittels Schleifen.
![]() |
Tipp |
---|---|
Durch die Verwendung von " |
![]() |
Anmerkung |
---|---|
ed(1) und vim(1) gehören zu den BRE, perl(1) zu den ERE. |
Wir nehmen an, eine Textdatei namens "DPL
" enthält die
Namen einiger Debian-Projektleiter der Jahre vor 2004 sowie deren
Ernennungsdatum in einem durch Leerzeichen getrennten Format:
Ian Murdock August 1993 Bruce Perens April 1996 Ian Jackson January 1998 Wichert Akkerman January 1999 Ben Collins April 2001 Bdale Garbee April 2002 Martin Michlmayr March 2003
![]() |
Tipp |
---|---|
Lesen Sie "Eine kurze Geschichte von Debian " bezüglich der neuesten Vergangenheit zum Debian-Projektleiter. |
Awk wird oft verwendet, um Daten aus dieser Art von Dateien zu extrahieren.
Versuchen Sie zum Beispiel folgendes:
$ awk '{ print $3 }' <DPL # Monat der Ernennung August April January January April April March $ awk '($1=="Ian") { print }' <DPL # DPL namens Ian Ian Murdock August 1993 Ian Jackson January 1998 $ awk '($2=="Perens") { print $3,$4 }' <DPL # Wann Perens ernannt wurde April 1996
Auch Shells wie Bash können verwendet werden, um diese Art von Dateien zu verarbeiten.
Versuchen Sie zum Beispiel folgendes:
$ while read first last month year; do echo $month done <DPL ... ergibt die gleiche Ausgabe wie beim ersten Awk-Beispiel
Hier verwendet der read
-Builtin-Befehl Zeichen aus
"$IFS
" (interne Feldseparatoren), um Zeilen in einzelne
Wörter aufzusplitten.
Wenn Sie "$IFS
" in ":
" ändern, können
Sie auf nette Weise "/etc/passwd
" mit der Shell
verarbeiten.
$ oldIFS="$IFS" # den alten Wert speichern $ IFS=':' $ while read user password uid gid rest_of_line; do if [ "$user" = "bozo" ]; then echo "$user's ID is $uid" fi done < /etc/passwd bozo's ID is 1000 $ IFS="$oldIFS" # den alten Wert wiederherstellen
(Wenn Awk dies erledigen soll, verwenden Sie "FS=':'
", um
den Feldseparator festzulegen.)
IFS wird auch von der Shell verwendet, um die Ergebnisse von Parameterexpansion, Befehlsersetzung und arithmetischer Expansion aufzusplitten. Diese tauchen nicht innerhalb von doppelt oder einfach quotierten Wörtern auf. Der Standardwert von IFS ist die Kombination von <Space>, <Tab> und <Newline>.
Seien Sie vorsichtig bei der Verwendung dieser Shell-IFS-Tricks. Verrückte Dinge passieren, wenn die Shell einige Teile des Skripts als eigene Eingabe interpretiert.
$ IFS=":," # ":" und "," als IFS verwenden $ echo IFS=$IFS, IFS="$IFS" # echo ist ein Bash-Builtin IFS= , IFS=:, $ date -R # Einfach eine Befehlsausgabe Sat, 23 Aug 2003 08:30:15 +0200 $ echo $(date -R) # Sub-Shell --> Eingabe zur Haupt-Shell Sat 23 Aug 2003 08 30 36 +0200 $ unset IFS # IFS auf den Standardwert zurücksetzen $ echo $(date -R) Sat, 23 Aug 2003 08:30:50 +0200
Die folgenden Skripte tun nette Dinge als Teil einer Weiterleitung.
Tabelle 1.26. Liste von Skript-Schnipseln für die Befehlsweiterleitung
Skript-Schnipsel (in einer Zeile eingeben) | Auswirkung des Befehls |
---|---|
find /usr -print
|
findet alle Dateien in "/usr "
|
seq 1 100
|
gibt die Zahlen 1 bis 100 aus |
| xargs -n 1 <befehl>
|
führt befehl wiederholt aus, mit jedem Element aus der Weiterleitung jeweils als Argument |
| xargs -n 1 echo
|
splittet durch Leerraum getrennte Elemente aus der Weiterleitung in einzelne Zeilen auf |
| xargs echo
|
führt alle Zeilen aus der Weiterleitung in eine Zeile zusammen |
| grep -e <regex_muster>
|
extrahiert Zeilen aus der Weiterleitung, die das Regex-Suchmuster enthalten |
| grep -v -e <regex_muster>
|
extrahiert Zeilen aus der Weiterleitung, die nicht das Regex-Suchmuster enthalten |
| cut -d: -f3 -
|
extrahiert das dritte Feld aus der Weiterleitung, separiert durch
": " (passwd-Datei usw.)
|
| awk '{ print $3 }'
|
extrahiert das dritte Feld aus der Weiterleitung, separiert durch Leerraum-Zeichen |
| awk -F'\t' '{ print $3 }'
|
extrahiert das dritte Feld aus der Weiterleitung, separiert durch Tab |
| col -bx
|
entfernt Backspace und expandiert Tabs zu Leerzeichen |
| expand -
|
expandiert Tabs |
| sort| uniq
|
sortiert Inhalte und entfernt Duplikate |
| tr 'A-Z' 'a-z'
|
konvertiert Großschreibung in Kleinschreibung |
| tr -d '\n'
|
führt mehrere Zeilen in eine Zeile zusammen |
| tr -d '\r'
|
entfernt CR (carriage return/Wagenrücklauf) |
| sed 's/^/# /'
|
fügt "# " zum Anfang jeder Zeile hinzu
|
| sed 's/\.ext//g'
|
entfernt ".ext "
|
| sed -n -e 2p
|
gibt die zweite Zeile aus |
| head -n 2 -
|
gibt die ersten zwei Zeilen aus |
| tail -n 2 -
|
gibt die letzten zwei Zeilen aus |
Ein einzeiliges Shell-Skript kann durch Verwendung von find(1) und xargs(1) über Schleifen viele Dateien in Folge abarbeiten und so ziemlich komplexe Aufgaben erledigen. Lesen Sie dazu Abschnitt 10.1.5, „Idioms for the selection of files“ und Abschnitt 9.3.9, „Repeating a command looping over files“.
Wenn die Verwendung des interaktiven Shell-Modus' zu kompliziert wird, ziehen Sie bitte in Erwägung, ein Shell-Skript zu schreiben (weiteres dazu in Abschnitt 12.1, „The shell script“).