Den Terminalmultiplexer GNU Screen im Solarized-Thema erstrahlen lassen

Hier ist eine kleine Notiz, wie man ganz einfach Anwendungen und die Shell in GNU Screen mit dem fantastischen Solarized-Thema aufpolieren kann. Die Lösung war schließlich ganz einfach, auch wenn ich zuerst gedacht hatte, es würde länger dauern das Problem zu lösen.
Bisher sahen Verzeichnisse und Dateien in Screen trotz meiner Umstellung auf "Solarized" grau in grau aus.
rxvt-unicode ohne solarized
 
Ich fand schnell heraus, dass Screen einen eigenen Wert "screen" für die $TERM-Variable hatte, der sich von meinem favorisierten Terminalemulator "rxvt-unicode-256color" unterschied. In der ~/.screenrc lässt sich der Wert in der Theorie mit

term     rxvt-unicode-256color

ändern. Bei mir passierte jedoch nichts. Also warum nicht den Zustand akzeptieren und meine ZSH-Einstellungen in ~/.zshrc.local erweitern.

ZSH

if [ $TERM = rxvt-unicode-256color ] || [ $TERM = screen ]; then
        eval `dircolors $HOME/.dir_colors`
fi

Am Ende musste lediglich die if-Abfrage so erweitert werden, dass nicht nur in Rxvt-unicode-256color, sondern auch in Screen die Farbpalette Solarized geladen wurde.
 
rxvt-unicode mit solarized

Vim

Blieb nur noch Vim übrig. Hier ist die Syntax geringfügig anders. Um tatsächlich 256 Farben zu erhalten, muss t_Co auf 256 gesetzt werden, der Rest ist wieder nur eine Erweiterung der IF-Abfrage.

set t_Co=256
set background=dark
if (&term=="rxvt-unicode-256color" || &term=="screen")
        colorscheme solarized
endif

Danach erstrahlt sowohl der normale Terminalemulator als auch Screen in Solarized. Trivial. 🙂

Die trivialen Dinge über die keiner spricht

Was haben Raumschiff Enterprise Folgen und Blog-Artikel über Leben auf der Konsole gemeinsam?
Beide verschweigen gerne die trivialen Dinge des Lebens. Womöglich habt ihr euch auch schon einmal gefragt, wie Captain Picard und Co. es eigentlich mit den Sanitären Anlagen halten? Üblicherweise wird dieses nur allzu menschliche Detail in jeder Star Trek Folge geflissentlich ausgeblendet.
Posts zum Thema Linux und Konsole verhalten sich ähnlich. Man erfährt schnell, dass man mit einem zehn Jahre alten Laptop problemlos das Wetter der Erde in Echtzeit rendern kann, doch das "Wie kopiere ich eigentlich Texte im Terminal von A nach B" wird als selbstverständlich vorausgesetzt. Hier ist mein Versuch das Geheimnis um die Bedienung der Muscheln zu lüften.

GPM - General Purpose Mouse

Ich gebe zu, ich kann nicht alle Gewohnheiten ablegen, die sich in Jahren der Arbeit mit grafischen Oberflächen angesammelt haben. Instinktiv suchte ich deshalb nach einer Lösung wie man Texte mit der Maus markieren kann, um sie dann durch Kopieren und Einfügen an eine andere Stelle zu bewegen.
In der Regel erfüllt GPM diesen Zweck hervorragend. Bei gedrückter linker Maustaste markiert man den Text, wechselt zum Programm, in das man ihn einfügen möchte und drückt die rechte Maustaste. Mehr braucht es nicht um Wörter und Texte von A nach B zu kopieren. Vorausgesetzt natürlich man hat nur zwei Tasten zur Verfügung. Bei einer Drei-Tasten Maus ist die mittlere Taste die Einfüge-Taste.

Kopieren und Einfügen mit Screen

