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

我知道这是一个真正的开放式问题,但我是新来的python,并build立一个简单的一个Web应用程序给非技术团队一些自我服务的能力。 这个团队有一堆重复的任务,他们踢到另一个团队,只是乞求自动化,如在远程主机上重新启动几个进程,grep日志,清理旧文件,部署/重新启动新版本的应用程序,获取当前运行版本等等。用户将点击button并观看GUI中的输出,他们不会手动input命令来运行(我知道这是危险的)。 任何新的任务将被编写并从技术支持团队添加到应用程序。

现在,我唯一不确定的是如何从命令中获得(接近)实时输出回GUI。 在过去我已经在PHP中构build了一个类似的应用程序,我所做的是将远程命令的输出刷新到db,然后用ajax轮询db并追加新的输出。 这是非常简单,工作很好,即使输出将回来大块(我有输出写入GUI线,所以它看起来像是实时)。 有一个更好的方法吗? 我正在考虑使用networking套接字将命令的输出返回到GUI。 好主意? 馊主意? 任何更好的Python库? 我也可以使用nodejs,如果这有什么区别的话,但我对这两种语言都是新手(我已经有一个简单的python烧瓶应用程序运行,作为一个API来粘合一些业务应用程序,而不是一个大问题重新写入节点)。

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

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

  • 第一部分运行命令,收获输出并推送
  • 第二部分接收输出并将其保存到DB /文件。 保存后,这部分正在向事件抛出
  • 第三部分 ,这应该是一个websocket服务器,它将处理在线用户和分发事件
  • 第四部分,这将是非常脚本化的GUI,可以通过websocket连接到第三部分,login用户,接收事件并将它们广播到其他GUI元素。

一旦我认为你比PHP感觉更强大的PHP,因为你最简单的方法将创build第二部分作为一个PHP服务来处理input(保存收获的输出到数据库),比方说,使用UDP包到第三部分的UDP监听套接字。

第一部分是python脚本来获取命令输出,并正确地绕过第二部分 。 像往常一样, grep的情况应该是一样容易:

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

在开发的某个时候,你将需要在收割机之后传递用户或任务ID作为参数。

棘手,但比你想象的要容易创build一个Node.js cript作为第三部分 。 作为单个实例脚本,它应该能够接收input并将其作为事件绕过给用户。 之前我曾经做过这样的事情:

 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侦听器,并侦听在websocket中运行的用户。 老实说,一旦你在Node.js中变得好了,你可能想用它来修复第二部分+第三部分,因为收割者会将输出直接推送到脚本,并在其中维护websocket,那么将会使用UDP部分。 但是它有一个缺点,就是像CRM一样从其他后端复制一些逻辑。

最后( 第四 )部分将实现与JavaScript内部的Web接口,将当前login的用户连接到套接字服务器。

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