Tips und Tricks

Home

Sourcen aller Java-Files zusammenfassen

Auf einem Windows mit installiertem Git Bash geht das mit einer einzigen Zeile:

"C:\Program Files\Git\usr\bin\find" . -name "*.java" -exec cat {} ";"

Das funktioniert zwar, ist aber relativ langsam. Diese Variante ist deutlich schneller:

"C:\Program Files\Git\usr\bin\find" . -name "*.java" -printf '"%p"\n' | xargs cat

ssh auf alte Computer

Ein aktuelles Linux verweigert die Verbindung zu Computern mit älteren ssh-Daemons. Diese Zeile schafft Abhilfe:

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -l user 192.168.1.150

Buffering von awk auf dem Raspberry

Auf einem normalen Debian funktionierte diese Zeile, auf dem Raspberry aber nicht:

inotifywait -e close  -m . | awk '!/ISDIR/ {  system( "echo command " $3 " option") }'

Der Output von inotifywait blieb im Buffer der Pipe stecken. stdbuf -oLvor der Pipeline bewirkte nichts.

Schlussendlich fand ich eine Option von awk die das Problem gelöst hat:

inotifywait -e close  -m . | awk -W interactive '!/ISDIR/ {  system( "echo command " $3 " option") }'

Aktive IP-Adressen im LAN anzeigen

Wenn die IP-Adressen mit DHCP vergeben werden, dann ist ein headless Raspberry gar nicht so einfach zu finden. Der folgende Befehl sucht die aktiven Adressen und zeigt die Hostnamen dazu an:

nmap -sP 192.168.1.0/24

Fehler: the system cannot execute the specified program

Tritt auf weil die Runtime-Library für Visual Studio nicht installiert ist. Abhilfe: bei "code generation" die "runtime library" auf "multithreaded" stellen. Schwer zu glauben, aber das funktioniert tatsächlich...

Dependencies von .EXEs anzeigen

Geht mit dumpbin /DEPENDENTS program.exe.

Fehler: Side-By-Side-Konfiguration

Tritt auf weil die Debug-Library für Visual Studio nicht installiert ist. Abhilfe: Release-Version erstellen und auf das Zielsystem kopieren.

HTTP-Server mit Python 3

In der Python-Library gibt es einen einfachen Webserver. Wenn Python 3 installiert ist, wird dieser Server wie folgt gestartet:

python -m http.server 80

Mit dieser Kommandozeile liefert der Server die Files im lokalen Directory aus.

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.

Es gibt zwei Versionen von netcat: nc.openbsd und nc.traditional. nc und netcat sind üblicherweise nur Links zu den entsprechenden Files. nc.traditional bietet die Option -o, um die empfangenen Daten als Hexdump in ein File speichern. Das ist ausgesprochen praktisch wenn die Antwort in binärer Form kommt.

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.