<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>[pimp my shell] &#187; tutorials</title>
	<atom:link href="http://blog.pimpmyshell.de/category/tutorials/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.pimpmyshell.de</link>
	<description>leben im text-modus</description>
	<lastBuildDate>Thu, 26 Aug 2010 18:04:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>lsr &#8211; Das fehlende Listing</title>
		<link>http://blog.pimpmyshell.de/2010/08/26/lsr-das-fehlende-listing/</link>
		<comments>http://blog.pimpmyshell.de/2010/08/26/lsr-das-fehlende-listing/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 16:59:49 +0000</pubDate>
		<dc:creator>kbo</dc:creator>
				<category><![CDATA[tutorials]]></category>
		<category><![CDATA[user-skripte]]></category>

		<guid isPermaLink="false">http://blog.pimpmyshell.de/?p=147</guid>
		<description><![CDATA[Ob Prozesse, offene Ports, Benutzer, Netzwerkverbindungen, Hardware oder Dateien: auf die richtige Auflistung kommt es immer an. Doch häufig werden die Ausgaben von ls recht lang. Da hilft nur der richtige Filter. Für Dateinamen oder manche Eigenschaften bieten die globs der verbreiteten shells komfortable Möglichkeiten. Die Liste der Verzeichnisse im aktuellen Pfad zum Beispiel liefert [...]]]></description>
			<content:encoded><![CDATA[<p>Ob Prozesse, offene Ports, Benutzer, Netzwerkverbindungen, Hardware oder Dateien: auf die richtige Auflistung kommt es immer an. Doch häufig werden die Ausgaben von <strong>ls</strong> recht lang. Da hilft nur der richtige Filter.</p>
<p>Für Dateinamen oder manche Eigenschaften bieten die globs der verbreiteten shells komfortable Möglichkeiten. Die Liste der Verzeichnisse im aktuellen Pfad zum Beispiel liefert die Ausgabe von</p>
<blockquote><p>ls -d */</p></blockquote>
<p>Doch schon schnell gelangt man an die Grenzen der globs und greift zum nächsten Werkzeug. Das ist in den meisten Fällen <strong>find</strong>. Damit lassen sich zum Beispiel Dateien nach den drei Zeitstempeln (creation, modification, access) filtern.</p>
<blockquote><p>find . -maxdepth 1 -ctime +30</p></blockquote>
<p>liefert die Liste der mindestens 30 Tage alten Dateien des aktuellen Verzeichnesses. Aber ein Werkzeug, um Dateien nach den Rechten des aktuellen Benutzers auszusuchen habe ich nicht gefunden. Im Kopf begann ich schon den find-Aufruf zu überlegen, als ich mich an die <em>glob qualifiers</em> der <strong>zsh</strong> erinnerte. Glob qualifiers sind im Prinzip weitere Optionen, die bei der Generierung von Dateinamen ausgewertet werden. Zu den einfachen Vertretern dieser Gattung gehört das Zeichen @, das die Auswahl auf symbolische Links einschränkt:</p>
<blockquote><p>ls -d *(@)</p></blockquote>
<p>Aber auch Besitzer und Berechtigungen einer Datei lassen sich ausdrücken. Die benutzten Ausdrücke waren jeder für sich relativ einfach:</p>
<ul>
<li>world readable: *(R)</li>
<li>lesbar durch User $LOGNAME: *(ru:$LOGNAME:)</li>
<li>lesbar durch Gruppe $gruppe: *(Ag:$gruppe:)</li>
</ul>
<p>Die zusammen benutzten glob qualifiers schränken die Auswahl immer weiter ein. Um also zwei Bedingungen mit einem oder zu verknüpfen schreibt man einfach zwei globs hintereinander. Das bedeutet aber, dass eine Datei, auf die beide globs zutreffen auch zwei Male im Gesamtausdruck steht. Der einfachste Aufruf wäre also absolut unübersichtlich:</p>
<blockquote><p>ls -d *(R) *(ru:$LOGNAME:) $(for g in $(groups); do print -r &#8220;*(Ag:$g:)&#8221;; done)</p></blockquote>
<p>Also schrieb ich einen weiteren Ausdruck dazu. Zuerst füllte ich ein Array mit sämtlichen Dateien aller globs und benutzte dann die <em>parameter expansion</em>, um die Liste zu kürzen:</p>
<blockquote><p>files=( *(R) *(ru:$LOGNAME:) $(for g in $(groups); do print -r &#8220;*(Ag:$g:)&#8221;; done) )<br />
ls -d ${(u)files}</p></blockquote>
<p>Zuletzt galt es nur noch die unzutreffenden globs zu entfernen. Das normale Verhalten der zsh ist, bei jedem glob, der auf keine Datei zutrifft, eine entsprechende Meldung auszugeben. Das ist bei dieser Benutzung äußerst störend, wird aber durch einen weiteren glob qualifier deaktiviert. Der Operator <em>N</em> setzt die Option <em>NULL_GLOB</em> für den betroffenen Ausdruck, falls dieser also keine passenden Dateien hat, wird er als leerer String gewertet.</p>
<blockquote><p>files=( *(NR) *(Nru:$LOGNAME:) $(for g in $(groups); do print -r &#8220;*(NAg:$g:)&#8221;; done) )<br />
ls -d ${(u)files}</p></blockquote>
<p>Die fertige Funktion ist vom Aufruf möglichst ähnlich zu <strong>ls</strong> und liegt <a href="http://sprunge.us/QiSJ">hier</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2010/08/26/lsr-das-fehlende-listing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fbcmd &#8211; update</title>
		<link>http://blog.pimpmyshell.de/2010/06/17/fbcmd-update/</link>
		<comments>http://blog.pimpmyshell.de/2010/06/17/fbcmd-update/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 00:04:44 +0000</pubDate>
		<dc:creator>Gregor</dc:creator>
				<category><![CDATA[how-tos]]></category>
		<category><![CDATA[user-skripte]]></category>

		<guid isPermaLink="false">http://blog.pimpmyshell.de/2010/06/17/fbcmd-update/</guid>
		<description><![CDATA[Nur eine kurze (und hoechstwahrscheinlich unelegente) Methode, mittels &#8220;fbmcd&#8221; eine Liste aller Geburtstage der Kontakte in Facebook direkt auf der Konsole zu erhalten: fbcmd allinfo &#8220;=all&#8221; > temp_file&#038;&#038;month=`date&#124;awk &#8216;{print $3}&#8217;`&#038;&#038;cat temp_file&#124;grep $month&#124;grep birthday&#038;&#038;rm temp_file Leider wird die Ausgabe nicht aufsteigend nach Datum sortiert, funktioniert bei mir jedoch prima und reicht fuer meine Zwecke vollkommen aus.]]></description>
			<content:encoded><![CDATA[<p>Nur eine kurze (und hoechstwahrscheinlich unelegente) Methode, mittels &#8220;fbmcd&#8221; eine Liste aller Geburtstage der Kontakte in Facebook direkt auf der Konsole zu erhalten:</p>
<blockquote><p>
fbcmd allinfo &#8220;=all&#8221; > temp_file&#038;&#038;month=`date|awk &#8216;{print $3}&#8217;`&#038;&#038;cat temp_file|grep $month|grep birthday&#038;&#038;rm temp_file
</p></blockquote>
<p>Leider wird die Ausgabe nicht aufsteigend nach Datum sortiert, funktioniert bei mir jedoch prima und reicht fuer meine Zwecke vollkommen aus.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2010/06/17/fbcmd-update/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>fbcmd &#8211; facebook in der shell</title>
		<link>http://blog.pimpmyshell.de/2010/05/28/fbcmd-facebook-in-der-shell/</link>
		<comments>http://blog.pimpmyshell.de/2010/05/28/fbcmd-facebook-in-der-shell/#comments</comments>
		<pubDate>Fri, 28 May 2010 10:06:02 +0000</pubDate>
		<dc:creator>Gregor</dc:creator>
				<category><![CDATA[how-tos]]></category>
		<category><![CDATA[programme]]></category>
		<category><![CDATA[tutorials]]></category>
<category>cmd</category><category>facebook</category><category>fbcmd</category><category>shell</category>
		<guid isPermaLink="false">http://blog.pimpmyshell.de/2010/05/28/fbcmd-facebook-in-der-shell/</guid>
		<description><![CDATA[Nachdem der Facebook-Chat nun mit bitlbee abgedeckt ist, waere es ebenso interessant, die Nachrichten und News-Streams von Facebook in der Konsole angezeigt zu bekommen. Ich habe versucht, das ganze mit w3m oder lynx zu stemmen, jedoch ist Facebook in einem Konsolenbrowser nicht wirklich benutzbar (jedenfalls für mich) also suchte ich nach einem einfachen textbasierten Interface [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem der Facebook-Chat nun mit bitlbee abgedeckt ist, waere es ebenso interessant, die Nachrichten und News-Streams von Facebook in der Konsole angezeigt zu bekommen. Ich habe versucht, das ganze mit w3m oder lynx zu stemmen, jedoch ist Facebook in einem Konsolenbrowser nicht wirklich benutzbar (jedenfalls für mich) also suchte ich nach einem einfachen textbasierten Interface welches die Facebook-API nutzt um die wichtigsten Aufgaben direkt mit einem Befehl von der Shell aus in Facebook zu erledigen. </p>
<p>Das Programm traegt den Namen <strong>fbcmd</strong> &#8211; der Name sagt eigentlich alles.<br />
Das Programm, die Funktionen und die Installation sind<a href="http://fbcmd.dtompkins.com/"> sehr gut dokumentiert</a>.</p>
<p>Ich musste unter Debian über die Repos noch <strong>php5-cli</strong> nachinstallieren um das Installationscript nutzen zu koennen. Ansonsten war es sehr angenehm zu installieren: </p>
<blockquote><p>
curl -O http://github.com/dtompkins/fbcmd/raw/master/fbcmd_update.php<br />
sudo php fbcmd_update.php<br />
sudo php fbcmd_update.php install
</p></blockquote>
<p>Nach der Installation kann man das Programm auch als User mit fbcmd starten und wird aufgefordert, den Authorisationscode von Facebook einzugeben &#8211; sehr einfach: Den generierten Link in den Browser einfügen, Bestätigen, Auth-Code Kopieren und mit folgendem Befehl dem Programm mitteilen. Danach kann es auch schon losgehen:</p>
<blockquote><p>fbcmd auth XXXXXX</p></blockquote>
<p>Nun reicht ein <strong>fbcmd inbox</strong> aus, um direkt auf der Konsole die letzten Nachrichten zu sehen, die man sich dann mit <strong>fbcmd msg nr. </strong>anschauen kann. Es gibt natuerlich noch viele weitere Befehle und Features in diesem Programm, die man sich im <a href="http://fbcmd.dtompkins.com/commands">Wiki des Projektes</a> auch genauer anschauen kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2010/05/28/fbcmd-facebook-in-der-shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>bitlbee &#8211; alles in einem!</title>
		<link>http://blog.pimpmyshell.de/2010/05/28/bitlbee-alles-in-einem/</link>
		<comments>http://blog.pimpmyshell.de/2010/05/28/bitlbee-alles-in-einem/#comments</comments>
		<pubDate>Fri, 28 May 2010 09:23:19 +0000</pubDate>
		<dc:creator>Gregor</dc:creator>
				<category><![CDATA[berichte]]></category>
		<category><![CDATA[how-tos]]></category>
		<category><![CDATA[tutorials]]></category>
<category>bitlbee</category><category>facebook</category><category>icq</category><category>irc</category><category>irssi</category><category>jabber</category><category>msn</category><category>oscar</category><category>perl</category><category>screen</category>
		<guid isPermaLink="false">http://blog.pimpmyshell.de/2010/05/28/bitlbee-alles-in-einem/</guid>
		<description><![CDATA[Ich bin noch immer Stammgast auf div. Unix/Linux Systemen und genieße meine Zeit die ich ausserhalb meines Jobs in der Shell verbringen kann. Leider hatte ich lange das Problem &#8211; in der Shell nicht mehr mit den ueblichen Verdaechtigen der Social-Networks verbunden zu sein &#8211; also waren ICQ,Google-Talk,Jabber,Twitter und Facebook immer in anderen grafischen Applikationen [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bin noch immer Stammgast auf div. Unix/Linux Systemen und genieße meine Zeit die ich ausserhalb meines Jobs in der Shell verbringen kann. Leider hatte ich lange das Problem &#8211; in der Shell nicht mehr mit den ueblichen Verdaechtigen der Social-Networks verbunden zu sein &#8211; also waren ICQ,Google-Talk,Jabber,Twitter und Facebook immer in anderen grafischen Applikationen irgendwo auf dem System und nicht in der Shell präsent, wo ich sie gerne haette.</p>
<p>Abhilfe schafft ein Programm, welches ich schon frueher genutzt, aber mittlerweile fast vergessen hatte: Bitlbee</p>
<p>Bitlbee ist ein kleiner lokaler IRC-Server, welcher mit einem rudimentären Bot ausgestattet, als Gateway zwischen ICQ,MSN,AIM,Jabber,Twitter,Facebook-Chat und dem IRC-Protokoll dient. Man kann sich nach der Installation mit dem IRC-Client seiner Wahl mit ihm verbinden und sich anmelden, die IM-Konten hinzufuegen und munter los-chatten.</p>
<p>Ich verbinde mich nun in meiner Screen-Session auf einer dezentralen Maschine über irssi auf den lokalen Bitlbee-Server und kann mich dann mit nur einem Befehl bei allen IM-Diensten anmelden und die Verwaltung der Chat anfragen und Gespräche sind wesentlich stressfreier und übersichtlicher als mit den meisten Multiprotokollmessangern die ich im grafischen Umfeld probiert habe.</p>
<p>Der Ablauf ist wie folgt:</p>
<p>Man installiert das Programm entweder per Hand oder aus den Repos seiner Distribution und verbindet sich danach mit dem IRC-Client seiner Wahl auf den IRC-Standardport(6667) des localhost.<br />
Automatisch wird man nach dem Verbinden auf den bitlbee-channel (&#038;bitlbee) geleitet, in dem zusammen mit @root erst einmal gar nichts passiert. Man kann sich jedoch über den &#8220;help&#8221; Befehl, einen Überblick über die Funktionen des Programms schaffen. </p>
<p>Um sich für die Zukunft am Bitlbee-Server anzumelden gibt man folgenden Befehl ein (mit eigenem Kennwort versteht sich): </p>
<blockquote><p>register password</p></blockquote>
<p>Nun ist man mit seinem Nicknamen am Server registriert und kann sich in zukünftigen Sessions mit folgendem Befehl anmelden:</p>
<blockquote><p>identify password</p></blockquote>
<p>Hat man Konten hinzugefügt, werde diese dann automatisch geladen und verbunden. Kommen wir genau zu diesem Punkt:<br />
Um ein Konto zu registrieren, muss man wissen welche Protokolle unterstützt werden und wie diese heißen:</p>
<ul>
<li>oscar = ICQ/AIM</li>
<li>msn = MSN</li>
<li>jabber = Jabber, Google-Talk, Facebook, GMX/WEB.de Messanger</li>
<li>twitter = twitter</li>
</ul>
<p>Nun also zur Registrierung. Nehmen wir als Beispiel ein ICQ Konto. Im &#038;bitlbee Channel geben wir folgenden Befehl ein:</p>
<blockquote><p>account add oscar icq-nummer passwort</p></blockquote>
<p>Will man einsehen, welche Konten mittlerweile registriert sind, geschieht dies durch:</p>
<blockquote><p>account list</p></blockquote>
<p>Nehmen wir an, das ICQ-Konto hat die Nummer 0, kann man sich wie folgt anmelden:</p>
<blockquote><p>account on 0</p></blockquote>
<p>Nun erscheinen die ICQ Kontakte im &#038;bitlbee-Kanal und man kann die personen per Query oder durch Voranstellen des Nicknamen ansprechen. Um Hilfe zu den div. Protokollen und der Syntax zu erhalten gibt man folgenden Befehl ein:</p>
<blockquote><p>help account add (oscar, twitter, jabber, msn, etc)</p></blockquote>
<p>Ich bin sehr von dieser Lösung überzeugt und kann sie nur weiter empfehlen. Auch die Möglichkeit, den Bitlbee-Server im Netz oder über SSH/VPN freizugeben und sich von einem beliebigen Client und OS aus darauf zu Verbinden hat seinen Charme. Viel Spaß beim Chatten und Twiitern. </p>
<p><strong>Anmerkungen:</strong></p>
<ul>
<li>Bitlbee unterstützt Twitter erst in den neueren Versionen. Ich musste die aktuellste (V.1.2.7) aus dem Quellcode kompillieren. </li>
<li>Projektwebseite:<a href="http://www.bitlbee.org">http://www.bitlbee.org/</a></li>
<li>Howto: <a href="http://www.nowhere.dk/articles/facebook-chat-in-bitlbee">Bitlbee und Facebook</a></li>
<li>Facebook-Rename-Script für Irssi: <a href="http://github.com/avar/irssi-bitlbee-facebook-rename">(Fix-nach Facebook-Update)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2010/05/28/bitlbee-alles-in-einem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>gcalcli &#8211; google calendar auf der shell</title>
		<link>http://blog.pimpmyshell.de/2008/02/12/gcalcli-google-calendar-auf-der-shell/</link>
		<comments>http://blog.pimpmyshell.de/2008/02/12/gcalcli-google-calendar-auf-der-shell/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 11:53:08 +0000</pubDate>
		<dc:creator>Gregor</dc:creator>
				<category><![CDATA[how-tos]]></category>
		<category><![CDATA[programme]]></category>

		<guid isPermaLink="false">http://blog.pimpmyshell.de/2008/02/12/gcalcli-google-calendar-auf-der-shell/</guid>
		<description><![CDATA[Wenn man auf mehr als nur einem PC arbeitet und damit vielleicht sogar verschiedene Plattformen vor sich hat, gibt es oft das Problem, dass Daten nicht synchron sind. Nehmen wir als Beispiel Terminverwaltung: Wie kann man ein Microsoft Outlook, einen Windows Mobile Gerät, den Mozilla Sunbird synchronisieren, dass jeder dieser Instanzen die gleichen Termine empfängt [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man auf mehr als nur einem PC arbeitet und damit vielleicht sogar verschiedene Plattformen vor sich hat, gibt es oft das Problem, dass Daten nicht synchron sind. Nehmen wir als Beispiel Terminverwaltung: Wie kann man ein Microsoft Outlook, einen Windows Mobile Gerät, den Mozilla Sunbird synchronisieren, dass jeder dieser Instanzen die gleichen Termine empfängt und eintragen kann? Die Antwort ist der Google-Calendar, man kann die Kalender über das Internet abbonieren auch mit Terminen füttern.</p>
<p>Nun, da ich mich wieder auf die Shell konzentriere, hatte ich das Problem, das ich unter der Shell die Termine nicht abrufen und eintragen konnte. Doch mit einem kleinen Python-Skript kann ich nun auch diese Hürde überwinden: <a href="http://code.google.com/p/gcalcli/">gcalcli</a></p>
<p>Leider war die installation von gcalcli nicht so trivial.</p>
<p><strong>How-To:</strong></p>
<ul>
<li>gcalcli von der <a href="http://code.google.com/p/gcalcli/">Projektwebseite herunterladen</a></li>
<li>tarball entpacken</li>
<li>nach /usr/local/bin kopieren</li>
<li>.gcalclirc im Home-Verzeichnis anlegen</li>
</ul>
<p><strong>Die .gcalclirc sollte folgendermaßen aussehen:</strong></p>
<blockquote><p>[gcalcli]<br />
user: benutzer@googlemail.com<br />
pw: passwort<br />
cals: owner</p></blockquote>
<ul>
<li>Abhängigkeiten erfüllen:</li>
<p><a href="http://code.google.com/p/gdata-python-client/">Gdata-Python</a>, <a href="http://effbot.org/zone/element-index.htm">Elementree</a>, <a href="http://www.labix.org/python-dateutil">Dateutil-Python<br />
</a></p>
<li>jeweils aktuellste Versionen der Abhängigkeiten herunterladen und entpacken. In die jeweiligen Verzeichnise wechseln und mit &#8220;python setup.py install&#8221; als Superuser die Module installieren.</li>
<li>Sind die Module installiert kann man testen ob die Abfrage funktioniert: als user &#8220;gcalcli agenda&#8221; eingeben</li>
<ul>
<p>Bekommt man als Belohnung keine aktuellen Termine auf der Shell sondern mehrere Zeilen Fehlermeldungen, liegt es &#8211; wie in meinem Fall Wahrscheinlich an der Codierung:</p>
<p>Dies lässt sich mit folgendem Bugfix des Scripts beheben:</p>
<p><strong>Die Zeilen 66+67 sollte man folgendermaßen anpassen:</strong></p>
<blockquote><p>sys.stdout =  codecs.getwriter(&#8216;utf-8&#8242;)(sys.stdout)<br />
sys.stdin = sys.stdin = codecs.getreader(&#8216;utf-8&#8242;)(sys.stdin)</p></blockquote>
<p><strong>Im oberen Teil des Skripts sollten sie noch Atom-Support aktivieren durch einfügen von:</strong></p>
<blockquote><p>import atom<br />
atom.XML_STRING_ENCODING = None</p></blockquote>
<p>Nach dem Speichern sollte das Skript einwandfrei funktionieren. Folgende Abfragemöglichkeiten gibt es:</p>
<p><code><strong>gcalcli agenda</strong></code><br />
Zeigt die aktuellen Termine an, die anstehen.</p>
<p><code><strong>gcalcli calw</strong></code><br />
Zeigt einen ASCII Kalender, mit den Terminen der aktuellen Woche an</p>
<p><code><strong>gcalcli calm</strong></code><br />
Zeigt den aktuellen Monatskalender mit allen Einträgen an</p>
<p><strong>Termine werden über den quick-command eingetragen:</strong></p>
<blockquote><p>gcalcli quick &#8220;Termintext Uhrzeit TT.MM.YYYY&#8221;</p></blockquote>
<p>Ein kleines Schmankerl am Rand: Man kann in den Einstellungen des Google-Calendars eine SMS-Benachrichtigungsfunktion aktivieren, mit der man dann kostenlos per SMS an die eingetragenen Termine erinnert wird. Viel Spaß beim konfigurieren und Termine verwalten auf der Shell. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2008/02/12/gcalcli-google-calendar-auf-der-shell/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Pimp your (Bash) Prompt</title>
		<link>http://blog.pimpmyshell.de/2007/12/10/pimp-your-prompt/</link>
		<comments>http://blog.pimpmyshell.de/2007/12/10/pimp-your-prompt/#comments</comments>
		<pubDate>Mon, 10 Dec 2007 22:17:00 +0000</pubDate>
		<dc:creator>Jeremy</dc:creator>
				<category><![CDATA[how-tos]]></category>
		<category><![CDATA[shells]]></category>

		<guid isPermaLink="false">http://blog.pimpmyshell.de/2007/12/10/pimp-your-prompt/</guid>
		<description><![CDATA[Du bist gelangweilt von dem hans@wurst:~$ &#8211; Prompt deiner Bash? Möchtest gerne mehr Informationen gezeigt bekommen? Du hättest gerne Augenschmerzen vor lauter Farben? In folgendem Artikel werde ich erklären, wie du Deinen Prompt personalisieren, einfärben, und visuell vollkommen verunstalten kannst. (Kleiner Hinweis vorweg: Der eine oder andere mag es bereits bemerkt haben, ich beziehe mich [...]]]></description>
			<content:encoded><![CDATA[<p>Du bist gelangweilt von dem <em>hans@wurst:~$</em> &#8211; Prompt deiner Bash? Möchtest gerne mehr Informationen gezeigt bekommen? Du hättest gerne Augenschmerzen vor lauter Farben?</p>
<p>In folgendem Artikel werde ich erklären, wie du</p>
<ul>
<li>Deinen Prompt personalisieren,</li>
<li>einfärben,</li>
<li>und visuell vollkommen verunstalten kannst.</li>
</ul>
<p><span id="more-96"></span><br />
<small>(Kleiner Hinweis vorweg: Der eine oder andere mag es bereits bemerkt haben, ich beziehe mich im ganzen Artikel ausschliesslich auf die <acronym title="Bourne again Shell">Bash</acronym>.  Selbstverständlich lassen sich die meisten anderen Shells ebenfalls über ihre Variablen individualisieren. Das soll keinerlei Wertung sein, ich habe einfach keine Zeit, mich mit anderen Shells wie der <em>zsh</em> zu beschäftigen. Sollte also jemand von euch Zeit und Lust haben einen Artikel dazu loszuwerden, lade ich ihn hiermit herzlich ein. :) )</small></p>
<h3>Grundlagen</h3>
<p>In der <acronym title="Bourne again Shell">Bash</acronym> wird der primäre Prompt über die Variable <strong>PS1</strong> gesteuert. Neben PS1 existieren noch PS2, PS3 und PS4, wobei für uns nur die ersten Beiden interessant sind.</p>
<ul>
<li><strong>PS1</strong> &#8211; In dieser Variable wird der primäre Prompt der <acronym title="Bourne again Shell">Bash</acronym> gespeichert. Der Standardwert ist in dem meisten Linuxdistributionen <em>\u@\h:\w\$</em>.</li>
<li><strong>PS2</strong> &#8211; Der sekundäre Prompt. Dieser Prompt wird ausgegeben, wenn auf eine Eingabe des Users gewartet wird. Der Standardwert ist <em>&gt;</em>. Der sekundäre Prompt lässt sich beispielsweise mit einem unvollendeten Befehl wie &#8220;ls |&#8221; ausgeben.</li>
<li><strong>PS3</strong> &#8211;  wird vom internen select Befehl verwendet.</li>
<li><strong>PS4</strong> &#8211; Die Variable &#8220;PS4&#8243; wird vor den Debug-Meldungen ausgegeben, die durch die Shell-Option &#8220;-x&#8221; [execute trace] ausgegeben werden. Der Standardwert ist hier meist <em>+</em>.</li>
</ul>
<p><strong>Die Veränderungen treten sofort ein, bleiben jedoch erst dann erhalten, wenn der &#8220;export&#8221;-Befehl in die Datei <em>~/.bashrc</em> eingetragen wird.</strong></p>
<p>Zunächst löschen wir einfach mal den Inhalt von PS1:</p>
<pre><code>unset $PS1</code></pre>
<p>Nun fehlt jegliche Eingabeaufforderung. Das bedeutet natürlich nicht, dass keine Befehle mehr eingegeben werden können. Es gibt einfach keinen Prompt mehr, der ausgegeben werden könnte.</p>
<p>Mit <kbd>export</kbd> können Umgebungsvariablen gesetzt werden. Ein schnelles:</p>
<pre><code>export $PS1="pimp my shell &gt;"</code></pre>
<p>zum Beispiel erzeugt folgenden sinnlosen aber witzigen Prompt:</p>
<pre><code>pimp my shell &gt;</code></pre>
<p>Aber wie lasse ich mir Informationen statt nur einfachen Text <del>prompten</del> <ins>ausgeben</ins>? Über so genannte Escape-Sequenzen. Nun wird es interessant. Es gibt einen ganzen Haufen Escape-Sequenzen, welche etwa Arbeitsverzeichnis, Benutzername oder Uhrzeit ausgeben:</p>
<table width="100%">
<tr>
<td><strong>\a</strong></td>
<td>Das ASCII-Zeichen für eine Glocke (&#8220;\007&#8243; sollte auch funktionieren). Dies erzeugt einen Ton, welcher (falls vorhanden) aus dem PC-Speaker tönt. Das ist aber nicht zu empfehlen, da dieser dann bei jedem ausgegebenen Prompt mit dieser Escape-Sequenz der Speaker einen nervigen Ton von sich gibt.</td>
</tr>
<tr>
<td><strong>\d</strong></td>
<td>Zeigt das Datum im &#8220;Wochentag Monat Datum&#8221;-Format (<abbr title="Beispielsweise">Bspw.</abbr> &#8220;Tue May 26&#8243;)</td>
</tr>
<tr>
<td><strong>\D{format}</strong></td>
<td>Der Inhalt der beiden geschweiften Klammern wird an <a href="http://opengroup.org/onlinepubs/007908799/xsh/strftime.html">strftime</a> gesendet und das Ergebnis zurück in den Prompt-String. Leer gelassen erzeugt das meist ein locale-Spezifisches Datum. Die geschweiften Klammern sind pflicht.</td>
</tr>
<tr>
<td><strong>\e</strong></td>
<td>Ein ASCII Escape-Zeichen (&#8220;\033&#8243; sollte auch funktionieren.)</td>
</tr>
<tr>
<td><strong>\h</strong></td>
<td>Der Hostname bis zum ersten &#8220;.&#8221;</td>
</tr>
<tr>
<td><strong>\H</strong></td>
<td>Der komplette Hostname</td>
</tr>
<tr>
<td><strong>\j</strong></td>
<td>Gibt die Anzahl der Hintergrundprozesse aus.</td>
</tr>
<tr>
<td><strong>\l</strong></td>
<td>Name der Shell</td>
</tr>
<tr>
<td><strong>\n</strong></td>
<td>Erzeugt eine neue Zeile (Ja, Prompts können mehrzeilig sein).</td>
</tr>
<tr>
<td><strong>\r</strong></td>
<td><a href="http://en.wikipedia.org/wiki/Carriage_return" title="Link zum englischen Wikipedia-Artikel">Carriage-Return</a></td>
</tr>
<tr>
<td><strong>\s</strong></td>
<td>Der Name der Shell. Logischerweise <em><acronym title="Bourne again Shell">Bash</acronym></em></td>
</tr>
<tr>
<td><strong>\t</strong></td>
<td>Die Zeit im 24-Stunden <em>HH:MM:SS</em> Format</td>
</tr>
<tr>
<td><strong>\T</strong></td>
<td>Die Zeit im 12-Stunden <em>HH:MM:SS</em> Format</td>
</tr>
<tr>
<td><strong>\@</strong></td>
<td>Die Zeit im 12-Stunden <em>AM/PM</em> Format</td>
</tr>
<tr>
<td><strong>\A</strong></td>
<td>Die Zeit im 24-Stunden <em>HH:MM</em> Format</td>
</tr>
<tr>
<td><strong>\u</strong></td>
<td>Name des Benutzers</td>
</tr>
<tr>
<td><strong>\v</strong></td>
<td>Versionsnummer der <acronym title="Bourne again Shell">Bash</acronym> (<abbr title="Beispielsweise">Bspw.</abbr> 3.2)</td>
</tr>
<tr>
<td><strong>\V</strong></td>
<td>Wie /v, jedoch mit Patch-Level (<abbr title="Beispielsweise">Bspw.</abbr> 3.2.25)</td>
</tr>
<tr>
<td><strong>\w</strong></td>
<td>Das aktuelle Arbeitsverzeichnis, wobei $HOME mit einer Tilde (~) abgekürzt wird.</td>
</tr>
<tr>
<td><strong>\W</strong></td>
<td>Das aktuelle Arbeitsverzeichnis (, jedoch ohne höhere Ebenen), wobei $HOME mit einer Tilde (~) abgekürzt wird.</td>
</tr>
<tr>
<td><strong>\!</strong></td>
<td>Die History-Nummer des Befehls. Dies kann natürlich je nach <em>.bash_history</em> variieren.</td>
</tr>
<tr>
<td><strong>\#</strong></td>
<td>Anzahl der bereits aufgerufenen Kommandos während der Shell-Session</td>
</tr>
<tr>
<td><strong>\$</strong></td>
<td>Wenn <acronym title="User IDentification Number">UID</acronym> = 0, ein #, andernfalls ein $. Zu deutsch: Normale User sehen ein &#8220;$&#8221;, Root ein &#8220;#&#8221;.</td>
</tr>
<tr>
<td><strong>\nnn</strong></td>
<td>Zeichen entsprechend der oktalen Zahl <em>nnn</em></td>
</tr>
<tr>
<td><strong>\\</strong></td>
<td>Ein Backslash</td>
</tr>
<tr>
<td><strong>\[</strong></td>
<td>Beginn einer Sequenz von nicht-darstellbaren Zeichen.</td>
</tr>
<tr>
<td><strong>\]</strong></td>
<td>Ende einer Sequenz von nicht-darstellbaren Zeichen</td>
</tr>
</table>
<p>Damit lässt sich schon viel anstellen. Sinnvoll sind und bleiben natürlich Benutzername, Verzeichnis und Hostname. Nach ein wenig herumspielen könnte der Inhalt von <strong>PS1</strong> zum Beispiel so aussehen:</p>
<pre><code>[&#92;d &#92;A, Bash Version &#92;V, &#92;# Commands, &#92;j Jobs, tty #&#92;l]&#92;n[&#92;u@&#92;H:&#92;w] &#92;$</code></pre>
<p>, was bei mir in etwa folgenden Prompt erzeugt:</p>
<pre><code>[Mo Dez 10 23:05, Bash Version 3.2.25, 116 Commands, 0 Jobs, tty #2]
[jxn@david:~] $</code></pre>
<p>Die eckigen Klammern sind übrigens reine Kosmetik ;)</p>
<h3>Farben</h3>
<div style="float:right;">
<table>
<tr>
<td><strong>Farbe</strong></td>
<td><strong><acronym title="Vordergrund">VG</acronym> / <acronym title="Hintergrund">HG</acronym></strong></td>
</tr>
<tr>
<td>Schwarz</td>
<td>30 / 40</td>
</tr>
<tr>
<td>Rot</td>
<td>31 / 41</td>
</tr>
<tr>
<td>Grün</td>
<td>32 / 42</td>
</tr>
<tr>
<td>Braun</td>
<td>33 / 43</td>
</tr>
<tr>
<td>Blau</td>
<td>34 / 44</td>
</tr>
<tr>
<td>Violett</td>
<td>35 / 45</td>
</tr>
<tr>
<td>Cyan</td>
<td>36 / 46</td>
</tr>
<tr>
<td>Weiss</td>
<td>37 / 47</td>
</table>
</div>
<p>Zufrieden mit der Ausgabe? Weiter gehts mit optischer hervorhebung durch Farben.</p>
<p>Farbangaben müssen über die Escape-Sequenz <strong>\e</strong> (/033 sollte auch funktionieren) eingeleitet werden. Diese Escape-Sequenz wird jedoch vom genutzten Terminal verarbeitet, nicht von der <acronym title="Bourne again Shell">Bash</acronym>. Deswegen funktioniert die Einfärbung von Prompts auch nicht überall, selbst wenn die <acronym title="Bourne again Shell">Bash</acronym> genutzt wird.</p>
<p>Eine Farbangabe besteht aus dem Escape-Zeichen &#8220;\e&#8221;, den Farbcodes &#8220;x;yy;zz&#8221; (Eigenschaft;Vordergrund;Hintergrund) und einem abschliessendem &#8220;m&#8221;. Beispiele für Farbcodes können der nebenstehenden Tabelle entnommen werden, wobei die 30er für die Vordergrund- und die 40er für die Hintergrundfarben stehen. Sinnvolle Werte für die Schrifteigenschaft (x) sind: 0 (Standard), 1 (heller), 22 (nicht heller), 4 (unterstrichen), 24 (nicht unterstrichen), 5 (blinkend), 25 (nicht blinkend), 7 (invers), 27 (nicht invers).</p>
<p>Die Codes in der Farbangabe können übrigens in beliebiger Reihenfolge gesetzt werden. Ein &#8220;5;41;32&#8243; ergibt <abbr title="Beispielsweise">Bspw.</abbr> das Gleiche wie ein &#8220;41;5;32&#8243;, das Entscheidende ist der Code, nicht die Reihenfolge.</p>
<p>Färben wir einfach mal den oben erwähnten Standardprompt &#8220;\u@\h:\w\$&#8221; hellgrün mit einem rotem Hintergrund:</p>
<pre><code>export PS1="&#92;e[1;32;41m&#92;u@&#92;h:&#92;w&#92;$ "</code></pre>
<p>Das Problem: Nun ist nicht nur der Prompt hellgrün, sondern der gesamte Text in unserer Shell. Das lässt sich mit einem schliessenden "\e[0m" verhindern. Auf diese Weise wird die Farbangabe auf Null zürückgesetzt. Ein</p>
<pre><code>export PS1="&#92;e[1;32;41m&#92;u@&#92;h:&#92;w&#92;$&#92;e[0m "</code></pre>
<p>sieht schon gleich viel besser aus. Aber das reicht leider immer noch nicht. Die sowieso nicht darstellbaren Zeichen unserer Farbangaben müssen mit den Sequenzen "\[" und "\]" auch als solche gekennzeichnet werden. Sonst gibt es hässliche Darstellungsfehler, sollte ein Kommando einmal das rechte Ende des sichtbaren Bereichs erreichen. Das Ergebnis sollte also wie folgt aussehen:</p>
<pre><code>export PS1="&#92;[&#92;e[1;32;41m&#92;u@&#92;h:&#92;w&#92;$&#92;e[0m&#92;] "</code></pre>
<p>Natürlich können in einem Prompt auch mehrere Farbangaben verwendet werden. Aber jeder sollte für sich entscheiden, wieviel <em>Bunt</em> seine Augen ertragen können. ;)</p>
<h3>Noch nicht genug? Bashish rocks your socks!</h3>
<p><a href="http://bashish.sourceforge.net/">Bashish</a> ist eine Theme-Engine für allerlei Terminals und Shells. Mit Bashish lassen sich Farbe, Schriftart, Transparenz und Hintergrundbild für einzelne Programme unabhängig voneinander personalisieren. Ausserdem kann man mit Bashish die Prompts verbreiteter Shells wie die Bash, zsh und tcsh konfigurieren. Was mit Bashish möglich ist, wird bei <a href="http://bashish.sourceforge.net/screenshot.html">den Screenshots</a> sehr gut veranschaulicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2007/12/10/pimp-your-prompt/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>.bash_history für mehrere Shells</title>
		<link>http://blog.pimpmyshell.de/2007/12/03/bash-history-fuer-mehrere-shells/</link>
		<comments>http://blog.pimpmyshell.de/2007/12/03/bash-history-fuer-mehrere-shells/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 21:58:32 +0000</pubDate>
		<dc:creator>Jeremy</dc:creator>
				<category><![CDATA[how-tos]]></category>

		<guid isPermaLink="false">http://blog.pimpmyshell.de/2007/12/03/bash-history-fuer-mehrere-shells/</guid>
		<description><![CDATA[Du kennst das. Du hast ein Terminal geöffnet und tippst fleißig deine Befehle ein, öffnest ein zweites Terminal und &#8211; es erinnert sich nicht an die gerade eben eingetippten Kommandos. Und es kommt sogar noch schlimmer: Wenn du zuerst das erste Terminal und danach das Zweite schließt, werden die Befehle des ersten Terminals aus der [...]]]></description>
			<content:encoded><![CDATA[<p>Du kennst das. Du hast ein Terminal geöffnet und tippst fleißig deine Befehle ein, öffnest ein zweites Terminal und &#8211; es erinnert sich nicht an die gerade eben eingetippten Kommandos. Und es kommt sogar noch schlimmer: Wenn du zuerst das erste Terminal und danach das Zweite schließt, werden die Befehle des ersten Terminals aus der Datei <em>~/.bash_history</em> überschrieben. Doppelt nervig.<br />
<span id="more-113"></span><br />
Die Bash speichert die <em>.bash_history</em> nur beim schließen eines Terminals, und nicht nach jedem eingetippten Kommando. Das lässt sich leicht ändern:</p>
<pre><code>nano ~/.bashrc</code></pre>
<p>(An Ubuntuuser: Man beachte, kein sudo hier. Die Datei gehört dem User, nicht dem System. Und selbstverständlich lässt sich auch jeder andere Texteditor wie gedit, kate, vi oder emacs nehmen.)</p>
<p>Füge nun die folgenden Zeilen hinzu:</p>
<pre><code>shopt -s histappend
PROMPT_COMMAND='history -a'</code></pre>
<p>und speichere das ganze ab (In Nano mit <kbd>Strg+O</kbd>. &#8220;^&#8221; steht in den meisten Fällen für <kbd>Strg</kbd>. Also macht die Statuszeile in Nano doch ein wenig Sinn. ;) )</p>
<p>Dies sorgt dafür, dass der Kommandoverlauf von der Bash <strong>angehängt</strong> (und nicht einfach überschrieben) wird. Ausserdem wird jedes mal, wenn ein Prompt ausgegeben wird, abgespeichert.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2007/12/03/bash-history-fuer-mehrere-shells/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>nützliche Netcat Tricks</title>
		<link>http://blog.pimpmyshell.de/2007/08/08/nuetzliche-netcat-tricks/</link>
		<comments>http://blog.pimpmyshell.de/2007/08/08/nuetzliche-netcat-tricks/#comments</comments>
		<pubDate>Wed, 08 Aug 2007 21:29:45 +0000</pubDate>
		<dc:creator>Jeremy</dc:creator>
				<category><![CDATA[tutorials]]></category>
<category>nc</category><category>netcat</category><category>tricks</category>
		<guid isPermaLink="false">http://blog.pimpmyshell.de/2007/08/08/nuetzliche-netcat-tricks/</guid>
		<description><![CDATA[Ich liebe die kleinen aber feinen (Unix-)Programme, die zwar nur einen Zweck erfüllen, diesen aber dafür ganz vorzüglich. Nehmen wir beispielsweise das Schweizer Armeemesser der Netzwerktools: netcat. Eine kleine Binärdatei, etwa 60 KB groß, je nach dem wo und wie sie kompiliert wurde. Was kann netcat? Nun, ich schätze die passendere Frage würde lauten: Was [...]]]></description>
			<content:encoded><![CDATA[<p>Ich liebe die kleinen aber feinen (Unix-)Programme, die zwar nur einen Zweck erfüllen, diesen aber dafür ganz vorzüglich. Nehmen wir beispielsweise das Schweizer Armeemesser der Netzwerktools: <strong>netcat</strong>. Eine kleine Binärdatei, etwa 60 KB groß, je nach dem <em>wo</em> und <em>wie</em> sie kompiliert wurde. Was kann netcat?</p>
<p>Nun, ich schätze die passendere Frage würde lauten: Was kann netcat <strong>nicht</strong>?<br />
<span id="more-111"></span></p>
<h3>Ports Scannen</h3>
<p>Netcat kann als Portscanner fungieren. Natürlich reicht es nicht an (beispielsweise) nmap heran, aber wenn du schnell sehen willst, welche Ports auf einem Rechner offen sind, führe folgenden Befehl aus:</p>
<p><code>nc -v -w 1 localhost -z 1-2000</code></p>
<p>, was alle offenen Ports zwischen 1 und 2000 auf localhost ausgibt.</p>
<h3>Dateien übertragen</h3>
<p>Du möchtest eine große, komprimierte Datei von Rechner A nach Rechner B schicken, hast aber weder FTP, noch E-Mail oder Instant Messenger sei es wegen Dateigröße oder irgendwelcher fehlenden Rechten zur verfügung? Verschicke die Datei doch mit netcat: </p>
<p>Zuerst muss mit netcat auf Rechner B ein Port geöffnet werden, wobei im folgenden 1234 der zu öffnende Port ist und datei.tar die zu speichernde Datei ist:</p>
<p><code>nc -lp 1234 &gt; datei.tar</code></p>
<p>Die IP von Rechner B ist beispielsweise 192.168.0.100. Gehen wir zu Rechner A und geben folgendes ein:</p>
<p><code>nc -w 1 192.168.0.100 1234 &lt; datei.tar</code></p>
<p>Fertig. Die Datei wird auf magische Weise über das Netzwerk übertragen.</p>
<h3>Chatten</h3>
<p>Schon einmal einen improvisierten Chat, von einem Rechner auf einen anderen benötigt? Auch das kann netcat.</p>
<p>Wir befehlen Netcat, auf Port 1234 zu &#8220;lauschen&#8221;:</p>
<p><code>nc -lp 1234</code></p>
<p>Dann einfach von einem anderen Rechner auf den Port verbinden: </p>
<p><code>nc 192.168.0.100 1234</code></p>
<p>Fange auf einem der beiden Rechnern an zu tippen. Sobald du <kbd>ENTER</kbd> drückst, wird die Zeile auf dem anderem sichtbar.</p>
<h3>Telnet Server</h3>
<p>Mit netcat lässt sich sogar innerhalb weniger Sekunden (so verrückt es auch klingen mag) ein Telnet Server aufsetzen. Die Shell (oder welche ausführbare Datei auch immer) lässt sich mit dem Parameter -e festlegen:</p>
<p><code>nc -lp 1234 -e /bin/bash</code></p>
<p>Das funktioniert sogar unter Windows:</p>
<p><code>nc -lp 1234 -e cmd.exe</code></p>
<p>Dann muss der Klient nur noch auf Port 1234 verbinden und hat vollzugriff auf eine Shell, zusammen mit dem Rechten des Benutzers der <strong>nc</strong> gestartet hat.</p>
<h3>HTTP Header simulieren</h3>
<p>Nützlich, um ein Paar zugriffe zu erzeugen, die leicht in den Logs zu erkennen sind. Der Header selbst muss natürlich manuell eingegeben werden:</p>
<p><code>nc pimpmyshell.de 80<br />
GET / HTTP/1.1<br />
Host pimpmyshell.de<br />
User-Agent: netcat<br />
Referrer: google.com</code></p>
<p>Die Anfrage wird erst nach einer Leerzeile abgeschickt. Es reicht also, zwei mal <kbd>RETURN</kbd> zu drücken. Dann sollte eine Antwort aus Headern und HTML erscheinen:</p>
<p><code>HTTP/1.1 200 OK<br />
Date: Wed, 08 Aug 2007 20:30:43 GMT<br />
Server: Apache<br />
Last-Modified: Fri, 01 Dec 2006 15:02:06 GMT<br />
ETag: "3dd0d1-9ad-4238c48865780"<br />
Accept-Ranges: bytes<br />
Content-Length: 2477<br />
Content-Type: text/html; charset=ISO-8859-1<br />
Content-Language: de</code><br />
<small>(Abgeschnitten, da HTML nicht nötig)</small></p>
<h3>Web Server</h3>
<p>Das ist sicher einer der coolsten Tricks. Damit lässt sich auf die schnelle (ein <em>wirklich simpler</em>) Webserver aufsetzen. Beispielsweise um den Benutzern einen kleinen Hinweis zu geben, wenn der eigentliche Webserver gerade nicht verfügbar ist. Schliesslich ist alles besser als <q>Keine Antwort von Server&#8230;</q></p>
<p><code>while true; do nc -l -p 80 -q 1 < error.html; done</code></p>
<p>Schützt den versierten Admin garantiert vor Morddrohungen per Telefon. *g*</p>
<h3>Systeme Klonen</h3>
<p>Ok, das ist mein absoluter Lieblingtrick. Auf dem System, das ich klonen will führe ich Folgendes aus:</p>
<p><code>dd if=/dev/sda | nc 192.168.0.100 1234</code></p>
<p>Und das hier auf dem Empfängersystem:</p>
<p><code>nc -l -p 1234 | dd of=/dev/sda</code></p>
<p>Natürlich müssen beide Systeme mit einer Live CD gebootet sein und zugriff auf das Netzwerk sowie netcat erhalten (Knoppix rockt!). </p>
<h3>Fazit</h3>
<p>Obwohl netcat zu all dem fähig ist, bleibt es der Unix Philosophie - <a href="http://en.wikipedia.org/wiki/Unix_philosophy">do one thing and do it well</a> - treu. Netcat wurde nur zu einem einzigen Zweck entwickelt: Datenpakete über Netzwerkverbindungen lesen und schreiben. Und weil es nur das kann, kann es auf so unglaublich vielfältige Weise eingesetzt werden. Es ist ironisch, aber in den meisten Fällen bedeuten mehr Funktionen nur eine noch stärkere Spezialisierung.</p>
<p>Ich habe gehört, dass netcat's fork <a href="http://www.dest-unreach.org/socat/">socat</a> noch mächtiger als sein und mehr Funktionen bieten soll. Ich bin aber noch nicht dazu gekommen, damit zu spielen.</p>
<p>Ebenso muss ich anmerken, dass fast alle der Tricks nur noch halb so lustig sind, wenn sie über das Internet genutzt werden, da - anders als bei ssh - die komplette Datenübertragung im Klartext stattfindet. Dafür gibt es <a href="http://sourceforge.net/projects/cryptcat/">cryptcat</a>, was ich aber ehrlich gesagt auch noch nicht getestet habe.</p>
<p>Und wenn ihr noch ein paar weitere coole Tricks für netcat kennt, schreibt sie in die Kommentare! Man lernt nie aus.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2007/08/08/nuetzliche-netcat-tricks/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>zufällige Passwörter generieren</title>
		<link>http://blog.pimpmyshell.de/2007/05/22/zufallige-passworter-generieren/</link>
		<comments>http://blog.pimpmyshell.de/2007/05/22/zufallige-passworter-generieren/#comments</comments>
		<pubDate>Tue, 22 May 2007 22:22:54 +0000</pubDate>
		<dc:creator>Jeremy</dc:creator>
				<category><![CDATA[tutorials]]></category>
<category>/dev/random</category><category>apg</category><category>otp</category><category>passwort</category><category>passwort generator</category><category>pwgen</category>
		<guid isPermaLink="false">http://blog.pimpmyshell.de/2007/05/22/zufallige-passworter-generieren/</guid>
		<description><![CDATA[Ich bin in letzter Zeit des öfteren über das Problem gestolpert, mir neue Passwörter ausdenken zu müssen. Da ich keine nun weder lust auf &#8220;auf die schnelle&#8221; ausgedachte und extrem unsichere Passwörter wie password123 hatte, noch auf grafische Tools zurückgreifen wollte, habe ich mich auf die Suche nach Möglichkeiten zur Passwortgenerierung in der Shell begeben. [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bin in letzter Zeit des öfteren über das Problem gestolpert, mir neue Passwörter ausdenken zu müssen. Da ich keine nun weder lust auf &#8220;auf die schnelle&#8221; ausgedachte und extrem unsichere Passwörter wie <strong>password123</strong> hatte, noch auf grafische Tools zurückgreifen wollte, habe ich mich auf die Suche nach Möglichkeiten zur Passwortgenerierung in der Shell begeben.<br />
<span id="more-88"></span></p>
<h3>/dev/random</h3>
<p>Die naheliegenste, wenn auch aufwändigste Methode (unter Linux) ist es, /dev/random zu nutzen. Mein erster Versuch sah wie folgt aus:</p>
<p><code>jxn@david:~$ head -n 1 /dev/random<br />
A��ɫ�M����▒$+�+Ť���d����t��~#9yi���m</code></p>
<p>, was (wie man oben sehen kann) einen ziemlich unbrauchbaren Müll erzeugte.</p>
<p>Im nächsten Versuch holte ich mir nur noch die ersten 9 Zeichen statt einer ganzen Zeile und wandelte mit <strong>uuencode</strong> alles in leserliches ASCII um:</p>
<p><code>jxn@david:~$ head -c 9 /dev/random | uuencode -m -<br />
begin-base64 644 -<br />
G7n6csku<br />
====</code></p>
<p>Unglücklicherweise gab es da noch diesen eigenartigen Müll vor und nach meinem gewünschten Passwort. Es gibt viele Wege, dies zu beseitigen. Ich nahm <strong>sed</strong>:</p>
<p><code>jxn@david:~$ head -c 9 /dev/random | uuencode -m - | sed -n '2p'<br />
LdsZTzueVFMS</code></p>
<p>Tadaa! Das einzige verbleibende Problem könnten noch ungewünschte Zeichen wie /, +, ? oder _ sein, welche sich aber ebenfalls mit sed und ein Paar <a href="http://de.wikipedia.org/wiki/Regulärer_Ausdruck" title="Link zum Wikipedia-Artikel">regulären Ausdrücken</a> leicht entfernen lassen:</p>
<p><code>jxn@david:~$ head -c 9 /dev/random | uuencode -m - | sed -n '2s/[^a-zA-Z 0-9]//;2p'<br />
wsS8xBNMGDSA</code></p>
<p>Fertig. Ich empfehle aus Komfortgründen jedoch, das ganze in ein Shellscript zu packen. ;-)</p>
<p>Das Problem der mit /dev/random genertieren Passwörter ist jedoch, dass sie in den meisten Fällen nicht aussprechbar sind und sich deswegen nicht sehr gut merken lassen: </p>
<p><code>mmN7kDsf+Ag z9E60Ve+vdP zzGYMiBEnkfV zMy5F8QHFG6c Msa9VrXSlWz3 u87UkaPLhBJy nw1jbXg1Gavo wFHnpCAiDkYg 0VgdCgSoN0n9 JcjT2SR8LWJY</code></p>
<h3>pwgen</h3>
<p>Wer sich Passwörter wünscht, die sich garantiert leichter merken lassen, der sollte das Programm <strong>pwgen</strong> ausprobieren. Es generiert ebenfalls zufällige Passwörter und sollte in den meisten Distributionen verfügbar sein. Das Programm ist zunächst ein wenig knifflig weil es, wenn ohne Parameter ausgeführt eine Tabelle mit 50 Passwörtern generiert. Um nur ein Passwört ausgeben zu lassen genügt ein:</p>
<p><code>pwgen -1</code></p>
<p>Andererseits generiert das Programm ebenfalls nur ein einziges Passwort wenn die Ausgabe in eine Datei umgeleitet wird. In wirklichkeit sind natürlich nicht alle Passwörter aussprechbar oder gar leicht zu merken. Aber die meisten von ihnen sind es, und das ist mehr als genug. Als kleines Beispiel hier noch ein paar der von pwgen generierten Passwörter:</p>
<p><code>zaiCh7th Eeheex3j hooKah1d eeQua8ie Ooghath8 queo3EiP teiP5lan aheeCh4r</code></p>
<h3>otp</h3>
<p>Ein weiteres nützliches Programm ist <strong>otp</strong>, was eigentlich ein Akronym ist und für <a href="http://de.wikipedia.org/wiki/One-Time-Pad">One Time Pad</a> steht. Es wurde entwickelt, um Schlüssel für jene Verschlüsselungsmethode zu generieren. Aber die Standardausgabe reicht für unsere Zwecke völlig. Hier noch ein Beispiel für die Ausgabe von otp:</p>
<p><code> 1) arri-ylew   2) riuo-ytrh   3) wkgc-elrb   4) npfn-ffkb<br />
 5) hptz-dlzv   6) yawa-vfhs   7) ohmp-rsun   8) cajw-bfqg</code></p>
<p>Genau wie pwgen generiert otp standardmäßig 50 Passwörter. Um nur ein einziges auszugeben,  (für Scripts beispielsweise) reicht:</p>
<p><code>otp -n1</code></p>
<h3>apg</h3>
<p>Solltet ihr eine noch größere Zufälligkeit brauchen, werdet ihr warscheinlich <strong>apg</strong> mögen. Ohne Parameter ausgeführt, fragt es euch zunächst nach ein wenig <em>Eingabe</em> eurerseits. Der Algorithmus generiert dann eine Liste von Passwörtern, auf eurer Eingabe basierend. Hier eine Beispielausgabe:</p>
<p><code>8obPactAblo (EIGHT-ob-Pact-A-blo)<br />
tu8VoazCiati (tu-EIGHT-Voaz-Ciat-i)<br />
rojKeOc0 (roj-Ke-Oc-ZERO)<br />
JedHeej9 (Jed-Heej-NINE)<br />
Konquedeps4 (Kon-qued-eps-FOUR)<br />
yov0HoobBoy (yov-ZERO-Hoob-Boy)</code></p>
<p>Wie ihr oben sehen könnt, gibt apg euch Tipps zum aussprechen (und damit automatisch leichter merken) der Passwörter. Zwar leider auf Englisch, aber das sollte kein Problem darstellen. Für Scripts gibt</p>
<p><code>apg -n 1</code></p>
<p>nur ein Passwort (ohne den Tipp) aus, welches sich leicht in weitere Programme umleiten lässt.</p>
<p>Wenn ihr euch also das nächste mal an einer dieser albernen &#8220;Web 2.0 Sites&#8221; anmeldet, ist es vielleicht Klug ein starkes Passwort zu verwenden. Und wenn euch gerade keines einfällt, so könnt ihr mit den Tools die ich euch gerade vorgestellt habe, euch auf die schnelle eins generieren lassen. :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2007/05/22/zufallige-passworter-generieren/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>muttrc &#8211; builder</title>
		<link>http://blog.pimpmyshell.de/2007/03/13/muttrc-builder/</link>
		<comments>http://blog.pimpmyshell.de/2007/03/13/muttrc-builder/#comments</comments>
		<pubDate>Tue, 13 Mar 2007 21:22:07 +0000</pubDate>
		<dc:creator>Gregor</dc:creator>
				<category><![CDATA[how-tos]]></category>
		<category><![CDATA[webseiten]]></category>
<category>mutt</category>
		<guid isPermaLink="false">http://blog.pimpmyshell.de/2007/03/13/muttrc-builder/</guid>
		<description><![CDATA[Jeder, der sich mutt auseinander setzt, begreift schnell, dass mutt der wahrscheinlich mächtigste Email-Client ist, den es im Unixumfeld gibt. Er ist extrem variabel aufgebaut und lässt sich bis aufs kleinste Detail konfigurieren. Um dies zu meistern &#8211; sprich sich die perfekte muttrc zu basteln bedarf es erst einmal viel Zeit, die man sich nehmen [...]]]></description>
			<content:encoded><![CDATA[<p>Jeder, der sich <strong><a href="http://pimpmyshell.de/wiki/index.php?title=Email#mutt">mutt </a></strong>auseinander setzt, begreift schnell, dass <strong>mutt </strong>der wahrscheinlich mächtigste <a href="http://pimpmyshell.de/wiki/index.php?title=Email">Email-Client </a>ist, den es im Unixumfeld gibt. Er ist extrem variabel aufgebaut und lässt sich bis aufs kleinste Detail konfigurieren. </p>
<p>Um dies zu meistern &#8211; sprich sich die perfekte <strong>muttrc</strong> zu basteln bedarf es erst einmal viel Zeit, die man sich nehmen muss, um die Man-Files, die unzaehligen How-Tos und die Tutorials durchzuarbeiten.</p>
<p>Beim surfen habe ich eine Internetseite gefunden, die ich als &#8220;Extrem-Hilfreich&#8221; einstufe:<br />
<a href="http://muttrcbuilder.org/"><br />
Der Muttrc-Builder</a></p>
<p>Mit Hilfe dieser Seite kann man sich eine Konfigurationsdatei basteln, die aus Mutt genau den Email-Client macht, den man sich immer gewünscht hat &#8211; inklusive der Farbgebung, Verschlüsselung, Imap- oder Pop3-konfiguration, Lese- und Sendeoptionen etc. </p>
<p>Probiert es aus! Ein Segen für jeden von Natur aus faulen Konsolen-Nutzer :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pimpmyshell.de/2007/03/13/muttrc-builder/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
