2017-09-16 18 views
0

私は3番目の部分のカスタムダッシュボードに情報を表示したいので、C#コンソールアプリケーションでCPU、メモリ、IO負荷などのAIXリアルタイム情報をキャプチャしようとしています。 は、コマンドTOPASを実行した後、私はテキスト、次の定期全体をキャプチャする必要があります。を読むにはどうすればいいですか?C#

enter image description here

私はいくつかのフォーラムで判明している次のコードでそれをキャプチャしてみました:

using Renci.SshNet; 
using System; 
using System.IO; 
using System.Threading; 

namespace SSH_check_commands 
{ 
public class MyAsyncInfo 
{ 
    public MyAsyncInfo(Byte[] array, ShellStream stream) 
    { 
     ByteArray = array; 
     Stream = stream; 
    } 

    public Byte[] ByteArray { get; set; } 
    public ShellStream Stream { get; set; } 
} 

class Program 
{ 
    private static ShellStream stream; 
    private static SshClient client; 
    private static byte[] _data = new byte[2048]; 
    static void Main(string[] args) 
    { 
     client = new SshClient("host", "user", "password"); 
     client.Connect(); 
     stream = client.CreateShellStream(@"xterm", 80, 24, 800, 600, 1024); 
     stream.DataReceived += StartAsyncRead; 
     stream.Write("bash\n"); 
     Thread.Sleep(5000); 
     stream.Write("topas -i 10\n"); 
     Console.ReadLine(); 
    } 

    private static void StartAsyncRead(object sender, EventArgs e) 
    { 
     try 
     { 
      stream.BeginRead(_data, 0, _data.Length, OnReadCompletion, new MyAsyncInfo(_data, stream)); 

     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception); 
     } 
    } 

    private static void OnReadCompletion(IAsyncResult ar) 
    { 
     try 
     { 
      var mai = (MyAsyncInfo)ar.AsyncState; 
      int datalen = mai.Stream.EndRead(ar); 
      string line = client.ConnectionInfo.Encoding.GetString(mai.ByteArray, 0, datalen); 
      Console.Write(line); 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception); 
     } 
    } 
    public static string SendCommand(string cmd, ShellStream sh) 
    { 
     StreamReader reader = null; 
     try 
     { 
      reader = new StreamReader(sh); 
      StreamWriter writer = new StreamWriter(sh); 
      writer.AutoFlush = true; 
      writer.WriteLine(cmd); 
      while (sh.Length == 0) 
      { 
       Thread.Sleep(1000); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("exception: " + ex.ToString()); 
     } 
     return reader.ReadToEnd(); 
    } 
} 
} 
それは構造ではないので

しかし、私は結果を解析することはできません。

enter image description here

私を助けてもらえますか?

答えて

0

結果は、構造化である。それらはANSI escape codesです。あなたはそれらを解析することができます。あなたのSSH端末クライアントがそれらを解析して素敵な出力を表示するのと同じ方法です。

しかし、それは巨大な仕事です。 SSH.NET based colored terminal emulatorを参照してください。


人間の使用を意図したコマンドの出力を解析しようとすると、最初は悪い考えです。同じ情報を構文解析しやすい形式で取得する別の方法があることは確かです。しかしそれは別のサイトの質問です(例えばSuper User)。

関連する問題