2017-11-20 14 views
2

Linuxコマンドを実行し、結果をPuTTYのようなWindowsアプリケーションのテキストボックスに表示する方法はありますか?例えばSSH.NETで長い時間コマンドを実行し、結果をTextBoxに連続して表示する

私は次のコマンドに

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(); 
} 

を使用してこのコマンドを実行する時間に沿ってかかり、何も結果が出ません結果のテキストボックスに入力します。

答えて

2

まず、理由がない限り、コマンド実行を自動化するために「シェル」チャネルを使用しないでください。 「exec」チャンネル(CreateCommandまたはRunCommand、SSH.NET)を使用してください。

だけでバックグラウンドスレッドでストリームを読み続ける、TextBoxに出力を供給するために:SSH.NET real-time command output monitoring:わずかに異なるアプローチを

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の質問を参照してください。

関連する問題