2012-09-26 1 views
6

을 실행 :확인하고 내가 조금 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); 
} 
+0

'Net :: Telnet' 모듈을 사용하고 있으므로'open' 호출을 사용하고 성공을 테스트 해 보았습니까? 나는 텔넷 전문가가 아니지만, 그것이 나라면 아마도 시도 할 것입니다 ... –

+0

간단한 테스트 방법이 없다면 이렇게 할 수 있습니다. time_spend_trying <30 초인 경우 – Jarmund

답변

6

사용 netcat을 - 리눅스 시스템에서 종종 nc :

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

또한 성공하면 0을 반환하고, 간단한에 만족 : 같은 응답 나를 위해

nc -dvzw10 ${HOSTNAME} 23 

작품, 연결이 끝나면 사라집니다.

  • -d는
  • -v가 (스크립트에서이 해제)
  • -z가 연결
  • 을 한 후 분리하는 것을 의미 장황 의미 키보드 측면에서 아무것도 읽을 수 없습니다 의미 - w10은 최대 10 초를 기다린다. 그렇지 않으면 포기한다.
0

하고 잘 작동하면 SSH 터널은 최대

입니다3210
# only a ping sample :-D 
if ! ping -c 1 192.168.101.9 
then 
     echo ":-(" 
else 
     echo ":-)" 
fi 
+0

이면 핑 (ping)을 루프에 넣는 것이 좋을지 다시 시도하십시오. – OkieOth

+0

핑이 많이 도움이되지 않습니다. 일반적으로 ~ 50 % packetloss (이것은 사전에 테스트를 거쳤으며 믿거 나 말거나, 그것은 50 %까지 수용 가능) – Jarmund

+0

터널이 작동하면 성공으로 종료됩니다. 품질은 다른 통신 수준의 일부입니다. – OkieOth

0

필자는 fping이 일반적인 핑보다 더 좋을 것이라고 생각합니다.

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

같은 뭔가를 포기하기 전에 서버 60초에 연결을 시도한다

는 fping [서버] 60000 -t 나는 코딩이없는 경우에도 당신은 아이디어를 얻을 생각 레알.

관련 문제