\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