BBS水木清华站∶精华区
发信人: is (天啦~~~~), 信区: Linux
标 题: MAILShell.pl
发信站: BBS 水木清华站 (Sun Apr 11 09:29:00 1999)
#!/usr/bin/perl
$GPG="/usr/bin/gpg";
$BASE="/root/MS";
$SENDMAIL="/usr/sbin/sendmail";
$passphrase="TTTTTTT";
$From="MAIL-COMMANDER\@aha.isee.za.net";
$LocalUser="MAIL-COMMANDER";
$sigs{"Yu Xin"}="8FF51D498C67273D68BBD3E1760DCC1279184EC1";
# Read Key ID from gpg's result
sub GetSIG()
{
my($input,$sig);
open(in,"<".$_[0]);
while($input=<in>)
{
chop($input);
if($input=~/^\[GNUPG:\]\sVALIDSIG\s[1234567890ABCDEF]*$/)
{
($sig)=$input=~/^\[GNUPG:\]\sVALIDSIG\s([1234567890ABCDEF]*)$/;
return $sig;
}
}
return "NONE";
}
# Decrypt Mail
# id.orig gnupg source file
# id.status gnupg running status
# id.output gnupg output
sub DecryptMail()
{
my($id)=$_[0];
my($cmds);
my($returncode);
$id=$BASE."/".$id;
# Create GnuPG command line
$cmds="|".$GPG." --batch --passphrase-fd 0 --status-fd 1"
." --yes --output ".$id.".output --decrypt ".$id.".orig > ".
$id.".status 2> /dev/null";
# input passphrase
open(out,$cmds);
print out $passphrase;
close(out);
# check exit code
$returncode=$?>>8;
if($returncode!=0)
{
unlink($id.".output");
unlink($id.".orig");
unlink($id.".status");
}
return $returncode;
}
# Create proc id
$curtime=time();
$id=sprintf("%010d.%05d",$curtime,$$);
$ReplyTo="me\@isee.za.net";
$tmp=$BASE."/".$id;
# Read mail from stdin and save in temp file
$orig=$tmp.".orig";
open(out,">".$orig);
$status=0;
while($input=<STDIN>)
{
print out $input;
# Get mail from address
if($input=~/Reply-To:/ && status==0)
{
chop($input);
($ReplyTo)=$input=~/^Reply-To:\s*(.+)/;
$status=1;
}
}
close(out);
# Call DecryptMail
$exitcode=&DecryptMail($id);
if($exitcode!=0)
{
exit 0;
}
$sig=&GetSIG($tmp.".status");
$status=0;
foreach $i (keys(%sigs))
{
if($sigs{$i} eq $sig)
{
$status=1;
$user=$i;
last;
}
}
if($status==0)
{
unlink($orig);
exit 0;
}
$script=$tmp.".output";
chmod(0700,$script);
system($script." > ".$tmp.".stdout"." 2> ".$tmp.".stderr");
open(out,">".$tmp.".reply");
print out "### Start #################################################\n\n";
print out " ID : $id\n";
print out " Reply-To : $ReplyTo\n";
print out " User : $user\n";
print out " SIG : $sigs{$user}\n";
print out "\n";
print out "\n### Script #################################################\n\n";
open(in,"<".$script);
while($input=<in>)
{
print out $input;
}
close(in);
print out "\n### STDOUT #################################################\n\n";
open(in,"<".$tmp.".stdout");
while($input=<in>)
{
print out $input;
}
close(in);
print out "\n### STDERR #################################################\n\n";
open(in,"<".$tmp.".stderr");
while($input=<in>)
{
print out $input;
}
close(in);
print out "\n### END ####################################################\n";
close(out);
#Encrypt and sign out mail
$cmd="|".$GPG." --batch -a -e -u \"".$LocalUser.
"\" -s --yes --passphrase 0 --output ".
$tmp.".sendout -r \"".$user."\" ".
$tmp.".reply >/dev/null 2>/dev/null";
print $cmd,"\n";
open(out,$cmd);
print out $passphrase;
close(out);
$cmd="|".$SENDMAIL." -t -f".$From;
open(out,$cmd);
print out "From: $From\n";
print out "To: $ReplyTo\n";
print out "Subject: [$id] Result\n";
print out "Reply-To: $ReplyTo\n\n";
open(in,"<".$tmp.".sendout");
while($input=<in>)
{
print out $input;
}
close(out);
close(in);
# clean file
unlink($tmp.".orig");
unlink($tmp.".output");
unlink($tmp.".status");
unlink($tmp.".stdout");
unlink($tmp.".stderr");
#unlink($tmp.".reply");
#unlink($tmp.".sendout");
exit 0
--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.119.79.80]
BBS水木清华站∶精华区