2010-05-07 2 views
0

ssh를 사용하여 명령을 실행하고 싶습니다.
I이 예에서와 같이 SharpSSH library을 사용하고 있습니다 :SharpSSH로 출력을 생성하지 않는 명령 실행

using System; 
using Tamir.SharpSsh; 

class Program { 
    static void Main(string[] args) { 
     string hostName = "host.foo.com"; 
     string userName = "user"; 
     string privateKeyFile = @"C:\privatekey.private"; 
     string privateKeyPassword = "xxx"; 

     SshExec sshExec = new SshExec(hostName, userName); 
     sshExec.AddIdentityFile(privateKeyFile, privateKeyPassword); 
     sshExec.Connect(); 
     string command = string.Join(" ", args); 
     Console.WriteLine("command = {0}", command); 
     string output = sshExec.RunCommand(command); 

     int code = sshExec.ChannelExec.getExitStatus(); 
     sshExec.Close(); 
     Console.WriteLine("code = {0}", code); 
     Console.WriteLine("output = {0}", output); 
    } 
} 

내 문제는 내가 실행 명령이 더 출력을 생성하지 않을 때, 내가 얻을 -1 리턴 코드로 대신의 명령에 의해 반환되는 코드입니다 원격 기계.
누군가이 문제가 발생 했습니까? 아니면 제가 잘못 했나요?

+0

RunCommand에 과부하를 사용하고 stdOut 및 stdErr을 무시하고 종료 코드를 읽은 적이 있습니까? 차이가별로없는 것 같아요. – kamranicus

답변

0

실제로 코드를 보면 getExitStatus는 실제로 실행 한 명령의 종료 상태가 아니며 명령 실행을 위해 방금 생성 된 "채널"의 종료 상태입니다. 아래 코드는 실제로 설정되는 전체 코드베이스의 유일한 위치입니다.

case SSH_MSG_CHANNEL_OPEN_FAILURE: 
          buf.getInt(); 
          buf.getShort(); 
          i=buf.getInt(); 
          channel=Channel.getChannel(i, this); 
          if(channel==null) 
          { 
           //break; 
          } 
          int reason_code=buf.getInt(); 
          //foo=buf.getString(); // additional textual information 
          //foo=buf.getString(); // language tag 
          channel.exitstatus=reason_code; 
          channel._close=true; 
          channel._eof_remote=true; 
          channel.setRecipient(0); 
          break; 

"channel.exitstatus = reason_code;" 문제의 코드입니다. 그리고 볼 수 있듯이 채널 열기에서만 설정됩니다. 그렇지 않으면 기본값 -1이됩니다.

타미르가 이것을 좀 더 광범위하게 사용하려고했지만 상상하지 못했습니다.

어느 쪽이든, 그것을 사용하려는 목적으로 만들어진 것이 아닙니다.

당신이 라이브러리, 리눅스 기반의 컴퓨터에있는 유일한 방법을 연결하는 명령의 리턴 코드를 얻을 수있는 경우는? "에코 $"로 명령 통화를 종료하는 것입니다, 그래서 당신은 사용하고자하는 것입니다

sshExec.RunCommand(command + ";echo $?"); 

그런 다음 끝에있는 명령 코드의 리턴을 구문 분석하십시오. 아마도 "EET"RETURNCODE "$와 같이 구문 분석하기 쉬운 접두사를 붙이시겠습니까? 실행 스크립트에서 리턴 코드를 얻기 위해이 매우 늦게 응답이이지만 ...이 futhure 참조 유용 할 수 있습니다

+0

답변 해 주셔서 감사합니다. 'echo $?' 제안하지만, 실제로 명령을 실행하면 종료 상태 **가 ** 명령 리턴 코드입니다. –

2

...

, 우리는 RunCommand 자체의 반환 값을 사용할 수 있습니다.

int returnCode = exec.RunCommand(strScript2, ref stdOut, ref stdError); 

하지만 종료시 리턴 코드가 없으면 0을 반환합니다.

관련 문제