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水木清华站∶精华区