GNU 병렬: 호스트당 실행되는 최대 네트워크 작업 수를 제한하는 방법

GNU 병렬: 호스트당 실행되는 최대 네트워크 작업 수를 제한하는 방법

저는 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 {}

semGNU Parallel의 일부입니다(약어는 parallel --semaphore). {= m://([^/]+):; $_=$1 =}호스트 이름을 가져옵니다. 5개의 슬롯이 있는 카운팅 세마포어를 만들라고 -j5지시합니다 . 백그라운드에서 작업을 생성하지 않도록 강제합니다 . 호스트 이름을 ID로 사용하면 호스트 이름당 세마포 수를 얻을 수 있습니다.sem--fgsem

-qparallel일부 URL에 특수 셸 문자(예: &)가 포함된 경우 이 문자를 사용해야 합니다. sem쉘도 확장 하므로 쉘 확장으로부터 보호해야 합니다 .

관련 정보