我有一个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)
这就是该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.
您可能最好使用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)
| 归档时间: |
|
| 查看次数: |
3967 次 |
| 最近记录: |