2017-02-17 37 views
2

Rubyの配列server_namesがあり、ホスト名が格納されています。印刷すると、次のようになります。Rubyでホスト名からIPアドレスを取得する

["hostname.abc.com", "hostname2.abc.com", "hostname3.abc.com"] 

かなり標準です。私がしようとしているのは、それらのサーバのIPを取得することです(別の変数に格納することもあります)。

IPSocketクラスのように見えますが、IPSocketクラスを使って反復処理する方法がわかりません。

server_names.each do |name| 
      IPSocket::getaddress(name) 
      p name 
      end 

のようなIPをプリントアウトしようとすると、サーバー名を入力しなかったというエラーが表示されます。これは構文上の問題ですか、それともクラスを正しく使用していないのですか?

出力:

getaddrinfo方法がどのように機能するかだけだ
getaddrinfo: nodename nor servname provided, or not known 
+0

は、あなたが見ているエラーの完全なスタックトレースを含めることはできますか? –

+0

こんにちは@StevenSchobert、返信いただきありがとうございます。あまり含まれていませんが、元の投稿を編集して出力を追加しました。しかしnslookupはIPを解決します。 – mxmxx

+0

あなたのホスト名は有効ですか? 'wget'や' curl'を使って実際に解決できるかどうか試しましたか? – Coolness

答えて

1

。名前を解決できる場合は、文字列として表されたIPアドレスを取得します。そうでない場合は、SocketError例外が発生します。物事のメソッドを呼び出すとき、それは.ではなく、名前空間の区切り::を使用する慣習だと

server_names.map do |name| 
    begin 
    IPSocket.getaddress(name) 
    rescue SocketError 
    false # Can return anything you want here 
    end 
end 

注:それはあなたがそれを予想する必要がこれらを処理するために意味しています。セパレータは機能しますが、通常MyClass::MY_CONSTのような定数を参照するために予約されているので、面倒です。

+1

ありがとう@タッドマン。この特定の環境では、AWSのホスト名は解決できませんでした(同様の環境でテストされていました)。最初に基本を確認してください... – mxmxx

4

Resolvは、Ruby標準ライブラリの一部であり、特にDNSエントリの解決を処理するために設計されています。 Rubyのドキュメントから

RESOLVはRubyで書かれたスレッド対応のDNSリゾルバライブラリです。 Resolvは、Rubyインタプリタ全体をブロックせずに、複数のDNS要求を同時に処理できます。

例:

require "resolv" 

server_names.each do |name| 
    address = Resolv.getaddress(name) 
    puts address 
end 
関連する問題