当你打电话时ping name.domain
,它会通过两个都 /etc/hosts
和 DNS 解析器来获取 IP。它可能是硬编码在 中的 IP /etc/hosts
,也可能是来自 DNS 服务器的 IP。当然,它是通过调用 getaddrinfo() 或等效函数(而不是直接调用)来实现的。
getaddrinfo()
如何从 shell调用?如何重现“正常”网络实用程序从某个地址获取 IP 的效果?
这与使用仅通过 DNS 或仅通过 的dig
/无关。我想在收到需要解析的名称时重现常见的应用程序行为(例如)。还有其他关于/ 的问题。这个问题不是这些问题的重复。host
getent
hosts
ping
dig
host
更新:这是我的发现(部分基于其他问题的答案)
- 在 Ubuntu(和 Debian?)上有
gethostip -d name.domain
来自syslinux
. perl -MSocket -le 'print inet_ntoa inet_aton shift' name.domain
工作可靠并且比接受的答案更简洁。- 使用
getent
可能还可以工作:getent ahostsv4 name.domain | grep STREAM | head -1 | cut -f1 -d' '
这似乎是最好的办法了。
答案1
如果你可以使用 Perl,我自己推出了(在互联网上找到并使用了它):
#!/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
}
此代码来自此 SF Q&A,标题为:首先使用 /etc/hosts 解析主机名的 Linux 命令行实用程序。
例子
$ ./gethostbyname.pl skinner
192.168.1.3
$ ./gethostbyname.pl www.google.com
74.125.225.84
$ ./gethostbyname.pl localhost
127.0.0.1
当代码在多台 Unix 机器(而不仅仅是 Linux)上运行时,我使用了上述方法,因此这getent
不是一个选择。
获取
我知道 的 手册页getent
会让您认为它getent
只会在文件数据库中查找,但我相信它会通过/etc/nsswitch.conf
.因此,如果它dns
在那里声明为一个值,那么我相信它将询问在 中配置的 DNS 服务器/etc/resolv.conf
。假设该文件中定义了一个。
在我的测试中,我的文件 中没有/etc/hosts
主机“skinner”的条目,但getent
通过 DNS 可以很好地解析它。
$ getent hosts skinner
192.168.1.3 skinner.bubba.net
$ grep skinner /etc/hosts
$