顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


文章 - abelyang

頁: 1 ... 32 33 [34] 35 36 37
991
雜七雜八 / 算數題
« 於: 2003-07-01 23:49 »
偷閒一下
算了一下文章數 (用 Excel)
引用
目前總共發表了 64105 篇文章

和所有的版本的文章數加起來 62447 有一點點的差距...
這是好奇這是什麼原因呢 ? phpBB 計數的問題嗎 ?
還是有什麼版面是沒有顯現的呢 ?

992
肉腳版 / 整批檔案內的字串替換?
« 於: 2003-07-01 23:24 »
mysql 附一個 叫 replace 的工具簡單好用
replace 'guard' 'abelyang' -- *
把所有檔案中的 guard 換成 abelyang
你仔細看一下它的用法是可以一次換 N 組...

993
PHP程式設計討論區 / session 跨網站
« 於: 2003-07-01 17:58 »
好像沒有人回答 ~~
我也不知道耶 (我猜是不行,安全的問題)

不過你可以試試用 DB 做
或用 URL 再 GET /POST 回另一個站求是否有 session
我是常用 fsocketopen(好像這麼寫)/curl 這些去連一些 url
取資料,當然 Server 端你要自己 control 囉

994
yeah~你找到核心問題了 , 就是這樣做研究才會進步,不是嗎 ?
中文的過濾本就是要realtime 從 encoding -> Big5 ( 或其他語言)
所以精華區的那一篇文章我才沒有寫中文的~~
不過若你只要檔像 104 那種來信,我想我們所討論的作法應可以做到了

至於每封信雖有固定的文字,但 Mime 結果完全不同在於 MIME 的演算特性
base64 指的是以 6 個 bit 去 encoding (2^6)
base32 則是以 5 個 bit ....

104 速配快報 和
1111 速配快報
mime 的 encoding patten 幾乎完全不同的

至於
引用
Re:104速配快遞 =?big5?B?UmU6IDEwNLN0sHSn1ru8?=
我溜104速配快遞 =?big5?B?p9q3yDEwNLN0sHSn1ru8?=

這兩個會有雷同純粹是 bit 數上的巧合而以


多研究看看 ~~我是知到怎解,但苦於沒有時間實作  :oops:

995
沒有錯
.* = DOS 的 *
你忘了看上兩篇了

996
系統安全討論版 / Sendmail Advisory
« 於: 2003-07-01 13:54 »
sendmail 的 問題
http://www.cert.org/advisories/CA-2003-12.html

sendmail 的 exploit code
http://www.securityfocus.com/bid/6991/exploit/

奇怪, 我怎麼沒收到 CERT/CC 的 Advirsory.....
是收到 Snort 的 Rule Update 通知才知道這件事...

snort 的 rule
alert tcp $EXTERNAL_NET any -> $SMTP_SERVERS 25 (msg:"SMTP Content-Transfer-Encoding overflow attempt"; flow:to_server,established; content:"Content-Transfer-Encoding\:"; byte_test:1,<,256,100,relative; content:!"|0a|"; within:100; reference:cve,CAN-2003-0161; reference:url,www.cert.org/advisories/CA-2003-12.html; classtype:attempted-admin; sid:2183; rev:1;)

注意哦 ~~是 gain root 哦

997
解中文的問題請參考這裏
http://phorum.study-area.org/viewtopic.php?t=17308
最近在趕東西 ~~去他的 ISMS

998
試了一下
#/etc/spam.sh
patten=""
for p in `cat /etc/spam_patten.txt`
do
mine=`echo $p | mmencode `
qp=`echo $p | mmencode -q`
p="$p|$mine|$qp"
patten="$p|$patten"
done
echo ":0 HB\n* ^Subject:.*(${patten}ABCDE).*"
echo "/var/spool/mail/crash"

果然不行~~我太理想了, 不過改一下就可以了, 改之前先看一下 procmailrc
的描述, 可能是因為 Mine 的格式問題, 因為 Mail 會加上一些 Language Tag
以 ? 可能會出問題吧...我猜
依據Mail 的 Language Tag 格式為
?Language-Tag?MIME-encoding=?=
所以? 要以 \? 表示, 且 Language 不只 Big5, 像 UTF-8 或簡體字也常會用到
? 在 RE 裏是有特殊意義的


