通过HTTP流控制台输出(使用Ruby)

我试图远程运行一些命令,并且SSH不能进入机器。 我要做的是设置一个运行一些特定命令的Sinatra应用程序,并通过HTTP流输出输出。

示例操作如下所示:

get "/log" do `tail -f some.log` end 

1据我所知,我需要使用Unicorn(或Mongrel),因为Thin不支持流数据2我认为我需要通过某种IO ruby​​对象来管道输出命令

我几乎知道怎么做(1)但不知道如何实现(2)。

如果您在同步服务器上(即Mongrel,Unicorn, 而不是 Thin),您只需返回一个IO对象:

 require 'sinatra' get '/log' do content_type :txt IO.popen('tail -f some.log') end 

如果这不起作用(例如,如果您使用Thin),则可以使用新的流API:

 require 'sinatra' get '/log' do content_type :txt IO.popen('tail -f some.log') do |io| stream do |out| io.each { |s| out << s } end end end 

如果它包含ANSI颜色代码,您还可以使用bcat gem,它将为您的输出着色:

 require 'sinatra' require 'bcat' get '/log' do command = %[tail -f some.log] bcat = Bcat.new(command, :command => true) bcat.to_app.call(env) end 

注意:对于无限运行的进程,如果有人关闭连接,您必须自己处理该进程。 使用第一个解决方案,一些服务器可能会为您处理。