Wem die Maus suspekt erscheint, hat mit dem Terminalmultiplexer Screen (Tmux hat eine ähnliche Funktion) die Möglichkeit Texte mit der Tastatur in einen Buffer zu kopieren und auch wieder zum Vorschein zu bringen.

  1. STRG+A ESC startet den Kopiermodus. Ein danach erneut gedrücktes ESC bricht ihn ab. Im Copy Mode lässt sich wie im Vim Editor navigieren. h,j,k,l oder mit den Pfeiltasten. Mit g und G springt man zum Anfang und zum Ende.
  2. Space-Taste. Drückt man nach der STRG+A ESC Sequenz die Space-Taste markiert man somit den Anfang des Textes, den man kopieren möchte. Der Vorgang lässt sich durch einen weiteren Druck auf die Space-Taste beenden. Danach befindet sich die Kopie im Buffer.
  3. STRG+A ] Mit dieser Kombination wird schließlich der Text an der gewünschten Stelle wieder in Screen eingefügt.

Native Copy&Paste Funktionen der Konsolenprogramme

Die Notizbuch-Anwendung hnb z.B. lässt in Sachen Kopieren, Ausschneiden und Einfügen keine Wünsche offen. Dies funktioniert mit der bekannten Tastenkombination STRG+c, STRG+x und STRG+v.
Da man Kopieraufgaben hauptsächlich in Editoren benötigt, empfiehlt sich natürlich Vim. 😉 Mit vim -p datei1 datei2 datei3 usw. lassen sich mehrere Dateien gleichzeitig in verschiedenen Tabs öffnen. Zwischen diesen kann man im Kommandomodus mit gt oder gT navigieren. Im selben Modus lassen sich neue Tabs mit dem Befehl :tabnew öffnen.
Kopieren wird bei Vim yanking genannt. Startet man den Visuellen Modus mit v lässt sich der Text mit den gewohnten Bewegungstasten markieren und mit y kopieren und mit p einfügen. Yanking funktioniert auch im Kommandomodus z.B. mit yy für eine Zeile oder y3w für das Kopieren von 3 Wörtern. Der Löschen Befehl dd, d3w usw. lässt sich zugleich auch zum Ausschneiden benutzen.
Soweit zum Thema. Die man Seite zu Screen hat hier z.B. noch einiges zu Copy&Paste zu bieten. Momentan machen die vorgestellten Alternativen das Leben für mich auf der Konsole ein gutes Stück angenehmer.

Konkurrenz zu Screen: Tmux

Ich habe in letzter Zeit wieder einige Konsolenprogramme ausprobiert, worunter auch Tmux zu finden war. Wenn man viel mit dem Terminal arbeitet oder auf der Konsole unterwegs ist, begegnet einem zwangsläufig GNU Screen und man fragt sich wie man es früher ohne dieses nützliche Programm geschafft hat.
Tmux ist wie Screen ein sogenannter Terminalmultiplexer, der mehrere Fenster mit darin laufenden Programmen innerhalb eines Bildschirms darstellen kann. Für mich ist er somit das Gegenstück zu einem kachelnden Fenstermanager unter X und besonders nützlich für sehr alte Rechner. In der Regel brauche ich Screen hauptsächlich um die Übersichtlichkeit zu verbessern und den Terminal einfach bedienungsfreundlicher zu gestalten. Nicht zu vergessen lassen sich die Sitzungen sowohl von Screen als auch Tmux abtrennen und jederzeit mit den darin laufenden Programmen wieder hervorholen.
Im Moment bin ich mit Screen zufrieden, doch ein paar gute Gründe zum Wechsel gibt es. Da wäre zum einen Screens Eigenart leicht angefressen auf längere Namen von Terminalemulatoren zu reagieren. Außerdem konnte ich rxvt-unicode-256color nur mit etwas Nachhilfe dazu bewegen von Screen erkannt zu werden. Schon damals hatte Neo in den Kommentaren auf Tmux hingewiesen und in der Tat scheint Tmux weniger Probleme mit 256-Farben-Terminals zu haben.
Ansonsten kann man oft lesen, dass Tmux das modernere Screen sei und aktiv weiterentwickelt wird. Ich kann nichts Gegenteiliges behaupten. Screen hingegen ist ein wahres Software-Urgestein, was aber nicht bedeutet, dass es schlecht oder unbrauchbar ist. Vielmehr scheint es so zu sein, dass Screen eine gewisse Reife erlangt hat und im Regelfall einfach funktioniert und dazu noch von allen großen Distributionen unterstützt wird. Abgesehen davon ist Screen Bestandteil des GNU Betriebssystems, weswegen ich mir um die Zukunft erst einmal keine Sorgen mache.
Ein klarer Pluspunkt für Tmux ist aus meiner Sicht die Fähigkeit, auch die vertikale und horizontale Aufteilung des Bildschirms nach der Wiederherstellung einer Session beizubehalten, die Screen leider verwirft. Ebenfalls bemerkenswert ist die gute Dokumentation zu Tmux und die vielen Beispiele, die im Netz kursieren. Eine Suche zu "tmux conf" hilft schon weiter.

