Willemers Informatik-Ecke
Terminals bestehen aus einer Einheit aus Tastatur und einem Monitor, die
unter UNIX normalerweise über eine serielle Leitung mit dem Rechner verbunden
sind. Dabei beherrschen die einfachen Terminals nur die Fähigkeit mit festen
Zeichen umzugehen. Da es Terminals verschiedener Hersteller gibt, liefern
Terminals je nach Typ unterschiedliche Kodierungen für die Sondertasten und
benötigen unterschiedliche Sequenzen, um den Bildschirm anzusteuern.
Echte Terminals gibt es kaum noch. Da Netzverkabelungen heute billiger sind als
serielle Kabel und die PCs sowieso auf jedem Arbeitsplatz stehen, gehen immer
mehr Terminals in Rente. An einer Stelle allerdings sind sie in manchen Fällen
von unschätzbarem Wert: im Serverraum als Konsole. Denn im
Falle eines Zusammenbruchs der Netzwerkkomponente ist es gut, einen Zugang zur
Maschine zu haben, der nicht vom Netzwerk abhängig ist.
Konfiguration der Terminals
inittab und ttys
Bei Hochfahren des Systems liest der Prozeß init die Datei
/etc/ttys (bei BSD-Systemen) oder /etc/inittab
(bei System V), um
festzustellen, welche Terminals verfügbar sein sollen.
In beiden Systemen existiert für jedes Terminal eine Zeile.
/etc/ttys
Die Datei /etc/ttys unter BSD ist recht einfach
aufgebaut. Zunächst kommt der Gerätename des Terminals, es folgt der
Programmaufruf des getty, der für dieses Terminal
zuständig ist. Anschließend kommt der Terminaltyp der termcap, der
für dieses Terminal standardmäßig verwendet werden soll. Die beiden
folgenden Spalten geben an, ob man sich als root anmelden kann oder nicht.
console none unknown off secure
ttyv0 "/usr/libexec/getty Pc" cons25 on secure
ttyv1 "/usr/libexec/getty Pc" cons25 on secure
ttyv2 "/usr/libexec/getty Pc" cons25 on secure
ttyv3 "/usr/libexec/getty Pc" cons25 on secure
ttyv4 "/usr/libexec/getty Pc" cons25 on secure
|
Der Eintrag in der inittab sieht geringfügig anders aus,
erfüllt aber den gleichen Zweck.
5:123:respawn:/sbin/mingetty tty5
6:123:respawn:/sbin/mingetty tty6
S0:123:respawn:/sbin/agetty -L 9600 ttyS0
|
Ein Eintrag in der inittab hat folgende Struktur:
ID:Runlevel:Aktion:Prozess
|
- ID:
-
Dies ist die Kennung der Zeile, sie besteht maximal 2 oder 4 Zeichen.
- Runlevel:
-
In welchem Runlevel die Aktion auszuführen ist. Im Beispiel sind die
Aktionen in Runlevel 1, 2 und 3 aktiv.
- Aktion:
-
Hier können verschiedene Schlüsselworte stehen. Im Falle eines
Terminaleintrags steht hier immer respawn. Das bedeutet, dass wenn der
Prozess stirbt, sofort ein neuer Prozess gestartet wird.
- Prozess:
-
Der Prozess, der zu diesem Eintrag gehört und gestartet wird.
Um ein weiteres Terminal anzuschließen, ist ein neuer Eintrag notwendig.
Anschließend muss der Prozess init dazu gebracht werden, die Datei
erneut zu lesen. Man erreicht dies, indem man init das SIGHUP-Signal
zusendet. Der Befehl lautet:
Startup der getty
Der init-Prozess startet beim Hochfahren für jede Terminalleitung den
entsprechenden Befehl, so wie er in /etc/inittab bzw.
/etc/ttys aufgeführt ist. Normalerweise ist dies getty
oder ein verwandtes Programm. getty bewacht die Leitung. Tut sich
etwas, startet er login, welcher wiederum bei erfolgreicher Anmeldung
die Shell startet. Beim Abmelden wird die Shell einfach beendet.
Aktion nach Ende des Prozesses
Ebenfalls in der inittab steht, was nach dem Tod des letzten
Programmes passieren soll. Für Terminals steht hier respawn, da nach
der Abmeldung bzw. der erfolglosen Anmeldung getty wieder in Aktion
treten soll.
Kryptische Zeichen
Es ist bei vielen Systemen möglich, mehrere Baudraten für ein Terminal
anzugeben. Eine falsche Baudrate zeigt sich am Terminal durch wilde Zeichen.
Durch Drücken der Taste Break (In den meisten Terminalemulationen
findet sich in den Menüs ein Kommando, um einen Break zu senden.)
am Terminal wird getty veranlaßt, zyklisch die nächste Baudrate zu
verwenden. Man drückt also Break, bis man das Login lesen kann und meldet
sich dann an.
nur Großbuchstaben
Eine Anmeldung nur in Großbuchstaben interpretiert
getty so, dass das Terminal nur Großbuchstaben beherrscht.
Darum werden alle Großbuchstaben als Kleinbuchstaben interpretiert.
Echte Großbuchstaben werden mit einem voranstehenden Backslash interpretiert.
Da es heute keine Terminals mehr gibt, die keine Kleinschreibung
beherrschen, hat man wahrscheinlich versehentlich die Caps-Lock-Taste bei
der Anmeldung gedrückt. Meldet
man sich einfach erneut an, ist alles ist wieder im Normalzustand.
Die Terminalvariable TERM
Das eingestellte Terminal ist in der Umgebungsvariablen TERM hinterlegt.
Für kurzfristige Änderungen des Terminals kann man den Inhalt dieser
Variablen verändern. Da Umgebungsvariablen nicht automatisch an die
Kindprozesse weitervererbt werden, sollte TERM exportiert werden.
Greift dies nicht, kann man das Terminal mit dem Aufruf von tset
initialisieren.
TERM=vt100
export TERM
tset
|
Das aktuelle Terminal wird auf vt100 eingestellt.
termcap
In den BSD-Varianten wie beispielsweise Solaris oder FreeBSD werden
in der Datei /etc/termcap (Terminal Capabilities) die Charakteristiken
der verschiedenen Terminals mit den zugehörigen Steuersequenzen definiert.
Diese Datei hat gewisse Analogien zur /etc/printcap bei BSD-Druckern.
Als Beispiel ist hier der Eintrag für ein VT52-Terminal herausgegriffen, da
dieses nicht so kompliziert ist. Es kennt keine Funktionstasten oder Farbe.
An diesen Einträgen kann man bereits ermessen, dass das Einrichten eines
Terminals schnell zur Geduldsprobe werden kann.
Wenn Sie also eine eigene Terminalanpassung brauchen, kopieren Sie sich
ein möglichst ähnliches Terminal und führen Sie die notwendigen
Anpassungen durch.
vt52|dec vt52:\
:bs:\
:co#80:it#8:li#24:\
:ac=«aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
:ae=\EG:as=\EF:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\
:cr=^M:do=\EB:ho=\EH:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:\
:le=\ED:nd=\EC:nw=^M^J:sf=^J:sr=\EI:ta=^I:up=\EA:
|
Es gibt drei Arten Variablen. Boolesche Variablen werden genannt, wenn sie
zutreffen. Numerische Variablen verwenden ein Hashzeichen (#) und
Zeichenfolgen werden mit einem Gleichheitszeichen gekennzeichnet. Bei den
Zeichenketten wird das ESC-Zeichen als \E notiert. Kontrollzeichen wird
ein ^ vorangestellt.
Die Bedeutung der wichtigsten Variablen sind:
Kürzel | Bedeutung |
bs | Backspace führt Rückschritt aus |
co# | Anzahl der Spalten |
li# | Anzahl der Zeilen |
it# | Tabulatorenweite |
as= | Startkennung des alternativen Zeichensatzes |
ac= | Zeichenpaare für Blockgrafik |
ae= | Endekennung des alternativen Zeichensatzes |
bl= | Zeichen, das einen Piep auslöst (bell) |
cd= | Löschen bis Bildschirmende |
ce= | Löschen bis Zeilenende |
cl= | Bildschirm komplett löschen, Cursor links oben |
ho= | Cursor eine Zeile nach links oben positionieren |
cm= | Cursor positionieren |
do= | Cursor eine Zeile nach unten bewegen |
le= | Cursor ein Zeichen nach links bewegen |
nd= | Cursor ein Zeichen nach rechts bewegen |
up= | Cursor eine Zeile nach oben bewegen |
Kürzel | Bedeutung |
cr= | Eingabezeichen für Wagenrücklauf |
kb= | Taste für Backspace |
kd= | Taste für Cursor unten |
kl= | Taste für Cursor links |
kr= | Taste für Cursor rechts |
ku= | Taste für Cursor oben |
nw= | Kommando Carriage Return |
sf= | Eine Zeile scrollen |
sr= | Rückwärts scrollen |
ta= | nächsten Tabulator anspringen |
Weitere Variablenkürzel finden sich in der Manpage von termcap.
terminfo
System V und Linux verwenden die Datei /etc/terminfo zur Ansteuerung
von Terminals. Diese Datei liegt nicht mehr als eine große Textdatei wie die
termcap vor. Durch die vielen unterschiedlichen Terminals ist eine
termcap derart groß, dass die Verwaltung schwierig wird.
terminfo compiler tic
Der Eintrag eines Terminals wird in einer eigenen Textdatei
erstellt, dann mit dem Terminfo Compiler tic compiliert und
anschließend unter dem Verzeichnis /usr/lib/terminfo abgestellt.
Um eine Terminalbeschreibung zu finden beginnt man mit der Terminalbezeichnung.
Der Name (vt100, wyse370, etc.) führt zu einer Datei unterhalb des
Verzeichnisses /usr/lib/terminfo. Dort finden sich Verzeichnisse mit
einem Buchstaben. Diese Buchstaben sind der jeweils erste Buchstabe der
Terminalbezeichnung. Auf diese Weise wird das Verzeichnis terminfo
nicht überfüllt, was ansonsten zu einer langen Antwortzeit führen würde.
Um auf die Beschreibung eines Terminals mit der Kennung vt100 zuzugreifen,
sucht UNIX die Datei vt100 in dem Verzeichnis
/usr/lib/terminfo/v.
terminfo lesbar machen
Diese Datei befindet sich wie gesagt im Binärformat, ist also nicht direkt
lesbar. Um eine textuelle Darstellung der Terminfodatei zu erhalten, verwendet
man den Befehl infocmp. Durch Umleiten der Ausgabe kann man sich
eine Sourcedatei herstellen. In dieser Datei werden die Eigenschaften des
Terminals beschrieben. Sie können geändert werden und mit tic wieder
zu Terminfodateien kompiliert werden.
Die exakte Beschreibung der Einträge in terminfo, die Funktionsweise
von tic und infocmp können den jeweiligen Manpages entnommen
werden. Prinzipiell ähneln sich die Einträge in terminfo und
termcap.
Wenn das Terminal durcheinander ist
Wie oben gezeigt wurde, werden Terminals durch die Ausgabe von Kontrollsequenzen
gesteuert. Erhält das Terminal falsche Sequenzen, kann es passieren, dass
man keine Ausgaben mehr erhält. Dies kann beispielsweise dadurch passieren,
dass man versehentlich Binärdateien mit cat anzeigen lässt.
Besonders unangenehm ist dies, wenn es bei den eingebauten Konsolen passiert,
da man diese nicht einfach ein- und ausschalten kann, ohne den gesamten
Computer herunterzufahren. Hier hilft oft der Befehl:
Vor und hinter dem Befehl sollte man ctrl-J statt der Entertaste benutzen,
da das Terminal eventuell so durcheinander ist, dass es zusätzlich
zum ctrl-J ein ctrl-M erzeugt, was die Shell nicht richtig interpretieren kann.
UNIX verwendet allein ctrl-J als Zeilenvorschub, während andere Systeme
Kombinationen aus ctrl-M und ctrl-J benutzen.
Der Befehl stty dient an sich in erster Linie zur Einstellung von
Terminaleigenschaften wie der Baudrate. Die Option sane ist
allerdings wohl die wichtigste Anwendung des Befehls.