Code Schnipsel: Base64 kodierte LDAP-Attribute on-the-fly in Klartext ausgeben

Bevor man jedes mal ein Skript schreibt um einfach nur eine LDAP Zeile in Klartext lesen zu können, einfach an Perl durchpipen:

ldapsearch -LLL -x -b 'dc=ldap' '(uid=username)' base64Attribut | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n //g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print'

Code Schnipsel: Nicht-ASCII-Zeichen in Dateinamen ersetzen

Als ich dabei war mir einen Subsonic Server aufzusetzen, wollte ich auch endlich mal die Dateinamen meiner Musiksammlung überarbeiten. Nach dem Rippen mit EAC und der Benamung über freeDB fanden sich haufenweise Umlaute und andere Nicht-ASCII Zeichen in den Dateinamen der flacs, was in der Regel zwar kein Problem darstellt, aber eben doch nur in der Regel. Zwischen verschiedenen Dateisystem und über die eine oder andere Protokollkommunikation kann einem die Sache mit den verschiedenen Kodierungen von Nicht-ASCII Zeichen doch zum Verhängnis werden. (Allein schon Playlisten die von manchen Playern automatisch in ISO-8859 angelegt werden, aber dann doch am Ende auf Dateien auf einem UTF Dateisystem zugreifen.) Daher werden diese Non-ASCIIs nun verASCIIt.

Erstmal muss man die „Probleme“ finden. find und grep arbeiten da gut zusammen (wobei es find vielleicht auch alleine machen kann, aber so hab ich es für mich schneller hingekriegt, zumal man gleich die exakten Positionen der entsprechenden Zeichen sieht.

find | grep --color=auto -P -n "[\x80-\xFF]"

Dann kann man ans Ersetzen gehen. Eigentlich könnte man das gut skripten, doch da es sich um eine einmalige Sache handelt, bin ich den faulen Weg der Einzelkommandos gegangen.

find -exec rename "s/ä/ae/g" {} +

In diesem konkreten Anwendungsfall hat es sich als Vorteil erwiesen erst die Verzeichnisse zu behandeln (find -type d), aber man kann das gleiche Kommando auch mehrmals durchführen mit dem gleichen Endergebnis. Um auf Nummer sicher zu gehen, kann man auch erst einen Trockenlauf (rename -n) durchführen.

Das Ganze wäre sicherlich auch ein nettes Pythonskript geworden, doch ich will schnell Ergebnisse um überall meine Musik zu hören, also pfeif ich drauf.

Code Schnipsel: Skriptelemente global austauschen

Wenn man von einem Webserver auf einen anderen umzieht und dabei auch ein paar weniger gut programmierte Anwendungen umziehen muss, kann man auf das Problem stoßen, dass z.B. an zig Stellen der Serverpfad eingetragen ist. Kann man einzeln per Hand machen, muss man aber nicht:

find . -name '*.php' -type f -exec sed -i.bkp 's/\/alter\/pfad\/zu\/htdocs/\/neuer\/pfad\/zu\/htdocs/g' {} +

Durch ‚-i.bkp‘ bei sed werden auch Backups der Originaldateien angelegt, für den Fall, dass man es verbockt. Die lassen sich aber auch auf einen Schlag loswerden, nachdem alles auf saubere Funktion getestet wurde.

find . -name '*.php.bkp' -type f -exec rm {} \;

Code Schnipsel: SSL Infos Remote checken

Um die Infos aus einer Zertifikatskette aus dem Serveroutput zu überprüfen, kann man entweder per OpenSSL die Zertifikate herunterladen und seperat lesen oder aber direkt die s_client Ausgabe sed’en und grep’en:

echo QUIT | openssl s_client -showcerts -connect www.server.de:443 2>/dev/null | sed -ne '/2 s\:\//,/END CERT/p' | sed -ne '/BEGIN CERT/,/END CERT/p' | openssl x509 -noout -subject -dates

subject= /C=DE/O=Firma/OU=Abteilung/CN=CA Orga
notBefore=Dec 24 10:29:00 2000 GMT
notAfter=Dec 24 23:59:00 2036 GMT

Erster Teil übergibt QUIT an openssl s_client im zweiten Teil, weil dieser auf eine Eingabe wartet, im dritten Teil wird der generelle Teil der Kette gewählt (in diesem Teil der zweite), im dritten Teil wird die Ausgabe nochmals auf das eigentliche Zertifikat reduziert, was im vierten Teil in eine lesbare Ausgabe umgewandelt wird (hier nur subject um sicher zu sein, dass man das richtige Zertifikat liest und die Daten, worum es eigentlich bei der Abfrage ging, aber mit -text gäbe es alles zu sehen).

Wenn man es anständig skriptet kann man auch die ganze Kette mit den gewünschten Infos ausgeben, aber als kleiner Hack reicht das so.

Code Schnipsel: find als du-Alternative

Wenn „du“ (Disk Usage) mal wieder zu langsam ist, kann man „find“ missbrauchen:

find ./directory/ -printf %k"\n" | awk '{ sum += $1 } END { print sum }'

Das macht sich besonders bemerkbar, wenn man ein Verzeichnis mit über 410 Millionen Dateien untersuchen will. Und natürlich lassen sich dann die ganzen schönen find-Filter benutzen.

find ./typo3temp/ -type f -iname '*.jpg' -ctime -2 -printf %k"\n" | awk '{ sum += $1 } END { print sum }'