मैं एक पर्ल स्क्रिप्ट, जो जब एक सा 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);
}
चूंकि आप 'नेट :: टेलनेट' मॉड्यूल का उपयोग कर रहे हैं, तो क्या आपने 'ओपन' कॉल और सफलता के लिए परीक्षण का उपयोग करने का प्रयास किया है? मैं कोई टेलनेट विशेषज्ञ नहीं हूं, लेकिन यह वही है जो मैं शायद कोशिश करता हूं अगर यह मैं ... –
मैं ऐसा कर सकता हूं यदि परीक्षण का कोई आसान तरीका नहीं है: सफलता के समय तक प्रयास करें यदि time_spend_trying <30 सेकंड – Jarmund