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"
脚本关键步骤解释
while read -r attempt_count target_ip:逐行读取文件,自动把每行按空格拆分成两个变量,-r防止特殊字符被转义- 数字校验:避免文件里的脏数据(比如非数字的次数)导致后续比较出错
- 正确的if判断:用
-gt做数值大于比较,[]前后必须留空格,变量加双引号防止意外解析 - 封禁命令:用
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
相关产品推荐
相关产品推荐

