如何在远程主机上运行命令并在GUI中实时显示输出?

时间:2015-12-07 15:45:19

标签: python node.js websocket

我知道这是一个真正开放式的问题,但我是python的新手,正在构建一个简单的一个Web应用程序,为非技术团队提供一些自助服务功能。这个团队有一堆重复的任务,他们将这些任务交给另一个只需要自动化的团队,比如重新启动远程主机上的一些进程,grep日志,清理旧文件,部署/重新启动应用程序的新版本,获取当前任务用户将点击按钮并在GUI中观看输出,他们不会手动输入命令来运行(我知道这是危险的)。任何新任务都将编写脚本并从技术支持团队添加到应用程序中。

现在,我唯一不确定的是如何从命令获得(接近)实时输出回GUI。我过去在PHP中构建了一个非常相似的应用程序,我所做的是将远程命令的输出刷新到db,然后使用ajax轮询db并附加新输出。虽然输出会以块的形式返回,但它非常简单并且工作得很好(我将输出逐行写入GUI,因此它看起来像是实时的)。有一个更好的方法吗?我正在考虑使用Web套接字将命令的输出推送回GUI。好主意?馊主意?有什么更好的python库?我也可以使用nodejs,如果这有什么不同,但我对这两种语言都不熟悉(我已经有一个简单的python烧瓶应用程序启动并运行,它充当了一个API,将几个业务应用程序粘合在一起,而不是在节点重写的重要事项)。

1 个答案:

答案 0 :(得分:1)

这是一个广泛的问题,但我会给你一些线索。

很好的例子是LogIo。一旦你愿意运行一些命令而不是将输出推送到GUI,使用Node.js就变成了自然的方法。这个应用程序可能包含很少的元素:

  • 第一部分运行命令并收集输出并将其推送到
  • 第二部分接收输出并将其保存到DB /文件。保存后,此部分将事件抛给
  • 第三部分,应该是一个websocket服务器,它将处理在线用户并将事件分发到
  • 第四部分,,它是一个预先编写脚本的GUI,能够通过websocket连接到第三部分,登录用户,接收事件并将它们广播到其他GUI元素。

一旦我认为你对PHP感觉比python更强大,你最简单的方法就是创建第二部分作为PHP服务来处理输入(将收获的输出保存到db)而不是说使用UDP包到第三部分的UDP侦听套接字。

第一部分将是python脚本,只是获取命令输出并将其正确地绕过第二部分。它应该像往常一样容易出现 grep 案例:

tail -f /var/log/apache2/access.log | /usr/share/bin/myharvester 

在开发它的某个时刻,你需要在 myharvester 之后传递用户或unical task id作为参数。

比你想象的更难以创建一个Node.js作为第三部分。作为单实例脚本,它应该能够接收输入并将其作为事件绕过给用户。我之前提交了类似的东西:

var config = {};
var app = require('http').createServer().listen(config.server.port);

var io = require('socket.io').listen(app);

var listenerDgram = require('dgram').createSocket('udp4');
listenerDgram.bind(config.listeners.udp.port);

var sprintf = require('sprintf').sprintf;

var users = [];

app.on('error', function(er) {
    console.log(sprintf('[%s] [ERROR] HTTP Server at port %s has thrown %s', Date(), config.server.port, er.toString()));
    process.exit();
});

listenerDgram.on('error', function(er) {
    console.log(sprintf('[%s] [ERROR] UDP Listener at port %s has thrown %s', Date(), config.listeners.udp.port, er.toString()));
    process.exit();
});

listenerDgram.on('message', function(msg, rinfo) {
    // handling, let's say, JSONized msg from part two script,
    // buildinf a var frame and finally
    if(user) {
        // emit to single user based on what happened
        // inside this method
        users[user].emit('notification', frame);
    } else {
        // emit to all users
        io.emit('notification', frame);
    }

});

io.sockets.on('connection', function(socket) {
    // handling user connection here and pushing users' sockets to
    // users aray.
});

这个废料是没有填写逻辑你需要的基本例子。脚本应该能够在给定端口上打开UDP侦听器并侦听在websockets中运行的用户。老实说,一旦你在Node.js中变得很好,你可能想用它来修复第二部分+第三部分,什么会使UDP部分关闭你,因为收割者将输出直接推送到脚本,维护内部的websocket。但它有一个缺点,就是将其他后端的一些逻辑重复为CRM。

Last( 4th )部分将用JavaScript实现Web界面,将当前登录的用户连接到套接字服务器。

之前我使用过类似的方法,并且它是实时工作的,所以我们可以在电话实际开始响铃之前向我们的呼叫中心员工显示有关来电的信息。最后,解决方案(不包括CRM界面)在两个脚本中关闭 - 专用CRM API部分(所有逻辑都发生)来处理来自Asterisk和Node.js事件转发器的事件。