Shell 脚本模拟 milter 实现黑白名单及关键词过滤
程序执行流程:
1. 开始接受邮件。
2. 检查发件人是否在黑名单内,如果是拒绝接受;否则继续
3. 检查发件人是否在白名单内,如果是接收邮件;否则继续
4. 对邮件进行关键字过滤,如果邮件中包含被过滤的关键词信息,则拒绝接收
该邮件;否则,接收该邮件。
Usage: sh mailfilter.sh [-r reject-addr] [-a add-addr][-k keywords]
###########################################################################
#/bin/bash;
#当有邮件到达时,先拷贝一份用户分析处理
If_Mail()
{
User=`whoami`;
if test -s /var/spool/mail/$User;
then
`cp /var/spool/mail/$User /var/spool/mail/tmp`;
return 1;
else
# echo '暂无邮件要处理';
return 0;
fi
}
#定位制定email行号
Locate()
{
if [ -f "/var/spool/mail/tmp" ];
then
Get_String=`grep -n $1 /var/spool/mail/tmp|head -1`;
#${varible%%string*}从右向左截取最后一个string后的字符串
Get_N=${Get_String%%:*};
#Get_Sting=`sed '$n,touch@localhost.localdomain' /var/spool/mail/tmp|head -1`;
#echo $Get_Sting;
else
Get_N=0;
fi
return $Get_N;
}
Deal_Black_List()
{
#此邮件判断在黑名单中
Mail_Addr=$1;
Locate $Mail_Addr;
#$?显示最后命令的退出状态
if test $? -eq 1;
then
echo "$Mail_Addr 已被列入黑名单,拒收此Email!!!";
#清空文件
`echo > /var/spool/mail/$User`;
# 删除空白行
` sed -i '/^$/d' /var/spool/mail/$User`;
`rm /var/spool/mail/tmp`;
return 1;
else
return 0;
fi
}
Deal_White_List()
{
Email_Addr=$1;
Locate $Email_Addr;
#$?显示最后命令的退出状态
if test $? -eq 1;
then
return 1;
else
return 0;
fi
}
Filter_Keywords()
{
if [ -f "/var/spool/mail/tmp" ] && [ 0 -lt `grep -c $1 /var/spool/mail/tmp` ];
then
echo "含有过滤关键词$1,拒收此Email!!!";
#清空文件
`echo > /var/spool/mail/$User`;
# 删除空白行
`sed -i '/^$/d' /var/spool/mail/$User`;
`rm /var/spool/mail/tmp`;
return 1;
else
echo "邮件接受";
return 0;
fi
}
while getopts :r:a:k:h opt
do
case $opt in
r)
Black_Addr=$OPTARG;
;;
a)
White_Addr=$OPTARG;
;;
k)
Keywords=$OPTARG;
;;
h)
echo "Usage: sh mail.sh [-r reject-addr] [-a add-addr]";
exit 0;
;;
*)
echo "-$opt 参数输入错误!";
exit 0;
;;
esac
done
echo '邮件过滤系统启用';
Old_Hash=`md5sum /var/spool/mail/$USER|cut -d' ' -f1`;
New_Hash=`md5sum /var/spool/mail/$USER|cut -d' ' -f1`;
while :
do
sleep 3;
n=0;
If_Mail;
if test $? -eq 0;
then
#邮件为空
continue;
else
New_Hash=`md5sum /var/spool/mail/$USER|cut -d' ' -f1`;
fi
#判断是否有新文件
if [ "$Old_Hash" = "$New_Hash" ];
then
continue;
else
echo '新邮件到达,系统即将处理!';
Old_Hash=`md5sum /var/spool/mail/$USER|cut -d' ' -f1`;
fi
#黑名单过滤
Deal_Black_List $Black_Addr;
if test $? -eq 1;
then
continue;
fi
#白名单过滤
Deal_White_List $White_Addr;
if test $? -eq 1;
then
echo "$White_Addr的邮件已接收"
continue;
fi
#关键词过滤
Filter_Keywords $Keywords;
done
###########################################################################
这是我的一次作业,第一次写shell脚本,不乏纰漏。望指正!
Shell 脚本模拟 milter 实现黑白名单及关键词过滤的更多相关文章
- Android随笔之——用shell脚本模拟用户按键、触摸操作
之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...
- Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试
需求 在 A 界面,点击跳转到 B 界面(该界面会执行一些业务),再点击返回键出现 Dialog 弹窗,点击确认退出按钮,返回 A 界面.不断循环. 思路 一开始想到的就是按键精灵,下了 mac 版使 ...
- DDoS攻防战(三):ip黑白名单防火墙frdev的原理与实现
在上一篇文章<DDoS攻防战 (二) :CC攻击工具实现与防御理论>中,笔者阐述了一个防御状态机,它可用来抵御来自应用层的DDoS攻击,但是该状态机依赖一个能应对大量条目快速增删的ip黑白 ...
- ip黑白名单防火墙frdev的原理与实现
汤之盘铭曰 苟日新 日日新 又日新 康诰曰 作新民 诗曰 周虽旧邦 其命维新 是故 君子无所不用其极 ——礼记·大学 在上一篇文章<DDoS攻防战 (二) :CC攻击工具实现与防御理论>中 ...
- Linux系统防CC攻击自动拉黑IP增强版Shell脚本 《Linux系统防CC攻击自动拉黑IP增强版Shell脚本》来自张戈博客
前天没事写了一个防CC攻击的Shell脚本,没想到这么快就要用上了,原因是因为360网站卫士的缓存黑名单突然无法过滤后台,导致WordPress无法登录!虽然,可以通过修改本地hosts文件来解决这个 ...
- Shell脚本编程30分钟入门
Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...
- shell脚本(管理守护进程)
工作中常常会遇到处理消息队列的消费者进程,这样的进程是一个守护进程,即一个服务.服务通常写个shell脚本来管理,查询服务的status ,启动start 关闭stop 重启reload.最近在学 ...
- Android自动化压力测试之Monkey Test Android常见的错误类型及黑白名单的使用方法(四)
Android常见的错误类型有两种 1.ANR类型 1)在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2)BroadcastReceiver在10秒内没有执行完毕 2.Crash类型 1)异 ...
- Hadoop的shell脚本分析
你会发现hadoop-daemon.sh用于启动单独的本机节点 而hadoop-daemons.sh 会批量的ssh到别的机器启动 前记: 这些天一直学习hadoop,学习中也遇到了许多的问题,主要是 ...
随机推荐
- nginx 一般配置实例 静态页面
# 使用的用户和组 user www www; # 指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍,例如两个四核CPU,则总核数为8) worker_processes 8; # 指定错误日 ...
- IOS开发备忘
1. ios 真机调试时出现CopyPngFile error解决方法 说是读取的时候没有找到这张图片,检查了一下图片路径,没有问题,于是google之,找到两种解决方法 : 方法一:在build s ...
- 我和Cpp的第一次正式约会
今天是我和Cpp的第一次正式的约会,大一的时候学校开了Cpp课,可是那时候玩性未收,没有好好学习,而如今我主动约Cpp,是真的想跟他进一步走下去^_^,正在学习<C++ Primer>,每 ...
- python【第九篇】多线程、多进程
内容提要 paramiko模块 进程.与线程区别 python GIL全局解释器锁 多线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生 ...
- DOS命令行使用pscp实现远程文件和文件夹传输(转)
转自 http://snailwarrior.blog.51cto.com/680306/141201 pscp是putty安装包所带的远程文件传输工具,使用和Linux下scp命令相似,具体的使 ...
- C# 程序性能提升篇-2、类型(字段类型、class和struct)的错误定义所影响性能浅析
前景提要: 编写程序时,也许你不经意间,就不知不觉的定义了错误的类型,从而发生了额外的性能消耗,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候 ...
- 抽象数据类型Triplet的C语言实现
#include <stdio.h> #include <stdlib.h> #define ERROR 0 #define OK 1 typedef int Status; ...
- ps中常用的快捷键
ctrl+c 复制 ctrl+v 粘贴 ctrl+n 新建文件 ctrl+s 保存 空格键 手抓工具 ctrl+t 自由变形 ctrl+加号 放大 ctrl+减号 缩小 ctrl+r 标 ...
- windows phone 8学习 - 选择器
1照相机 CameraCaptureTask cct=new CameraCaptureTask(); cct.Completed+=new EventHandler<PhotoResult&g ...
- eclipse问题解决(link方式安装插件失败)
使用 link 方式,离线安装 eclipse 插件时,经常失败. 一.常见的失败情况 link方式配好后,eclipse 启动,没有弹出任何信息. 查看当前工作空间——.metadata——.log ...