調整了一下 spam.sh
#/etc/spam.sh
patten=""
for p in `cat /etc/spam_patten.txt`
do
mine=`echo $p | mmencode `
#用 .* 來判斷 Big5/UTF-8/UCS/GB2312...等問題
mine="*=\?.*\?B\?$mine=\?="
# QP 沒有 language tag 的問題
qp=`echo $p | mmencode -q`
p="$p|$mine|$qp"
patten="$p|$patten"
done
echo -e ":0 HB\n* ^Subject:.*(${patten}ABCDE).*"
echo "/var/spool/mail/crash"

有興趣的人試試看吧 ~~

999
引用
echo ":0 HB\n* ^Subject:.*(${patten}ABCDE).*"
      ^^n換行的意思嗎?     ^^^^^加上這個ABCDE是什麼用意?請不吝指教!!


echo -e ":0....." , 忘了 加 -e , 請補上
\n 是換行的意思沒有錯
$patten 會變成像 a|xx|bbb|fkfk| , 為了省事,所以我後面直接補上 ABCDE
所以  .*(a|xx|bbb|fkfk|ABCDE).* , 不然就要加 if 判斷...

1000
yaeh 沒有錯,
# 的東西都是 pre-complier 要參考的地方
另外有時候也可以用 gcc -DHAVE_MYSQL ..定義,讓 pre-complier 知道
要 enable mysql 的功能

1001
拾人牙慧 / [DNS]用 DB 做 DNS 服務
« 於: 2003-07-01 11:49 »
請原諒我~~不行耶
因為和業務有關 , sorry
我想你還是試一下 PowerDNS 好了
我想原理都是一樣的
Sorry...

1002
:D
我先列一個應你的急吧 ~~
#/etc/spam_patten.txt, 字內不要有空白, 不然就要用 sed 處理空白問題了
點頭網生活週報
新光三越禮券
客戶租用本
準備這套超級工具
業務員行銷標準工具
吃喝玩樂報


#/etc/spam.sh
patten=""
for p in `cat /etc/spam_patten.txt`
do
        mine=`echo $p | mmencode `
        qp=`echo $p | mmencode -q`
        p="$p|$mine|$qp"
        patten="$p|$patten"
done
echo ":0 HB\n* ^Subject:.*(${patten}ABCDE).*"
echo "/var/spool/mail/crash"

你 定好 patten 好, 再 run  spam.sh , 這是我臨時做給你應急用的,
基本上都可以吧 !
EX:  sh spam.sh > /etc/procmailrc.spam

/etc/procmailrc 中再和 INCLUDERC 將他納進來

唯有自己做研究才會知道有那些 TroubleShooting ....
這是我的經驗

1003
那你試試這個好了
#mime64
echo "104 速配快報,這樣可不可以呢 ?"  | mmencode

#quote-print
echo "104 速配快報,這樣可不可以呢 ?"  | mmencode -q

#解回來 mine
echo "MTA0ILN0sHSn1rP4LLNvvMulaaSjpWmlSKlPID8K" | mmencode -u

#解回來 qp
echo "104 =B3t=B0t=A7=D6=B3=F8,=B3o=BC=CB=A5i=A4..." | mmencode -q -u

這樣是你要的嗎 ?
對你不適用那你就將問題描述清楚一點
不然你就自己做研究還學得比較多些  :roll:

1004
拾人牙慧 / [DNS]用 DB 做 DNS 服務
« 於: 2003-07-01 10:11 »
雖然我貼了這篇文章, 但是我並沒有用過  ....
我用了一套用 自己  寫的 Perl DNS server
Perl 的程式只有 3百多行哦 ~~, 我用了這些 PM
use strict;
use vars qw(@ISA);
use Net::Server::PreFork;
use Net::DNS;
use DBI;

也是讀 DB 的方式, 完全沒有 Zone file,
只要 NS 指到我的機器, 就可以讀 DB 相關的 RR 設定
也不用定到 zone, 我想 PowerDNS 也是一樣的做法吧

1005
你直接把實際的一封信 Cut 出來那段" 104..."  的 mime 就好了 ? 不是嗎 ?
不過還有一種 QP 的 encoding 哦 ~別漏了

1006
原來文章我貼在一大篇的後面,我想可能很多人沒有注意到
所以把他拉出來獨立寫成一篇,不過有些雜亂,
不過這本來就是工程師的本性不是嗎  :D

