如何在不利用其他IP地址的情况下从Ruby获取我的机器的IP地址?

我到处搜索,但他们的解决方案需要某种forms的IP地址。 以下是我找到的解决方案。

require 'socket' #METHOD 1 ip = IPSocket.getaddress(Socket.gethostname) puts ip #METHOD 2 host = Socket.gethostname puts host #METHOD 3(uses Google's address) ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last} puts ip #METHOD 4(uses gateway address) 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 '192.168.1.1', 1 s.addr.last end ensure Socket.do_not_reverse_lookup = orig end ip=local_ip puts ip 

所有这些都需要某人的IP地址。 有没有使用别人的IP地址的解决方案? 优选地,平台无关。

不是您正在寻找的解决方案:

 require 'socket' addr_infos = Socket.ip_address_list 

由于一台机器可以有多个接口和多个IP地址,因此该方法返回一个Addrinfo数组。

您可以像这样获取确切的IP地址:

 addr_infos.each do |addr_info| puts addr_info.ip_address end 

PS问题有点陈旧,但显示为Google上的第一项,并且它不包含大多数人正在寻找的解决方案,所以我决定发布它。

希望能帮助到你。

 require 'socket' Socket::getaddrinfo(Socket.gethostname,"echo",Socket::AF_INET)[0][3] 

实际上,与方法1非常相似

这就是我多年来一直在生产中使用的东西:

 require 'socket' require 'resolv-replace' ip = Socket.ip_address_list.detect{|intf| intf.ipv4_private?} ip.ip_address 

效果很好; 在aws和经典主机上测试

因为没有对主机的默认ip接口(实际上根本不需要任何ip接口)所有关于命名的假设都是模糊的,不一定成立。

gethostname()返回的值可以独立定义到任何ip-setup,因此它不需要根据可以解析为任何ip-address的主机名来反映有效主机。

从POSIX系统的API视图中,唯一可用于测试(ip-)接口可用性的reliabe函数是getifaddrs()函数,它返回所有接口的列表及其参数。

由于看起来Ruby的当前Socket lib没有提供它的接口, 这个(http://rubygems.org/gems/system-getifaddrs)基于gem的方法似乎确实是唯一的出路。

解析ip命令的输出?

来自https://gist.github.com/henriquemenezes/a99f13da957515023e78aea30d6c0a48

 gw = `ip route show`[/default.*/][/\d+\.\d+\.\d+\.\d+/] 

或解析ipconfig命令的输出: https : //stackoverflow.com/a/12632929/32453