web-dev-qa-db-ja.com

他のIPアドレスを利用せずにRubyから私のマシンのIPアドレスを取得する方法は?

私はあらゆる場所を検索しましたが、それらのソリューションには何らかの形式の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アドレスを使用しないソリューションはありますか?好ましくは、プラットフォームに依存しない。

25
user1535147

あなたが探しているソリューションではありません:

require 'socket'

addr_infos = Socket.ip_address_list

マシンは複数のインターフェースと複数のIPアドレスを持つことができるため、このメソッドは Addrinfo の配列を返します。

次のように正確なIPアドレスを取得できます。

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

追伸質問は少し古いですが、Googleの最初の項目として表示され、ほとんどの人が探しているソリューションが含まれていないため、投稿することにしました。

それが役に立てば幸い。

43
Itay Grudev

これは私が何年も本番で使用してきたものです:

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

よく働く; awsと従来のホスティングでテスト済み

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

実際には方法1と同じです

16
Eugene Rourke

ホストへのデフォルトのIPインターフェースなどは存在しないため(実際にはIPインターフェースである必要はありません)、名前付けに関するすべての仮定は曖昧なので、必ずしも成り立ちません。

gethostname()によって返される値は、任意のip-setupに個別に定義できるため、任意のipアドレスに解決できるホスト名に関して有効なホストを反映する必要はありません。

POSIXシステムのAPIの観点から、(ip-)インターフェースの利用可能性をテストするための唯一の信頼できる関数は、関数getifaddrs()であり、すべてのインターフェースとそのパラメーターのリストを返します。

Rubyの現在のSocket libがそれにインターフェースを提供していないように見えるので、 this(http://rubygems.org/gems/system-getifaddrs) gemベースのアプローチが唯一の方法のようですトーゴ。

1
alk

ipコマンドの出力を解析しますか?

from https://Gist.github.com/henriquemenezes/a99f13da957515023e78aea30d6c0a48

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

またはipconfigコマンドの出力を解析します: https://stackoverflow.com/a/12632929/3245

0
rogerdpack