代碼: [選擇]
# file /etc/procmailrc
# 前面這幾個變數很重要尤其是 USER/HOME 等這些系統預設
# INCLUDERC 也是一個重要的用法,只是這裏我沒有列出來
# 我記得 man procmail 裏面有寫
# log 在初學時是一定要開的,並且也可以用 mailstat 來看到統計

# 以下的這些變數 man procmailrc 會說明的更多更詳細
PATH=$PATH
SHELL=/bin/sh
MAILDIR=/var/spool/mail

#表示要開啟 procmail 的記錄
VERBOSE=yes
SENDMAIL=/usr/sbin/sendmail

#Log 到什麼檔案
LOGFILE=/home1/MAIL/procmail.log

#收件人的 home 目錄
#如果這封信是寄給 abelyang, 那他的 $HOME 就是 /home/abelyang
USER=$HOME

#收件人, ${USER##*/}  結果就 abelyang, man bash
USER=`echo ${USER##*/}@xxx.net.tw`

#主旨 , 但主指可能編碼過 (qp or mine), 請看最後的一隻 perl 程式,幫你
#解碼,同樣的事也可使用 mmencode 做到
#formail 的用法請 man 就有夠看了, formail -zxMAIL_HEAD_FIELD 可以取出
#MAIL HEADER 的欄位意義
SUBJ=`formail -zxSubject: `

# ppp <ppp@ppp.com.tw> paser to ppp@ppp.com.tw
# 如果你要什麼 Return-Path 或其他的參考 formail
# 至於 ${FROM##*<} 這種變數的 paser 你 man bash
#或參考一些 Shell Script 講變數控制的章節
FROM=`formail -zxFrom:`
FROM=`echo ${FROM##*<}`
FROM=`echo ${FROM%%>}`

# sed 用法請自己去查,這段主要在取出多個收件者
# 如果這封信給 a b c 三個人,在 to 的地方是寫成 a,b,c
# tr 在於將 ',' 換成斷行 , sed 在於取出 abelyang <abelyang@xxx.net.tw>
# 中的 <abelyang@xxx.net.tw> 的值,要先斷行的原因則是在於 sed 的處理需要
TO=`formail -zxTo:|tr ',' '\n'| sed 's/\(.*\) \(.*\)/\2/'`

# 定義另存新檔的檔名, .eml 是 outlook 用的附檔名
FILE=/home1/MAIL/mail-`echo $FROM-$SUBJ| sed -e s/' '/''/g`-`date +%Y%m%d-%H:%I:%S`.eml

# 只要收到 mail 就直接先另存新檔, chown 是為了 Apache 處理用
tmp=`formail > $FILE;chown apache.apache $FILE`

#這段較容易誤判...抓 Attach file 的檔案名稱
attach=` formail -i "" | grep -i 'Name=' | cut -f 2 -d'=' | tail -1`

# 以上的處理,重點在於對 procmail 的環境變數的了解, 及 formail 的應用是不是看懂了
# 所以我們有了 寄件人(FROM)/收件人(TO)/實際收件人才(USER)/主旨(SUBJ)/附件(attach)
# 這封信的備份(FILE)
#-------------------------------------------------------

#很多了不了解 H B 或其他如 w h b f ..等棋標的意義, 可以 man procmailrc , 每一項都有
#解釋, 僅就我用到的做一些解釋好了
# H Header 信件的表頭段
# B Body 信件的本文段
#   這裏用 HB 是因為 attachment 的資訊有時會在 header, 有時會在 body 內
#   大寫 HB 和小寫 hb 其實是差不多的,只不過大寫用 egrep 處理而以
# f Filter 是一個很重要的用法,做二次處理用,這裏的義意在於符合這個過慮條件的
#   要有兩個處理動作(看 exitcode),一個放資料庫, 一個放 crash
# w Wait 的意思,要等 那一段( script) 處理完後才可以做存到 crash 的動作
# h Header    ,參考 H

# 如果你要檔一封就告訴 User 說你被檔了....那你的信對 User 來說只是增加
# 困擾而以,所以這種作法個人覺得是不夠實際的,應該是一個 Summary 的 report