GNU Screen
Tmux

Wie sie sehen, sehen sie nicht viel. Große Unterschiede in meiner Standardkonfiguration gibt es zwischen Screen und Tmux nicht. In letzter Zeit kommt noch fbterm für die Konsole hinzu, der die Optik mit einem Hintergrundbild deutlich aufpoliert. In der Regel tut es aber eine Statusleiste am unteren Rand für mich.
Tmux bietet eine simple Möglichkeit die Tastenbelegungen mit dem bind Befehl zu ändern, weswegen ich z.B. von STRG+B auf das Screen-typische STRG+A zurückgewechselt bin, um Kommandos an Tmux durchzuleiten.
Meine .tmux.conf sieht so aus:

# STRG+A anstelle von STRG+B
unbind C-b
unbind l
set -g prefix C-a
bind-key C-a last-window
# Reload Taste
bind r source-file ~/.tmux.conf
# wichtig für rxvt-unicode-256color
set -g default-terminal "screen-256color"
set -g history-limit 1000
# Automatisch gestartete Session
new -d 'exec irssi'
neww -n alpine 'exec alpine -d 0'
neww -n mc mc
neww -n htop htop
neww -n slurm 'exec slurm -i eth0'
neww -n hnb hnb
neww -n elinks elinks
neww -n wyrd wyrd
neww -n newsbeuter newsbeuter
# THEMA
set -g status-bg black
set -g status-fg white
set -g status-right '#[fg=white]#(cut -d " " -f 1-3 /proc/loadavg)#[default] #[fg=white]%H:%M#[default]'

Im Gegensatz zu Screen muss Tmux mit tmux attach gestartet werden, sofern man Anwendungen in einer neuen Session beim ersten Aufruf mit ausführen möchte. Es gibt noch viel mehr zu erzählen und vor allem auf der technischen Seite gibt es einige Unterschiede zu Screen.
Was man mitnehmen sollte ist, es gibt eine gute Alternative zu Screen und die heißt Tmux.

GNU screen: $term too long – sorry

Kurze Notiz um einen nervigen Bug zu fixen.
Nachdem ich wegen der 256-Farben-Palette von Solarized auf rxvt-unicode-256color umgestiegen bin, lässt sich GNU-Screen plötzlich nicht mehr starten.
Die Fehlermeldung lautet:

$term too long - sorry

Der Bug ist im Debian-Bugtracker mit der Nummer #621804 bekannt. Es gibt scheinbar auch einen Fix sowohl Upstream als auch bei Debian, aber das Ganze scheint noch nicht eingepflegt worden zu sein.
Ich weiß zwar nicht, warum die Char-Variable für den Namen des Terminalemulators nur 20 Byte groß sein darf, aber die Lösung des Problems scheint recht einfach zu sein.
In .Xdefaults muss der Name des Terminals verkürzt werden.
z.B.

urxvt*termName:		rxvt-256color

Damit scheint alles wieder in Ordnung zu sein.

GNU Screen richtig nutzen

