2010-03-16 7 views

Répondre

8

A partir de Ruby 2.1, Socket # getifaddrs est disponible:

001:0> require 'socket' 
=> true 
002:0> Socket.getifaddrs.map { |i| i.addr.ip_address if i.addr.ipv4? }.compact 
=> ["127.0.0.1", "192.168.1.121", "192.168.1.181"] 
1

Je ne pense pas que Ruby a un api standard pour cela, mais dans certaines hypothèses cela devrait être assez fiable sur toutes les plateformes:

require 'socket' 
Socket::getaddrinfo(Socket.gethostname, 'echo', Socket::AF_INET).map { |x| x[3] } 

Ici, nous partons du principe pas mal de choses comme la machine ayant un nom d'hôte local pointant vers les adresses IP correctes. Donc, ce n'est certainement pas complètement fiable, mais il est indépendant de la plate-forme et fonctionne sur les configurations communes. Editer: Si vous décidez d'analyser syntaxiquement ifconfig, pensez à ruby-ifconfig. Il prétend faire cela sur la plupart des plates-formes non-windows déjà.

+0

"_service_ est un nom de service (" http », "ssh", ...), ou un numéro de port (80, 22, ...) ", donc: echo => 'echo' – andrykonchin

+1

L'exigence de nom d'hôte tue ceci pour moi .. Sur une machine avec 4 interfaces je viens juste de revenir [" 127.0.0.1 "," 127.0.0.1 "] – Tindron

+0

Ummm ... Est-ce que le outil que vous écrivez côté serveur? L'utilisation de snmp est-elle une option? – anshul

2

Vérifiez le message suivant:

http://coderrr.wordpress.com/2008/05/28/get-your-local-ip-address/

Il y a aussi une discussion sur la solution anshul posté dans les commentaires.

+1

Cette méthode fonctionne très bien si je connais les adresses IP auxquelles je veux me connecter pour chaque interface. Malheureusement, je ne peux pas supposer que .. selon les commentaires Ruby n'a pas d'API pour cela, donc je suppose que c'est ifconfig/ipconfig pour moi. – Tindron