명령의 결과를 가져와 명령 dig
에 전달 해야 하는 문제가 있습니다. 예를 들면 다음과 같습니다.nmap
for ip in 'dig mydomain.com -t ns +short'
do nmap $ip
done
답변1
명령 은 dig
여러 줄의 출력을 반환합니다. 각 줄은 호스트 이름입니다. nmap
모든 호스트 이름에서 실행하고 싶습니다 .
이 xargs
유틸리티는 입력으로 제공된 인수를 사용하여 명령을 실행하는 데 사용됩니다 xargs
.
dig mydomain.com -t ns +short | xargs -I {} nmap {}
nmap
이것은 각 출력 라인에 대해 한 번씩 실행됩니다 dig
.
또는 nmap
한 번에 두 개씩 병렬로 실행하고 xargs
구현에서 이를 지원하는 경우(이것이 이해가 되는지 모르겠지만 가능합니다)
dig mydomain.com -t ns +short | xargs -I {} -P 2 nmap {}
dig
또 다른 접근 방식은 명시적 루프의 출력 행을 while
쉘 변수로 읽은 다음 nmap
해당 변수의 값을 호출하는 것입니다.
dig mydomain.com -t ns +short |
while IFS= read -r host; do
nmap "$host"
done
한 가지 변형은 배열의 호스트 이름을 수집하고(배열을 이해하는 셸이 필요함) nmap
모든 배열 요소를 한 번에 호출하는 것입니다.
dig mydomain.com -t ns +short |
{ readarray -t hosts; nmap "${hosts[@]}"; }
또는 위치 인수를 사용하고 동일한 작업을 수행합니다.
dig mydomain.com -t ns +short |
{
set --
while IFS= read -r host; do
set -- "$@" "$host"
done
nmap "$@"
}
또는 -iL
옵션 을 사용 nmap
하고 이 방법으로 호스트 이름을 제공하십시오.
nmap -iL <( dig mydomain.com -t ns +short )
또는 프로세스 대체가 없는 경우,
dig mydomain.com -t ns +short | nmap -iL -
코드의 주요 문제점은 루프가 dig mydomain.com -t ns +short
단일 반복의 값으로 리터럴 문자열을 사용한다는 것입니다 $ip
.
또한 $ip
루프 본문 호출에서 따옴표를 사용하고 있습니다 nmap
. 이는 셸이 유틸리티를 호출하기 전에 값을 단어로 분할한다는 의미입니다. 유틸리티 는 , , 및 단어 를 인수로 nmap
가져옵니다 . 그런 다음 잘 이해하지 못하는 옵션에 대해 불평을 계속합니다 .dig
mydomain.com
-t
ns
+short
-t
이제 당신은할 수 있다작은 따옴표를 백틱으로 변경하여 이 문제를 "수정"하면 작은 따옴표로 묶인 문자열을 명령 대체로 변환하지만 명령 출력을 반복하는 일반적인 방법으로서 이것은 다소 우아하지 않습니다. 특히 단어 출력을 공백으로 분할하고 쉘이 읽어야 하기 때문에 각 단어에 파일 이름 와일드카드를 적용합니다.모든 출력루프의 첫 번째 반복을 시작하기 전에 명령을 실행하십시오.
위 코드의 모든 변형은 일부 명령의 출력을 읽고 이를 한 줄씩 nmap
.