• ベストアンサー
  • 困ってます

自分のIPアドレスの取得方法

Ubuntu 11.04でruby1.8.7を使用しています。 rubyで自分のIPアドレスを取得したいのですがいい方法を見つけられません。 ifconfig -aではeth0のinet addrとして192.168.153.129が見えており、これを取得したいのです。 ネットで調べた IPSocket::getaddress(Socket::gethostname) や Socket.getaddrinfo(Socket::gethostname, nil, Socket::AF_INET)[0][3] は、/etc/hostsに 「IP(192.168.153.129)」 「ホスト名」 を追加しておかないとうまくいかないようです(追加すればうまくいきます)。 /etc/hostsにはubuntuインストールのデフォルトとして 「IP(127.0.1.1)」 「ホスト名」 が記載されており、このままではうまくいかないようなのです。自分の環境だけであれば/etc/hostsを変更すればよいのですが、rubyプログラムを配布して別のホストで動かす際に、/etc/hostsの変更を依頼しなければいけないのがいやがられそうです。 /etc/hostsの変更なしに、自分のIPアドレスを取得するよい方法はないでしょうか。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数2145
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • shiren2
  • ベストアンサー率47% (139/295)

Rubyは全くの初心者ですけど、やっつけ仕事でいいならこれでどうですか。 #!/usr/bin/ruby `ifconfig eth0` =~ /inet ([\d\.]+)/; printf("%s\n", $1)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

なるほど。 外部コマンドの出力を利用するのですね。 試したところうまくいきそうです。 ありがとうございます。

その他の回答 (1)

  • 回答No.2
  • osamuy
  • ベストアンサー率42% (1231/2878)

そもそもIPアドレスは、ネットワークインタフェースに紐づくものなので、何をもって「自分のIPアドレス」とするかを明確化したほうがよいと思います。 一覧を取得するなら、回答No.1さんが書かれているように、ifconfigの出力を整形するのが一番手っ取り早いかと。 あるいは外部と通信するためのIPアドレスを指定したいということなら、デフォルトゲートウェイにつながるインタフェースを判別し、そのIPアドレスを取得するとか。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 自分が外部PCからアクセスされる際に使用するIPアドレスを取得したかったのです。 ifconfigの整形でうまくいきそうです。 rubyのSocketのAPIで何かいい手があるのではないかと思っていましたが、このようなIPアドレスを取得するというのは簡単そうで意外と難しいのですね。

