Mittwoch, 6. Januar 2010
Mailheader decodieren mit Hilfe von perl
Spamfilter können auf Wunsch die aussortierten Mails am Server speichern. An sich sieht man es den Mails schon am Betreff an, ob sie tatsächlich spam oder doch ham (und in diesem Fall eventuell ein false positive) sind.
Allerdings müssen non-ascii Teile des Mailheaders passend encodiert sein, was das Lesen teilweise unmöglich macht.
Ein paar Beispiele:
=?iso-8859-1?Q?Hall=F6chen?=
=?UTF-8?Q?Hall=C3=B6chen?=
=?UTF-8?B?SGFsbMO2Y2hlbg==?=
=?iso-2022-jp?B?GyRCOiNHLyRiSSwkOiRkJGo/ayQyJGsbKEIhIRskQkcvS3ZBMCRO?=
=?GB2312?B?0rvSubzkyMM1MDDN8sjLudjXosT6svrGt7XEzfjC59Oq?=
Da sind diverse encodings, mal in quoted printable, mal in base64. Allen gemeinsam ist die schwere Lesbarkeit.
Mailheader oder Teile davon kann man am einfachsten mit perl decodieren:
Aber auch ganze Unterordner voller Spammails können durchsucht werden:
Nicht encodierte Teile sind übrigens gar kein Problem.
Allerdings müssen non-ascii Teile des Mailheaders passend encodiert sein, was das Lesen teilweise unmöglich macht.
Ein paar Beispiele:
=?iso-8859-1?Q?Hall=F6chen?=
=?UTF-8?Q?Hall=C3=B6chen?=
=?UTF-8?B?SGFsbMO2Y2hlbg==?=
=?iso-2022-jp?B?GyRCOiNHLyRiSSwkOiRkJGo/ayQyJGsbKEIhIRskQkcvS3ZBMCRO?=
=?GB2312?B?0rvSubzkyMM1MDDN8sjLudjXosT6svrGt7XEzfjC59Oq?=
Da sind diverse encodings, mal in quoted printable, mal in base64. Allen gemeinsam ist die schwere Lesbarkeit.
Mailheader oder Teile davon kann man am einfachsten mit perl decodieren:
echo '=?UTF-8?B?SGFsbMO2Y2hlbg==?=' | perl -MEncode -ne 'print encode("utf8",decode("MIME-Header",$_))'
Obiges Beispiel decodiert nicht einfach nur den Header, sondern encodiert auch gleich in UTF-8 (default wäre iso).Aber auch ganze Unterordner voller Spammails können durchsucht werden:
ls -1t | head -20 | xargs grep '^Subject: =?' | perl -MEncode -ne 'print encode("utf8",decode("MIME-Header",$_))'
Dieses Beispiel durchsucht die neuesten 20 Mails im Ordner nach encodierten Subjects und gibt diese decodiert als UTF-8 aus.Nicht encodierte Teile sind übrigens gar kein Problem.
Donnerstag, 31. Dezember 2009
Diverse Maildienste auf der Kommandozeile testen
Vertrauen ist gut, Kontrolle ist besser. Hier folgt eine Sammlung von Kommandozeilentests für diverse Maildienste (smtp, pop, imap...)
Wir gehen davon aus, dass der Mailserver erfolgreich installiert ist, in diesem Fall sei das Postfix mit Postgrey und Amavis, das Zertifikat wurde erstellt, die erforderlichen Dienste laufen und die gewünschten Ports sind in der Firewall geöffnet. Die Dienste imap, imaps, pop3 und pop3s werden von Dovecot zur Verfügung gestellt.
Als Beispieldomain verwende ich dein.mailserver.net, als Beispiel-IP 1.2.3.4, der Beispieluser (brauchen wir zum Testen der Dienste mit Login) heißt userlein und er hat das Passwort "geheim".
Um es übersichtlicher zu machen, sind die einzugebenden Befehle grün, die Antworten des Servers, auf die es besonders ankommt sind blau.
Nun aber zu den Praxisbeipielen:
Wir gehen davon aus, dass der Mailserver erfolgreich installiert ist, in diesem Fall sei das Postfix mit Postgrey und Amavis, das Zertifikat wurde erstellt, die erforderlichen Dienste laufen und die gewünschten Ports sind in der Firewall geöffnet. Die Dienste imap, imaps, pop3 und pop3s werden von Dovecot zur Verfügung gestellt.
Als Beispieldomain verwende ich dein.mailserver.net, als Beispiel-IP 1.2.3.4, der Beispieluser (brauchen wir zum Testen der Dienste mit Login) heißt userlein und er hat das Passwort "geheim".
Um es übersichtlicher zu machen, sind die einzugebenden Befehle grün, die Antworten des Servers, auf die es besonders ankommt sind blau.
Nun aber zu den Praxisbeipielen:
"Diverse Maildienste auf der Kommandozeile testen" vollständig lesen
Amavis, sa-learn und awl
Gelegentlich flutscht auch mal ein Spammail durch den Amavis-Filter und landet damit ungewollt in der Autowhitelist, bzw. wird von Bayes fälschlicherweise als sauber erkannt.
Mit zwei Kommandos kann das richtig gestellt werden.
Amavis läuft als unprivilegierter User (in diesem Fall als vscan), damit sa-learn und spamassassin für den richtigen Filter funktionieren, rufen wir die Kommandos mit sudo auf (als root):
Das kann natürlich auch gleich getestet werden:
Mit zwei Kommandos kann das richtig gestellt werden.
Amavis läuft als unprivilegierter User (in diesem Fall als vscan), damit sa-learn und spamassassin für den richtigen Filter funktionieren, rufen wir die Kommandos mit sudo auf (als root):
sudo -u vscan spamassassin --remove-addr-from-whitelist spammer@doofe-domain.net
...entfernt die Email Adresse aus der Whitelist.
sudo -u vscan sa-learn --spam spammail.eml
...trainiert Bayes auf das vormals durchgeflutschte Mail (hier spammail.eml).Das kann natürlich auch gleich getestet werden:
sudo -u vscan spamassassin -L -D < spammail.eml
Siehe da, Bayes vergibt jetzt 3.5 Punkte, AWL ist völlig verschwunden.Sonntag, 20. Dezember 2009
Floats vergleichen in der Bash
Die Bash (test) kann an sich nur Ganzzahlen vergleichen, übergibt man eine Fließkommazahl, führt das zu einem Fehler.
So richtig Sinn macht das klarerweise erst mit Variablen:
if [ 12.3 -gt 12 ]; then echo '>'; fi
bash: [: 12.3: integer expression expected
Möchte man doch schnell mal zwei floats vergleichen, geht das ganz einfach mit bc. Zuerst interaktiv:
bash: [: 12.3: integer expression expected
xela@linux:~> bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. if (10.123 > 10.1119) 1 else 0 1 quitUm diese Art Test in einem Skript verwenden zu können, nehmen wir "echo" zum Übergeben an bc:
if [ $(echo "if (19 >= 19.00000) 1 else 0" | bc) -eq 1 ] ; then echo größergleich; else echo kleiner; fi
Wichtig dabei ist das "else 0", damit auf alle Fälle ein Integer (Ganzzahl) zurückgegeben wird, den test (also [ ) dann vergleichen kann.So richtig Sinn macht das klarerweise erst mit Variablen:
a='3.333'; b='3.2176'; if [ $(echo "if (${a} > ${b}) 1 else 0" | bc) -eq 1 ] ; then echo größer; else echo kleiner; fi
Mittwoch, 26. August 2009
ffmpeg Schrifteffekt mit vhook imlib2.so
FFMPEG bietet ein paar dürftig dokumentierte Effekte, sogenannte vhooks. Einer davon ist imlib2.so. Zwar sind die vhooks zu nicht viel nütze, werden auch gar nicht mehr weiter entwickelt und sind in der Anwendung gräßlich kompliziert. Einen lustigen Effekt möchte ich euch aber nicht vorenthalten: eine Schrift, die etwas zeitverzögert übers Bild huscht und dabei langsam transparent wird.
Zuvor muss in der Shell noch die Variable FONTPATH gesetzt und exportiert werden, falls sie nicht gesetzt ist:
Jetzt aber im Detail:
ffmpeg -i input.flv -vhook '/usr/lib/vhook/imlib2.so -c white -x 250 -y H+(-1.8*N+80) -t Hallo! -A max(0,255-exp(N/16))' -sameq -acodec copy output.flv
Ja, das ist eine mords Codewurst.Zuvor muss in der Shell noch die Variable FONTPATH gesetzt und exportiert werden, falls sie nicht gesetzt ist:
FONTPATH="/usr/lib/jvm/java-1.6.0-sun-1.6.0/jre/lib/fonts/"
export FONTPATH
Sonst findet ffmpeg die Schriften nicht. Obiger Ordner ist nur ein Beispiel, dort liegt bei mir zufällig die Schrift, die ffmpeg per default verwendet. Zwar kann das noch mit -f gesetzt werden, aber der Befehl ist auch so schon lang genug.export FONTPATH
Jetzt aber im Detail:
"ffmpeg Schrifteffekt mit vhook imlib2.so" vollständig lesen
Freitag, 31. Juli 2009
Text formatieren in zenity
Zenity ist ein Programm, das GTK+ Dialoge anzeigt. Damit kann man Shellskripten ein GUI (Graphical User Interface) verpassen, was einigen Komfort für den User bringt.
Ein einfaches Beispiel:
Zenity kann aber auch Fragen, Auswahllisten, Kalender, etc.
Wenig bekannt ist, dass die Texte in den Dialogfenstern auch formatiert werden können. In der manpage von zenity steht auch gar nichts davon.
Deshalb ein paar Beispiele:
<i></i> erzeugt kursiven Text
Verwendet wird offensichtlich eine HTML-ähniche Syntax mit Tags.
\n erzeugt einen Zeilenumbruch
Natürlich kann man Text auch verkleinern mit small, smaller, x-small und xx-small.
Auch farbiger Text ist möglich:
Mehr lässt sich eventuell noch durch herumprobieren herausfinden.
Die Dokumentation zu den mit zenity verwendbaren Tags steckt wohl irgendwo tief im GTK+ Quelltext.
Ein einfaches Beispiel:
zenity --info --text "sehr informativ"
Zenity kann aber auch Fragen, Auswahllisten, Kalender, etc.
Wenig bekannt ist, dass die Texte in den Dialogfenstern auch formatiert werden können. In der manpage von zenity steht auch gar nichts davon.
Deshalb ein paar Beispiele:
zenity --info --text "<b>sehr</b> <i>informativ</i>"
<b></b> erzeugt fetten Text<i></i> erzeugt kursiven Text
Verwendet wird offensichtlich eine HTML-ähniche Syntax mit Tags.
zenity --info --text '<span size="xx-large">Obacht!!!</span>\n\nDas ist extrem wichtig'
large, larger, x-large und xx-large erzeugen größeren Text\n erzeugt einen Zeilenumbruch
Natürlich kann man Text auch verkleinern mit small, smaller, x-small und xx-small.
Auch farbiger Text ist möglich:
zenity --info --text '<span color="red">roter</span> und <span color="blue">blauer</span> Text'
Außerdem gehen die HTML-Tags <u>, <tt>, <sup>, <sub>, <s>, <big>.Mehr lässt sich eventuell noch durch herumprobieren herausfinden.
Die Dokumentation zu den mit zenity verwendbaren Tags steckt wohl irgendwo tief im GTK+ Quelltext.
Montag, 27. April 2009
Datei mit gemischtem Encoding reparieren
Textdateien haben ein Encoding, das ist in unseren Breiten meist entweder utf-8 oder iso-8859-1 (es gibt natürlich noch bedeutend mehr). Ein großes Problem entsteht, wenn Windows- und Linuxuser gemeinsam (deutschsprachige) Dateien bearbeiten. Dann kann es vorkommen, dass eine Textdatei sowohl utf-8, als auch iso-8859-1 Teile enthält.
Die Datei ist kaputt, Umlaute werden teilweise nicht mehr richtig angezeigt.
Was tun? Normalerweise müsste sich jetzt jemand hinsetzen und den gesamten Text durcharbeiten.
Nein, wir Tricksen!
Wir verwenden das Programm recode, allerdings nicht direkt. Mit gemischtem Encoding kann recode nicht umgehen, sondern wir gehen den Umweg über HTML-Entities.
Wichtig: Folgendes findet auf einer Linuxkonsole mit $LANG=de_DE.UTF-8 statt:
Die Datei ist kaputt, Umlaute werden teilweise nicht mehr richtig angezeigt.
Was tun? Normalerweise müsste sich jetzt jemand hinsetzen und den gesamten Text durcharbeiten.
Nein, wir Tricksen!
Wir verwenden das Programm recode, allerdings nicht direkt. Mit gemischtem Encoding kann recode nicht umgehen, sondern wir gehen den Umweg über HTML-Entities.
Wichtig: Folgendes findet auf einer Linuxkonsole mit $LANG=de_DE.UTF-8 statt:
"Datei mit gemischtem Encoding reparieren" vollständig lesen
« vorherige Seite
(Seite 3 von 6, insgesamt 40 Einträge)
» nächste Seite