Benutzer-Werkzeuge

Action disabled: source

Dieses kleine Script hilf dem Administrator einer Postfix Servers bei der Beseitigung von Spamabfall in der Mailqueue. Dabei durchsucht das Script den Inhalt der Files direkt in der Queue. Im Gegensatz zu meinem anderen Script für die Mailqueue, welches die Informationen nur in der Ausgabe des mailq Kommandos sucht.

Dafür kann dieses Script bei „intelligenten“ Spammern helfen, die einen Login geknackt haben, aber bei jeder Mail einen anderen Envelope Sender verwendet. Ein Script welches nur mailq durchsucht kann diese Art nicht erwischen, weil in mailq keine Informationen zum verwendeten Login enthalten sind. Nur Sender und Empfänger plus ein paar andere Sachen sind dort ersichtlich.

Hier kommt dann dieses Script zum Zuge: es ermittelt JEDE Message-ID aus der Mailqueue und durchsucht danach JEDES File der Queue nach dem gesuchten String. Da in den Files auch Verwaltungsinformationen des Mailservers stehen sieht man z.B. die gesamten Header, Login-IP und v.a. Login-Username. Das Script bietet einerseits mit dem Parameter -lu die Möglichkeit nach einem bestimmten SASL-Login zu suchen und andererseits mit dem Parameter -s nach einem bestimmten String. Per default werden keine Mails gelöscht, sondern es werden nur die Message-IDs der Mails, welche das Gesuchte enthalten, zurückgegeben. Erst mit dem expliziten -d wird das Script angewiesen die ermittelten IDs auch zu löschen.

Ein Wort der Warnung noch ;-) Das Script wird nicht nachfragen ob gelöscht werden soll wenn -d gesetzt ist. Zudem gibt es nicht wirklich eine Prüfung von -lu und -s Alles was kein Leerstring ist wird als Suche akzeptiert. Es wäre also nicht gerade empfehlenswert -s ' ' -d zu machen. Das würde alles aus der Queue putzen, weil wohl jede Mail irgendwo ein Leerzeichen enthält :-D

#!/bin/bash
 
#########################################################################
#									#
# searchMsgId4SASL.sh							#
# @author	tobi <jahlives@gmx.ch>					#
# @License	GPL3							#
# @copyright	Can be changed as you want. No need for specify the	#
#		original author						#
# It's allowed for commercial usage but please ask via email prior	#
# to use it in any commercial matter					#
#									#
# This script is as it is. No guarantee for anything. Use at own risk	#
#									#	
#########################################################################
 
DELETE=0
SEARCH=''
STRING=''
while [ $# -gt 0 ] ; do
 case "$1" in
  '-lu')
   shift
   SEARCH="$1"
   shift
  ;;
  '-d')
   DELETE=1
   shift
  ;;
  '-s')
   shift
   STRING="$1"
   shift
  ;;
  '-h')
   echo '# searchMsgId4SASL.sh helps admins to quickly remove msg from mailqueue for a certain user SASL login'
   echo "# $0 -lu me@mydomain.tld [-d]"
   echo '# -lu  email address of the user to clean from queue (username used in SASL login)'
   echo '# -d   enforces delete mode expects -lu to be set. If not set matching msg ids will be printed only. Be VERY careful using this switch. !!!"Quadrupel" check what you set in -lu!!!'
   echo '#      WARNING: if you specify -lu and -d then the script goes to delete mode. There wont be any "are you sure"-windows style question but all mails from user that match $SEARCH will be deleted'
   echo "# -s   defines a custom search string. Use it if you're looking for a special content string of a mail"
   echo '#      -s and -lu CANNOT be set at the same time. Be careful with -s as it searches the entire mail (headers and body)!!!'
   echo '# -h   show this help'
   exit 0
  ;;
  *)
   echo "Unknown parameter $1. Type -h for short help" && exit 1
  ;;
 esac
done
[[ "x$SEARCH" = 'x' && "x$STRING" = 'x' ]] && echo '###' && $0 -h && echo '###' && exit 1
[[ "x$SEARCH" != 'x' && "x$STRING" != 'x' ]] && $0 -h && echo '###' && exit 1
 
for i in $(mailq|tail -n +2|awk 'BEGIN { RS = "" }/'""'/{ if($1 != "'--'") print $1 }' | tr -d '*!') ; do
 if [ "x$SEARCH" != 'x' ] ; then
  RET=$(find /var/spool/postfix -type f -name "$i" -exec grep "sasl_username=$SEARCH" {} \;)
 elif [ "x$STRING" != 'x' ] ; then
  RET=$(find /var/spool/postfix -type f -name "$i" -exec grep "$STRING" {} \;)
 fi 
 [[ "x$RET" != 'x' && $DELETE -eq 0 ]] && echo $i
 [[ "x$RET" != 'x' && $DELETE -eq 1 ]] && postsuper -d $i
done
Melden Sie sich an, um einen Kommentar zu erstellen.

Seiten-Werkzeuge