私はあらゆる場所を検索しましたが、それらのソリューションには何らかの形式の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
追伸質問は少し古いですが、Googleの最初の項目として表示され、ほとんどの人が探しているソリューションが含まれていないため、投稿することにしました。
それが役に立てば幸い。
これは私が何年も本番で使用してきたものです:
require 'socket'
ip = Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
ip.ip_address
よく働く; awsと従来のホスティングでテスト済み
require 'socket'
Socket::getaddrinfo(Socket.gethostname,"echo",Socket::AF_INET)[0][3]
実際には方法1と同じです
ホストへのデフォルトのIPインターフェースなどは存在しないため(実際にはIPインターフェースである必要はありません)、名前付けに関するすべての仮定は曖昧なので、必ずしも成り立ちません。
gethostname()
によって返される値は、任意のip-setupに個別に定義できるため、任意のipアドレスに解決できるホスト名に関して有効なホストを反映する必要はありません。
POSIXシステムのAPIの観点から、(ip-)インターフェースの利用可能性をテストするための唯一の信頼できる関数は、関数getifaddrs()
であり、すべてのインターフェースとそのパラメーターのリストを返します。
Rubyの現在のSocket libがそれにインターフェースを提供していないように見えるので、 this(http://rubygems.org/gems/system-getifaddrs) gemベースのアプローチが唯一の方法のようですトーゴ。
ip
コマンドの出力を解析しますか?
from https://Gist.github.com/henriquemenezes/a99f13da957515023e78aea30d6c0a48
gw = `ip route show`[/default.*/][/\d+\.\d+\.\d+\.\d+/]
またはipconfig
コマンドの出力を解析します: https://stackoverflow.com/a/12632929/3245