:0 HB
* ^.*Content-Type:.*
# 夾帶附件名稱 ,這裏沒有換行
* ^.*[nN]ame=.*\.(wav|pif|bat|vbs|js|exe|com|hta|dll|scr|js|asd|chm| lnk|nws|ocx|reg|shb|shs|vb|vbe|ws[cfh]|EXE|PIF|BAT|VBS|JS|COM|HTA|SCR|JS|ASD|CHM|LNK|NWS|OCX|RE|G|SHB|SHS|VB|VBE|WS[CFH])
# 寄件人不為 apache, 因為我的 Web 是用 apache 的身份在跑的,
# 沒有這一條取回原信時又被檔了
* ! ^From: apache.*
{
# fwh 下的 command 沒有斷行
# 句尾沒有 \ 的就是沒有換行哦,每一行要用 \ 接起來讓它成為一個 command
# 一定要加 \ , 不然就寫成一行, 切記 !!
# email = TO 的值 <abelyang@xxx.net.tw> 要去掉 '<' '>' 符號
# delete 那一行的目的在於這封信寄給一個 group 時 (aliases) , 這個 group
# 如果有 10 個人,沒有經過這個時間值 500 (五分鐘,用 DB 的 data type 有關)
# 的判斷,你會存了 100 (10^2) 筆(每人十筆)記錄在資料庫
# 原因和 procmail 的運作有關,你可自身去體會囉
:0 fwh
|( for email in $TO;\
   do \
    email=`echo ${email##*<}`;\
    email=`echo ${email%%>}`;\
    echo "delete from SPAM where MAIL_FROM='$FROM' and SUBJ='$SUBJ' and USERNAME ='$USER' and CREATE_TIME+500>now()"|mysql procmail -u username;\
    echo "INSERT IN TO SPAM(MAIL_FROM, RCPT_TO,SUBJ, FILE_NAME,USERNAME, MAIL_TYPE ) VALUES('$FROM','$email','$SUBJ','$FILE','$USER',2)"| mysql -u username procmail ;\
   done );
# 無條件存入 crash ...雖然我的 rule 很多,但沒有一條是存入 /dev/null 的
:0
/var/spool/mail/crash
}





DB 的內容:
代碼: [選擇]
CREATE TABLE SPAM (
SN int(20) NOT NULL auto_increment,
MAIL_FROM varchar(255) default NULL, --寄件人
RCPT_TO varchar(255) default NULL, --收件人, 可能是 aliases
SUBJ varchar(255) default NULL, --主旨
FILE_NAME varchar(255) NOT NULL default '',--這封信另存新檔的名稱
CREATE_TIME timestamp(14) NOT NULL, --收件時間,為 yyyymmddhhiiss
MAIL_TYPE tinyint(2) default '1', --是廣告信還是附件為危險檔案
USERNAME varchar(64) NOT NULL default '',--實際收件人
PRIMARY KEY (SN)
) TYPE=MyISAM;




如果你怕在 /home1/MAIL 的檔案太多可以用 crontab 去刪掉過期的(例:三天)如:
代碼: [選擇]
00 1,13 * * 3,4,5,6 find /home1/MAIL -atime +3 -exec rm -f {} \;

好了,信可以另存新檔,也可統一進垃圾桶,並有一份清單存到資料庫 ~~
這時候你就可以寫一個寄信程式 (shell,php,perl...),去查資料庫,
並將每天的檔件 Summary Report 寄給 USER 看,並在 Mail 中讓他以CGI 的
方式取回信件,我個人是用 php 寫的,在 mail 中以 html 程現 report
並以 GET 的方式連結
代碼: [選擇]
http://webmail.xxx.net.tw/action.php?to=".urlencode($RCPT_TO)."&subject=".urlencode($SUBJ)
就可以取回信了
這裏有一點你要特別注意的就是不要直接 用像 cat $FILE| sendmail -oi -t $USER 這種方式
因為有些病毒可能會直接在 MUA 上發作,而是將這封信 Attachment , 並附上一段警語
可能較恰當


為了這些東西我記得當時我看了這些 man page (還有一大堆不相甘的就不列了)
procmail
procmailrc
procmailex
formail

常看到網路上有人在問這個問題~~可是我從來沒有看過人解過,
我是幾乎都看 man page 學的

有人可能想知道中文怎麼檔吧 ~~ 等我有時間再來分享囉
(提示: 善用 :0 fwh 那段就可以了)


解 mail encoding 程式,如果程式名叫做 mail_parser 好了
./mail_parser 編碼過的字串
mail 有兩種編碼方式,一種是 QP , 一種是 Mine64,
因為當初做這個時並不知道有 mmencode 這種指令
 還讓我看了半天的標準 XD

