2012-12-14 2 views
3

이것은 실제 상황과 관련하여 매우 간단합니다. 나는 옛날 BBS/터미널 코드에서 너무 녹슬었고 그 순간을 기억하고있다.Powershell : 텔넷 응답 텍스트 듣기

원격 서버에 대한 텔넷 세션을 열고 Powershell 스크립트를 사용하여 텍스트 파일을 기반으로 해당 서버에 명령을 실행합니다. 또한 서버에서 로그로 되돌아 오는 모든 텍스트를 침투하도록 설계되었습니다.

## Read output from a remote host 
    function GetRemoteOutput 
    { 
     ## Create a buffer to receive the response 
     $buffer = new-object System.Byte[] 1024 
     $encoding = new-object System.Text.AsciiEncoding 

     $outputBuffer = "" 
     $foundMore = $false 

     ## Read all the data available from the stream, writing it to the 
     ## output buffer when done. 
     do 
     { 
     ## Allow data to buffer for a bit 
     start-sleep -m 10000 

     ## Read what data is available 
     $foundmore = $false 
     $stream.ReadTimeout = 12000 

     do 
     { 
      try 
      { 
      $read = $stream.Read($buffer, 0, 1024) 

      if($read -gt 0) 
      { 
       $foundmore = $true 
       $outputBuffer += ($encoding.GetString($buffer, 0, $read)) 
       write-host $outputbuffer 
      } 
      } catch { $foundMore = $false; $read = 0 } 
     } while($read -gt 0) 
     } while($foundmore) 

     $outputBuffer 
    } 

Telnet 세션의 다른 쪽 끝에서 서버가 준비 될 때까지 기다려야하는 경우 문제가 발생합니다. 위의 구현은 단순히 Start-Sleep (10 초!)을 사용하고 다음 명령 인 'blind'를 보냅니다.

내가하고 싶은 것은 세션 서버가 내 상자로 보내는 것을 잡기 위해 버퍼를 시작한 다음 그 버퍼 내의 터미널 세션에서 프롬프트가 다시 표시되면 다음 명령을 트리거하는 것입니다. .

xxxxxxSANCTRLnnn가 [A]>

이제, 이러한 이름이 그들의 위치에 따라 달라질 것이다 (이것이 IBM DS400 산 컨트롤러 스크립트의 목표에서 프롬프트이다) (XXXXXX), 액세스중인 실제 SAN (nnn) 및 액세스중인 SAN (A 또는 B)의 두 컨트롤러 모듈 중 어느 것을 선택하십시오. 따라서 regex-match 문은 시스템 프롬프트의 실제 '패턴 일치'에 매우 효과적입니다.

1)는 터미널 2의 출력을 버퍼링하는 동안 일시 중지하는 스크립트를 얻을)상의 로그 파일 3) 패턴 일치로 그 출력을 전달한다 스크립팅 가이에 내 질문은, 어떤 방법에 일하는 것이있다 예상 "프롬프트"그래서 다음 명령을 발급

미리 감사드립니다! : D

+0

내가 프롬프트 일치에 사용할 찾고 있어요 정규식 때까지} (그리고 서버에서 읽어 리프레시) : '$의 promptmatch "=^\ w {6} SANCTRL \ d {3} \ [[A, B] \] \> "' –

답변

1

어떻게 될까?

do {start-sleep -sec 1; (! $ foundMore가)

+0

가능성이 있습니다. 나는 그것을 조사 할 것이다! 고맙습니다. –