Screen ist für mich eines der wichtigsten Konsolenprogramme. Verbindet man sich mit ssh zu einem Rechner, vermisst man schnell die Fähigkeit einer modernen grafischen Oberfläche zwischen verschiedenen Anwendungen und Fenstern einfach hin- und her zu wechseln. Und wie können ausgeführte Programme in der Konsole auch nach dem Logout weiterlaufen? Hier kommt screen ins Spiel.
Beim Start von screen erscheint eine Nachricht und danach scheint es als ob sich nicht viel geändert hätte. Lediglich die Eingabeaufforderung der Shell blinkt einem entgegen.


Hier lässt sich nun z.B. rtorrent starten und der Bildschirm horizontal mit Strg+A und S teilen. Mit Strg+A und TAB springt man zur nächsten Bildschirmregion und kann dort mit Strg+A und c eine neue Shell öffnen und z.B elinks starten. Dies würde dann meinem schon vorgestellten rtorrent Setup entsprechen und sieht wie folgt aus.


Screen lässt sich aber nicht nur horizontal sondern auch vertikal teilen. Um das rtorrent Fenster vertikal zu teilen und htop anzuzeigen, springt man einfach mit Strg+A und TAB in die obere Hälfte zurück. Dann genügt bei Debian und Ubuntu ein Strg+A und | um den Bildschirm erneut zu teilen.
Anschließend wird der Schritt zum Starten einer neuen Anwendung wiederholt, wiederum Strg+A und TAB um zur nächsten Region zu gelangen, Strg+A und c um die Shell zu öffnen und dann htop eingeben.


Das Spiel lässt sich nun beliebig weiter treiben. Mit Strg+A und d bietet screen eine seiner besten Optionen an, nämlich screen abzutrennen und in den Hintergrund zu schicken. Danach befindet man sich wieder auf der ursprünglichen Konsole, alle in screen ausgeführten Programme laufen aber weiter!
Man könnte sich also problemlos ausloggen, zu Bekannten fahren, von dort sich erneut zu seinem Rechner mit ssh verbinden und danach mit dem Kommando screen -r seine Session wieder aufrufen.
Leider ist die Aufteilung der Anwendungen in verschiedene Regionen dann verschwunden und man müsste von neuem die Einteilung vornehmen. Natürlich lässt sich einfach mit Strg+A und SPACE zwischen den "Fenstern" wechseln. Oder man springt direkt zu einem Fenster indem man Strg+A und 0,1 oder 2 eingibt.
Wäre es nicht besser, man hätte eine Statusleiste, in der die unterschiedlichen Programme mit Namen und Fensterzahl schon angezeigt würden? Wäre es nicht praktischer die Anwendungen schon sofort beim Starten von screen mit auszuführen, ohne den Umweg über das Öffnen einer neuen shell zu gehen?
Der "Trick" ist die im Home Ordner versteckte Datei .screenrc zu erstellen, welche bei mir so aussieht.

hardstatus alwayslastline "%-w[%n %t]%+w%=%H %c Load: %l"
shelltitle '...'
startup_message off
vbell off
blankerprg /home/apo/.scripts/screensaver.sh
idle 300 blanker
#screen -t centerim 0 /home/apo/.scripts/centerim.sh
#screen -t alpine 1 alpine -d 0
#screen -t mc 2 /home/apo/.scripts/mc.sh
screen -t rtorrent 1 rtorrent
screen -t htop 2 htop
#screen -t wyrd 4 wyrd
screen -t elinks 3 /home/apo/.scripts/elinks.sh
#screen -t hnb 8 hnb
screen -t slurm 4 slurm -i eth0
GNU Screen

Aufmerksamen Lesern von KMandlas hervorragendem Linuxblog und Testern seiner Debian Lenny Sandbox Edition fällt hier sicher auf, dass es sich mit geringfügigen Änderungen um seine screenrc handelt. Sie ist übersichtlich und enthält meiner Meinung auch alles was man für die effiziente Benutzung von screen braucht.
Was macht diese Konfigurationsdatei? Zum einen verschwindet die Startnachricht, die man nicht wirklich benötigt. Die visuelle Rückmeldung, wenn sich etwas in den Fenstern getan hat, ist ebenfalls ausgeschaltet. Mit Shelltitle lässt sich der Name einer mit Strg+A und c gestarteten shell festlegen.
Die Zeile blankerprg verweist auf ein Bildschirmschoner-Skript, welches nach 5 Minuten ausgeführt wird, sollte man in der Zwischenzeit keine weiteren Aktionen in screen vorgenommen haben. Im Grunde genommen handelt es sich hier mehr um ein Gimmick, welches bei modernen Monitoren nicht notwendig ist. Ich stelle es ein anderes Mal ausführlicher vor.
Die restlichen Zeilen sind Programme, die ich regelmäßig in meiner Screen Session ausführe. Da ich nicht auf jedem Rechner immer die gleichen benötige, sind manche mit der # kommentiert. Der Aufbau ist simpel