代碼: [選擇]
#!/usr/bin/perl
    $sub=$ARGV[0];
    if ($sub=~ /=\?\S+\?\l(\S)\?/) {
      if ($1 =~ /[Qq]/) {
        $sub=decode_qp($sub);
      }
      elsif ($1 =~ /[Bb]/) {
        $sub=decode_base64($sub);
      }
    }
    elsif ($sub=~ /=[a-fA-F0-9][a-fA-F0-9]/) {
      $sub=decode_qp($sub);
    }
    $subject.=$sub;
print $subject;    
sub decode_qp {
        my($string) = @_;
        @buffer=split(/\?/,$string);
        $string = $buffer[3] if ($buffer[3] ne "");
        $string =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
        $string =~ /\?=(.*)/;
        $string =~ tr/_/ /;
        $buffer[4]=~s/^=//;
        $buffer[0]=~s/=$//;
        $string="$buffer[0]$string$buffer[4]";
        return($string);
}

sub decode_base64 {
        my($string) = @_;
        my($string2);
        @buffer=split(/\?/,$string);
        $string = $buffer[3] if ($buffer[3] ne "");
        $string =~ s/=+$//;
        $string =~ tr|A-Za-z0-9+/| -_|;
        while($string =~ /(.{1,60})/gs) {
                my($string3) = chr(32+length($1)*3/4);
                $string2 .= unpack("u",$string3 . $1 );
        }
        $buffer[4]=~s/^=//;
        $buffer[0]=~s/=$//;
        $string2="$buffer[0]$string2$buffer[4]";
        return($string2);
}

1007
database 討論版 / 以C語言連結MYSQL的問題
« 於: 2003-06-30 23:03 »
那你執行的結果是什麼呢 ?

我不知道你的問題在那裏, 不過你試著加上這兩句在 connect 前
mysql_options(&mysql,MYSQL_OPT_COMPRESS,0);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");

不然你可試著用我的版本改一下試試
或著如果你會用 gdb , 你就 trace 一下看看問題所在

1008
我想應該只會對 pre-complier 會有影響吧 ~~
不多 include 太多有時候會有衝突~對於執行檔的大小應沒有什麼影響才是
這是我的猜測,不知對不對

-O2, 這個不是猜測,我確定

1010
酷!學園 精華區 / 安裝及架設VPN-PPTP
« 於: 2003-06-30 17:28 »
引用
重新編譯Kernel
http://public.planetmirror.com/pub/mppe/ 下載linux-2.4.19-openssl-0.9.6b-mppe.patch.gz

(1)cd /usr/src/linux-2.4.20

(2)zcat /tmp/linux-2.4.19-openssl-0.9.6b-mppe.patch.gz | patch -p1

我覺得這一段會有問題吧 ~~,
http://www.cert.org/advisories/CA-2002-23.html

如果你是用 SuSe 的再注意一下這篇
http://www.securityfocus.com/advisories/5454

0.9.6b 的 SSL 是有問題的版本,不知道這樣用會不會有問題 ?!
我做的時候參考的是這篇
http://home.swbell.net/berzerke/howto.html

1011
我記得 QPL 的授權好像是
你若用在商業用途, 那是要收錢的
若不是商業用途, 則是免費的
不知道有沒有記錯

1012
你用 rpm -ba xxx.src.rpm 後
到 /usr/src/redhat/SPECS 下看,
會有一個  xxx.spec 檔
編輯那個檔, 當 gd 的 configure 的 jpeg 或 freetype 的路徑指對或拿掉
(你也可藉此觀察 RPM 怎麼做的)
然後再下
rpm -ba xxx.src.rpm ...
應該會成功 ....
我個人的演變是剛學 Linux 時愛用 RPM ,
但是熟了後就不喜歡 RPM 了,反而愛用 tar.gz (tarball) 這種方法

1013
雜七雜八 / 流量統計
« 於: 2003-06-30 15:06 »
流量統計 ~~
TWNIC 七月份起將公布 Root Server 及 Whois Server 的流量統計
有興趣的人可以去看看哦 ~ (只公布月及年的部份, 日和星期 Security 的考量)
先賭為快 :