関連するQ&A

  • ssh ホスト名接続方法

    いつもお世話になってます。 標題についてご教授願えますでしょうか。 クライアント(windows7) に VMware と ubuntu を入れました。 ubuntu のデフォルトhogeです。 ホスト名はhoge-pcです ※hoge@hoge-pc 最初は上記ホストとユーザでauthorized_key等を作って、 クライアント側でIPアドレスで鍵認証させました。 しかし、名前解決したいと思い、 ホスト名をfooに変更して、 /etc/hostnameと/etc/hostsを変更しました。 しかしながら、クライアントからTera TarmでIPで接続すると問題にですが、 ホスト名で接続できません。 何か他にやるべき事があるのでしょうか。 [/etc/hosts] xxx.xxx.xxx.xxx foo [/etc/hostname] hoge ⇒ foo もちろん/etc/init.d/networking restartやubuntuの再起動もやっております。 宜しくお願いします。

  • getaddrinf()で取得したIPアドレス表示

    お世話になります。 C言語でソケット通信の勉強中です。 CentOS6.4を使っています。 LIST1は、 IPアドレスではなくホスト名がコマンド引数で渡されたとき、 getaddrinfo()でIPアドレスを取得して、 sendto()でサーバにメッセージを送信するだけの、 クライアントのプログラムです。 このLIST1のudp通信自体は上手くいくのですが、 終わりの方で、 getaddrinfo()で取得したIPアドレスを inet_ntoa()を使って文字列表示しようとすると、 セグメンテーション違反です (コアダンプ)となってしまいます。 inet_ntoa()の引数が疑わしく、 いろいろ渡し方を変えたり、参照方法を変えたりしてみたのですが、、 なかなか解決しません。 ちゃんと、192.168.12.1とか表示するにはどうすれば良いでしょうか? ■LIST1 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <errno.h> int main(int argc,char *argv[]){ int sock; struct addrinfo hints,*res; int n; int err; if(argc != 2){ fprintf(stderr,"Usage : %s dst \n",argv[0]); return 1; } /* IP アドレス表記+ホスト名両方に対応 */ memset(&hints,0,sizeof(hints)); hints.ai_family = AF_UNSPEC; /* IPV4 IPV6 両方に対応 */ hints.ai_socktype = SOCK_DGRAM; err = getaddrinfo(argv[1],"12345",&hints,&res); if(err != 0){ perror("getaddrinfo"); printf("getaddrinfo %s\n",strerror(errno)); printf("getaddrinfo : %s \n",gai_strerror(err)); return 1; } sock = socket(res->ai_family,res->ai_socktype,0); if(sock < 0){ perror("socket"); return 1; } { const char *ipverstr; switch (res->ai_family){ case AF_INET: ipverstr = "IPv4"; break; case AF_INET6: ipverstr = "IPv6"; break; default: ipverstr = "unknown"; break; } printf("ipverstr = %s\n ",ipverstr); } n = sendto(sock,"HELLO",5,0,res->ai_addr,res->ai_addrlen); //n = sendto(sock,"HELLO", 5, 0,(struct sockaddr *)addr, sizeof(addr)); if(n<1){ perror("sendto"); { } return 1; } printf("############ finish !! #######\n"); close(sock); freeaddrinfo(res); struct sockaddr_in *addr; addr = (struct sockaddr_in *)res->ai_addr; printf("inet_ntoa(in_addr)sin = %s\n",inet_ntoa((struct in_addr)addr->sin_addr)); return 0; }

  • /etc/hosts 記述方法

    /etc/hosts 記述方法 ip アドレス  ホスト名 が 一般的ですが、 ホスト名 ipアドレス でも問題ないでしょうか? また しくみとして どの段階でこのファイルを読み取り、認識するかなど 教えてください。 URL あれば尚可

  • IPアドレスについて

    $host = gethostbyaddr ( "192.168.0.1" ); echo $host."\n"; //ホスト名からIPアドレスのリストを取得します。 $arr_ip = gethostbynamel($host); foreach($arr_ip as $str_ip) { echo $str_ip . "\n"; これで、IPアドレスを取得する事はできるのですが、 192.168.2.1 等に変更したい場合はどうすればいいのですか?? 前にも質問してのですが、どうしても諦められなくて… お願いします!!!

    • ベストアンサー
    • PHP
  • /etc/hosts の設定

    /etc/hosts  記述 ip アドレス  ホスト名 ですが、 ホスト名  ipアドレス の記述だと、認識しないのでしょうか? それとも、問題ないでしょうか? Linux でも結果は同じでしょうか?

  • /etc/hosts ファイルのリンクについて

    Solaris8を使用しております。 /etc/hosts シンボリックリンクについて質問します。 つい先日、/etc/hosts はファイル実体ではなく、/etc/inet/hosts へのシンボリックリンクであるということを知りました。 普段、IPアドレスとホスト名を確認する際には、/etc/hosts から情報を得ていますが、当該実体ファイルが、/etc/hosts へリンクされている意図は何でしょうか。 シンボリックリンク作成については、/etc/hosts ファイルに限ったことではないと思いますが、シンボリックリンクを使用することの利点についても併せて教えていただけると幸いです。 ご存知の方がいたら回答お願いします。

  • Linuxでのtelnetについて

    Redhat9を使っています。 ドメインはまだ取得しておらず、とりあえず自宅でLANを構築してLinuxをサーバーにしようと考えています。 今のところ、telnet,ftpがIPアドレスを指定すればクライアント側からできるようになっているのですが、ホスト名を使った場合には接続できません。 これは、どうすれば解決するのでしょうか? 一応、/etc/hostsの中に対応するホスト名とIPを書いてあるのですが、正式なドメインを取得しないとダメなのでしょうか?それとも、他に設定があるのでしょうか? よろしくお願いします。

  • IPアドレスとMACアドレスを取得したい(C言語)

    OSはLinuxで、コンパイラはgccです。 C言語でプログラムを作っていて、自分のIPアドレスとMACアドレスを取得しようと考えています。下のソースでIPアドレスは入手できたのですが、MACアドレスも取得しようとしたら、IPアドレスが上手く取得できなくなりました。ioctl(fd, SIOCGIFHWADDR, &ifr);で取得できるとおもうのですが、同時に取得しようとするとIPアドレスの表示が正しくされなくなっている状況です。 /* 自IPアドレスの取得 */ int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_STREAM, 0); ifr.ifr_addr.sa_family = AF_INET; /* eth0のIPアドレスの取得 */ strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); ioctl(fd, SIOCGIFADDR, &ifr); /* MACアドレスの取得 */ ←上書きされている?? ioctl(fd, SIOCGIFHWADDR, &ifr); close(fd); どなかたご教授お願いいたします。

  • IPアドレスを配列に代入する方法。

    パケットモニタリング(tcpdumpみたいなもの)でIPアドレスを取得するプログラムがあるのですが、IPアドレスを配列に代入することが出来ません。 パケットモニタリングのソース void print_ip(struct ip *ip) { printf("| Source IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_src))); /* ループ */ 実行画面 | Source IP Address: 12.34.56.78 | | Source IP Address: 34.56.78.09 | ・ ・ というふうにどんどん取得、表示していく このIPアドレス inet_ntoa(*(struct in_addr *) &(ip->ip_src))); を配列に代入していきたいのですが上手くいきません。一応自分でやってみたのですが、 void print_ip(struct ip *ip) { int *pa[2048]; static int i = 1; printf("| Source IP Address: %15s|\n", inet_ntoa(*(struct in_addr *) &(ip->ip_src))); i++; pa[i] = (int *)&(ip->ip_src); printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) pa[i])); if (i == 10) { for (i = 1; i < 10; i++) { printf("送信先[%d]%15s\n", i, inet_ntoa(*(struct in_addr *) pa[i])); }} } という風にaddres[1]から順にどんどんIPアドレスを格納しようとしたんですがaddres[1]からaddres[10]まで表示するときに全部addres[10]に代入されているIPアドレスが表示されてしまいます。 おそらく配列にIPアドレスが上手く格納できてないんだと思うのですが。C言語初心者なので誰かご教授していただけないでしょうか? 宜しくお願いします。 OSはLinuxです。

  • IPアドレスの取得について

     私の使用中のIPアドレスを、下記サイトにアクセスして確認したあと、このサイトで、取得した私のIPアドレス または ホスト名でサーチしましたがエラーになります。  http://www.matukin.com/hostname/index.cgi  その他下記サイトで、IPアドレス または ホスト名を入力してもエラーになります。  http://www.matukin.com/hostname/index.cgi  http://www.cman.jp/network/support/page_put.cgi  http://dog.tele.jp/lookup.php  http://whois.ansi.co.jp/  http://www.mse.co.jp/ip_domain/  なぜでしょうか?  グローバルIPアドレスは、61.245.7xxx の9桁です。  ホスト名は、61.245.7xxx .er.eaccess.ne.jp です。  何度してもエラーになります。  私の入力が変なのでしょうか?