Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从基于web的界面运行shell命令的最佳方式是什么?_Python_Ruby On Rails_Ruby_Django_Shell - Fatal编程技术网

Python 从基于web的界面运行shell命令的最佳方式是什么?

Python 从基于web的界面运行shell命令的最佳方式是什么?,python,ruby-on-rails,ruby,django,shell,Python,Ruby On Rails,Ruby,Django,Shell,想象一下,一个web应用程序允许登录用户在web服务器上按一个按钮即可运行shell命令。在大多数语言中,通过一些标准的库操作系统工具,这是相对简单的 但是,如果该命令长时间运行,您不希望UI挂起。同样,使用某种后台进程或将要执行的命令放入消息队列(并可能将输出和状态保存到某个地方以供以后使用)相对容易处理。快回来,我们会处理好的,然后再打给你 我想做的是显示所述WebUI触发的shell命令的输出。所以垂直滚动文本就像在终端上运行一样 我对如何处理这个问题有一个模糊的想法,可能是将输出流式传输

想象一下,一个web应用程序允许登录用户在web服务器上按一个按钮即可运行shell命令。在大多数语言中,通过一些标准的库操作系统工具,这是相对简单的

但是,如果该命令长时间运行,您不希望UI挂起。同样,使用某种后台进程或将要执行的命令放入消息队列(并可能将输出和状态保存到某个地方以供以后使用)相对容易处理。快回来,我们会处理好的,然后再打给你

我想做的是显示所述WebUI触发的shell命令的输出。所以垂直滚动文本就像在终端上运行一样

我对如何处理这个问题有一个模糊的想法,可能是将输出流式传输到websocket,然后简单地将输出打印到屏幕上

我想问的是:


他们的任何插件、库或应用程序都已经做到了这一点。一些我可以使用或阅读的来源。理想情况下,它是一个开放源码的python/django或ruby/rails工具,但其他堆栈也会很有趣。

我不确定这是否是您想要的,但还有一些基于web的ssh客户端。如果您关心安全性并且真正想要动态反馈,那么您可以查看comet,或者只需要一个带有自己http会话的框架,该会话在打印完成之前不会结束。

基于web的ssh客户端可以在主机中工作(有java ssh客户端)

Ruby有一个基于web的终端: (指向源的链接位于页面底部)。 您还可以通过jruby嵌入Ruby:

我还没有听说有任何库可以这样做,但是您需要设置system命令并调用系统。然后,您需要“泵送”sysout和syserr标准输入,并通过管道将数据传回web客户端

作为这类问题的一个例子,请查看人们如何使用ruby/python/etc对视频进行转码的代码片段,例如,我的示例取自这篇博客文章

class MediaFormatException < StandardError
end

def execute_mencoder(command)
  progress = nil
  IO.popen(command) do |pipe|
    pipe.each("r") do |line|
      if line =~ /Pos:[^(]*(s*(d+)%)/
        p = $1.to_i
        p = 100 if p > 100
        if progress != p
          progress = p
          print "PROGRESS: #{progress}n"
          $defout.flush
        end
      end
    end
  end
  raise MediaFormatException if $?.exitstatus != 0
end
类MediaFormatException100,p=100
如果进展!=p
进度=p
打印“进度:#{PROGRESS}n”
$defout.flush
结束
结束
结束
结束
如果$?.exitstatus!=0,则引发MediaFormatException
结束
我不知道这个示例是否同时从sysout和syserr中提取数据,但您肯定需要同时从这两个接口中提取数据,通常,如果缓冲区填满,执行命令可能会挂起或失败(我在Python中遇到过这种情况)。如果您只需将
返回到web客户端,则此方法看起来也会有所不同-在终端中,ffmpeg/mencoder的进度指示器在底线上保持不变,但此方法将为您提供一长串进度指示器更新。将
发送到您的终端,您将看到我所做的我指的是。

当然不是运行shell命令的最佳方式,但可能是最简单的方式:

#!/bin/sh

echo Content-Type: text/plain
echo

/usr/bin/uptime

因此,我试图用代码回答我自己的问题,因为我找不到任何符合要求的东西。希望它对遇到同样问题的任何人都有用

Redbeard 0X0A为我指出了大致的方向,我能够得到一个支持ruby脚本,使用popen做我想做的事情。将其扩展到使用EventMachine(因为它提供了一种编写websocket服务器的便捷方式)并使用其内置的popen方法解决了我的问题

此处有更多详细信息,代码位于

查看(在线)或

除了要求能够在作业运行期间显示输出外,它们都是解决这一问题的优秀解决方案!它们都是用Python编写的(甚至在django上也使用Yabi)

它们都是在考虑生物信息学的基础上构建的,但实际上都是通用的工作人员/工作流工具

它们将允许您在web界面中指定参数,在单独的列中查看排队/运行/完成的作业,并在作业完成后检查详细信息和结果,或使用可能更改的参数重新运行作业

Galaxy更容易安装。Galaxy安装归结为下载并运行“sh run.sh”),添加您自己的工具归结为在以下行中创建XML文件:

<tool id="mytool" name="My Tool" version="1.0.0">
  <description>Does this and that</description>
  <command>somecommand --aparam $aparam</command>
  <inputs>
    <param name="aparam" type="text" label="A parameter"/>
  </inputs>
  <outputs>
    <data name="outfile" format="tabular"/>
  </outputs>
</tool>

这个和那个
somecommand——aparam$aparam
。。。并将其放在/tools文件夹中,在tool_conf.xml中添加一行,告诉galaxy您的新工具(在那里您还可以去掉生物信息学工具,这样它们就不会弄乱您的工具菜单)

Yabi的安装更加复杂(请参阅自述文件),但是如果您使用的是正确的系统,安装过程可能会更加顺利。另一方面,它甚至允许您在web界面中进行工具配置,而不是像Galaxy中那样作为XML文件


Galaxy仍然是拥有最大社区的公司,这反映在功能/已集成工具的数量上(请参阅共享工具/包装器)。

看起来是实现这一点的完美工具。

运行该命令的问题较少,我更感兴趣的是在web界面中逐行显示命令的输出。简化这种方法会给我带来后端,我认为使用IO.popen会在输出时逐行返回。然后只需要把它放到前端。