저는 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 =}
호스트 이름을 가져옵니다. 5개의 슬롯이 있는 카운팅 세마포어를 만들라고 -j5
지시합니다 . 백그라운드에서 작업을 생성하지 않도록 강제합니다 . 호스트 이름을 ID로 사용하면 호스트 이름당 세마포 수를 얻을 수 있습니다.sem
--fg
sem
-q
parallel
일부 URL에 특수 셸 문자(예: &)가 포함된 경우 이 문자를 사용해야 합니다. sem
쉘도 확장 하므로 쉘 확장으로부터 보호해야 합니다 .