You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BASH入门:逐行读文件并封禁SSH登录次数超3的IP

嘿,别慌!作为Bash新手遇到这种语法报错太正常了,我来帮你捋清楚问题所在,再给你一个能直接用的解决方案~

先说说你脚本第5行报错的大概率原因

command not found在if语句处出现,通常是踩了这几个Bash语法坑:

  • []前后没加空格:比如你写了if[$count -gt 3],Shell会把if[$count]当成一个不存在的命令,必须写成if [ "$count" -gt 3 ](注意[后面、]前面的空格)
  • 用了>做数值比较:Bash里>是重定向符号,不是数值大于的意思!数值比较得用-gt(greater than),如果写if [ $count > 3 ],Shell会把3当成文件名,试图把$count的内容重定向到文件3里,自然报错
  • 变量没加引号:如果IP或者次数里有空格(虽然你的场景不太可能),会导致Shell解析出错,所以变量最好用双引号包起来

符合你需求的完整脚本示例

假设你的记录文件叫ssh_login_attempts.txt,每行格式是次数 IP,比如:

2 192.168.1.10
5 192.168.1.20
4 192.168.1.30

下面这个脚本会逐行处理、判断并封禁符合条件的IP:

#!/bin/bash
# 替换成你的记录文件名
LOG_FILE="ssh_login_attempts.txt"

# 逐行读取文件,拆分次数和IP
while read -r attempt_count target_ip; do
    # 先过滤掉非数字的无效记录(可选,但能避免报错)
    if ! [[ "$attempt_count" =~ ^[0-9]+$ ]]; then
        echo "跳过无效记录:$attempt_count $target_ip"
        continue
    fi

    # 判断次数是否超过3,注意语法细节:[]前后空格、-gt做数值比较、变量加引号
    if [ "$attempt_count" -gt 3 ]; then
        echo "发现恶意IP:$target_ip,尝试次数$attempt_count,执行封禁..."
        # 执行netfilter封禁命令(需要root权限,所以脚本要sudo运行)
        sudo iptables -A INPUT -s "$target_ip" -p tcp --dport 22 -j DROP
        
        # 如果你需要规则永久生效,根据系统不同加对应的保存命令,比如Debian/Ubuntu:
        # sudo iptables-save > /etc/iptables/rules.v4
    fi
done < "$LOG_FILE"

脚本关键步骤解释

  1. while read -r attempt_count target_ip:逐行读取文件,自动把每行按空格拆分成两个变量,-r防止特殊字符被转义
  2. 数字校验:避免文件里的脏数据(比如非数字的次数)导致后续比较出错
  3. 正确的if判断:用-gt做数值大于比较,[]前后必须留空格,变量加双引号防止意外解析
  4. 封禁命令:用iptables(netfilter的用户态工具)添加规则,拒绝该IP的SSH端口(22)连接,需要root权限,所以运行脚本时要加sudo

运行注意事项

  • 保存脚本为block_ssh_ips.sh,然后给执行权限:chmod +x block_ssh_ips.sh
  • 必须用root权限运行:sudo ./block_ssh_ips.sh
  • 如果要永久保存封禁规则,记得加上注释里的iptables-save命令,否则重启后规则会消失

内容的提问来源于stack exchange,提问作者DivZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:44:11