\documentclass{beamer}
\usepackage{amsmath}
\usepackage{url}
\usepackage{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[ngerman]{babel}
% Manual syntax highlighting
\newcommand{\synfunc} [1]{\color{blue!50!black}#1\color{black}}
\newcommand{\synstr} [1]{\color{red!50!black}#1\color{black}}
\newcommand{\synvar} [1]{\color{purple!50!black}#1\color{black}}
\newcommand{\synclass} [1]{\color{green!50!black}#1\color{black}}
\newcommand{\syncomment}[1]{\color{blue!20!black}#1\color{black}}
\newcommand{\syncool} [1]{\color{beamer@blendedblue}#1\color{black}}
\newcommand{\synoder} {\ \ \color{black}$\vee$\ \ }
\newcommand{\hr} {\rule[4pt]{\textwidth}{0.1pt}\\}
\title{Terminals, uxterm und screen}
\author{Ingo Blechschmidt \\\texttt{<iblech@web.de>}}
\institute{LUGA}
\date{7. September 2005}
\usetheme{Warsaw}
\usecolortheme{seahorse}
\setbeamercovered{transparent}
\begin{document}
\frame{\titlepage}
\frame{
\frametitle{Inhalt}
\tableofcontents
}
% Terminals
% * Geschichte
% * Interna
% * $TERM
% * termcap, terminfo
% * ncurses
% * SIGWINCH
% * Probleme
% * xterm, konsole, gnome-terminal
%
% uxterm:
% * Geschichte
% * Features
% * Konfiguration über X-Resources
% * Maus-Menüs
%
% screen
% * "Was ist es?"
% * "Wie funzt es?"
% * $TERM = "screen"
% * Eigenes PTY
% * Features
% * Mehrere Fenster
% * Detaching
% * Viele Konfigurationsmöglichkeiten
%
% screen-nodestatus
% * Sinn
% * Live-Demo
% * Screenshot etc.
% * "Total einfach"
% * "Wie kann ich mir sowas einbinden?"
% * Andere Sachen einbinden
\section{Terminals}
\subsection{Geschichte}
\frame[t]{\frametitle{Terminals}
\begin{itemize}
\item Terminal: Einheit von Aus- und Eingabegerät
\item "`Dumb Terminals"' (frühe 1970er): \\
Revolution des Umgangs mit Computern durch \\
einfache Ein- und Ausgabe
\item "`Intelligent Terminals"' (späte 1970er): \\
Interpretation von Escape-Sequenzen (Cursor-Positionierung, Schreiben
auf beliebigen Positionen, Farbauswahl, etc.)
\item Heute: Weitgehender Ersatz von echten Hardware-Terminals durch
Terminal-Emulatoren (xterm, rxvt, DOS mit geladenem
\texttt{ansi.sys}, \ldots)
\end{itemize}
}
\subsection{Interna}
\frame[t]{\frametitle{Probleme}
Inkompatibilitäten zwischen den einzelnen Terminal-Emulatoren:
\begin{itemize}
\item Unterschiedliche Interpretation von Escape-Sequenzen
\item Unterschiedliche Unterstützung von Farben
\item Unterschiedliche Handhabung von nicht-ASCII
\item Unterschiedliche Handhabung von Sondertasten (Funktionstasten,
Cursorbewegungstasten, Modifiers (Shift, Ctrl, Num-Lock, etc.))
\item Unterschiedliches Verhalten in Grenzfällen (Cursor in der letzten
Spalte der letzten Zeile, etc.)
\item \ldots
\end{itemize}
}
\frame[t]{\frametitle{Abhilfe: \texttt{\$TERM}, termcap, terminfo}
\begin{itemize}
\item Setzen der Umgebungsvariablen \texttt{TERM} durch jeden
Terminal-Emulator
\item Datenbank über alle Terminal-Typen:
\begin{itemize}
\item "`Unterstützt du Farben?"'
\item "`Welche Escape-Sequenz muss ich dir schicken, um den Cursor auf den
Zeilenanfang zu positionieren?"'
\item "`Wenn \texttt{\$USER} F1 drückt -- welche Sequenz schickst du mir
dann?"',
\item "`Wenn ich was in die untere rechte Ecke schreibe -- tickst du dann
aus?"'
\end{itemize}
\item Siehe auch: \texttt{/usr/share/terminfo/?/*}
\end{itemize}
}
\frame[t]{\frametitle{Cool. Problem beseitigt, nicht?}
\begin{itemize}
\item Leider nein.
\item Problem: Aktualität der installierten terminfo-Datenbank
\vfill
\item Nutzen von \texttt{shinynewterm}
\item SSHen zu \texttt{\$oldbox}
\item Probleme beim Nutzen bildschirmorienterter
Anwendungen
\vfill
\item "`Lösung"': Manuelles Setzen von \texttt{\$TERM} auf einen
von beiden Seiten verstandenen Standard (z.B. \texttt{vt100})
\item Lösung: \texttt{\~{}/.terminfo/}
\end{itemize}
}
\frame[t]{\frametitle{Dann ist jetzt alles ok?}
\begin{itemize}
\item Leider nein.
\item Problem: Lügen vieler Terminal-Emulatoren -- \\
Ausgeben von konsole, gnome-terminal, PuTTY und vieler anderer als
xterm
\item Das \textit{wäre} kein Problem -- \textit{wenn} sie alle Features von
xterm unterstützten und auch alle Besonderheiten von xterm
übernähmen.
\item In der Realität: Implementierung nur einer Untermenge von xterms
Features durch die meisten Nachahmer
\end{itemize}
}
\frame[t]{\frametitle{Workarounds}
\begin{itemize}
\item Massive Beschneidung des \texttt{xterm}-terminfo-Eintrags auf die
kleine Schnittmenge aller implementierten Features der am häufigsten
verwendeten Terminal-Emulatoren
\item Notwendigkeit für zusätzliche Checks in den Applikationen
\end{itemize}
}
\frame[t]{\frametitle{\texttt{SIGWINCH}}
\begin{itemize}
\item Problem: Möglichkeit, Terminals \textit{während der Laufzeit} in der
Größe zu verändern
\item Früher: Fehlen einer Möglichkeit des Mitteilens dieser Information
den laufenden Programmen
\item Heute: Senden des Signals \texttt{SIGWINCH} bei Veränderung der Größe
(und anderen Eigenschaften)
\end{itemize}
}
\frame[t]{\frametitle{"`Terminal-Viren"'}
\begin{itemize}
\item "`Viren"' bei alten textbasierten BBS: \\
Nutzen von ANSI-Sequenzen zur Farbverstellung, Tastaturumbelegung,
etc.
\item Unterstützung für gefährlichere Sequenzen durch heutige
Terminal-Emulatoren
% \begin{itemize}
% \item Umschaltung auf alternativen Grafikzeichensatz
% \item Veränderung der Terminal-Größe, Schriftart
% \item Maximierung/Minimierung
% \item Unterbindung des lokalen Echos
% \item Reset
% \item \ldots
% \end{itemize}
\item Niemals direkte Ausgabe von fraglichen Dateien per cat; \\
Stattdessen less oder \texttt{\$EDITOR}
\item Siehe auch: \texttt{`locate ctlseqs`}
\end{itemize}
\vfill
\begin{block}{Möglichkeiten zur Wiederherstellung}
\begin{itemize}
\item Alternativer Zeichensatz? \texttt{\^{}O}
\item Kein lokales Echo? \texttt{stty sane}
\item Vollständiger Reset nötig? \texttt{reset}
\end{itemize}
\end{block}
}
\subsection{Terminal-Emulatoren}
\frame[t]{\frametitle{Terminal-Emulatoren}
\begin{itemize}
\item xterm, uxterm (viele Features)
\item konsole, gnome-terminal \\
(Integration in die jeweilige Desktop-Umgebung)
\item rxvt, rxvt-unicode, aterm, wterm, \ldots \\
(geringer Ressourcenverbrauch)
\end{itemize}
}
\section{(u)xterm}
\subsection{Geschichte}
\frame[t]{\frametitle{(u)xterm}
\begin{itemize}
\item xterm älter als X!
\item Viele Versionen und Varianten
\item Viele Features
\end{itemize}
}
\subsection{Features}
\frame[t]{\frametitle{Features}
\begin{itemize}
\item Weniger Ressourcenverbrauch im Vergleich zu Terminal-Emulatoren
großer Desktop-Umgebungen
\item Exzellente Konfigurationsmöglichkeiten, auch zur Laufzeit
\item \textbf{u}xterm: exzellente Unicode- und UTF-8-Unterstützung
\end{itemize}
}
\subsection{Konfiguration}
\frame[t]{\frametitle{Konfiguration: X-Resources}
\begin{itemize}
\item Konfigurationseinstellungen über die X-Resources-Datenbank
\item Siehe auch: xterm(1), xrdb(1)
\end{itemize}
\vfill
\begin{block}{Beispiel-\texttt{\~{}/.Xdefaults}}\texttt{\small%
\syncomment{! Farben} \\
\synclass{UXTerm}*\synvar{background}: \ \synstr{\#000000} \\
\synclass{UXTerm}*\synvar{foreground}: \ \synstr{\#b2b2b2} \\
% \synclass{UXTerm}*\synvar{cursorColor}:\ \synstr{\#cdc092} \\
\syncomment{! Statt fetter Schrift lieber hellere} \\
\synclass{UXTerm}*\synvar{colorBDMode}:\ \synstr{true} \\
\syncomment{! Gut leserliche dicktengleiche Schrift} \\
\synclass{UXTerm}*\synvar{faceName}:\ \ \ \ \synstr{Andale Mono} \\
\synclass{UXTerm}*\synvar{faceSize}:\ \ \ \ \synstr{12} \\
\syncomment{! Scrollbar nimmt nur Platz weg} \\
\synclass{UXTerm}*\synvar{scrollBar}:\ \ \ \synstr{false} \\
\synclass{UXTerm}*\synvar{saveLines}:\ \ \ \synstr{10000} \\
}\end{block}
}
\frame[t]{\frametitle{Konfiguration: Kommandozeilen-Optionen}
\begin{itemize}
\item \texttt{-geometry \textit{Standard-Geometrie-Beschreibung}}
\item \texttt{-e \textit{Programm}}
\item \texttt{-xrm \textit{zusätzlicher xrdb-Eintrag}}
\item Siehe auch: \texttt{xterm -h}
\end{itemize}
}
\frame[t]{\frametitle{Konfiguration: Maus-Menüs}
\begin{itemize}
\item \texttt{<Ctrl> + <Button 1>}: Generelle Optionen
\begin{itemize}
\item Senden von Signalen (u.a. \texttt{SIGTERM}, \texttt{SIGKILL})
\item Neuzeichnen des Fensters
\item "`Secure Keyboard"'
\end{itemize}
\item \texttt{<Ctrl> + <Button 3>}: Terminal-Optionen
\begin{itemize}
\item Reverse Video
\item Visual Bell
\item Margin Bell
\item Reset
\end{itemize}
\item \texttt{<Ctrl> + <Button 2>}: Auswahl der Schriftgröße
\end{itemize}
}
\section{screen}
\frame[t]{\frametitle{screen}
\begin{itemize}
\item Fenstermanager für die Konsole mit vielen weiteren Features
\item Erste Version 1987
\item Oft genutztes Programm \\
(wenig Fehler, viel Dokumentation im Netz)
\item Nach Konfiguration enorme Arbeitserleichterung!
\end{itemize}
}
\subsection{Features}
\frame[t]{\frametitle{Mehrere Fenster}
\vspace*{-2em}
\begin{tabbing}
\texttt{\^{}A M} (monitor): \= \kill
\texttt{\^{}A c} (create): \> Erzeugen eines neuen Fensters \\
\texttt{\^{}A K} (kill): \> Abschießen des aktuellen Fensters \\
\texttt{\^{}A w} (windows): \> Anzeige des Fensterliste in der Statuszeile \\
\texttt{\^{}A "}: \> Anzeige des Fensterliste als Menü \\
\ \\
\texttt{\^{}A n} (next): \> Wechsel zum nächsten Fenster \\
\texttt{\^{}A p} (prev): \> Wechsel zum vorherigen Fenster \\
\texttt{\^{}A a}: \> Wechsel zum zuletzt ausgewählten Fenster \\
\texttt{\^{}A \textit{Nummer}}: \> Wechsel zu Fenster \textit{Nummer} \\
\ \\
\texttt{\^{}A M} (monitor): \> Überwachen des aktuellen Fensters auf Aktivität \\
\texttt{\^{}A \_{}}: \> Überwachen des aktuellen Fensters auf Stille \\
\end{tabbing}
}
\frame[t]{\frametitle{Scrollback-Buffer}
\vspace*{-2em}
\begin{tabbing}
\texttt{\^{}A <Space>}: \= \kill
\texttt{\^{}A [}: \> Wechsel in Scrollback-Buffer \\
\texttt{\^{}A .}: \> Vorzeitige Rückkehr in normalen Betriebsmodus \\
\ \\
\texttt{\^{}A <Space>}: \> Setzen einer Markierung \\
\ \\
\texttt{\^{}A ]}: \> Einfügen der Markierung \\
\end{tabbing}
}
\frame[t]{\frametitle{Statuszeile}
\begin{block}{Beispiel-\texttt{\~{}/.screenrc}}
\texttt{%
\syncomment{\# Statuszeile immer anzeigen} \\
\synfunc{hardstatus}\ \synstr{alwayslastline} \\
\ \\
\syncomment{\# Datum ganz rechts anzeigen} \\
\synfunc{hardstatus}\ \synstr{string}\ "\synstr{\symbol{37}h\symbol{37}=\symbol{37}D, \symbol{37}d.\symbol{37}m. \symbol{37}c}" \\
\syncomment{\# \symbol{37}h:\ \ \ \ \ \ \ \ \ \ \ \ Normaler Status-Text} \\
\syncomment{\# \symbol{37}=:\ \ \ \ \ \ \ \ \ \ \ \ Folgenden Text rechts ausrichten} \\
\syncomment{\# \symbol{37}D, \symbol{37}d.\symbol{37}m. \symbol{37}c: Di, 06.09. 18:21} \\
}
\end{block}
}
\frame[t]{\frametitle{"`Abdocken"'}
\vspace*{-2em}
\begin{tabbing}
\texttt{\^{}A \^{}D} (detach): \= \kill
\texttt{\^{}A \^{}D} (detach): \> Beenden von screen (aber nicht der Programme!) \\
\texttt{\^{}A *} (display): \> Anzeige aller "`angedockten"' screens \\
\texttt{\$ screen -RD}: \> Andocken an eine frühere Sitzung oder \\
\> Erstellen einer neuen
\end{tabbing}
\vfill
\begin{block}{Beispiel-\texttt{\~{}/.screenrc}}
\texttt{%
\syncomment{\# Automatisch abdocken wenn das echte Terminal} \\
\syncomment{\# stirbt (Absturz des X-Servers, Tod einer SSH-} \\
\syncomment{\# Verbindung, etc.)} \\
\synfunc{autodetach}\ \synstr{on}
}
\end{block}
}
\frame[t]{\frametitle{Viele Konfigurationsmöglichkeiten}
\begin{itemize}
\item Vielseitige Konfigurationsmöglichkeiten
\item \texttt{\~{}/.screenrc}, Kommandozeilen-Parameter
\vfill
\item Umbelegung von Tastenbindungen
\item Vorbelegung einiger Fenster für bestimmte Programme
\item Detaillierte Anpassung der Statuszeile
\item Ab-/Einschalten von UTF-8 für einzelne Fenster
\item \ldots
\end{itemize}
}
\subsection{Funktionsweise}
\frame[t]{\frametitle{Funktionsweise}
\begin{itemize}
\item Erzeugung eines eigenen virtuellen Terminals (\texttt{TERM=screen})
für jedes Fenster
\item Verstecken des echten Terminals vor den Programmen in der
screen-Session
\item Übersetzen der für \texttt{TERM=screen} passenden Escape-Codes in die
Codes des unterliegenden Terminals (\texttt{TERM=xterm},
\texttt{TERM=linux}, \ldots)
\item Damit auch möglich: Starten einer screen-Session in (z.B.) xterm und
dann späteres Andocken in PuTTY!
\end{itemize}
}
\subsection{screen-nodestatus}
\frame[t]{\frametitle{screen-nodestatus}
\begin{itemize}
\item Problem: \\
"`Habe ich das Gateway eingeschaltet?"' \\
"`Ist mein Server online?"' \\
"`Spielt AugustaKOM mal wierder Ping-Pong mit meinen Paketen?"'
\item Lösung: Anzeige des Erreichbarkeitsstatus beliebiger Rechner in
screens Statuszeile durch screen-nodestatus
\item Platz in der Statuszeile kostbar -- \\
Anzeige nur der Anfangsbuchstaben der Namen der überwachten Rechner
\vspace*{-1.5em}
\begin{tabbing}
Kleiner Anfangsbuchstabe? \= \kill
Großer Anfangsbuchstabe? \> Rechner erreichbar \\
Kleiner Anfangsbuchstabe? \> Rechner nicht erreichbar \\
\end{tabbing}
\end{itemize}
}
\frame[t]{\frametitle{screen-nodestatus: Funktionsweise}
\begin{block}{Beispiel-\texttt{\~{}/.screenrc}}
\texttt{%
\syncomment{\# Anzeige des jeweils letzten Zeile des Ausgabe} \\
\syncomment{\# von backtick-Befehl \#40 in der Statuszeile} \\
\synfunc{hardstatus}\ \synstr{string}\ "\ldots\synstr{\symbol{37}40`}\ldots" \\
\ \\
\syncomment{\# Definition des backtick-Befehls \#40} \\
\synfunc{backtick}\ \synstr{40}\ \synstr{0}\ \synstr{0}\ \synstr{\textit{programm}} \\
\syncomment{\# 40:\ \ ID} \\
\syncomment{\# 0 0: Einmaliges Starten des Programms,} \\
\syncomment{\#\ \ \ \ \ \ Anzeige der jeweils letzten Zeile der Ausgabe} \\
}
\end{block}
}
% \subsection{Erweiterbarkeit} -- XXX
% ^J, ^O, ^]=esc, ^@=000=strg+space,strg+altgr+q, ^=ctrl
\frame[t]{\frametitle{Siehe auch}
\vspace*{-2em}\small
\begin{tabbing}
\hspace{0.05\textwidth} \= \kill
\url{http://www.catb.org/~esr/terminfo/}, \\
term(7), terminfo(5), termcap(5), tset(1), stty(1): \\
\> Informationen über die terminfo-Datenbank und \texttt{\$TERM} \\
{\footnotesize\url{http://thread.gmane.org/gmane.linux.gentoo.devel/30624}}: \\
\> "`Fixing the TERM mess"' \\
\ \\
\url{http://dickey.his.com/xterm/xterm.faq.html}, xterm(1): \\
\> xterms Geschichte und Konfigurationsmöglichkeiten \\
{\footnotesize\url{http://www.x.org/pub/unsupported/doc/papers/tutorials/resources.txt}}: \\
\> Umgang mit der X-Resources-Datenbank \\
\ \\
{\scriptsize\url{http://www4.informatik.uni-erlangen.de/~jnweiger/screen-faq.html}},
screen(1): \\
\> Lösungen zu Problemen mit screen, Konfigurationsmöglichkeiten \\
\ \\
{\footnotesize\url{http://svn.openfoundry.org/pugs/examples/network/screen-nodestatus.p6}}: \\
\> screen-nodestatus (in Perl 6)
\end{tabbing}
}
\end{document}
Download