gpt4 book ai didi

c# - 如何在C#中从AIX topas命令结果中剥离ANSI转义代码

转载 作者:行者123 更新时间:2023-12-02 14:19:03 27 4
gpt4 key购买 nike

我试图使用C#控制台应用程序捕获AIX实时信息,例如CPU,内存,IO负载,因为我想在第三方定制仪表板中显示该信息。
运行命令topas之后,我需要定期捕获以下全部文本:

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

请你帮助我好吗?

解决方法:

我已经改变了解决问题的方法。
我无法通过ssh流捕获整个文本,因为我仅收到更改的字符。
因此,我定期运行以下ssh命令将nmon内容保存在文件中(称为hostname_YYMMDD_H24_mm.nmon):
nmon -f -c 1

使用cat命令之后,我可以读取文件,提取内容,对其进行转换并将其加载到仪表板中。

最佳答案

结果是结构化的。这些是ANSI escape codes。您可以解析它们,就像您的SSH终端客户端解析那些以显示漂亮的输出一样。

但这是一项艰巨的任务。参见SSH.NET based colored terminal emulator

尽管我会说,首先解析试图供人类使用的命令的输出是一个坏主意。当然,还有另一种以更易于解析的格式检索相同信息的方法。但这是另一个站点的问题(例如Super User)。

如果只想剥离ANSI转义码,则可以使用正则表达式,如How to remove ^[, and all of the escape sequences in a file using linux shell scripting所示:

s = new Regex(@"\x1B\[[^@-~]*[@-~]").Replace(s, "");

关于c# - 如何在C#中从AIX topas命令结果中剥离ANSI转义代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46252499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com