2013-05-14 268 views
0

我使用这个库连接到Linux命令我就跑,但 一些命令有问题如何通过SSH正确运行“top”命令?

例如,我有一个问题,运行这些命令:

顶部和顶部-n 1

error:TERM environment variable not set

private void button2_Click(object sender, EventArgs e) 
{ 
     Renci.SshNet.SshClient sshClient = new Renci.SshNet.SshClient("192.168.150.128", "reza", "1"); 
     sshClient.Connect(); 
     var command = sshClient.RunCommand("top"); 

     var line = command.Result.Split('\n'); 
     List<ServerStatusCpu> serverstatus = new List<ServerStatusCpu>(); 
     for (int i = 3; i < line.Length - 1; i++) 
     { 
      var li = line[i]; 
      var words = li.Split(' '); 
      List<string> fillterwords = new List<string>(); 

      foreach (var w in words) 
      { 
       if (w != "") 
       { 
        fillterwords.Add(w); 
       } 
      } 

      ServerStatusCpu serverStatus = new ServerStatusCpu(); 
      serverStatus.Time = fillterwords[0]; 
      serverStatus.TimeType = fillterwords[1]; 
      serverStatus.Name = fillterwords[2]; 
      serverStatus.UserCpuTime = float.Parse(fillterwords[3].Replace("%", "")); 
      serverStatus.UserNiceCpuTime = float.Parse(fillterwords[4].Replace("%", "")); 
      serverStatus.SystemCpuTime = float.Parse(fillterwords[5].Replace("%", "")); 
      serverStatus.IoWaitCpuTime = float.Parse(fillterwords[6].Replace("%", "")); 
      serverStatus.IrqCpuTime = float.Parse(fillterwords[7].Replace("%", "")); 
      serverStatus.SoftwareIrqCpuTime = float.Parse(fillterwords[8].Replace("%", "")); 
      serverStatus.StealCpuTime = float.Parse(fillterwords[9].Replace("%", "")); 
      serverStatus.GuestCpuTime = float.Parse(fillterwords[10].Replace("%", "")); 
      serverStatus.IdleCpuTime = float.Parse(fillterwords[11].Replace("%", "")); 

      serverstatus.Add(serverStatus); 
     } 
     dataGridView1.DataSource = serverstatus; 
} 


class ServerStatusCpu 
{ 
    public class ServerStatusCpu 
    { 
     public string Time { get; set; } 

     public string TimeType { get; set; } 

     public string Name { get; set; } 

     public float UserCpuTime { get; set; } 

     public float SystemCpuTime { get; set; } 

     public float UserNiceCpuTime { get; set; } 

     public float IdleCpuTime { get; set; } 

     public float IoWaitCpuTime { get; set; } 

     public float IrqCpuTime { get; set; } 

     public float SoftwareIrqCpuTime { get; set; } 

     public float StealCpuTime { get; set; } 

     public float GuestCpuTime { get; set; } 
    } 
} 

回答

0

您有相关的事实,服务器不知道该输入应该被重定向其任期问题。

请看看http://www.linuxquestions.org/questions/programming-9/term-environment-variable-not-set-593180/

你需要能够获得任何输出之前设置TERM变量。

+0

此外,当您通过SSH连接到机器并手动调用命令时会发生什么? – 2013-05-14 13:13:31

+0

感谢您的回答 我看到你已经把一个链接,但我的问题并没有解决我的问题,因为这个事件 这就是当我连接到Lyvnks和我运行这个命令-bn1顶部 我只是不精确top或top-i命令或其他命令top -n 2我的问题 不解决请告诉我如何解决此问题ssh.net库 谢谢 – Martin 2013-05-14 18:20:05

+0

如何在top -yourargs> outputfile中运行某些内容,然后读取输出文件的转储? – 2013-05-15 07:12:49

0

使用此:top -n1b

随着命令行参数顶部b

开始。在“批量”模式,这可能是用于发送从顶部 输出到其他程序或文件是有用的。在这个 模式下,顶部将不会接受输入,并且一直运行,直到您使用'-n'命令行选项设置的迭代限制为 ,或者直到 死亡。

更多帮助信息看man top

BTW -

尼斯代码示例,这是我的版本裁判代码:)

使用MoreLINQ,还需要添加一些代码来返回结果。

