导入函数执行失败排查:/usr/local/bin下攻击拦截脚本异常
解决notify_about_attack.sh中ban_ip函数未执行的问题
首先看你的问题:执行notify_about_attack.sh时,ban_ip()函数里的第一条日志语句都没输出,说明函数压根没被调用到。最可能的原因是相对路径导致的脚本加载失败,咱们一步步排查解决:
1. 修复handle_attack.sh的加载路径
你的notify_about_attack.sh里用了source ./handle_attack.sh,但执行这个脚本时,当前工作目录不一定是/usr/local/bin(比如通过定时任务、其他脚本调用时),这会导致找不到handle_attack.sh。虽然你加了“加载成功”的日志,但source失败默认不会终止脚本,后续调用ban_ip时会因为函数未定义直接报错退出,自然不会执行函数里的内容。
把相对路径改成绝对路径,同时添加失败判断:
# 替换notify_about_attack.sh里的source语句 source /usr/local/bin/handle_attack.sh || { echo "加载handle_attack.sh失败,错误码:$?" >> /tmp/ban.log; exit 1; }
这样如果加载失败,会明确记录日志,方便后续排查。
2. 同步修复handle_attack.sh里的配置文件路径
同样,handle_attack.sh里的source ./stae.conf也存在相对路径问题,改成绝对路径避免找不到配置文件:
# 替换handle_attack.sh里的source语句 source /usr/local/bin/stae.conf
3. 检查脚本权限与执行环境
- 确保
handle_attack.sh和stae.conf对执行notify_about_attack.sh的用户有读权限(source不需要执行权限,但需要读权限):chmod 644 /usr/local/bin/handle_attack.sh /usr/local/bin/stae.conf - 如果是通过系统服务或定时任务执行,确认执行用户的环境能找到
bash和expect,或者在脚本开头指定绝对解释器路径:# notify_about_attack.sh和handle_attack.sh开头添加 #!/usr/bin/env bash
4. 额外优化:修复stae_baned_ip.exp里的日志命令
顺便提一下,stae_baned_ip.exp里的echo命令在Expect环境下不能直接使用,要改成exec echo才能调用系统的echo命令写入日志:
exec echo "${user} ${host} ${password} ${timeout} ${baned_ip}" >> /tmp/ban.log
做完这些修改后,重新执行notify_about_attack.sh,应该能看到ban_ip函数里的日志输出了。如果还是有问题,可以查看/tmp/ban.log里的错误信息,或者在notify_about_attack.sh开头添加set -x开启调试模式,追踪每一步执行情况。
内容的提问来源于stack exchange,提问作者aircraft
相关产品推荐
相关产品推荐

