2016-10-19 1 views
0

SSH를 통해 자동화하려고 시도했지만 서버에 결함이있어 exec 채널을 올바르게 구현하지 않아 CreateShellStream()을 사용하여 문제를 해결했습니다. 나는 프로그램을 실행할 때 연결을 사용할 수 없으며 단절이 일어날 것이라고 예상 할 수 있습니다. 내 솔루션 :SshStream이 더 이상 유효하지 않을 때 SshStream.Expect()가 코드를 중단합니다.

while(!_cancellationToken.IsCancellationRequested)) 
{ 
    ShellStream stream = null; 
    while(stream == null) 
    { 
     stream = await GetSshStream(); 
    } 
    while(stream.CanWrite && stream.CanRead) 
    { 
     stream.WriteLine(command); 
     //this breaks everything if stream is not valid 
     var rep = stream.Expect(new Regex(@"[$>]")); 
     var delimiters = new[] { " ", "\r\n", "\t" }; 
     var values = rep.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); 
     DealWithValues(values); 
    } 
} 

이것은 작동하며 연결을 기다리고 com을 시작합니다. 이 문제가 발생하면 stream.CanWrite && stream.CanRead은 충분하지 않으므로 stream이 정상이며 연결이 끊어지고 스트림이 유효하지 않게되고 Expect();과 함께 사용되면 모든 문제가 발생합니다. 모든 루프에서 튀어 나와 try {} catch{}을 통과하고 심지어 Visual Studio 디버거를 단계별로 분해하고 다른 스레드 (멀티 스레드 프로그램)에서 프로그램을 계속 진행합니다. 이 일을 막고 실행을 첫 번째로 던지는 방법이 있습니까 while? 서버에 액세스 할 필요가있을 때마다 새 스트림을 만들 수 있지만 매번 한 번 폴링 매개 변수를 사용하면 매번 다시 연결하는 오버 헤드가 발생하지 않으려 고합니다.

답변

0

실종 코드 실행이 중단되었다는 오해가 있습니다. 대신 쓰레드는 입력 대기 중이다. Expect에 시간 초과가 발생했으며이를 사용하고 있어야합니다.

관련 문제