screen -t Titel des Fensters Fensterzahl Name des Programms und Startparameter

Somit wird aus einem langweiligen Terminalfenster ein Fenstermanager für die Konsole. Zwischen den einzelnen Fenstern lässt sich danach wie gewohnt mit Strg+A und Space oder Strg+A und Fensterzahl wechseln.

Wer weitere Vorschläge für das Aussehen der Statuszeile bei screen sucht, findet schon bei Google mit dem Begriff hardstatus und screen viele weitere Ideen. Noch einfacher geht es, wenn man direkt byobu ausprobiert, was nichts anderes als ein verbessertes oder besser verschönertes screen ist.


Screen ist nicht nur für Serveradmins sinnvoll. Auch für alte Computer mit sehr wenig RAM bietet sich screen mit vielen nützlichen Konsolenprogrammen an, womit sich E-Mail schreiben, Browsen, Chatten, Bittorrent und vieles mehr realisieren lässt. Viel Spass beim Ausprobieren!

Effizient und schnell: rtorrent, screen und elinks

Heute möchte ich rtorrent, einen kleinen und sehr effizienten Bittorrent Client vorstellen und wie man ihn bequem aus der Ferne mit ssh kontrollieren kann. Im Zusammenspiel mit dem Terminal Multiplexer screen sind rtorrent und der Textbrowser elinks eine komfortable Lösung, um einen Bittorrent Client fernzusteuern, schnell und einfach neue Torrents hinzuzufügen und gleichzeitig äußerst effizient mit Systemressourcen umzugehen.
Durch die geringen Anforderungen an die Hardware eignet sich rtorrent auch für ältere Rechner und für Lösungen ohne grafische Desktopumgebung und lässt sich insbesondere für einen dedizierten Server, eine sogenannte Seedbox, nutzen.
Rtorrent ist eine auf ncurses basierende Oberfläche der Bittorrent Bibliothek libtorrent und ist derzeit bei Debian und Ubuntu in der Version 0.8.6 (rtorrent) und 0.12.6 (libtorrent) verfügbar. Zentrale Konfigurationsdatei bei rtorrent ist die im Home Ordner versteckte Datei .rtorrent.rc.

1. Schritt: Programme installieren

aptitude install ssh rtorrent elinks screen

2. Schritt: Konfiguration

Eine Beispieldatei der .rtorrent.rc gibt es auf der offiziellen Homepage. Hier findet man unter anderem die üblichen Einstellungen zur minimalen und maximalen Anzahl von peers pro Torrent, Anzahl der gleichzeitigen Verbindungen beim Upload und eine Option für die Beschränkung der Upload/Download Rate.
Ein interessantes Feature von rtorrent ist das Überwachen von Ordnern auf neue Torrents. Diese werden dann automatisch in rtorrent gestartet und nach erfolgreichem Download in einen anderen Ordner verschoben. Um ein solches Szenario einzurichten, geht man einfach so vor:
Im Home Verzeichnis einen Ordner Downloads erstellen und in diesem dann z.B. die Unterverzeichnisse watch, session, todo, fertig anlegen. In der .rtorrent.rc müssen danach nur noch folgende Angaben gemacht werden:

directory = ~/Downloads/todo
session = ~/Downloads/session
schedule = watch_directory,10,10,"load_start=~/Downloads/watch/*.torrent,d.set_custom1=~/Downloads/fertig/"
schedule = tied_directory,10,10,start_tied=
schedule = untied_directory,10,10,stop_untied=
system.method.set_key=event.download.finished,move_complete,"d.set_directory=$d.get_custom1=;execute=mv, -u,$d.get_base_path=,$d.get_custom1="

