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。这个问题不是那些的重复。
更新:这是我的发现(部分基于其他问题的答案)
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' '这似乎是最好的办法。
如果您可以访问 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)
| 归档时间: |
|
| 查看次数: |
6606 次 |
| 最近记录: |