2010-05-07 135 views
0

我想用ssh运行一个命令。
我使用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 2011-01-20 20:50:56

回答

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。

我想坦米尔打算使用这个更广泛一点,但从来没有这样做。

无论哪种方式,它从来没有打算用于你试图使用它的目的。

如果要连接到基于Linux机器的唯一途径,与此库,以获得命令的返回码是结束你的命令调用“回声$?”,所以你可能需要使用

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

然后在最后解析该命令代码的返回值。甚至可以用易于解析的东西加前缀,即echo“RETURNCODE”$?

+0

感谢您的回答和'echo $?'建议,但实际上,如果我运行的命令产生输出,那么退出状态**是**命令返回代码... – 2010-06-29 20:45:49

2

虽然这是一个非常晚的答复......这可能是futhure引用有用...

对于来自执行脚本获取返回代码,就可以中使用RunCommand本身的返回值。

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

但是,当退出时没有返回码时,这将返回0。

相关问题