Answers:
一种有效的工具是getent
。因此您可以使用getent hosts www.google.com
或getent hosts localhost
。它将根据名称服务交换器配置中指定的数据库检索条目/etc/nsswitch.conf
。
files dns
用于主机的主机,这意味着先查询/ etc / hosts,然后再查询DNS解析器。您的配置可能不同。
getent
。感谢您对该命令的介绍。
您可以使用gethostbyname()(不建议使用)包装,例如:
python -c 'import socket;print socket.gethostbyname("www.google.com")'
或类似的getaddrinfo()包装器:
python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'
请注意,getaddrinfo将所有实例作为列表返回。该命令的最后一部分仅选择第一个元组。这也可以返回IPv6地址。
您可以使用[这里您最喜欢的语言]编写一个调用getnameinfo的脚本。这就是二进制文件(如ping)的处理方式,因此可以确保获得相同的处理。
使用getent ahosts
,例如:
$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004
您将通过glibc解析器获取所有IPv4和IPv6地址(因此/etc/hosts
,通常使用中的第一个配置/etc/nsswitch.conf
)。
不要使用getent hosts
,因为它会为您提供IPv6或IPv4地址(不能同时提供两者),并且所选协议可能不是一种无效的协议。确实,IPv6地址通常是首选,但在某些地方,路由器会过滤(不支持)IPv6数据。
“ gethostbyname” 命令行版本:
#!/usr/bin/perl
use Socket;
$host = shift @ARGV;
die("usage: gethostbyname hostname\n") unless(defined($host));
$packed_ip = gethostbyname($host);
if (defined $packed_ip) {
$ip_address = inet_ntoa($packed_ip);
print "$ip_address\n";
exit 0
} else {
warn "$host not found\n";
exit 1
}
getent hosts
被打破。它更喜欢IPv6地址,gai.conf
应该配置为更喜欢ipv4,但是...
Perl在中gethostbyname
使用优先级/etc/nsswitch.conf
hosts: files dns
因此,这就像getent hosts
应该为我工作。
也:
perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'
应该管用。
getent ahosts
。
以下命令将通过直接DNS服务器查找通过DNS / etc / hosts执行查找。
ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*/\1/"
此命令将尝试对域(在这种情况下为google.com)执行一次ping操作,等待超时为2秒,获得PING命令的第一行,该行的内容为“ PING google.com(216.58.199.36)56(84 )数据字节”,然后使用Stream Editor(sed)检测第一组括号并提取其中的数据,这就是我们要查找的IP地址。
注意:如果URL中带有括号(又称圆括号),则regex表达式将不起作用,但是这种情况很少见。
awk '/hostname/ { print $1 }' /etc/hosts
帮助吗?