从Ruby中的主机名获取IP地址

时间:2017-02-17 22:45:00

标签: ruby

我有一个存储主机名的Ruby数组 server_names 。如果我打印出来,它看起来像这样:

["hostname.abc.com", "hostname2.abc.com", "hostname3.abc.com"]

非常标准。我尝试做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。

看起来IPSocket类可能会这样做,但我不确定如何使用IPSocket类迭代它。如果它只是尝试打印出如下的IP:

server_names.each do |name|
            IPSocket::getaddress(name)
            p name
          end

它抱怨说我没有提供服务器名称。这是一个语法问题还是我没有正确使用该类?

输出:

getaddrinfo: nodename nor servname provided, or not known

2 个答案:

答案 0 :(得分:5)

您可能最好使用Resolv,它是Ruby标准库的一部分,专门用于处理解析DNS条目。

来自Ruby文档:

  

Resolv是一个用Ruby编写的线程感知DNS解析器库。 Resolv可以同时处理多个DNS请求,而不会阻塞整个Ruby解释器。

示例:

require "resolv"

server_names.each do |name|
  address = Resolv.getaddress(name)
  puts address
end

答案 1 :(得分:3)

这就是getaddrinfo方法的工作原理。如果可以解析名称,则会获得表示为字符串的IP地址。如果没有,您会收到SocketError个例外。这意味着为了处理这些问题,您需要预测:

server_names.map do |name|
  begin
    IPSocket.getaddress(name)
  rescue SocketError
    false # Can return anything you want here
  end
end

请注意,在调用方法时,使用.而不是命名空间分隔符::的约定。分隔符确实有效,但它通常用于引用MyClass::MY_CONST之类的常量。