Выполнение команды, которая не производит вывод с SharpSSH - PullRequest
0 голосов
/ 07 мая 2010

Я хочу запустить команду, используя ssh.
Я использую библиотеку 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 в качестве кода возврата вместо кода, возвращаемого командой на удаленном компьютере.
Кто-то сталкивался с этой проблемой или я что-то не так делаю?

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Хотя это очень поздний ответ ... это может быть полезно для ссылок на будущее ...

Для получения кода возврата из выполненного скрипта мы можем использовать значение возврата самого RunCommand.

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

Но это вернет 0, когда нет кода возврата при выходе.

0 голосов
/ 29 июня 2010

Если вы действительно посмотрите на код, 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, единственный способ, с помощью этой библиотеки, получить код возврата команды, это завершить ваш командный вызов с помощью «echo $?», Поэтому вы можете использовать

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

А затем проанализируйте возвращение для этого кода команды в конце. Может быть, даже префикс его с чем-то легко разбирается, например, echo "RETURNCODE" $?

...