static void ParseTop(string contentOfOutput) 
{ 
    var line = contentOfOutput.Split('\n'); 

    //parse uptime/user/load.avg 
    var lineUud = line[0].Substring("top -".Length); 

    var wordsUud = lineUud.Split(new[] { "up", "load average:", ",", " " }, StringSplitOptions.RemoveEmptyEntries); 
    //00:00:00 up 0 days, 17:51, 0 users, load average: 0.00, 0.01, 0.05 
    //^0   ^1 ^2 ^3  ^4 ^5(unused)   ^6 ^7 ^8 
    //00:00:00 up 0 min, 1 user, load average: 0.00, 0.01, 0.05 
    //^0   ^1 ^2 ^3 ^4(unused)   ^5 ^6 ^7 

    var time = TimeSpan.Parse(wordsUud[0]); 
    if (wordsUud[2] == "days") 
    { 
     var uptime = TimeSpan.Parse(wordsUud[1] + "." + wordsUud[3] + ":00"); 
     var users = int.Parse(wordsUud[4]); 
     var la1Min = float.Parse(wordsUud[5]); 
     var la5Min = float.Parse(wordsUud[6]); 
     var la15Min = float.Parse(wordsUud[7]); 
    } 
    else 
    { 
     var uptime = TimeSpan.Parse("00:" + wordsUud[1] + ":00"); 
     var users = int.Parse(wordsUud[3]); 
     var la1Min = float.Parse(wordsUud[4]); 
     var la5Min = float.Parse(wordsUud[5]); 
     var la15Min = float.Parse(wordsUud[6]); 
    } 


    //parse tasks 
    var lineTasks = line[1].Substring("Tasks:".Length); 

    var wordTasks = lineTasks.Split(new[] { "total", "running", "sleeping", "stopped", "zombie", ",", " " }, StringSplitOptions.RemoveEmptyEntries); 
    //70 total, 1 running, 69 sleeping, 0 stopped, 0 zombie 
    //^0   ^1   ^2    ^3   ^4 
    var totalTasks = int.Parse(wordTasks[0]); 
    var runningTasks = int.Parse(wordTasks[1]); 
    var sleepingTasks = int.Parse(wordTasks[2]); 
    var stoppedTasks = int.Parse(wordTasks[3]); 
    var zombieTasks = int.Parse(wordTasks[4]); 

    //parse cpu 
    var cpus = new Dictionary<string, Dictionary<string, float>>(); 

    var cpuLineIndex = 2; 
    string cpuLine; 
    while ((cpuLine = line[cpuLineIndex]).StartsWith("%Cpu")) 
    { 
     var wordCpu = cpuLine.Split(new[] { "%Cpu", ":", ",", " " }, StringSplitOptions.RemoveEmptyEntries); 
     //%Cpu(s): 0.2 us, 0.6 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st 
     //%Cpu1 : 0.2 us, 0.6 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st 
     // ^0 ^1 ^2 ^3 ^4 ^5 ^6 ^7 ^8 ^9 ^10 ^11 ^12 ^13 ^14 ^15 ^16 

     var cpu = new Dictionary<string, float>(); 
     foreach (var entry in wordCpu.Skip(1).Batch(2).Where(p => p.Count() == 2).Select(p => p.ToArray())) 
     { 
      cpu[entry[1]] = float.Parse(entry[0]); 
     } 

     cpus[wordCpu[0]] = cpu; 
     cpuLineIndex++; 
    } 

    //parse memory/swap 
    var memories = new Dictionary<string, Dictionary<string, int>>(); 

    var memLineIndex = cpuLineIndex; 
    string memLine; 
    while ((memLine = line[memLineIndex]).StartsWith("KiB")) 
    { 
     var wordMem = memLine.Split(new[] { "KiB", ":", ",", " " }, StringSplitOptions.RemoveEmptyEntries); 
     //KiB Mem: 993780 total, 968936 used, 24844 free, 418236 buffers 
     //KiB Swap: 524284 total,  0 used, 524284 free, 506312 cached 
     // ^0  ^1  ^2  ^3  ^4  ^5  ^6  ^7  ^8 

     var mem = new Dictionary<string, int>(); 
     foreach (var entry in wordMem.Skip(1).Batch(2).Where(p => p.Count() == 2).Select(p => p.ToArray())) 
     { 
      mem[entry[1]] = int.Parse(entry[0]); 
     } 

     memories[wordMem[0]] = mem; 
     memLineIndex++; 
    } 


    //parse process 
    var process = new List<Dictionary<string, string>>(); 

    var lineNumOfBlank = Array.IndexOf(line, ""); 
    var headers = line[lineNumOfBlank + 1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 

    for (var i = lineNumOfBlank + 2; i < line.Length - 1; i++) 
    { 
     var li = line[i]; 
     var strings = li.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 

     var dic = new Dictionary<string, string>(); 
     for (var j = 0; j < headers.Length; j++) 
     { 
      dic[headers[j]] = strings[j]; 
     } 

     if (strings.Length > headers.Length) //process name has space? 
     { 
      for (var j = headers.Length; j < strings.Length; j++) 
      { 
       dic[headers[headers.Length - 1]] += " " + strings[j]; 
      } 
     } 

     process.Add(dic); 
    } 
}