Bash脚本调用UFW时无法识别IP地址字符串的问题排查
解决ufw添加规则时"ERROR: Bad source address"的问题
问题出在你的IP列表文件使用了Windows风格的CRLF(\r\n)换行,bash读取每行内容时会把末尾的\r字符(也就是你看到的 )当成IP地址的一部分,导致ufw无法识别这个无效的地址格式。
方法1:先将文件转换为Unix格式(推荐)
直接把文件的换行符改成Unix的LF格式,后续读取就不会有问题:
- 安装并使用
dos2unix工具:sudo apt install dos2unix dos2unix your_ip_list.txt - 如果没有
dos2unix,用sed命令直接删除每行末尾的\r:sed -i 's/\r$//' your_ip_list.txt
方法2:在脚本读取时实时过滤换行符
不用修改原文件,在读取每行IP的时候直接去掉末尾的\r:
- 用
tr命令过滤:while IFS= read -r ip; do # 移除IP中的\r字符 clean_ip=$(echo "$ip" | tr -d '\r') sudo ufw insert 1 deny from "$clean_ip" to any done < your_ip_list.txt - 用
sed预处理文件再读取:# 先处理文件去掉\r,再逐行读取执行命令 sed 's/\r$//' your_ip_list.txt | while IFS= read -r ip; do sudo ufw insert 1 deny from "$ip" to any done
额外提示
后续通过API生成IP列表文件时,尽量配置输出为Unix格式的换行(LF),避免再次出现类似问题。
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

