이 명령이 실패하는 이유는 무엇입니까(실제 명령을 단순화한 버전임)?
/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 주소로 바꾸어 명령이 실패한 것처럼 보이게 합니다. 다음 명령을 사용하여 파이프라인을 실행하기 전에 직접 확인할 수 있습니다.{}
host
set -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"' '{}'