매우 간단해 보이는 문제가 있지만 만족스러운 해결책을 찾을 수 없습니다. 다음과 같이 IP와 포트가 포함된 간단한 입력 파일이 있습니다.
10.155.78.0 445
172.17.11.0 3389
nc -vvv <ip> <port>
이제 for 루프의 각 행을 실행 하고 싶습니다 .
내가 생각할 수 있는 것은 cut을 사용하여 선을 두 번 분할하는 것뿐입니다.
for x in $(cat inputfile); do nc -vvv $(echo -n $x | cut -d" " -f1) $(echo -n $x | cut -d" " -f2)
또는 gawk를 사용하고 서브쉘을 시작하십시오.
for x in $(cat dingens); do cmd=$(echo $x | gawk -F" " '{ print "nc -vvv -w 2 " $1 " " $2 }'); echo -n $cmd | bash; done
그러나 두 솔루션 모두 매우 복잡해 보입니다. 더 나은 해결책은 없을까요?
답변1
while IFS=" " read -r Ip Port Junk <&3; do
nc -vvv "${Ip}" "${Port}" 3<&-
done 3< inFile
의 목적은 Junk
두 번째 필드 이후의 모든 필드(예: 설명)를 수신하는 것입니다. inFile
stdin 대신 fd 3에서 엽니다. 그렇지 않으면 해당 nc
루프를 호출하면 다음 내용도 읽게 됩니다.inFile
답변2
예를 들어 다음과 같이 사용할 수 있습니다 xargs
.
xargs -n 2 nc -vvv < inputfile
에서 man xargs
:
-n max-args
,--max-args=max-args
명령줄당 최대 max-args개의 인수를 사용합니다. [...]
xargs
각 명령의 출력을 리디렉션하는 데 주의한다면 이 옵션을 사용하여 여러 명령을 병렬로 실행할 수도 있습니다 . 예를 들어, 8코어 CPU가 있고 8개의 작업을 병렬로 실행하려는 경우:nc
-P
nc
xargs -P 8 -n 2 sh -c 'nc -vvv "$1" "$2" > "$1-$2.log"' sh < inputfile
-P max-procs
,--max-procs=max-procs
max-procs
한 번에 실행할 수 있는 최대 프로세스 수는 1입니다. [...]