1014
拾人牙慧 / [DNS]用 DB 做 DNS 服務
« 於: 2003-06-30 13:32 »
http://www.powerdns.com/downloads/index.php
可以參考看看哦~~用 DB 做的 DNS Server
省去 Zone file 的很多問題, 且用 DB 做可以提供更大的彈性
網域名稱的相關管理更容易了

1015
是的, 用 array 去 mapping 吧 ~~

好幾個月呀~~不過我不是一直看的~~
你一定會有很多零碎的時間吧 ~~
有那種小小的時間帶就可以連過去看一下....
慢慢看 ~~發揮那種 sample 都看的精神, 你就會很了解 php 的 function
能做到什麼了
我個人是這麼看的 ~~你參考看看
另外提醒你 ...
POST 資料後回上一頁, 和你說網頁過期, 對不對 ?
把 header 看一下, 你就會知道如何避免了~~
不用用到 javascript 或 session 來弄,
懂了 header 的解法後, 你再將他加到 php.ini 中就一勞永凂了
這些我都是看 function 時學到的

1016
是的~~沒有錯~~這一點也不難
抓 IE 送出來的 header
再來看這裏吧
http://tw2.php.net/manual/en/function.getallheaders.php

www.php.net 上的文件很多哦~~我可是一個一個 function 都看
且把說明及範例都看完了 ~比書本還詳細百倍

1018
拾人牙慧 / 以 DB 做 帳號的認證
« 於: 2003-06-30 01:16 »
http://www.mysql.com 有提供一個 libnss-mysql,
這個東西讓你可以用 DB 來做帳號的認證
所有的服務幾乎都有包含在內 ( telnet/pop3/imap....)
實際的東西可以到這找
http://libnss-mysql.sourceforge.net/
我個人是覺得很好用~~不過我向來都懶得將這些東西寫成文件
只要知道怎麼找並且看得懂就好了...
用 DB 比用 file 來得好 control 許多 ,
且如果你用 apache 1.x 版的, 可以加掛 mod_mysql_auth,
就可以做到和 .htaccess (Http Auth) 用同一套密碼
也可以將 Radius 整合進去,甚至像我一樣,將 pptpd/pppd (VPN)的 chap-secret
都整合進去 (我有改 source code, 讓他去查 DB 做認證啦,不然它那會呢! 不過差點被
chapms.c 搞死)

那用 apache 2.x 的怎辨,可以到這找
http://search.cpan.org/search?m=all&q=Apache&s=21
用 Perl 做的 Auth mod, 一樣可以讓你查 DB 做認證

自己去體會囉 ~~如何讓那麼多的服務共用一套認證來源
或說, 如何讓那麼多機器的那麼多服務共用一套認證來源....

1019
Linux 討論版 / mod_auth_mysql 問題
« 於: 2003-06-30 00:35 »
是的,沒有錯,用 apxs 所顯示的訊息是如此
但是過於簡單, 所以我用 gcc 自己動手一步一步做這個 DSO
所以才看得到問題所在

1020
看到手癢...我就來展示一下好了 ^^"
#file /etc/procmailrc
#前面這幾個變數很重要尤其是 USER/HOME 等這些系統預設
#我記得 man procmail 裏面有寫
#log 在初學時是一定要開的,並且也可以用 mailstat 來看到統計
PATH=$PATH
SHELL=/bin/sh
MAILDIR=/var/spool/mail
VERBOSE=yes
SENDMAIL=/usr/sbin/sendmail
LOGFILE=/home1/MAIL/procmail.log
USER=$HOME
USER=`echo ${USER##*/}@twnic.net.tw`
SUBJ=`formail -zxSubject: `
# ppp <ppp@ppp.com.tw> paser to ppp@ppp.com.tw
# 如果你要什麼 Return-Path 或其他的參考 formail
# 至於 ${FROM##*<} 這種變數的 paser 你 man bash 就會有了

FROM=`formail -zxFrom:`
FROM=`echo ${FROM##*<}`
FROM=`echo ${FROM%%>}`
# sed 用法請自己去查,這段主要在取出多個收件者
TO=`formail -zxTo:|tr ',' '\n'| sed 's/\(.*\) \(.*\)/\2/'`
#另存郵件新檔,做什麼用呢 ? 總會誤判吧 ,我用 Web CGI 再讓 user 取回
#他被檔掉什麼信每天都會 report 給他 , .eml 是 outlook 的附檔名
FILE=/home1/MAIL/mail-`echo $FROM-$SUBJ| sed -e s/' '/''/g`-`date +%Y%m%d-%H:%I:%S`.eml
tmp=`formail > $FILE;chown apache.apache $FILE`
#這段較容易誤判...抓 Attach file .....
attach=` formail -i "" | grep -i 'Name=' | cut -f 2 -d'=' | tail -1`

