我正在使用 GNU Parallel 扫描 URL 列表(来自不同主机)是否存在漏洞,如下所示:
cat urls.txt | parallel --gnu -j 50 ./scan {}
“扫描”程序适用于一个线程中的一个 URL。我需要硬限制每个主机的并发请求(作业)数量,例如 5 个连接。我怎样才能实现这个目标?
答案1
将 url 拆分为每个主机一个文件。然后对每个文件运行“parallel -j5”。
或者对 url 进行排序,并在遇到新主机时插入分隔符 '\0',然后在 '\0' 上拆分并删除 '\0',同时将其作为块传递到新的并行实例:
sort urls.txt |
perl -pe '(not m://$last:) and print "\0";m://([^/]+): and $last=$1' |
parallel -j10 --pipe --rrs -N1 --recend '\0' parallel -j5 ./scan
编辑:
我认为这会起作用:
cat urls.txt | parallel -q -j50 sem --fg --id '{= m://([^/]+):; $_=$1 =}' -j5 ./scan {}
sem
是 GNU Parallel 的一部分(它是 的简写parallel --semaphore
)。{= m://([^/]+):; $_=$1 =}
获取主机名。-j5
告诉sem
我们制作一个有 5 个槽的计数信号量。--fg
强制sem
不在后台生成作业。通过使用主机名作为 ID,您将获得每个主机名的计数信号量。
-q
parallel
如果您的某些 URL 包含特殊的 shell 字符(例如 &),则需要使用该字符。需要保护它们免受 shell 扩展,因为sem
shell 也会扩展它们。