我正在编写一个node.js应用程序,我需要将各种命令的stdout解析为javascript对象,我可以通过websocket连接发送到浏览器。
让我们以ping为例。我想发回stdout
64 bytes from ip.isp.com (123.123.123.123): icmp_seq=2 ttl=53 time=7.92 ms
作为
之类的对象{
'icmp_seq': 2,
'ttl': 53,
'time': '7.92 ms'
}
我也想做很多不同的命令,包括nmap,所以我想确保我尽可能高效,智能地完成它。我现在的计划是做分裂和正则表达式比赛,但我想确保我没有错过任何东西。
答案 0 :(得分:3)
试试这个正则表达式:
^(?<Size>\d+) bytes from (?<DestinationHost>[^\s]+) \((?<DestinationIP>.+?)\): icmp_seq=(?<ICMPSequence>\d+) ttl=(?<TTL>\d+) time=(?<Time>.+)$
使用多行选项运行此选项。您将不得不调整它以使用您可能收到的所有输出,但是对于您发布的行,它将起作用。
获得结果后,您可以将每个匹配拉出到自己的变量或JSON对象中。
答案 1 :(得分:2)
分裂和正则表达式匹配可能就是我所做的,至少对于像ping
这样相当简单的命令。对于任何明显更复杂的事情,您可能必须创建一个基本的(甚至是非基本的)解析器。
答案 2 :(得分:2)
回到一百万年前,我开发了一些使用CLI命令收集系统信息的监控软件(Tivoli)。我所做的是从命令输出中大量使用“awk”管道的末尾。像这样的原生CLI工具的面向行的特性(有时)是一种简单的方法,可以切断CLI输出以实现“屏幕抓取”目的。
答案 3 :(得分:1)
许多'强大的'命令行实用程序将具有特殊的输出模式,旨在轻松解析。例如,我知道nmap有-oX用于XML输出,希望将它转换为JSON很简单。
以下是有关nmap的更多信息:
http://nmap.org/book/man-output.html
所以我强烈建议研究每个命令行实用程序并查找“解析预期”输出选项。
如果你去了正则表达式的路线,一定要尽可能宽容。而不是捕获整个stdout缓冲区并尝试将整个事物解析为一个全局匹配,我会尝试获取您正在寻找的信息的特定子模式,但是ymmv。
但长话短说,不要在这里重新发明轮子。我希望对于每个不同的util,至少有一个页面/线程在线,有人已经这样做了。