:0 HB
* ^.*Content-Type:.*
#夾帶附件名稱
* ^.*[nN]ame=.*\.(pif|bat|vbs|js|exe|com|hta|dll|scr|js|asd|chm|lnk|nws|ocx|reg|shb|shs|vb|vbe|ws[cfh]|EXE|PIF|BAT|VBS|JS|COM|HTA|SCR|JS|ASD|CHM|LNK|NWS|OCX|RE|G|SHB|SHS|VB|VBE|WS[CFH])
#寄件人不為 apache, 因為我的 Web 是用 apache 的身份在跑的,
#沒有這一條取回原信時又被檔了
* ! ^From: apache.*
{
# fwh 下的 command 沒有斷行
        :0 fwh
        |(      for email in $TO; do email=`echo ${email##*<}`;email=`echo ${email%%>}`;echo "delete from SPAM where MAIL_FROM='$FROM' and SUBJ='$SUBJ' and USERNAME ='$USER'  and CREATE_TIME+500>now()"|mysql procmail -u username; echo "INSERT IN TO SPAM(MAIL_FROM, RCPT_TO,SUBJ, FILE_NAME,USERNAME, MAIL_TYPE ) VALUES('$FROM','$email','$SUBJ','$FILE','$USER',2)"| mysql -u username procmail ;done );

        :0
        /var/spool/mail/crash
}                                        



不要問我 fwh 這些意義我記得 procmail 內有寫
DB 的內容:
CREATE TABLE SPAM (
  SN int(20) NOT NULL auto_increment,
  MAIL_FROM varchar(255) default NULL,   --寄件人
  RCPT_TO varchar(255) default NULL,   --收件人, 可能是 aliases
  SUBJ varchar(255) default NULL,   --主旨
  FILE_NAME varchar(255) NOT NULL default '',--這封信另存新檔的名稱
  CREATE_TIME timestamp(14) NOT NULL,   --收件時間,為 yyyymmddhhiiss
  MAIL_TYPE tinyint(2) default '1',      --是廣告信還是附件為危險檔案
  USERNAME varchar(64) NOT NULL default '',--實際收件人
  PRIMARY KEY  (SN)
) TYPE=MyISAM;    

經過這樣的處理每封信都會另存一個新檔在 /home1/MAIL 之下
同時有集中到 /var/spool/mail/crash  (等於是有兩份)
並在資料庫中記錄該件的相關訊息

echo "delete from SPAM where MAIL_FROM='$FROM' and SUBJ='$SUBJ' and USERNAME='$USER'  and CREATE_TIME+500>now()"|
這一段你要實作過才能體會的,就是這封信寄給一個 group 時 (aliases) , 這個 group
如果有5個人,沒有經過這個時間值 ( 五分鐘)的判斷,你會存了 25 筆(每人五筆)記錄在資
料庫原因和 procmail 的運作有關,你可自身去體會囉


這些東西是我兩年前弄的有些可能巳經忘了為什麼了 ?
我是每天早上 11 點和下午3點 report 給當事人
會這麼做的原因是原來以 patten 的過慮方式難免有巧合,且容易造成爭議~~
(有人會說即使是廣告信你也無權替我檔下來吧,檔下來了還不讓我知道 !! )

如果你怕在 /home1/MAIL 的檔案太多可以用 crontab 去刪掉過期的(例:三天)如:
00 1,13 * * 3,4,5,6 find /home1/MAIL -atime +3 -exec rm -f {} \;

好了,信可以另存新檔,也可統一進垃圾桶,並有一份清單存到資料庫 ~~
你就可以寫一個程式去定期 Report 並 mail 給當事人了,(這個 mail 內我用了超連結,
連到一個 CGI ,這個 CGI 再以 apache 的身份將該件以附件的方式信還給當事人)
這個應不用我再寫了吧 ~~ 祝好運囉

為了這些東西我記得當時我看了這些 man page
procmail
procmailrc
procmailex
formail

頁: 1 ... 32 33 [34] 35 36 37