Bei längeren Sitzungen an einer (Text-) Konsole würde ich gern frühere Eingaben nachlesen; insbesondere wenn umfangreiche Arbeiten stattgefunden haben. Wie lässt sich das machen?
Dr. Linux: Wenn Sie mit der Tastenkombination [Shift]+[Bild hoch] bzw. [Shift]+[Bild runter] zum "Blättern" nicht auskommen, können Sie ein Sitzungsprotokoll mit dem Kommando
user$ script Name_der_Protokolldatei
anfertigen lassen. Verwenden Sie den script-Befehl ohne Angabe einer Datei, wird automatisch ein Protokoll mit dem Namen typescript im aktuellen Arbeitsverzeichnis erstellt.
script läuft im Hintergrund und lässt sich mit der Tastenkombination [Strg+D] wieder beenden.
Viele Textkonsolen liefern eine Farbdarstellung, die durch sogenannte Escape-Sequenzen (siehe den gleichnamigen Kasten) gesteuert wird. Diese hält script in der Protokoll-Datei ebenfalls fest, so dass in der Reproduktion z. B. auch farbige Listings korrekt dargestellt werden.
Escape-Sequenzen
Das American National Standards Institute (ANSI) machte sich u. a. auch die Normierung der Terminalsteuerzeichen zur Aufgabe. Praktisch umgesetzt wird dies mit Escape-Sequenzen, von denen in diesem Artikel mehrfach die Rede ist, und die Sie ausführlich im Bash-Prompt-HOWTO (z. B. http://www.linux.com/howto/Bash-Prompt-HOWTO-6.html) beschrieben finden.
Einige dieser Steuerzeichen kennen Sie schon; so ist das bekannte "Beep", das Ihr System gelegentlich von sich gibt, ebenfalls eine Escape-Sequenz: Auf einer Kommandozeile abgesetzt lässt die Tastenkombination [Strg+G] Ihren Rechner piepsen (sofern Ihr Distributor oder Sie Ihr System nicht auf "sprachlos" konfiguriert haben).
Noch "multimedialer" können Sie derartige Zeichen zur Farbsteuerung einsetzen, z. B. für farbige Ausgaben im Textmodus oder zur farbigen Gestaltung des Prompts. Das HOWTO bietet einige Beispiele, die zum Probieren einladen, als vorgefertigte Skripte an. In eine Datei kopiert und ausführbar gemacht können Sie z. B. das Farbschema auf Ihrer Kommandozeile betrachten. Das folgende Skript aus dem HOWTO demonstriert die möglichen Farben (Abbildung 1):
#!/bin/bash
#
# Diese Datei gibt eine Reihe von Farbcodes
# auf dem Terminal aus.
# Jeder echo-Aufruf druckt eine Vordergrundfarbe auf
# grauem und schwarzem Hintergrund aus und schreibt
# den Code für die Vordergrundfarbe in die Zeilenmitte.
# Dieses Skript wurde mit weißen, schwarzen und grünen
# Terminalhintergründen getestet (2. Dezember 98).
#
echo "Auf Hellgrau: Auf Schwarz:"
echo -e "\033[47m\033[1;37m Weiss \033[0m\
1;37m \
\033[40m\033[1;37m Weiss \033[0m"
echo -e "\033[47m\033[37m Hellgrau \033[0m\
37m \
\033[40m\033[37m Hellgrau \033[0m"
echo -e "\033[47m\033[1;30m Grau \033[0m\
1;30m \
\033[40m\033[1;30m Grau \033[0m"
echo -e "\033[47m\033[30m Schwarz \033[0m\
30m \
\033[40m\033[30m Schwarz \033[0m"
echo -e "\033[47m\033[31m Rot \033[0m\
31m \
\033[40m\033[31m Rot \033[0m"
echo -e "\033[47m\033[1;31m Hellrot \033[0m\
1;31m \
\033[40m\033[1;31m Hellrot \033[0m"
echo -e "\033[47m\033[32m Grün \033[0m\
32m \
\033[40m\033[32m Grün \033[0m"
echo -e "\033[47m\033[1;32m Hellgrün \033[0m\
1;32m \
\033[40m\033[1;32m Hellgrün \033[0m"
echo -e "\033[47m\033[33m Braun \033[0m\
33m \
\033[40m\033[33m Braun \033[0m"
echo -e "\033[47m\033[1;33m Gelb \033[0m\
1;33m \
\033[40m\033[1;33m Gelb \033[0m"
echo -e "\033[47m\033[34m Blau \033[0m\
34m \
\033[40m\033[34m Blau \033[0m"
echo -e "\033[47m\033[1;34m Hellbau \033[0m\
1;34m \
\033[40m\033[1;34m Hellblau \033[0m"
echo -e "\033[47m\033[35m Purpur \033[0m\
35m \
\033[40m\033[35m Purpur \033[0m"
echo -e "\033[47m\033[1;35m Rosa \033[0m\
1;35m \
\033[40m\033[1;35m Rosa \033[0m"
echo -e "\033[47m\033[36m Cyan \033[0m\
36m \
\033[40m\033[36m Cyan \033[0m"
echo -e "\033[47m\033[1;36m Hellcyan \033[0m\
1;36m \
\033[40m\033[1;36m Hellcyan \033[0m"
\033 steht dabei für das Zeichen, das ein Druck auf die ESCape-Taste erzeugt, daher der Name Escape-Sequenzen. Die 33 im oktalen Zahlensystem entspricht dem ASCII-Code für das Escape-Zeichen (27 dezimal).
Die Shell
Ein Kommandointerpreter. Dieses Programm wird z. B. bei der Anmeldung am System gestartet (Login-Shell) und nimmt die vom Benutzer eingegebenen Kommandos entgegen (interaktive Shell). Shells haben in der Regel Programmiersprachenelemente (Variablen, Schleifen, konditionale Abfragen etc.) eingebaut, sodass man Anweisungen zu sogenannten Shell-Programmen alias Shell-Skripten zusammenstellen und ausführen lassen kann. Neben der bash, die von der überwiegenden Anzahl der Linuxuser genutzt wird, stehen unter Linux und anderen Unixbetriebssystemen z. B. folgende Shells zur Auswahl:
Beginnen Sie mit dem Aufzeichnen des Protokolls in Ihrem Home-Verzeichnis, denn zum Erstellen der Protokolldatei benötigt script Ihre Schreibberechtigung für das aktuelle Verzeichnis.
Mit
user$ cat Dateiname_des_Protokolls
lässt sich das Protokoll von einer Kommandozeile aus reproduzieren; bei längeren Protokollen bietet sich eine seitenweise Anzeige mit more statt cat an, oder Sie rufen das Protokoll in einem X-Terminalprogramm auf, das einen Scrollbalken zur Verfügung stellt.
Lässt sich die Login-Meldung, beispielsweise
Red Hat Linux release 7.0 (Guinness) Kernel 2.2.16-22 on an i586
individuell gestalten?
Dr. Linux: Die Distributionen geben vor dem Login Meldungen aus, deren Inhalt in der Datei /etc/issue gespeichert ist. Der Superuser kann diese Datei editieren und damit die Ausgabe vor dem Login verändern.
Wenn Sie die Datei mit einem Editor öffen, werden Sie eventuell feststellen, dass dieser Begrüßungstext nicht nur aus Text, sondern auch aus Steuerzeichen besteht. So finden Sie bei SuSE z. B. folgenden Eintrag:
Welcome to SuSE Linux 7.1 (i386) - Kernel \r (\l).
Debian gibt sich mit
Debian GNU/\s 2.1 \n \l
etwas spartanischer, und Mandrake zeichnet mit einem Haufen Escape-Sequenzen gar einen kompletten Pinguin:
^[[40m^[[40m ^[[2J^[[0;0H ^[[0;1;30;44m ^[[40m ^[[44m ^[[40m[…] ^[[0m^[[255D Linux Mandrake release 7.0 (Air) Kernel 2.2.18 on an i686 / \l
Mit den Steuerzeichen hat es dabei folgende Bewandtnis:
\l erzeugt in der Ausgabe die Nummer der Textkonsole (tty1, tty2, …).\t gibt die Uhrzeit im Format HH:MM:SS aus.\m gibt den Prozessortyp (z. B. i586) an.\r gibt die Kernelnummer aus.\d setzt das Datum im Format 2001-06-13 ein.\n ist das Steuerzeichen, das durch den Rechnernamen ersetzt wird. Wenn Sie den EintragWillkommen - dies ist Kernel \r. Es ist \t. \l ist bereit zum Login.
in Ihrer /etc/issue ablegen, sieht die Login-Meldung dann so aus:
Willkommen - dies ist Kernel 2.2.18. Es ist 20:40:22. tty2 ist bereit zum Login.
Will man wie bei der Mandrake-Willkommensmeldung zusätzlich mit Farben arbeiten, kann man auf die im Kasten Escape-Sequenzen beschriebenen Steuerzeichen zurück greifen. Allerdings schreibt man das Escape-Zeichen jetzt nicht mehr als \033, sondern als [Strg+V], gefolgt von einem Druck auf die [Esc]-Taste. Zu sehen bekommt man dann ein ^[ in der Datei.
^[[47m^[[31m Willkommen - dies ist ^[[40m Kernel \r.^[[0 Es ist \t. \l ist bereit zum Login.
sorgt dafür, dass Willkommen - dies ist als rote Schrift auf grauem Untergrund erscheint. Die Kernelangabe wird Rot auf Schwarz ausgegeben, und mit Strg+V, [0 wird wieder die originale Farbgebung eingeschaltet.
Möchten Sie auch die Login-Meldung verändern, die Benutzer angezeigt bekommen, die sich per Telnet auf Ihrem Rechner einloggen, dann editieren Sie die Datei /etc/issue.net auf gleiche Weise.
Ich bekomme nach dem Anmelden (Login) auf der Textkonsole meines Systems folgenden Informationstext:
Last login: Sat Apr 28 14:35:54 on tty6
Wo kann ich das abstellen?
Dr. Linux: Wenn Sie diese Information nicht haben wollen, müssen Sie als Superuser tätig werden. Die Meldung des letzten erfolgreichen Logins (aller User) wird in der Datei /var/log/lastlog gespeichert und nach dem erneuten Anmelden beim System von der Login-Shell ausgegeben. Die Entscheidung, ob diese Daten auf dem Bildschirm erscheinen, wird in der Datei /etc/login.defs getroffen.
Öffnen Sie dieses File mit dem Editor Ihrer Wahl, und ändern Sie in der Zeile
LASTLOG_ENAB "yes"
den Eintrag "yes" auf "no".
Für Mandrake-User gibt es allerdings eine schlechte Nachricht: Bei einigen Versionen dieser Distribution ändert das Setzen von LASTLOG_ENAB nichts an der Ausgabe der "Last login"-Meldung.
Ich habe bei meiner Linux-Installation angegeben, mich zukünftig grafisch einzuloggen. Jetzt will ich mich aber doch lieber auf einer Textkonsole anmelden und die grafische Oberfläche bei Bedarf mit startx per Hand aufrufen. In welcher Datei muss ich das eintragen?
Dr. Linux: Unix-Systeme können in verschiedenen Betriebszuständen laufen, die als Runlevel bezeichnet werden. In der Datei /etc/inittab finden Sie eine Definition der vorkonfigurierten Runlevel Ihres Systems. Die Nummerierung der Runlevel ist bei den verschiedenen Distributionen nicht identisch.
Gemeinsam sind allen der Runlevel 0, der das System herunterfährt, und Runlevel 6, der einen Reboot auslöst. Daher ist es nicht ratsam, einen dieser beiden als Default Runlevel einzutragen, also als den Betriebszustand, der beim Booten automatisch eingenommen wird.
Die übrigen Runlevel sehen bei der SuSE-7.1-Distribution folgendermaßen aus:
root die Chance hat, an einem kaputten System mit nur wenig Funktionalität noch Einiges zu retten./etc/inittab finden Sie neben der Definition der Runlevel auch den Default-Runlevel. Kennzeichnend ist das Wort initdefault:id:5:initdefault:
Die Ziffer in dieser Zeile legt fest, mit welchem Runlevel Ihr System aktuell startet. Bei einer SuSE 7.1 muss also nur die Ziffer 5 gegen die Ziffer 3 ausgetauscht werden, damit die grafische Oberfläche beim nächsten Systemstart nicht mehr automatisch zur Verfügung steht. Bei anderen Distributionen lesen Sie einfach die Definitionen in /etc/inittab aufmerksam, um einen passenden Multi-User-Runlevel zu finden.
Warum können einige Programme über die Eingabe des Namens auf einer Kommandozeile starten und andere nicht? Verschiedene Programme wie z. B. fdisk kann ich nicht einfach auf der Kommandozeile aufrufen, obwohl sich das Programm unter /sbin/fdisk befindet. Ist mein System falsch konfiguriert?
Dr. Linux: Vorausgesetzt, Sie möchten keine Programmdateien aufrufen, deren Ausführung root oder einem bestimmten User und dessen Gruppe vorbehalten sind (wie z. B. fetchnews), lassen sich alle Programme starten, indem Sie den absoluten Pfadnamen als Befehl absetzen. In Ihrem Beispiel geben Sie also Folgendes ein:
user$ /sbin/fdisk
Ihre Shell sucht dann mit Hilfe der Shell-Variablen PATH nach dem Programm.
Die bash arbeitet nach dem Login eines Anwenders folgende Dateien im jeweiligen Homeverzeichnis ab:
Ist das Verzeichnis /sbin nicht in der PATH-Variablen eingetragen, wird in diesem Verzeichnis nicht gesucht, ergo müssen solche Programme mit dem absoluten oder relativen Pfadnamen gestartet werden. Soll ein Programm im aktuellen Verzeichnis aufgerufen werden, das sich nicht im Suchpfad befindet, wird dies durch Voranstellen von ./ vor den Programmnamen erreicht.
Diese auf den ersten Blick etwas umständlich anmutende Vorgehensweise hat durchaus ihren Sinn. Dahinter steckt der Grundgedanke, den Anwendern mehr Sicherheit vor Zugriff und/oder Schädigung durch "die dunkle Seite der Macht" zu geben.
Ein etwas tieferer Blick auf die Arbeitsweise der Variablen PATH erklärt diesen Sicherheitsmechanismus. Die Variable enthält eine Reihe von Verzeichnispfaden, die durch Doppelpunkte von einander getrennt sind. Diese Reihe wird von vorn bis zu dem Verzeichnispfad durchgearbeitet, in dem das gesuchte Kommando bzw. Programm gefunden wird, der Rest wird ignoriert.
Ein (eingeschleustes) Programm, das nur den Namen eines oft benutzten Kommandos führt, aber im Hintergrund etwas völlig Anderes auslöst, wird statt des echten Programms ausgeführt, wenn es von der Shell vor dem wirklichen Befehl gefunden wird. Daher ist es sicherer, dass nur die vorgesehenen Verzeichnispfade durchsucht werden. Wären das jeweils aktuelle Arbeitsverzeichnis oder auch das von vielen gemeinsam genutzte temporäre Verzeichnis ganz vorn in PATH aufgelistet, bräuchten Schadprogramme aus der täglichen Mailflut auf Einzelplatzrechnern oder (Angreifer-) Programme im Verzeichnis /tmp (vor allem in Netzwerken) nur auf einen Aufruf zu warten.
Ein sorgfältiger Administrator ruft daher Programme mit dem absoluten Pfadnamen auf, um nicht unbewusst einem (eingeschleusten) Programm auch noch die Rechte des Superusers mit auf den Weg zu geben.
Mit dem Befehl
user$ echo $PATH
können Sie sich anschauen, welche Verzeichnisse zu Ihrem Programmsuchpfad gehören:
usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/lib/java/:.
Für die kurzfristige Aufnahme eines Verzeichnisses in die PATH-Variable setzen Sie folgenden Befehl auf der Kommandozeile ab:
user$ export PATH=$PATH:/Verzeichnis/Unterverzeichnis
Das vorangestellte $PATH bewirkt, dass der bereits vorhandene Inhalt der Pfadvariablen erhalten bleibt. Selbstverständlich wirkt sich diese Pfadänderung nicht auf Terminalfenster aus, die Sie sonst noch geöffnet haben.
Möchten Sie trotz der Sicherheitsbedenken permanent ein weiteres Verzeichnis in die Variable aufnehmen, dann erreichen Sie dies durch einen entsprechenden Eintrag in der ~/.bashrc oder ~/.profile.
Es passiert gelegentlich, dass ich im Textmodus oder in einem XTerm eine Programmdatei mit dem Befehl cat öffne. In Folge wird die Bildschirmausgabe mit unlesbaren Zeichen übersät, und alle anschließend neu eingegebenen Zeichen werden ebenfalls unleserlich dargestellt. Wie bekomme ich in solchen Fällen eine lesbare Bildschirmausgabe zurück?
Dr. Linux: Eine im Eifer des Gefechts aufgelistete Programmdatei hat fast immer zur Folge, dass sich die Zeichenausgabe in ein unleserliches Etwas verwandelt, denn die Ausgabe von Programmdateien enthält gewöhnlich Steuerzeichen, die wiederum die Grafikkarte dazu veranlassen, in einen alternativen Modus zu schalten.
Im günstigsten Fall brechen Sie das Programm mit der Tastenkombination [Strg+C] ab und bekommen einen lesbaren Prompt zurück.
Bleibt die Eingabeaufforderung weiterhin unlesbar, versuchen Sie es mit der Tastenkombination [Strg+V] und danach [Strg+O] (Abbildung 3). Mit [Strg+V] sagen Sie Ihrer Shell, dass Sie nun ein Steuerzeichen absetzen, die Shell wird Ihnen dies mit keinerlei Rückmeldung danken. [Strg+O] ist das Steuerzeichen und erscheint normalerweise schon in lesbarer Form als ^O auf der Kommandozeile. Erst danach drücken Sie [Return] ([Enter]), was Ihnen die lesbare Auskunft command not found und hoffentlich einen wiederhergestellten Prompt einbringt.
Wenn Sie einen Sinn für das 100%ige haben, schicken Sie nun noch den Befehl
user$ reset
hinterher, der all die lästigen Störzeichen aus der Bildschirmausgabe entfernt.
Wenn alles schiefgeht, was schiefgehen kann, dann fallen Ihnen gerade im Ernstfall die Tastenkombinationen nicht ein, um den alternativen Modus der Grafikkarte zurückzusetzen. Ein "blind" eingetipptes reset, gefolgt von return (eventuell zweimal hintereinander) reicht ggf. schon aus, um Ihre Bildschirmausgabe wieder in eine lesbare Form zu versetzen.
Glossar
Konsole
Einer der Textbildschirme, zwischen denen man unter Linux mit der Tastenkombination [Alt] plus Funktionstaste (meistens [F1] bis [F6]) umschalten kann. Von einer grafischen Oberfläche gelangen Sie mit [Strg+Alt] plus Funktionstaste [F1] bis [F6] zu einem Textbildschirm.
Prompt
Die Eingabeaufforderung (auch Bereitschaftszeichen genannt) signalisiert die Bereitschaft einer Shell, einen Befehl auszuführen. Da der Prompt konfiguriert werden kann, findet sich auf einigen Systemen einer, der das aktuelle Verzeichnis anzeigt, andere Rechner, häufig in Netzwerken, geben auch den jeweiligen Rechnernamen aus. Bei den Puristen unter den Administratoren finden Sie womöglich nur einzelne Zeichen wie %, > oder $.
Shell-Variablen
Viele Funktionen der bash werden durch Variablen gesteuert, die wiederum Einfluss auf die Gesamtfunktion eines Systems ausüben. Die Grundeinstellungen in den Dateien /etc/profile, /etc/profile.local, /etc/bashrc (je nach Distribution) werden zunächst eingelesen. Anwender haben die Möglichkeit, diese Einstellungen zu individualisieren, indem sie in ihrem Homeverzeichnis die entsprechenden Punkt-Dateien editieren.
Pfadnamen
Ein absoluter Pfadname, häufig auch vollständiger Pfadname genannt, beginnt mit dem Wurzelverzeichnis Root, symbolisiert durch /. Er setzt sich in der Regel aus /Verzeichnisname/ggf_weitere_Verzeichnisse/Dateiname zusammen. Ein relativer Pfadname beginnt im aktuellen Verzeichnis. /Verzeichnisname wird durch einen Punkt (.) ersetzt, dies ergibt den Aufruf ./ggf_weitere_Verzeichnisse/Dateiname. So kann das System (auch bei gleichnamigen Dateien) unterscheiden, welcher Datei der Aufruf gilt.