问题描述

自动拉黑功能缺陷:当黑名单列表为空时,自动拉黑功能无法生效。代码逻辑为:先检测黑名单是否为空,若为空则直接退出,随后才尝试将失败的 IP(ssh\_failed 和 web_failed)添加到黑名单/usr/bin/pushbot/api/ip_blacklist​。结果导致黑名单始终无法更新。通过ipset list ip_blacklist命令查看是否添加黑名单成功。

临时解决方法

设置黑名单时间为 0

手动添加任意 IP 到黑名单列表这样可以让自动拉黑功能恢复正常运行。

其他代码逻辑问题

失败次数判断不合理:代码仅检测 ssh\_failed 及 web\_failed 文件列表顶部的 IP。如果该 IP 登录失败次数不足 3 次,则直接退出,导致后续有多次失败的 IP 无法被拉黑。

逻辑优化

优化检测逻辑:调整代码,取消只判断第一行 IP 的逻辑,确保所有符合拉黑条件的 IP 都能被正确处理。

优化代码

需要优化的内容为web失败和ssh失败两处,删除末尾的|head =n1即可,优化后的代码如下:

echo "" > ${dir}ssh_login
    unset login_ip login_ip_list

    # --- 下面这一行需要修改:删除末尾的 |head -n1 ---
    local login_ip_list=`cat ${dir}web_failed|awk '{print $1}'|grep -v "^$"|sort -u|head -n1`
    for login_ip in $login_ip_list;
    do
        [ -z "$login_ip" ] && continue
        echo "$ip_white_list"|grep -w -q "$login_ip" && continue
        local web_login_sum=`cat ${dir}web_failed|grep -w "${login_ip}"|wc -l`
        if [ "$web_login_sum" -ge "$login_max_num" ] ;then
            if [ ! -z "$web_login_failed" ] && [ "$web_login_failed" -eq "1" ]; then
                if [ -z "$title" ];
                then
                    title="${login_ip} 通过 Web 频繁尝试登录"
                    content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
                    elif ( echo "$title"|grep -q "频繁尝试登录" );
                    then
                        title="${login_ip} ${title}"
                        content="${content}${str_splitline}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
                    else
                        title="设备状态变化"
                        content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
                fi
            fi
            sed -i "/^${login_ip}$/d" ${dir}web_failed
            echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备 ${login_ip} 通过 Web 频繁尝试登录" >> ${logfile}
            add_ip_black $login_ip
        fi
    done
unset login_ip

    # --- 下面这一行需要修改:删除末尾的 |head -n1 ---
    local login_ip_list=`cat ${dir}ssh_failed|awk '{print $1}'|grep -v "^$"|sort -u|head -n1`
    for login_ip in $login_ip_list;
    do
        [ -z "$login_ip" ] && continue
        echo "$ip_white_list"|grep -w -q "$login_ip" && continue
        local ssh_login_sum=`cat ${dir}ssh_failed|grep -w "${login_ip}"|wc -l`
        if [ "$ssh_login_sum" -ge "$login_max_num" ] ;then
            if [ ! -z "$ssh_login_failed" ] && [ "$ssh_login_failed" -eq "1" ]; then
                if [ -z "$title" ];
                then
                    title="${login_ip} 通过 SSH 频繁尝试登录"
                    content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
                    elif ( echo "$title"|grep -q "频繁尝试登录" );
                    then
                        title="${login_ip} ${title}"
                        content="${content}${str_splitline}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
                    else
                        title="设备状态变化"
                        content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
                fi
            fi
            sed -i "/^${login_ip}$/d" ${dir}ssh_failed
            echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备 ${login_ip} 通过 SSH 频繁尝试登录" >> ${logfile}
            add_ip_black $login_ip
        fi
    done

标签: 全能通知, 自动拉黑, 脚本优化, 黑名单, bug

已有 3 条评论

  1. qq
    qq 2026-02-05 18:12 回复

    啊?

    1. ccc
      ccc 2026-02-05 18:54 回复

      ccccccc

    2. biu
      biu 作者 2026-02-05 18:42 回复

添加新评论