来自 shell 的 getaddrinfo() ?

dan*_*an3 9 shell networking dns

当你调用ping name.domain,它通过两个 /etc/hosts和DNS解析器来获取IP。它可以是硬编码在 中的 IP /etc/hosts,也可以是来自 DNS 服务器的 IP 。当然,它是通过调用 getaddrinfo() 或等价物来实现的,而不是直接调用。

我如何getaddrinfo()从shell调用?如何重现“普通”网络实用程序从地址获取 IP 的效果?

这不是关于使用dig/host只通过 DNS,或者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' '

这似乎是最好的办法。

slm*_*slm 5

如果您可以访问 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
}
Run Code Online (Sandbox Code Playgroud)

此代码来自此 SF 问答,标题为:首先使用 /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
Run Code Online (Sandbox Code Playgroud)

当代码在多台 Unix 机器上运行时我已经使用了上述方法,而不仅仅是 Linux,所以getent不是一个选项。

对象

我知道手册页getent让您认为getent只会查看文件数据库,但我相信它会通过/etc/nsswitch.conf. 因此,如果它在那里声明dns为一个值,那么我相信它会询问在/etc/resolv.conf. 假设在该文件中定义了一个。

在我的测试中,我的文件中没有一个条目/etc/hosts,用于主机“skinner”,但getent通过 DNS 解析它就好了。

$ getent hosts skinner
192.168.1.3     skinner.bubba.net

$ grep skinner /etc/hosts
$
Run Code Online (Sandbox Code Playgroud)