从 shell 中 getaddrinfo() ?

从 shell 中 getaddrinfo() ?

当你打电话时ping name.domain,它会通过两个都 /etc/hosts和 DNS 解析器来获取 IP。它可能是硬编码在 中的 IP /etc/hosts,也可能是来自 DNS 服务器的 IP。当然,它是通过调用 getaddrinfo() 或等效函数(而不是直接调用)来实现的。

getaddrinfo()如何从 shell调用?如何重现“正常”网络实用程序从某个地址获取 IP 的效果?

这与使用仅通过 DNS 或仅通过 的dig/无关。我想在收到需要解析的名称时重现常见的应用程序行为(例如)。还有其他关于/ 的问题。这个问题不是这些问题的重复。hostgetenthostspingdighost

更新:这是我的发现(部分基于其他问题的答案)

  • 在 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
$

相关内容