首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby:获取本地IP (nix)

Ruby:获取本地IP (nix)
EN

Stack Overflow用户
提问于 2011-02-17 21:17:06
回答 3查看 14.9K关注 0票数 15

我需要获取我的IP (即DHCP)。我在我的environment.rb中使用了这个

代码语言:javascript
复制
LOCAL_IP = `ifconfig wlan0`.match(/inet addr:(\d*\.\d*\.\d*\.\d*)/)[1] || "localhost"

但是有没有rubyway或者更干净的解决方案呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-18 22:55:02

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

因为这里的所有答案都处理这个简单的场景,所以更简洁的方法是向套接字询问当前的ip_address_list(),如下所示:

代码语言:javascript
复制
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()方法,如下所示:

代码语言:javascript
复制
ip= my_first_public_ipv4.ip_address unless my_first_public_ipv4.nil?

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

票数 30
EN

Stack Overflow用户

发布于 2011-02-17 21:58:16

代码语言:javascript
复制
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

票数 11
EN

Stack Overflow用户

发布于 2011-02-17 22:19:46

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

代码语言:javascript
复制
require "socket"
local_ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5029427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档