2016-04-13 26 views
0

我想對每個傳入郵件的正文執行命令。對所有傳入郵件執行bash命令(Postfix)

sed ':a;N;$!ba;s/=\n//g' /path-to/message-file | sed 's/</\n\</g' | sed -r '/'"$(sed -r 's/\\/\\\\/g;s/\//\\\//g;s/\^/\\^/g;s/\[/\\[/g;s/'\''/'\'"\\\\"\'\''/g;s/\]/\\]/g;s/\*/\\*/g;s/\$/\\$/g;s/\./\\./g' whitelist | paste -s -d '|')"'/! s/http/httx/g' 

我認爲這可能是可能的Postfix After-Queue Content Filter,但我不知道該怎麼辦呢?

編輯:

afterqueue.sh

#!/bin/sh 
# Simple shell-based filter. It is meant to be invoked as follows: 
#  /path/to/script -f sender recipients... 

# Localize these. The -G option does nothing before Postfix 2.3. 
INSPECT_DIR=/var/spool/filter 
SENDMAIL="/usr/sbin/sendmail -G -i" # NEVER NEVER NEVER use "-t" here. 

# Exit codes from <sysexits.h> 
EX_TEMPFAIL=75 
EX_UNAVAILABLE=69 

# Clean up when done or when aborting. 
trap "rm -f in.$$" 0 1 2 3 15 

# Start processing. 
cd $INSPECT_DIR || { 
    echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; } 

cat >in.$$ || { 
    echo Cannot save mail to file; exit $EX_TEMPFAIL; } 

# Specify your content filter here. 
sh /path/to/remove_links.sh <in.$$ 

$SENDMAIL "[email protected]" <in.$$ 

exit $? 

remove_links .sh

#!/bin/bash 

sed ':a;N;$!ba;s/=\n//g' $1 | sed 's/</\n\</g' | sed -r '/'"$(sed -r 's/\\/\\\\/g;s/\//\\\//g;s/\^/\\^/g;s/\[/\\[/g;s/'\''/'\'"\\\\"\'\''/g;s/\]/\\]/g;s/\*/\\*/g;s/\$/\\$/g;s/\./\\./g' /path/to/whitelist | paste -s -d '|')"'/! s/http/httx/g' 

它是工作,如果我用手工調用它,但如果我把它添加到/etc/postfix/master.cf這樣的:

# ============================================================= 
    # service type private unpriv chroot wakeup maxproc command 
    #    (yes) (yes) (yes) (never) (100) 
    # ============================================================= 
    filter unix -  n  n  -  10  pipe 
    flags=Rq user=filter null_sender= 
    argv=/path/to/afterqueue.sh -f ${sender} -- ${recipient} 

有在郵件中沒有變化。 我得到以下系統日誌:

Apr 13 15:14:08 rs211184 postfix/qmgr[7492]: 3FFDF23CB5F: from=<[email protected]>, size=4358, nrcpt=1 (queue active) 
Apr 13 15:14:08 rs211184 postfix/pipe[7504]: 116E523CA8C: to=<[email protected]>, relay=filter, delay=0.2, delays=0.16/0/0/0.04, dsn=2.0.0, status=sent (delivered via filter service) 
Apr 13 15:14:08 rs211184 postfix/qmgr[7492]: 116E523CA8C: removed 
Apr 13 15:14:08 rs211184 postfix-local[7522]: postfix-local: [email protected], [email protected], dirname=/var/qmail/mailnames 
Apr 13 15:14:08 rs211184 postfix/pipe[7521]: 3FFDF23CB5F: to=<[email protected]>, relay=plesk_virtual, delay=0.02, delays=0.01/0/0/0.01, dsn=2.0.0, status=sent (delivered via plesk_virtual service) 
Apr 13 15:14:08 rs211184 postfix/qmgr[7492]: 3FFDF23CB5F: removed 
+0

我明白了;堆棧溢出提供了這個作爲一個「鏈接」的問題 - 不知道爲什麼,但它現在更清晰。 http://stackoverflow.com/questions/36543377/find-and-replace-urls-in-postfix-files-linux-ubuntu?lq=1 – tripleee

+0

權限被拒絕顯然不是一個編程錯誤。後綴用戶缺少寫入(或者甚至可能讀取)訪問您試圖讓它操作的目錄。 – tripleee

+0

好的,我已經解決了拒絕的權限。但是過濾器仍然無法工作,儘管syslog中沒有錯誤...請參閱已編輯的問題。 – BP20

回答

0

你似乎期望在文件的消息,奇怪的是一個靜態的文件名,但是這不是它的工作原理。該消息到達標準輸入。最起碼,只要刪除/path/to/message-file - 但真的,管道sedsed往往是一個錯誤;你應該將它重構爲一個sed腳本(或Awk,或者Python,或者你有什麼)。

sed -e ':a;N;$!ba;s/=\n//g' -e 's/</\n\</g' | 
# This is too convoluted, really! 
sed -r '/'"$(sed -r 's/\\/\\\\/g;s/\//\\\//g;s/\^/\\^/g;s/\[/\\[/g;s/'\''/'\'"\\\\"\'\''/g;s/\]/\\]/g;s/\*/\\*/g;s/\$/\\$/g;s/\./\\./g' whitelist | 
paste -s -d '|')"'/! s/http/httx/g' 
+0

如果我能理解白名單應該做什麼,將所有這些轉換爲相對簡單的腳本可能不會太難。看起來也許是時候從sed轉向更高級了;或者可以將白名單內容放入外部文件中,每次更新「白名單」時都會更新。 – tripleee

+0

就像在前面的問題中指出的那樣,任何MIME編碼都足以繞過你的過濾器。 HTML經常被引用 - 可打印編碼;您將會錯過任何類似'htt = \ np:// badsite.example.com'的URL(其中'\ n'是引用可打印主體中的物理換行符)或base64編碼的URL。 – tripleee

+0

我編輯了這個問題... 但像'htt = \ np:// badsite.example.com'這樣的換行符被替換爲第一個sed命令... – BP20