#!/bin/blog

December 18, 2005

Exitcode in Perl auswerten

Filed under: Internet, Notizen, perl — Tags: — martin @ 5:01 pm

Damit habe ich jahrelang Probleme gehabt, bis ich der Sache schließlich im Detail nachgehen mußte. Wenn man den Exitcode eines von Perl aufgerufenen externen Programms wissen will, muß man dazu den Rückgabewert um 8 Bits nach rechts shiften:

my $out=`/usr/local/bin/blahfasel`;
my $rc = $?>>8;

Die Information findet sich in man perlfunc bei der system-Funktion.

Advertisements

December 11, 2004

SSH um die Ecke(n) bringen

Filed under: Notizen, Sicherheit, UNIX/Linux/BSD — martin @ 11:41 am

Die Ausgangslage

Auf einer bestimmten Baustelle muß ich, wenn ich an meine Mails kommen will, über zwei DMZ-Gateways (eins von der Baustelle und unser eigenes) sowie unseren im Rechenzentrum stehenden Webserver gehen, um schließlich auf dem Server im Büro zu landen. Als ich noch mit dem textbasierten Mutt gearbeitet habe, war das eine ganz einfache Sache, denn ich konnte mich immer der Nase nach per SSH über ein System nach dem anderen durchhangeln und dann auf der Kommandozeile des Zielsystems mutt starten:

martin@workstation:~$ cat bin/bring-mich-office.sh
#!/bin/sh
ssh -A -t dmzbox.baustelle.invalid \
 ssh -A -t webbox.example.com \
 ssh -A -t dmzbox.example.com \
 ssh officebox.example.com
martin@workstation:~$ bin/bring-mich-office.sh
martin@officebox:~$ mutt -y

Die Frickelvariante

Seit ich unter die Mausschubser gegangen bin, gestaltet sich das ganze deutlich schwieriger, denn über diese ganze Kette müssen jetzt die Ports 143 und 25 für IMAP und SMTP getunnelt werden. Dies soll geschehen, ohne daß diese Ports auf den in der Mitte der Kette befindlichen Systemen ansprechbar sind. Wenn auf den Zwischenstationen jedermann auf die weitergeleiteten Ports zugreifen könnte, hätte ich riesige unerwünschte Löcher in Firewalls gebohrt, und das will sicherlich niemand.

Um diesen Tunnel vollautomatisch aufbauen zu können, habe ich mich dann eine ganze Weile mit einer wüsten Konstruktion herumgeschlagen, bei der zunächst über alle beteiligten Funkhäuser ein “verlegter” SSH-Port durchgetunnelt wurde. In einer zweiten SSH-Sitzung habe ich über diesen dann meine beiden Applikationsports getunnelt:

#!/bin/sh
# Erste Verbindung
ssh -A -L 10022:localhost:10022 dmzbox.baustelle.invalid \
 ssh -A -L 10022:localhost:10022 webbox.examle.com \
 ssh -A -L 10022:localhost:10022 dmzbox.example.com \
 ssh -L 10022:localhost:22 officebox.example.com sleep 20 &
# Gedenkpause
sleep 10
# Zweite Verbindung
ssh -t -C -p 10022 -L 10025:localhost:25 -L 10143:localhost:143 127.0.0.1

Ich denke, ich muß nicht näher erläutern, warum das nicht nur furchtbar aussieht, sondern auch ganz schön bescheiden funktioniert hat. Bei fünf ineinandergestöpselten Port-Weiterleitungen ist die Wahrscheinlichkeit, daß alles klappt, wirklich nicht besonders hoch.
(more…)

March 13, 2004

Mail mit Attachment versenden

Filed under: Internet, Notizen, perl — Tags: — martin @ 7:58 am

Mime::Lite ist wohl die bequemste Möglichkeit, um aus Perl-Scripts heraus einigermaßen ordentlich MIME-codierte Mails mit Anhang zu versenden.

#!/usr/bin/perl -w
use strict;
use diagnostics;
use MIME::Lite;
use File::Basename;

my $absender    = 'Alice <alice@thisdomain.invalid>';
my $empfaenger  = 'Bob <bob@otherdomain.invalid>';
my $datei       = "/home/alice/info.pdf";
my $smtphost    = "127.0.0.1 25";
my $betreff     = "Demo Dateianhang";

