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