使用SharpSSH运行不产生输出的命令

时间:2010-05-07 15:44:30

标签: c# ssh sharpssh

我想使用ssh运行命令 我正在使用SharpSSH library,如下例所示:

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作为返回码,而不是远程机器上的命令返回的代码。
有人遇到过这个问题,还是我做错了什么?

2 个答案:

答案 0 :(得分:2)

虽然这是一个非常晚的回复...这可能对未来的参考有用...

为了从执行的脚本中获取返回代码,我们可以使用RunCommand本身的返回值。

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

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

答案 1 :(得分:0)

如果您实际查看代码,getExitStatus实际上并不是您运行的命令的退出状态,它是刚刚为运行命令而创建的“Channel”的退出状态。下面是整个代码库中实际设置的唯一位置:

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。

我想Tamir打算更广泛地使用它,但从未这样做过。

无论哪种方式,它都不会用于您尝试使用它的目的。

如果要连接到基于linux的机器,使用此库获取命令返回代码的唯一方法是使用“echo $?”结束命令调用,因此您可能希望使用

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

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