my $anschreiben = <<EOF;
Sehr geehrte Damen und Herren,

anbei die gewünschten Informationen.
EOF

MIME::Lite->send('smtp', $smtphost, Timeout=>5);

my $msg = MIME::Lite->new(
        From            => $absender,
        To              => $empfaenger,
        Subject         => $betreff,
        Type            => 'multipart/mixed'
        );

$msg->attach(
        Type            => 'TEXT',
        Data            => $anschreiben
        );

$msg->attach(
        Type            => 'AUTO',
        Path            => $datei,
        Filename        => basename($datei),
        Disposition     => 'attachment'
        );

$msg->send();

Um eine Mail direkt über den lokalen MTA z.B. per sendmail oder qmail-inject einzuqueuen, würde man MIME::Lite wie folgt konfigurieren:

 
MIME::Lite->send('sendmail', "/usr/lib/sendmail -t -oi "); (Postfix)
MIME::Lite->send('sendmail', "/var/qmail/bin/qmail-inject -f $absender $emfpaenger"); (Qmail)

 
Fehler beim Versand kann man am Rückgabewert der send()-Methode erkennen.

January 8, 2004

chkmd5cap

Filed under: Internet, Notizen, perl — Tags: — martin @ 7:53 pm

#!/usr/bin/perl -w
require 5.000;
use strict;

# Test if this System can handle MD5 Passwords

my $testpw = '$1$oTg0Hgpx$lI1RZ2NHlP2TBv21ntM0h/';     # "foo"

print STDERR "Checking for MD5 password compatibility... ";

if ($testpw eq (crypt('foo', $testpw))){
        print STDERR "Yes.\n";
        exit 0;
}else{
        print STDERR "No.\n";
        exit 1;
}

November 25, 2003

Installierte Perl-Module auflisten

Filed under: Internet, Notizen, perl — Tags: , — martin @ 2:37 pm

Immer wieder werde ich gefragt, wie man sich alle installierten Perl-Module anzeigen lassen kann. Dabei ist der entsprechende Aufruf doch so einfach und selbsterklärend. 😉

perl -MExtUtils::Installed -e'$m=ExtUtils::Installed->new();
for($m->modules()){my$v=$m->version($_)||"-";
printf("%-10s %-50s\n",$v,$_);}'

(Vgl.: CPAN-FAQ)

November 13, 2003

Datumsberechnung in Perl II

Filed under: Internet, Notizen, perl — Tags: — martin @ 6:52 pm

Wenn man sich näher an die Frage der Datumsberechnung heranwagt (siehe auch meinen früheren sehr einfach gestrickten Beitrag zum Thema) merkt man, daß man sich auf einem gut erforschten, aber nicht gerade leicht verdaulichen Gebiet bewegt.
(more…)

October 20, 2003

Perl-Module als User installieren

Filed under: Internet, Notizen, perl — Tags: — martin @ 6:17 am

Wie man Perlmodule als User installiert, wird in der CPAN-FAQ beschrieben:

http://www.perl.com/CPAN-local/misc/cpan-faq.html#How_install_private

In aller Kürze sieht das wie folgt aus:
perl Makefile.PL LIB=/home/martin/lib PREFIX=/home/martin/lib

Und dann natürlich
use lib qw(/home/martin/lib);
im Script selbst nicht vergessen!

Will man als User ein Modul installieren, das seinerseits auf einem solchen lokal installierten Modul aufbaut:
export PERL5LIB=/home/martin/lib (o.ä., je nach verwendeter Shell)
perl Makefile.PL LIB=/home/martin/lib PREFIX=/home/martin/lib

October 14, 2003

In-place editing, ein für alle mal.

Filed under: Internet, Notizen, perl, UNIX/Linux/BSD — Tags: — martin @ 6:17 pm

So bearbeitet man mit Perl als sed-Ersatz Dateien und läßt dabei ein Backup zurück:

perl -i.bak -pe 's/lull/lall/g' file1 file2 file3 ... fileN

Die genannten Dateien werden so geändert, und die alte Version bleibt mit der Extension .bak jeweils zurück.

Blog at WordPress.com.