【问题标题】:Getting all IP addresses of a hostname获取主机名的所有 IP 地址
【发布时间】:2018-09-11 13:52:18
【问题描述】:

我正在尝试获取主机的所有 IP 地址。

这是 nslookup 的输出:

>>nslookup site.com

Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   site.com
Address: 1.1.1.1
Name:   site.com
Address: 2.2.2.2

我试过这段代码:

use Socket;
use Data::Dumper;
my $name = "site.com";
@addresses = gethostbyname($name)   or die "Can't resolve $name: $!\n";
@addresses = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
print Dumper(\@addresses);

这是输出:

['1.1.1.1'];

无论如何要同时获得1.1.1.12.2.2.2

【问题讨论】:

  • 请注意,perldoc -f gethostbyname 告诉我们:“确保在 SCALAR 上下文中调用“gethostbyname”,并检查其返回值是否已定义。” 您的代码示例两者都没有.
  • @JamesEKeenan 当您不关心列表上下文 gethostbyname 返回的所有其他信息时,这是为了将主机名解析为单个 IP 地址。

标签: perl nslookup


【解决方案1】:

您可以使用Net::DNS::Resolver 获取主机名的 IPv4 地址(A 记录):

use warnings;
use strict;

use feature 'say';

use Net::DNS::Resolver;

my $res = Net::DNS::Resolver->new;

my $name = 'stackoverflow.com';
my $q = $res->query($name);

if ($q){
    print "$name has the following IPv4 addresses:\n";
    for ($q->answer){
        say $_->address if $_->type eq 'A';
    }
}

输出:

stackoverflow.com has the following IPv4 addresses:
151.101.65.69
151.101.193.69
151.101.1.69
151.101.129.69

【讨论】:

  • 这为您提供了名称服务器提供的所有 IP,这可能是 OP 想要的,但它与主机名的所有 IP 地址不同。
  • @CupcakeProtocol cnn.com 的权威名称服务器分发相同的 IP 地址。请澄清你的意思。
  • 对于来自加利福尼亚和纽约的 www.cnn.com 查询,我得到了完全不同的答案。我的意思是,DNS 技巧可用于将您定向到特定实例或一组实例,并且作为局外人无法确定详尽的 IP 地址列表。
  • 我认为你的答案是 OP 想要的,但 OP 的问题含糊不清,我想为后人指出这一点。
  • @tonix 可以从一个 IP 地址处理数十亿个请求...
【解决方案2】:

简单的纯perl打印域stackoverflow.com的IP:

use Socket;
print join'.',unpack('C4',inet_aton('stackoverflow.com'));
print "\n";

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 2023-03-05
    • 1970-01-01
    • 2018-01-02
    • 2018-08-26
    • 2012-04-12
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多