为什么该命令失败(这是实际命令的简化版本)?
/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
消除echo命令也可以:
/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如何进行{}字符串替换的结合。
ps我知道有解决方法,我主要是想寻找中断的交互,从而阻止此命令成功运行。谢谢。
发生这种情况是因为您的shell在将命令行参数传递给命令之前对命令行参数执行了变量和命令替换,因此$(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"' '{}'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句