【问题标题】:Ruby: get local IP (nix)Ruby:获取本地 IP (nix)
【发布时间】:2011-02-17 13:17:06
【问题描述】:

我需要获取我的 IP(即 DHCP)。我在我的environment.rb 中使用它:

LOCAL_IP = `ifconfig wlan0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1] || "localhost"

但是有 ruby​​way 或更清洁的解决方案吗?

【问题讨论】:

  • 可能有多个本地 IP 地址。通常,要使用的地址(例如用于打开侦听套接字)是通过配置文件指定的。
  • 我需要 wlan0 inet 地址。我从我的 wifi 路由器通过 DHCP 获取它。因此,对于我的开发环境,每次重新连接到路由器时,我都需要设置新的 IP。所以现在我想从系统中自动获取它。我使用 unix 命令来获取它并且它工作正常,但现在我正在寻找更多的 ruby​​way 解决方案。
  • 是的。它是重复的。但我不能删除它

标签: ruby unix ip


【解决方案1】:

一台服务器通常有多个接口,至少一个私有接口和一个公共接口。

由于这里的所有答案都针对这个简单的场景,因此更简洁的方法是向 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 方法。

【讨论】:

  • 顺便说一句,我认为这在 v1.8 中不可用
  • 为了完整性,获取IP地址:Socket.ip_address_list.detect{|intf| intf.ipv4_private?}.getnameinfo[0]
  • 请注意,ip_address_list 似乎是在 1.9.x 中引入的
【解决方案2】:
require 'socket'

def local_ip
  orig = Socket.do_not_reverse_lookup  
  Socket.do_not_reverse_lookup =true # turn off reverse DNS resolution temporarily
  UDPSocket.open do |s|
    s.connect '64.233.187.99', 1 #google
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

puts local_ip

找到here

【讨论】:

  • 如果机器位于 LAN 中且未连接到 WAN,此方法将崩溃。我在这个案例中遇到了崩溃问题。
【解决方案3】:

这里是对steenslag的解决方案的一个小修改

require "socket"
local_ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}

【讨论】:

  • 为什么会有改进? @steenslag 将运行得更快,因为它禁用了 DNS 查找,更短的代码并不总是更好
猜你喜欢
  • 2012-12-10
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 2020-11-29
  • 2013-10-28
  • 2012-11-29
相关资源
最近更新 更多