函数式编程在 shell 中的运用
shell 练习:用函数式思维写 shell,以服务器安全-封锁 ip/解封 ip 作为示例。
脚本介绍
脚本功能:
- 可设置配置文件参数供脚本使用
- 增量分析 Nginx log、secure log、lastb 获取入侵 ip 并封禁
- 可通过命令行输入 ip 并封禁,支持批量操作
- 可通过命令行输入 ip 并解封, 支持批量操作
- 支持 firewalld 和 nginx host deny file 两种方式封禁 ip
- 支持切换封禁 ip 的方案并迁移前方案的数据
- 支持校验黑名单和 nginx deny file 文件状态,自动触发防火墙操作或重启 nginx 操作
详细介绍可参考:iFirewalld 介绍
目录结构
目录结构:
- black_list.sh 黑名单路由文件
- config.sh 配置文件
- unban_the_ip.sh 解禁 ip 的文件
- white_list.sh 白名单文件
- lib 存储公共代码模块
- common: 公共代码文件,包括错误码定义等
- blacklist: 黑名单功能函数,提供黑名单添加/删除/list/校验 等操作
- nginx: nginx 功能函数,提供 nginx 数据添加/删除 等操作
- firewall: 防火墙功能函数,提供防火墙数据添加/删除/list 等操作
脚本代码
脚本使用
自动封禁 ip 的使用方法,将下面的命令写进 crontab 中:
bash
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.daily.0/nginx >/dev/null 2>&1
*/10 * * * * sh /root/black_list.sh add > /dev/null 2>&1 &
0 0 * * * /usr/bin/echo 0 > /tmp/nginxlog_seek && rm -rf /tmp/nginxlog_since* && rm -rf /tmp/securelog_since*
如果是单个脚本的使用,可通过 ./脚本名
来打印帮助信息