2012-09-26 18 views
6

मैं एक पर्ल स्क्रिप्ट, जो जब एक सा destilled, इस तरह दिखता है:जांच की जा रही है, तो एक SSH सुरंग ऊपर है और चल रहा

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 

बात यह है कि लक्ष्य $ आईपी बहुत अप्रत्याशित के साथ एक लिंक पर है बैंडविड्थ, तो सुरंग तुरंत आ सकती है, इसमें कुछ समय लग सकता है, यह बिल्कुल नहीं आ सकता है। तो सुरंग को उठने और दौड़ने के लिए कुछ समय देने के लिए नींद जरूरी है।

तो सवाल यह है: सुरंग ऊपर और चलने पर मैं कैसे परीक्षण कर सकता हूं? अगर सुरंग सीधे आती है तो 10 सेकंड वास्तव में अवांछित देरी होती है। आदर्श रूप से, मैं यह जांचना चाहता हूं कि यह ऊपर है और टेलनेट ऑब्जेक्ट बनाने के बाद, अधिकतम, कहें, 30 सेकंड के लिए जारी रखें।

संपादित करें: पिंग मुझे Mouch, के रूप में सुरंग के दूरदराज के अंत में आम तौर पर निर्भर है मदद नहीं करता है, लेकिन packetloss की एक बहुत ही उच्च राशि

हल के साथ: सिरे से Extrapolating mikebabcock ने सुझाव दिया , sleep 10 इस ब्लॉक जो एक आकर्षण की तरह काम करता साथ प्रतिस्थापित किया गया:

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

चूंकि आप 'नेट :: टेलनेट' मॉड्यूल का उपयोग कर रहे हैं, तो क्या आपने 'ओपन' कॉल और सफलता के लिए परीक्षण का उपयोग करने का प्रयास किया है? मैं कोई टेलनेट विशेषज्ञ नहीं हूं, लेकिन यह वही है जो मैं शायद कोशिश करता हूं अगर यह मैं ... –

+0

मैं ऐसा कर सकता हूं यदि परीक्षण का कोई आसान तरीका नहीं है: सफलता के समय तक प्रयास करें यदि time_spend_trying <30 सेकंड – Jarmund

उत्तर

6

उपयोग netcat - अक्सर Linux सिस्टम पर nc:

मेरे लिए
nc -dvzw10 ${HOSTNAME} 23 

काम करता है, की तरह एक प्रतिक्रिया के साथ:

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

यह भी सफलता पर 0 देता है, और एक साधारण के साथ खुश है कनेक्शन जिसके बाद यह चला जाता है।

  • -d का मतलब कुंजीपटल पक्ष
  • -v वर्बोज़ होना करने के लिए (एक स्क्रिप्ट में इसे बंद करें)
  • -z कनेक्शन
  • करने के बाद डिस्कनेक्ट करने के लिए इसका मतलब है इसका मतलब से कुछ भी पढ़ने के लिए नहीं - w10 का अर्थ है 10 सेकंड तक प्रतीक्षा करना, अन्यथा
0

आप अपने ssh सर्वर के लिए एक पिंग एकीकृत कर सकते हैं और अगर यह ठीक काम करता है ssh सुरंग अप

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

शायद पिंग को एक लूप में रखना अच्छा विचार भी है – OkieOth

+0

पिंग मुझे बहुत मदद नहीं करता है, क्योंकि यह आमतौर पर ~ 50% पैकेटलोस (यह पहले से परीक्षण किया जाता है, और विश्वास करता है या नहीं, यह 50% तक स्वीकार्य है) – Jarmund

+0

लेकिन सुरंग ऊपर होने पर सफलता के साथ बाहर निकलें। गुणवत्ता अन्य संचार स्तरों का एक हिस्सा है – OkieOth

0

मुझे लगता है कि सामान्य पिंग, अधिक स्क्रिप्ट अनुकूल के बाद फिंगिंग बेहतर हो सकती है।

fping आयकर 60000 [अपने सर्वर]

कुछ

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

तरह देने से पहले सर्वर 60seconds से कनेक्ट करने के लिए प्रयास करना चाहिए मैं भले ही कोडिंग नहीं है आप अंदाजा हो लगता है असली।

संबंधित मुद्दे