2014-01-12 3 views
7

Я попытался с помощьюPing для достижимости удаленного хоста в Рубине

Ping.pingecho("10.102.52.42", 30) 

для достижимости удаленного хоста. Этот оператор возвращает null, даже если я могу выполнить ping ip вручную. Есть ли эффективный способ определения доступности удаленной машины в рубине.

ответ

22

Я использую драгоценный камень net-ping, который вам необходимо установить. Тогда код легко:

#!/usr/bin/env ruby 

require 'net/ping' 

def up?(host) 
    check = Net::Ping::External.new(host) 
    check.ping? 
end 

chost = '10.0.0.1' 
puts up?(chost) # prints "true" if ping replies 
+2

Это лучший ответ на мой взгляд, как это платформа независимый. Использование оператора back tick довольно зависимо от платформы. –

+1

Лучший ответ. как и предыдущий комментарий! – Hanynowsky

+0

ugh, это тот ответ, который я искал. Благодаря! – javamonkey79

2

Если вы на * NIX машины (OSX/Linux/BSD ...), вы всегда можете сказать, рубин (с помощью клещей назад), чтобы использовать командную строку и сохраните результаты.

x = `ping -c 1 10.102.52.42` 
# do whatever with X 

Параметр -c 1 говорит один раз запустить. Вы можете установить это на любое число, которое вы сочтете нужным. Если вы не установили -c, он будет работать до тех пор, пока не прервется, что приведет к остановке вашей программы.

1

Ping с внешним, udp, http..etc. Измените, как вы сочтете нужным. читать далее здесь ping-net git-repo

######################################################################## 
# example_pingexternal.rb 
# 
# A short sample program demonstrating an external ping. You can run 
# this program via the example:external task. Modify as you see fit. 
######################################################################## 
require 'net/ping' 

good = 'www.rubyforge.org' 
bad = 'foo.bar.baz' 

p1 = Net::Ping::External.new(good) 
p p1.ping? 

p2 = Net::Ping::External.new(bad) 
p p2.ping? 

2)

######################################################################## 
# example_pinghttp.rb 
# 
# A short sample program demonstrating an http ping. You can run 
# this program via the example:http task. Modify as you see fit. 
######################################################################## 
require 'net/ping' 

good = 'http://www.google.com/index.html' 
bad = 'http://www.ruby-lang.org/index.html' 

puts "== Good ping, no redirect" 

p1 = Net::Ping::HTTP.new(good) 
p p1.ping? 

puts "== Bad ping" 

p2 = Net::Ping::HTTP.new(bad) 
p p2.ping? 
p p2.warning 
p p2.exception 

3)

######################################################################## 
# example_pingtcp.rb 
# 
# A short sample program demonstrating a tcp ping. You can run 
# this program via the example:tcp task. Modify as you see fit. 
######################################################################## 
require 'net/ping' 

good = 'www.google.com' 
bad = 'foo.bar.baz' 

p1 = Net::Ping::TCP.new(good, 'http') 
p p1.ping? 

p2 = Net::Ping::TCP.new(bad) 
p p2.ping? 

4)

ping-1.7.8/examples/example_pingudp.rb 
######################################################################## 
# example_pingudp.rb 
# 
# A short sample program demonstrating a UDP ping. You can run 
# this program via the example:udp task. Modify as you see fit. 
######################################################################## 
require 'net/ping' 

host = 'www.google.com' 

u = Net::Ping::UDP.new(host) 
p u.ping? 
Смежные вопросы