2016-04-13 19 views
0

Her gelen posta postasının gövdesinde bir komut yürütmek istiyorum.Tüm gelen postalar için bash komutunu çalıştır (Postfix)

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: ...

DÜZENLEME

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' 

Ben Postfix After-Queue Content Filter ile mümkün olabileceğini düşünüyorum, ama bunu nasıl bilmiyorum .0

#!/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' 

elimle diyoruz eğer, çalışıyor, ama böyle /etc/postfix/master.cf eklerseniz:

# ============================================================= 
    # 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} 

postada herhangi bir değişiklik olmamıştır. aşağıdaki syslogd'yi:

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

Şimdi görüyorum; Yığın Taşması bunu "bağlantılı" bir soru olarak sağladı - dunno neden, ama şimdi daha net. http://stackoverflow.com/questions/36543377/find-and-replace-urls-in-postfix-files-linux-ubuntu?lq=1 – tripleee

+0

izin vermedi açıkçası bir programlama hatası değil. Postfix kullanıcısı, manipüle etmeye çalıştığınız dizine yazma (veya muhtemelen okunan) erişiminden yoksundur. – tripleee

+0

Tamam, izin reddedildi. Ancak, syslog'da herhangi bir hata olmamasına rağmen, filtre hala çalışmayacaktır ... düzenlenmiş soruya bakın. Ben beyaz liste şeyler yapmak gerekiyordu anlamak olsaydı – BP20

cevap

0

Bir dosyada mesaj ve tuhaf bir statik dosya adını beklemek gibi görünüyor, ama bu iş böyle değil. Mesaj standart girişe ulaşır. Minimal, sadece /path/to/message-file kaldırmak - ama gerçekten sedsed için boru sık sık bir hatadır; Bunu tek bir sed komut dosyasına (veya Awk, veya Python'a veya neye sahipsiniz) yeniden yönlendirmelisiniz.

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

, muhtemelen görece basit komut dosyasına tüm bu dönüştürmek için çok zor olmayacaktır. Görünüşe göre belki de 'sed' den biraz daha gelişmiş bir şeye geçmek zamanıdır; veya beyaz liste öğelerini, "beyaz liste" yi her güncellediğinizde güncellediğiniz harici bir dosyaya yerleştirebilirsiniz. – tripleee

+0

Önceki soruda belirtildiği gibi, herhangi bir MIME kodlaması filtrenizi atlamak için yeterlidir. HTML genellikle basılabilir yazdırılan kodlanır; "htt = \ np: // badsite.example.com" gibi görünen herhangi bir URL'yi ("nn" yazdırılabilir yazdırılabilir bir gövdede fiziksel satır sonu) veya base64 kodlu URL’yi kaçırırsınız. – tripleee

+0

Soruyu düzelttim ... Ancak "htt = \ np: // badsite.example.com" gibi linebreaks ilk sed komutuyla değiştirilir ... – BP20

İlgili konular