函数式编程在 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 中:

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*

如果是单个脚本的使用,可通过 ./脚本名 来打印帮助信息

上次更新:
贡献者: iEchoxu