亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 3299 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號