호스트와 nslookup이 IP 주소가 호스트 이름이라고 생각하는 이유는 무엇입니까?

호스트와 nslookup이 IP 주소가 호스트 이름이라고 생각하는 이유는 무엇입니까?

이 명령이 실패하는 이유는 무엇입니까(실제 명령을 단순화한 버전임)?

/tmp $ echo 74.6.231.20 | xargs -n1 -I {} echo "$(host -d {})"
Trying "74.6.231.20.<REDACTED>.<REDACTED>.com"
Trying "74.6.231.20"
Host 74.6.231.20 not found: 3(NXDOMAIN)
Received 95 bytes from 10.163.24.1#53 in 1 ms

이것주인명령은 74.6.231.20을 IP 주소가 아닌 호스트 이름으로 간주하므로 명령이 실패합니다(예: 74.6.231.20 호스트 이름/FQDN이 없음).

IP 주소를 직접 지정하세요.

/tmp $ echo 216.58.195.78 |  xargs -n1 -I {} echo "$(host -d 216.58.195.78)"
Trying "78.195.58.216.in-addr.arpa"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21425
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;78.195.58.216.in-addr.arpa.    IN  PTR

;; ANSWER SECTION:
78.195.58.216.in-addr.arpa. 85730 IN    PTR sfo07s16-in-f78.1e100.net.
78.195.58.216.in-addr.arpa. 85730 IN    PTR sfo07s16-in-f14.1e100.net.

Received 113 bytes from 10.163.24.1#53 in 2 ms

제거하다에코이 명령은 다음과 같이 작동합니다.

/tmp echo 74.6.231.20 | xargs -n1 -I {} sh -c  "(host {})"
20.231.6.74.in-addr.arpa domain name pointer media-router-fp73.prod.media.vip.ne1.yahoo.com.

문제는 xargs와 echo의 조합 및 xargs가 {} 문자열 교체를 수행하는 방식인 것 같습니다.

p.s. 해결 방법이 있다는 것을 알고 있습니다. 주로 이 명령이 성공적으로 실행되지 못하게 하는 손상된 상호 작용을 찾는 데 관심이 있습니다. 감사해요.

답변1

이는 쉘이 명령줄 인수를 명령에 인수로 전달하기 전에 변수 및 명령 대체를 수행하기 때문에 발생합니다. 따라서 $(host -d {})xargs번째 echo명령은 실제로 다음을 출력합니다.

Trying "{}.<REDACTED>.<REDACTED>.com"
Trying "{}"
Host {} not found: 3(NXDOMAIN)
Received 95 bytes from 10.163.24.1#53 in 1 ms

그런 다음 xargs출력을 IP 주소로 바꾸어 명령이 실패한 것처럼 보이게 합니다. 다음 명령을 사용하여 파이프라인을 실행하기 전에 직접 확인할 수 있습니다.{}hostset -x

( set -x; echo 74.6.231.20 | xargs -n1 -I {} echo "$(host -d {})" )

+ echo 74.6.231.20
++ host -d '{}'
+ xargs -n1 -I '{}' echo 'Trying "{}.<REDACTED>.<REDACTED>.com"
Trying "{}"
Host {} not found: 3(NXDOMAIN)
Received 95 bytes from 10.163.24.1#53 in 1 ms'
Trying "74.6.231.20.<REDACTED>.<REDACTED>.com"
Trying "74.6.231.20"
Host 74.6.231.20 not found: 3(NXDOMAIN)
Received 95 bytes from 10.163.24.1#53 in 1 ms

이 특정 예에서 출력을 표시하기만 하려는 경우 host출력을 캡처한 다음 명시적으로 표시할 필요가 없습니다 echo. 이렇게만 하면 충분합니다.

echo 74.6.231.20 | xargs -n1 host -d

편집하다:

xargs다음은 여러 명령에 입력을 전달하는 방법의 예입니다. 이는 bash명령 뒤에 오는 모든 인수가 -c에 위치 인수로 할당되기 때문에 작동합니다 $0.

echo 74.6.231.20 | xargs -n1 -I '{}' /bin/bash -c 'echo "$0"; host -d "$0"' '{}'

관련 정보