为了账号安全,请及时绑定邮箱和手机立即绑定

在Ruby on Rails中获取主机名或IP

在Ruby on Rails中获取主机名或IP

ABOUTYOU 2019-11-27 13:09:43
我正在维护Ruby on Rails应用程序,并且正在寻找一种简单的方法来查找我所在盒子的主机名或IP地址(因为它是VM,并且新实例可能具有不同的主机名或IP地址) 。在Ruby on Rails中有快速简便的方法吗?编辑:下面的答案是正确的,但是提供的澄清Craig很有用(另请参见答案中提供的链接):[以下]代码不会建立连接或发送任何数据包(至Google的64.233.187.99)。由于UDP是无状态协议,所以connect()仅进行系统调用,该系统调用根据地址和绑定的接口(以及IP接口)确定如何路由数据包。addr()返回一个数组,其中包含套接字的族(AF_INET),本地端口和本地地址(这是我们想要的)。
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

主机名


在Ruby中获取主机名的一种简单方法是:


require 'socket'

hostname = Socket.gethostname

问题在于,这依赖于主机知道自己的名称,因为主机使用gethostname或uname系统调用,因此对于原始问题将不起作用。


从功能上讲,这与hostname答案相同,而无需调用外部程序。主机名可以是完全限定的,也可以不是完全限定的,具体取决于计算机的配置。


IP地址


从ruby 1.9开始,您还可以使用Socket库获取本地地址列表。 ip_address_list返回AddrInfo对象的数组。如何选择取决于您要做什么以及拥有多少接口,但是以下示例仅选择第一个非环回IPV4 IP地址作为字符串:


require 'socket'

ip_address = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }.ip_address


查看完整回答
反对 回复 2019-11-27
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

一台服务器通常具有多个接口,至少一个专用接口和一个公用接口。


由于这里的所有答案都是针对这种简单情况的,因此一种更干净的方法是向Socket索要电流,ip_address_list()如下所示:


require 'socket'


def my_first_private_ipv4

  Socket.ip_address_list.detect{|intf| intf.ipv4_private?}

end


def my_first_public_ipv4

  Socket.ip_address_list.detect{|intf| intf.ipv4? and !intf.ipv4_loopback? and !intf.ipv4_multicast? and !intf.ipv4_private?}

end

两者都返回一个Addrinfo对象,因此,如果需要一个字符串,则可以使用该ip_address()方法,如下所示:


ip= my_first_public_ipv4.ip_address unless my_first_public_ipv4.nil?

通过更改用于过滤所需接口地址的Addrinfo方法,您可以轻松地找到更适合您的情况的解决方案。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 3168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信