c#renci ssh命令输出因客户端而异

时间:2018-10-16 21:45:32

标签: c# ssh.net

我身上真的发生了奇怪的事情。

我有ssh命令,该命令在远程服务器上执行python脚本。 当我通过PuTTY执行它时,它应该像应该的那样工作并显示所需的输出。但是,当使用ssh.net通过我的C#应用​​程序执行该命令时,它总是返回一些旧的数据,这些数据已经很久没有从服务器上使用了(freebsd 9.3)。

这是我执行命令并捕获输出的方式:

var task = new Task(() => {
    var ret = ssh_instance.CreateCommand("cd /home/" + "python python_script.py -param");
    ret.Execute();
    FlexibleMessageBox.Show(ret.Result);
});
task.Start();

这在我看来是无法解释的,因此,如果有人能启发我我在做什么错,我将非常感激。

1 个答案:

答案 0 :(得分:-1)

请记住。

  1. 调用“ CreateCommand()”方法后,连接将关闭。
  2. 您需要根据每个命令读取流中接收到的所有数据。

    ->我认为,这就是为什么从连接中获得旧结果的原因。

因此,我尝试使用Renci.SshNet.ShellStream类。在我的代码中是

    private Renci.SshNet.SshClient _client = null;
    private Renci.SshNet.ShellStream shellStream = null;

    private void connect()
    {
        try
        {
            this.disConnect();
            _client = new Renci.SshNet.SshClient(cboUri.Text, tbxSrvUsr.Text, tbxSrvPW.Text);
            //_client.ErrorOccurred += new EventHandler<Renci.SshNet.Common.ExceptionEventArgs>(_client_ErrorOccurred);
            //_client.HostKeyReceived += new EventHandler<Renci.SshNet.Common.HostKeyEventArgs>(_client_HostKeyReceived);

            _client.Connect();

            byte[] buffer = new byte[1000];
            shellStream = _client.CreateShellStream("Jornathan", 80, 24, 800, 800, 1024);
            shellStream.BeginRead(buffer, 0, buffer.Length, null, null);


            shellStream.DataReceived += new EventHandler<Renci.SshNet.Common.ShellDataEventArgs>(shellStream_DataReceived);

            tbxStatus.Text = "Connected";            

            this.btnConnect.Enabled = false;
            this.cboServerList.Enabled = false;

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

并添加方法以从服务器读取所有文本。 请记住,您应该阅读所有文本,直到遇到接收到的数据大小为“ 0”为止。请参阅以下内容。

    private void readOutput()
    {
        do
        {
            string strOutput = shellStream.ReadLine();
            if (strOutput != null && strOutput.Length > 0)
            {
                System.Console.WriteLine(strOutput);
                this.SetStatusText(strOutput);
            }
            else
            {
                break;
            }

        } while (true);
    }

然后添加事件处理程序,就是这样!

    private System.Threading.Thread Thread_OutputHandle = null;

    private void shellStream_DataReceived(object sender, Renci.SshNet.Common.ShellDataEventArgs e)
    {
        if (Thread_OutputHandle == null)
        {

            Thread_OutputHandle = new System.Threading.Thread(new System.Threading.ThreadStart(readOutput));
            Thread_OutputHandle.Start();
        }
        else if (Thread_OutputHandle.ThreadState == System.Threading.ThreadState.Stopped)
        {
            Thread_OutputHandle.Abort();

            Thread_OutputHandle = new System.Threading.Thread(new System.Threading.ThreadStart(readOutput));
            Thread_OutputHandle.Start();
        }            
    }

其他: 我希望记住我在哪里可以帮助制作此代码。 但是我不能。

当您找到需要帮助的代码位置时,请告诉我。 我将其位置添加到这里。