Tips und Tricks

Home

PNG-Bilder auf Knoppix optimieren

Bisher hatte ich geglaubt, dass die Bildverarbeitungsprogramme recht vernünftige PNGs schreiben, aber das ist wohl doch nicht der Fall. Auf der Suche nach einem PNG-Optimizer habe ich OptiPNG auf Knoppix gefunden. Das hat das PNG fast halbiert...

optipng -o5 -v lambda.png

Auspacken von ZIPs mit find

Die Aufgabe: Suchen und Auspacken von ZIPs in einem Directory-Baum. Die ZIPs liegen immer in einem Directory mit dem Namen "A4". Es gibt aber auch andere Directories, und die Archive in diesen Directories sollen nicht ausgepackt werden.

\tools\cygwin\bin\find . -wholename '*/A4/*.zip' -execdir 7z x {} ';'

Nach den Warnungen in der man-Page zu urteilen, sind wholename und execdir nicht wirklich portabel, aber auf Cygwin unter Windows funktioniert das wunderbar.

vi Makro zur Konversion von altem PHP Code

Alter PHP Code greift direkt auf globale Variablen zu, die vom Webserver gesetzt werden. Dies ist ein Sicherheitsrisiko und deshalb sind aktuelle Webserver und PHP Interpreter anders konfiguriert.

Automatisches Suchen und ersetzen hilft bei der Portierung wenig, weil die lokalen Variablen nach dem gleichen Muster benutzt werden. Manuelles editieren ist mühsam und fehleranfällig, deshalb haben wir das folgende vi-Makro geschrieben:

map v f$a_POST["^[ea"]^[

Dieses Makro ist wohl bloss für vi-Gurus verständlich, deshalb die Erklärung dazu:

mapdefiniert ein vi-Makro
vist einer der wenigen Buchstaben die von vi noch nicht belegt sind
f$positioniert den Cursor auf dem nächsten $-Zeichen
afügt Text hinter dem $ ein
_POST["wird eingefügt
^[beendet das Einfügen. Die Eingabe erfolgt durch <Ctrl-V>Esc
egeht zum Ende des Worts, also dem Variablennamen
afügt Text hinter dem Wort ein
"]wird eingefügt
^[beendet das Einfügen.

Dieses Makro ersetzt also zum Beispiel $variable durch $_POST["variable"].

Mit vi Carriage Returns aus einem File löschen

Werden Files von Windows auf Linux transferiert, dann bleiben häufig die Carriage Returns ('\r') im File. Dieses Zeichen ist unter Linux unerwünscht oder sogar problematisch.

Der vi zeigt das Return als ^M an, und dann hilft folgender Befehl:

:%s/^M//g

Das ^M bekommt man durch die Tastenkombination <Ctrl-V><Ctrl-M>.

rsync zum Kopieren eines Disks

Sie finden tausende von Seiten über rsync, aber die Kombination hier haben wir nur einmal gesehen. Trotz eifrigem Suchen haben wir die Seite dann nicht wieder gefunden...

Das Kommando dient dazu, den Inhalt eines Server-Directories möglichst exakt zu kopieren

rsync -avH --delete --numeric-ids -e ssh user@server.ch:/var/www/ www/
-aRekursives Kopieren mit allen Rechten
-vVerbose
-HHardlinks erhalten
--deleteFiles die im Source-Directory nicht existieren werden gelöscht
--numeric-idsDie numerischen IDs kopieren, nicht anpassen
-e sshSSH als Transportmedium verwenden

Achten Sie auf die Slashes hinter Source- und Destination-Directories. Sie sind wichtig !

UDP-Paket mit Command Line Tools schicken

Es kommt immer wieder vor dass man schnell mal ein UDP-Paket schicken soll, möglichst ohne ein Programm zu schreiben. Die folgende Zeile benutzt echo und netcat um das zu bewerkstelligen.

echo -en '\0\0' | netcat -u 192.168.1.202 5431
-e\0 wird als Byte 0x00 interpretiert
-nKein Newline ausgeben
-uUDP als Transportmedium benutzen
192.168.1.202IP-Adresse des Remote-Systems
5431Portnummer auf dem Remote-System

Die Quotes sind nötig, sonst "frisst" die Shell die Backslashes.

Hosts mit iptables vom Server aussperren

Bei der letzten Attacke auf das DNS haben wir die Hosts mit folgender Kommandozeile vom Server abgehalten:

iptables -A INPUT -s 80.82.65.97 -p UDP -j DROP
-AZu den Filtern hinzufügen.
-sSource Address
-pProtokoll
-jWas mit dem Paket passieren soll

Nachtrag

Nach einer Weile wird es mühsam, immer neue IPs mit iptables einzutragen...

Eine Google-Suche führte uns zum Blogeintrag von Benny Baumann. Den konnten wir zwar nicht direkt übernehmen, weil die Query anders codiert war, aber die Anleitung ist so gut dass wir in kurzer Zeit ein passendes Filter für unseren Fall entwickelt hatten.