Die letzte Zeile sieht zwar etwas kryptisch aus, bewirkt aber, dass nach der Fertigstellung des Downloads dieser vom Ordner todo nach fertig verschoben wird. Um die Torrent Datei automatisch aus dem watch Ordner zu entfernen und somit das Seeden bei einem Verhältnis von 1:1 zu beenden, muss noch dieser Code eingefügt werden.

ratio.enable=
ratio.min.set=100
ratio.max.set=120
ratio.upload.set=20M
system.method.set = group.seeding.ratio.command, d.close=, d.erase=

Verschlüsselung des Datenverkehrs erreicht man in rtorrent durch den Eintrag folgender Zeile in die .rtorrent.rc

encryption = allow_incoming, try_outgoing, require, require_RC4

3. Bedienung

Nachdem man sich mit ssh auf dem Rechner eingeloggt hat, startet man zunächst mit dem Befehl screen den Terminal Multiplexer. In screen gestartete Programme laufen auch nach dem Ausloggen mit ssh weiter. Diese können gleichzeitig in unterschiedlichen Fenstern laufen und auch nebeneinander in der Konsole dargestellt werden. Hat man rtorrent ausgeführt, kann man mit der Tastenkombination STRG+A und dann SHIFT+S die Darstellung horizontal teilen. Mit STRG+A und TAB wechselt man zur nächsten Hälfte und kann dort mit STRG+A und c eine neue Konsole öffnen. Hier startet man elinks, mit welchem man nach neuen Torrents suchen kann. Im Optionsmenü lässt sich als Standard Ordner für Downloads dann auf den watch Ordner verweisen. Heruntergeladene Torrents landen also direkt bei rtorrent!
Indem man eine Torrent Datei aus dem watch Ordner löscht, lässt sich das Herunterladen oder Verteilen beenden. Mit dem Kommando STRG+A und d verlässt man screen und schickt es in den Hintergrund. Mit dem Befehl screen -r kann man sich erneut zu seiner Session und aller darin laufenden Programme verbinden. Für weitere nützliche Kommandos innerhalb von screen einfach STRG+A und ? eingeben. Das vertikale Teilen von screen funktioniert bei Debian mit der Kombination STRG+A und |. Mehr Screenshots und weitere Informationen zu screen gibt es hier.

Wie lässt sich rtorrent bedienen?

Rtorrent lässt sich komplett über die Tastatur steuern. Mit den Pfeiltasten bewegt man sich zwischen Torrents und den Menüoptionen. Mit der Pfeiltaste nach Rechts kommt man in ein Untermenü, wo man mehr über die heruntergeladenen Dateien, Peers und Tracker erfährt. In rtorrent gibt es mehrere Ansichten, die sich über die Tasten 1-9 erreichen lassen. Das Upload Verhältnis lässt sich mit a/s/d erhöhen und mit y/x/c reduzieren. Für das Download Verhältnis ist es entsprechend A/S/D und Y/X/C. Möchte man, dass rtorrent für ein bestimmtes Torrent die globalen Einstellungen ignoriert muss man SHIFT+i drücken. Drückt man einmal STRG+d stoppt der Up-und Download des ausgewählten Torrents, ein weiteres STRG+d entfernt das Torrent. Schließlich kann man rtorrent mit STRG+q beenden.

4. Fazit

Diese Erklärung sollte nur einen kurzen Eindruck vermitteln, was man mit drei Konsolenprogrammen erreichen kann. Transmission ist sicherlich mit einer grafischen Oberfläche intuitiver zu bedienen. Wer sich jedoch von der Konfiguration einer Textdatei und der Tastensteuerung nicht abschrecken lässt, erhält einen hocheffizienten Bittorrent Client und eine hervorragende Lösung sowohl für Low als auch High End Rechner.

5. Links

Offizielle Projektseite mit umfangreicher Dokumentation für rtorrent und libtorrent