代码之家  ›  专栏  ›  技术社区  ›  Garethr

从基于Web的界面运行shell命令的最佳方法是什么?

  •  8
  • Garethr  · 技术社区  · 14 年前

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

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

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

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

    我想问的是:

    他们的插件、库或应用程序是否已经这样做了?我可以使用或读取的源代码。理想情况下是一个开源的python/django或ruby/rails工具,但是其他的堆栈也会很有趣。

    7 回复  |  直到 10 年前
        1
  •  1
  •   nmichaels    14 年前

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

        2
  •  1
  •   rogerdpack    14 年前

    基于Web的SSH客户端将工作在主机中(在那里有Java SSH客户端)。

    Ruby有一个基于网络的终端: http://tryruby.org (指向源的链接位于页面底部)。 您还可以通过jruby嵌入Ruby: http://tim.lossen.de/2007/03/jruby/applet.html http://github.com/jruby/jruby/blob/master/samples/irb-applet.html

        3
  •  1
  •   Astra    14 年前

    我没有听说有任何库可以这样做,但是您需要设置系统命令并向系统发出调用。然后,您将需要“抽取”sysout和syserr标准输入,并将这些数据通过管道返回到Web客户机。

    作为这种类型问题的一个例子,研究一下人们如何使用ruby/python/etc来转换视频的代码截图,也就是说。 http://kpumuk.info/ruby-on-rails/encoding-media-files-in-ruby-using-ffmpeg-mencoder-with-progress-tracking/ -我的例子摘自这篇博文。

    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
    

    我不知道这个示例是否同时从sysout和syserr中提取数据,但是您肯定需要从这两个接口中提取数据,通常如果缓冲区满了,执行命令可能挂起或失败(我在python中遇到过这种情况)。如果只返回 line 对于Web客户端-在终端中,ffmpeg/mencoder的进度指示器在底线上保持不变,但此方法将为您提供一长串进度指示器更新。管子 线 到了终点站,你就会明白我指的是什么。

        4
  •  1
  •   Garethr    14 年前

    所以,我试着用代码来回答我自己的问题,因为我找不到任何适合我的答案。希望它对遇到同样问题的任何人都有用。

    Redbeard 0x0A向我指出了一个大致的方向,我可以使用popen执行Ruby脚本中的任何操作。把它扩展到使用EventMachine(因为它提供了一种编写WebSocket服务器的方便方法),并使用它的内置popen方法解决了我的问题。

    此处提供更多详细信息 http://morethanseven.net/2010/09/09/Script-running-web-interface-with-websockets.html 代码在 http://github.com/garethr/bolt/

        5
  •  0
  •   sente    14 年前

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

    #!/bin/sh
    
    echo Content-Type: text/plain
    echo
    
    /usr/bin/uptime
    

    http://www.sente.cc/scripts/uptime.cgi

        6
  •  0
  •   Samuel Lampa    12 年前

    看一看 Galaxy (在线) demo Yabi .

    除了能够在作业运行期间显示输出的需求外,它们都是很好的解决方案!它们也都是写在i python(和yabi,甚至在django上)。

    它们都是在考虑生物信息学的基础上构建的,但实际上都是一般的工作运行程序/工作流工具。

    它们允许您在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>
    

    …把它放在/tools文件夹中,在tool conf.xml中添加一行,告诉Galaxy你的新工具(在那里你还可以去掉生物信息学工具,这样它们就不会弄乱你的工具菜单)。

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

    不过,Galaxy仍然是最大的社区,这反映在功能/已集成工具的数量上(请参见 toolshed 对于共享工具/包装器)。

        7
  •  0
  •   Alex Archambault    10 年前

    websocketd 看起来是完美的工具。