#!/usr/bin/bash
TARGETS=(
"81.176.235.2"
"81.176.70.2"
"78.41.109.7"
)
myIPs=(
"185.164.100.1"
"185.164.100.2"
"185.164.100.3"
"185.164.100.4"
"185.164.100.5"
)
for t in "${TARGETS[@]}"
do
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
wait
done
done
TARGETS
이 코드가 각 IP에 대해 echo 명령으로 시작하여 병렬로 실행되기를 원합니다 . 또한 스크립트는 동시에 여러 주소에 명령을 에코하도록 의도되지 않았 myIPs
으므로 wait
이를 내부 루프에 도입했습니다. .NET의 각 대상에 대해 쌍 echo
(포트당 하나, 각각 하나 )을 병렬로 실행하고 싶습니다 80
. 즉, 저는 이 작업을 수행하고 싶습니다(하지만 불행하게도 작동하지 않습니다).443
TARGETS
for t in "${TARGETS[@]}"
do &
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
wait
done
done
wait
그러나 로드 평균이 너무 많이 증가하므로 다음을 원하지 않습니다.
for t in "${TARGETS[@]}"
do
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
done
done
wait
내 목표를 어떻게 달성할 수 있나요?
PS 이것은 더 복잡한 스크립트의 일부일 뿐입니다. 관련 문제를 격리하고 싶었기 때문에 echo
대신 네트워크 명령 중 하나를 사용했습니다.
답변1
귀하의 질문을 이해하기 어렵다고 생각합니다. 병렬 실행과 순차 실행을 원하는 것 같습니다.
넌 이걸 원해?
for t in "${TARGETS[@]}"; do
(
for a in "${myIPs[@]}"; do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
wait
done
) &
done
각 대상의 for 루프는 백그라운드의 하위 쉘에서 실행됩니다.
답변2
내가 올바르게 이해했다면 두 루프를 반대로 하고 done
s 사이에 대기 시간을 두어야 합니다. 좋다
for a in "${myIPs[@]}"
do for t in "${TARGETS[@]}"
do echo "${a} ${t} -p 80" 2>&1 &
echo "${a} ${t} -p 443" 2>&1 &
done
wait
done
의 각 IP에 대해 myIPs
두 개의 포트가 포함된 패킷을 세 개의 포트 각각에 보낸 TARGETS
다음 여섯 개의 포트가 완료될 때까지 기다립니다.