【问题标题】:Execute long time command in SSH.NET and display the results continuously in TextBox在 SSH.NET 中执行长时间命令并在 TextBox 中连续显示结果
【发布时间】:2017-11-20 07:11:10
【问题描述】:

有什么方法可以执行 Linux 命令并将结果显示在像 PuTTY 这样的 Windows 应用程序的文本框中。

例如我正在尝试执行以下命令

wget http://centos-webpanel.com/cwp-latest
sh cwp-latest

使用以下代码

SshClient sshclient = new SshClient(IPtxtBox.Text, UserNameTxt.Text, PasswordTxt.Text);
sshclient.Connect();
ShellStream stream = sshclient.CreateShellStream("customCommand", 80, 24, 800, 600, 1024);

resultTxt.Text = SSHCommand.SendCommand(stream, "wget http://centos-webpanel.com/cwp-latest && sh cwp-latest");
private static void WriteStream(string cmd, StreamWriter writer, ShellStream stream)
{
    writer.WriteLine(cmd);
    while (stream.Length == 0)
        Thread.Sleep(500);
}
private static string ReadStream(StreamReader reader)
{
    StringBuilder result = new StringBuilder();

    string line;
    while ((line = reader.ReadLine()) != null)
        result.AppendLine(line);

    return result.ToString();
}
private static string SendCommand(ShellStream stream, string customCMD)
{
    StringBuilder strAnswer = new StringBuilder();

    var reader = new StreamReader(stream);
    var writer = new StreamWriter(stream);
    writer.AutoFlush = true;
    WriteStream(customCMD, writer, stream);

    strAnswer.AppendLine(ReadStream(reader));

    string answer = strAnswer.ToString();
    return answer.Trim();
}

此命令执行需要一些时间,结果文本框中没有显示结果。

【问题讨论】:

    标签: c# .net ssh stream ssh.net


    【解决方案1】:

    首先,除非你有充分的理由,否则不要使用“shell”通道来自动执行命令。使用“exec”通道(SSH.NET 中的CreateCommandRunCommand)。

    要将输出提供给TextBox,只需在后台线程上继续读取流:

    private void button1_Click(object sender, EventArgs e)
    {
        new Task(() => RunCommand()).Start();
    }
    
    private void RunCommand()
    {
        var host = "hostname";
        var username = "username";
        var password = "password";
    
        using (var client = new SshClient(host, username, password))
        {
            client.Connect();
            // If the command2 depend on an environment modified by command1,
            // execute them like this.
            // If not, use separate CreateCommand calls.
            var cmd = client.CreateCommand("command1; command2");
    
            var result = cmd.BeginExecute();
    
            using (var reader = new StreamReader(
                                  cmd.OutputStream, Encoding.UTF8, true, 1024, true))
            {
                while (!result.IsCompleted || !reader.EndOfStream)
                {
                    string line = reader.ReadLine();
                    if (line != null)
                    {
                        textBox1.Invoke(
                            (MethodInvoker)(() =>
                                textBox1.AppendText(line + Environment.NewLine)));
                    }
                }
            }
    
            cmd.EndExecute(result);
        }
    }
    

    对于稍微不同的方法,请参阅类似的 WPF 问题:
    SSH.NET real-time command output monitoring

    以这种方式执行时,某些程序(如 Python)可能会缓冲输出。见:
    How to continuously write output from Python Program running on a remote host (Raspberry Pi) executed with C# SSH.NET on local console?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多