2012-09-26 11 views
6

çalıştıran:Denetleme ve ben biraz damıtılmış zaman, şöyle bir perl script var

my $randport = int(10000 + rand(1000));   # Random port as other scripts like this run at the same time 
my $localip = '192.168.100.' . ($port - 4000); # Don't ask... backwards compatibility 
system("ssh -NL $randport:$localip:23 root\@$ip -o ConnectTimeout=60 -i somekey &"); # create the tunnel in the background 

sleep 10;  # Give the tunnel some time to come up 

# Create the telnet object 
my $telnet = new Net::Telnet(
     Timeout =>  10, 
     Host =>  'localhost', 
     Port =>  $randport, 
     Telnetmode => 0, 
     Errmode =>  \&fail, 
); 

# SNIPPED... a bunch of parsing data from $telnet 

şey hedef $ ip çok öngörülemeyen bir linke olmasıdır bant genişliği, bu yüzden tünel hemen ortaya çıkabilir, bir süre alabilir, hiç ortaya çıkmayabilir. Bu yüzden tünele bir süre kalkmak ve koşmak için bir uyku şarttır.

Yani soru şu: Nasıl tünel ve çalışır olup olmadığını test edebilirsiniz? Tünel hemen çıkarsa 10 saniye gerçekten istenmeyen bir geciktir. İdeal olarak, ben 30 saniye, diyelim ki, en fazla, o kadar olmadığını kontrol ve bir kez Telnet nesnesi oluşturma ile devam etmek istiyorum.

Düzenleme: ucu lerden yola çıkılarak mikebabcock önerdiği: Ping ama

çözüldü packetloss çok yüksek miktarda, tünelin uzak ucu yukarı genellikle olduğu gibi benim mouch yardımcı olmuyor , sleep 10 bir cazibe gibi çalışır bu blokta ile değiştirilmiştir: eğer ssh sunucusuna bir ping entegre edebilirsiniz

my $starttime = time(); 
while (1) 
{ 
    # Check for success 
    if (system("nc -dzw10 localhost $randport > /dev/null") == 0) { last } 

    # Check for timeout 
    if (time() > $starttime + 30) { &fail() } 

    # 250ms delay before recheck 
    select (undef, undef, undef, 0.25); 
} 
+0

pes et "Net :: Telnet" modülünü kullandığınızdan, "açık" aramayı denediniz mi ve başarı için test mi yaptınız? Telnet uzmanı değilim, ama muhtemelen ben olsaydım denerdim. –

+0

Test yapmanın basit bir yolu yoksa bunu yapabilirim: time_spend_trying <30 saniye – Jarmund

cevap

6

Kullanım netcat'in - Linux sistemlerinde genellikle nc:

Connection to ${HOSTNAME} 23 port [tcp/telnet] succeeded! 

Ayrıca başarısına 0 döndürür ve basit memnun geçerli: Böyle bir tepki ile benim için

nc -dvzw10 ${HOSTNAME} 23 

İşleri, Bundan sonra bağlantı gider.

  • -d
  • -v (Senaryoya bunu kapat)
  • -z bağlantısı
  • yaptıktan sonra kesmek demektir ayrıntılı olmak demektir klavye tarafında bir şey okumak için değil demektir - w10 10 saniyeye kadar beklemek demektir, aksi halde
0

ve iyi çalışıyor eğer ssh tünel yukarı

olduğunu
# only a ping sample :-D 
if ! ping -c 1 192.168.101.9 
then 
     echo ":-(" 
else 
     echo ":-)" 
fi 
+0

belki de ping'i bir döngü içine koymak için iyi bir fikir olduğunu tekrar denemeye başladım: – OkieOth

+0

ping genelde bana çok fazla yardım etmiyor. % 50 packetloss (bu önceden test edilir ve inanın ya da inanmayın,% 50'ye kadar kabul edilebilir) – Jarmund

+0

fakat tünel açıksa başarı ile çıkılır. Kalite diğer iletişim düzeylerinin bir parçasıdır – OkieOth

0

her zamanki ping sonra daha iyi olabilir Fping, daha senaryo dostu düşünüyorum.

if(fping -t 60000 [your server]) { 
execute desired code; 
} else { 
execute this script again to rerun;; 
} 

gibi şey vazgeçmeden önce sunucu 60seconds bağlanmaya denemelisiniz

Fping [sunucu] 60000 -t ben kodlama olmasa bile anladınız gerçek.

İlgili konular