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

mxm*_*mxx 5 ruby

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

["hostname.abc.com", "hostname2.abc.com", "hostname3.abc.com"]
Run Code Online (Sandbox Code Playgroud)

很标准.我要做的是获取这些服务器的IP(可能将它们存储在另一个变量中).

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

server_names.each do |name|
            IPSocket::getaddress(name)
            p name
          end
Run Code Online (Sandbox Code Playgroud)

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

输出:

getaddrinfo: nodename nor servname provided, or not known
Run Code Online (Sandbox Code Playgroud)

tad*_*man 6

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

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

请注意,在对事物调用方法时,使用约定.而不是命名空间分隔符::。分隔符确实有效,但它很混乱,因为它通常保留用于引用MyClass::MY_CONST.


Ste*_*ert 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
Run Code Online (Sandbox Code Playgroud)