을 실행 :확인하고 내가 조금 destilled 때, 다음과 같습니다 펄 스크립트가
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
것은 대상 $의 IP는 매우 예측할 수와 링크 점이다 대역폭 때문에 터널이 바로 올라올 수도 있습니다. 시간이 좀 걸릴 수도 있습니다. 터지지 않을 수도 있습니다. 그래서 터널을 시작하고 달리기 위해 잠을 자려면 잠이 필요합니다.
그래서 질문입니다 : 어떻게 터널이 작동하고 있는지 테스트 할 수 있습니까? 10 초는 터널이 곧바로 오면 매우 바람직하지 않은 지연입니다. 이상적으로, 나는 그것이 있는지 확인하고 telnet 객체를 생성하는 것을 계속하고 싶습니다. 한 번 말하면 최대 30 초입니다.
편집 : 끝에서 외삽 mikebabcock에 의해 제안 : 핑하지만
가 해결 packetloss의 매우 높은 양, 터널의 원격 종료가 일반적으로 나를, mouch 도움이되지 않습니다 , sleep 10
마법처럼 작동이 블록으로 대체되었습니다 : 당신은 당신의 SSH 서버에 핑 (ping)을 통합 할 수 있습니다
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);
}
'Net :: Telnet' 모듈을 사용하고 있으므로'open' 호출을 사용하고 성공을 테스트 해 보았습니까? 나는 텔넷 전문가가 아니지만, 그것이 나라면 아마도 시도 할 것입니다 ... –
간단한 테스트 방법이 없다면 이렇게 할 수 있습니다. time_spend_trying <30 초인 경우 – Jarmund