Kleine Tipps und Tricks

›› Unix und Perl ›› Perl/Bash Einzeiler (Mini-Tipps)

LWP (libwww-perl) FTP hinter Firewall nutzen

Wer z.B. cpan.pm benutzt um Perlpakete zu installieren, kennt den Effekt vielleicht, dass diese nicht funktionieren, wenn der ingebaute FTP Client nicht auf Passive umgestellt ist.

Einfach in den Environment Variablen FTP_PASSIVE = 1 einstellen und schon klappts auch mit LWP und Firewalls ;-)

Verzeichnisse oder Dateien bei Tar Archiven herauslassen.

Wer Archive von Verzeichnissen erstellen möchte, aber z.B. cache or temporäre Verzeichnisse kann dies relativ einfach in TAR lösen.

Beispiel:
/home/daniel/ soll archiviert werden, aber /home/daniel/.webbrowser-cache und /home/daniel/temporary sollen herausgelassen werden.

Dafür schreibt man einfach:
tar cvvf /tmp/MeinArchiv.tar — exclude=/home/daniel/.webbrowser-cache —exclude=/home/daniel/temporary /home/daniel/

Wenn man nun gleichzeitig viele User mit gleichen temporären Verzeichnissen archivieren möchte geht das genauso:
Beispiel:
/home/daniel
/home/peter
/home/john

haben alle in ihrem Home directory ein .webbrowser-cache und temporary Verzeichniss. Also einfach :
tar cvvf /tmp/Archive.tar — exclude=/home/*/.webbrowser-cache —exclude=/home/*/temporary /home/daniel/ /home/peter/ /home/john/

Wenn eh alle Homedirs so gespeichert werden sollen geht natürlich auch:
tar cvvf /tmp/Archive.tar — exclude=/home/*/.webbrowser-cache —exclude=/home/*/temporary /home/

PerlOneLiner

ls -lF | perl -e 'my $input ; foreach $std_input (<STDIN>) { chomp $std_input ; my @row = split (/ /,$std_input) ; print pop @row ; print "\n" ; } ;'

Etwas ausführlicher geschrieben als benötigt, aber der Perl Einzeiler erlaubt das Anzeigen der letzten Spalte (bei durch SPACE getrennte Spalten) eines Textes. Der ls -lF ist nur die Hilfe um Test-Daten für dieses Beispiel zu haben.

Der Vorteil zu awk oder cat Varianten ist dass die Anzahl der Spalten sich dynamisch ändern können und trotzdem wird die letzte Spalte angezeigt. Sehr stabil ist das ganze aber nicht, da es natürlich auf die Inputdaten ankommen. Sollten hier massiv vieles Spaces am Ende der Zeile kommen, ist obige Variante eher nicht zu gebrauchen.

Netzwerk Umleitung incl. Datenmitschnitt.

mknod backpipe p

netcat -l -p 80 < backpipe | tee -a flow | netcat localhost 81 | tee -a flow 1 > backpipe

Serielle Bidirektionale Kommunikation

per Expect Script:

#!/usr/bin/expect -f
set spawned [spawn -open [open /dev/ttyS1 w+]]
stty ispeed 9600 ospeed 9600 raw -echo cs8 -parenb -cstopb onlcr < /dev/ttyS1
expect “Hello”
send “Welcome”

Preview Bilder aus PDF erstellen

Wenn man “mal eben” aus 50 PDF Dateien ein JPG Bildchen der Frontseite z.B. für Previews benötigt, ist es am einfachsten die Imagemagick Tools zu benutzen. Convert kann dies nämlich, basierend auf Ghostscript, total einfach erstellen.

Basis: convert datei.pdf bild.jpg

Dabei könnten nun aber mehrere Bilder erstellt werden, sollte das PDF Dokument mehr als eine Seite beinhalten. Hinzu möchte man die Frontseite auf ein bestimmtes Maß haben. Bei meinen Webseiten nutze ich gerne 100 Pixel breite für Previews. Daher ist bei mir der Aufruf wie folgt:

convert -thumbnail 100 datei.pdf0 bild.jpg

Um nun viele pdf dateien zu konvertieren, kombiniert man es einfach mit einem find.

find . -name ‘*.pdf’ -exec convert -thumbnail 100 {}0 {}.jpg \;

Schon hat man innerhalb von Sekunden jede Frontseite von den PDF Dokumenten in einem 100 Pixel breiten Preview Bild.

Auf die Schnelle viele kleine PDF zu einem PDF mergen

Um mal ganz schnell mehrere PDFs in eine PDF Datei zu mergen ist es am einfachsten das Ganze per Ghostscript zu erledigen.

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged_file.pdf source1.pdf source2.pdf source3.pdf

Redirects über Netzwerkverbindungen

Um z.B. Backups von einer zur anderen Maschine ohne zwischenspeichern durchzuführen, kann man auch Redirects über SSH oder RSH durchführen.

Anstatt erst ein tar -cvfz homedir.tar.gz /home/myhomedir und dann ein scp homedir.tar.gz user@Server2:/home/backup kann man auch folgendes machen:

tar -cvzO /home/homedir | ssh user@Server2 cat \>/home/backup/homedir.tar.gz

Der tar sendet das komprimierte Tarball an STDOUT. Das ganze wird über die Pipe als STDIN von SSH nach dem einloggen in /home/backup/homedir.tar.gz geschrieben.

Es geht natürlich auch anders herum: Auf einer Remoteseite etwas starten und den Output lokal nutzen:

ssh user@Server2 tar -cz /home/homedir >/home/backup/homedir.tar.gz

Hierbei wird also zunächst auf dem Remotesystem sich eingelogged und dann ein tarball von /home/homedir nach STDOUT schrieben. Da der darauf folgende Redirect nicht escaped wird, wird dann STDOUT in die lokale Datei: /home/backup/homedir.tar.gz geschrieben.

Tars splitten und wieder zusammenfügen.

Verzeichnis “foo” wird in mehrere foo.tgz Dateien mit einer Grösse von 1024 MB komprimiert und aufgesplittet:

tar cvz foo/ | split —line-byte=1024m – foo.tgz_

Dadurch entstehen mehrere foo.tgz_aa ( bis foo.tgz_zz) Dateien, die man wieder wie folgt entpacken kann:

cat foo.tgz_* | tar xvfz –

oder alternativ wieder zu einer grossen Datei zusammenfügen kann:

cat foo.tgz_* > foo.tgz

Unterverzeichniss mit Symbolic Links kopieren, obwohl diese auf nicht-existente Ziele stehen.

Mit einem cp -Rp quell-dir ziel-dir kann man natürlich komplette Verzeichnisse kopieren. Die Symbolic links darin werden auch sauber kopiert, aber wehe ein symbolic link zeigt auf ein ungültiges Ziel. Dann bricht cp leider ab.

Die saubere Variante sieht etwas verwirrend aus, aber funktioniert tadellos:

cd quell-dir && tar cf – . | ( mkdir ../ziel-dir ; cd ../ziel-dir ; tar xfp -) && cd ..

Damit werden alle symbolic links sauber von quell-dir nach ziel-dir kopiert. ;-)