如何用ruby获取本机IP并发送給Gtalk

04 January 2012

问题

有一台server用的是动态ip,每次重启后ip地址就变了,因此写了一个脚本,每次在server重启后,自动将ip发送到我的gtalk上。

解决

如何获取本机IP

用ruby获取本机的动态ip,网上很多教程都用

require 'socket'

IPSocket.getaddress(Socket.gethostname)
puts TCPSocket.gethostbyname(Socket.gethostname)

这个在mac下是正常的,但是在linux下就只能拿到127.0.0.1 在StackOverflow上有另一种解决方案

require 'socket'

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 '64.233.187.99', 1
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = rig
end

这段主要是通过开启一个UDP链接来获取本地对外ip,因为UDP是无状态,所以不会实际建立网络链接,但是会获取本机对外ip。

如何发送消息

获取ip后需要通过gtalk发送,gtalk使用的是xmpp协议,ruby中协议有多种开源实现,比较简单通用的是xmpp4r,详细教程请看这里 首先需要安装xmpp4r-simple

gem install xmpp4r-simple

注意,貌似这个gem不支持1.9.*,所以使用之前先将ruby切换到1.8.7版本 然后编写代码,主要两步:

  • 建立链接
  • 发送消息

代码如下:

 require 'rubygems'
 require 'xmpp4r-simple'  

 username = gmailusername
 password = gmailpassword
 to_username = destination_gmailusername  

 puts "Connecting to jabber server.."
 jabber = Jabber::Simple.new(username+'@gmail.com',password)
 puts "Connected."
 jabber.deliver(to_username+"@gmail.com", "Hello..!")
 sleep(1)

注意,最后那个sleep不能少,尽管我还不知道为啥:(

如此以来整个的获取ip,发送給gtalk的脚本为:

require 'rubygems'
require 'socket'
require 'xmpp4r-simple'

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 '64.233.187.99', 1
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

jabber = Jabber::Simple.new('gmailuseanme@gmail.com','password')
jabber.deliver('destusenam@gmail.com', local_ip)
sleep 1

设置自动运行

linux设置自动运行是老生常谈了,在/etc/rc.local加上一句运行脚本的命令即可:

ruby /home/jiangbo/ruby/getIP.rb

结尾

这样每次机器重启时,就能够通过gtalk获取到ip了,不过还遗留一个问题,就是在机器重启时,必须保证接收消息的gtalk在线,因为这种方式的消息gtalk不会自动重法,目前不知怎么解决。



blog comments powered by Disqus