0

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 が返されることです。
誰かがこの問題に遭遇しましたか、それとも私が何か間違ったことをしていますか?

4

2 に答える 2

2

これは非常に遅い返信ですが...これは将来の参照に役立つかもしれません...

実行されたスクリプトから戻りコードを取得するには、RunCommand 自体の戻り値を使用できます。

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

ただし、終了時にリターン コードがない場合、これは 0 を返します。

于 2011-12-16T07:58:58.697 に答える
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 ベースのマシンに接続している場合、このライブラリを使用してコマンド リターン コードを取得する唯一の方法は、コマンド コールを「echo $?」で終了することです。

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

そして、最後にそのコマンド コードの戻り値を解析します。解析しやすいプレフィックスを付けることもできます。たとえば、echo "RETURNCODE"$ などです。

于 2010-06-29T14:13:04.790 に答える