如何在不利用其他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