2010-09-03 61 views
8

Hãy tưởng tượng một ứng dụng web cho phép người dùng đã đăng nhập chạy lệnh shell trên máy chủ web chỉ bằng một nút bấm. Điều này là tương đối đơn giản trong hầu hết các ngôn ngữ thông qua một số công cụ thư viện chuẩn của thư viện.Cách tốt nhất để chạy lệnh shell từ giao diện dựa trên web là gì?

Nhưng nếu lệnh đó hoạt động lâu, bạn không muốn giao diện người dùng của mình bị treo. Một lần nữa điều này là tương đối dễ dàng để đối phó với việc sử dụng một số loại quá trình nền hoặc đặt lệnh được thực hiện trên một hàng đợi tin nhắn (và có thể tiết kiệm đầu ra và tình trạng ở đâu đó để tiêu thụ sau này). Chỉ cần trở lại nhanh chóng tiết kiệm chúng tôi sẽ chạy điều đó và lấy lại cho bạn.

Điều tôi muốn làm là hiển thị kết quả của lệnh shell được kích hoạt web ui được kích hoạt vì nó xảy ra. Vì vậy, văn bản cuộn dọc như khi đang chạy trong một thiết bị đầu cuối.

Tôi có một ý tưởng mơ hồ về cách tôi có thể tiếp cận điều này, truyền đầu ra đến một websocket có lẽ và chỉ cần in đầu ra màn hình.

Những gì tôi muốn hỏi là:

Are của họ bất kỳ plugin, thư viện hoặc các ứng dụng đó đã làm điều này. Một cái gì đó tôi có thể sử dụng hoặc đọc nguồn gốc của. Lý tưởng nhất là một công cụ python/django hoặc ruby ​​/ rails mã nguồn mở, nhưng các ngăn xếp khác cũng sẽ rất thú vị.

Trả lời

1

Vì vậy, tôi đã cố gắng để trả lời câu hỏi của riêng tôi với mã như tôi couldn' t tìm thấy bất cứ điều gì để phù hợp với hóa đơn. Hy vọng rằng nó hữu ích cho bất cứ ai đi qua cùng một vấn đề.

Redbeard 0X0A chỉ cho tôi theo hướng chung, tôi có thể đứng lên dọc theo kịch bản ruby ​​đang làm những gì tôi muốn bằng cách sử dụng popen. Mở rộng điều này để sử dụng EventMachine (vì nó cung cấp một cách thuận tiện để viết một máy chủ websocket) và sử dụng phương thức popen sẵn có của nó đã giải quyết được vấn đề của tôi.

Xem thêm chi tiết tại đây http://morethanseven.net/2010/09/09/Script-running-web-interface-with-websockets.html và mã tại http://github.com/garethr/bolt/

1

Tôi không chắc chắn đó là những gì bạn muốn, nhưng có một số trang web dựa trên khách hàng ssh ra khỏi đó. Nếu bạn quan tâm đến bảo mật và thực sự chỉ muốn phản hồi động, bạn có thể xem xét sao chổi hoặc chỉ có một khung với phiên http của riêng nó mà không kết thúc cho đến khi in xong.

1

tôi đã không nghe nói về bất kỳ thư viện mà làm điều này, nhưng bạn sẽ cần phải thiết lập các lệnh hệ thống và gọi ra vào hệ thống. Sau đó, bạn sẽ cần phải "bơm" các đầu vào tiêu chuẩn sysout và syserr và đưa dữ liệu đó trở lại máy khách web của bạn.

Ví dụ về kiểu vấn đề này, hãy xem đoạn mã về cách mọi người sử dụng ruby ​​/ python/etc để chuyển mã video, ví dụ: http://kpumuk.info/ruby-on-rails/encoding-media-files-in-ruby-using-ffmpeg-mencoder-with-progress-tracking/ - ví dụ của tôi được lấy từ bài đăng trên blog này.

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 

Tôi không biết nếu ví dụ này là kéo dữ liệu từ cả hai sysout và syserr, nhưng bạn chắc chắn sẽ cần phải được kéo dữ liệu từ cả những giao diện, điển hình là nếu bộ đệm đầy lên, lệnh thực hiện sức mạnh treo hoặc thất bại (Tôi đã trải nghiệm điều này với Python). Phương pháp này cũng sẽ khác nếu điều duy nhất bạn làm là trả lại line cho máy khách web - trong một thiết bị đầu cuối, chỉ báo tiến trình của ffmpeg/mencoder vẫn giữ nguyên ở dòng dưới cùng, nhưng phương pháp này sẽ cung cấp cho bạn danh sách chỉ báo tiến trình dài cập nhật. Ống line ra khỏi thiết bị đầu cuối của bạn và bạn sẽ thấy những gì tôi đang đề cập đến.

+0

Cảm ơn. Đơn giản hóa cách tiếp cận này mang lại cho tôi phụ trợ mà tôi nghĩ - bằng cách sử dụng IO.popen sẽ trả về dòng theo đầu ra khi nó xảy ra. Sau đó, chỉ cần để có được nó vào lối vào. – Garethr

0

Chắc chắn không phải là tốt nhất cách để chạy các lệnh shell, nhưng nhiều khả năng dễ nhất:

#!/bin/sh 

echo Content-Type: text/plain 
echo 

/usr/bin/uptime 

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

+0

chạy lệnh là ít của vấn đề, tôi quan tâm nhiều hơn trong việc hiển thị đầu ra của dòng lệnh theo dòng như nó xảy ra trong giao diện web – Garethr

0

Hãy xem Galaxy (trực tuyến demo) hoặc Yabi.

Ngoại trừ yêu cầu để có thể hiển thị đầu ra trong khi chạy công việc, cả hai đều là giải pháp tuyệt vời cho điều này! Cả hai đều được viết i Python (và Yabi ngay cả trên django).

Cả hai đều được xây dựng với tin sinh học trong tâm trí, nhưng thực sự là cả hai công việc chung/công việc dòng công cụ.

Chúng sẽ cho phép bạn chỉ định tham số trong giao diện web, xem hàng đợi/chạy/hoàn thành công việc trong một cột riêng biệt và sau khi hoàn thành công việc, kiểm tra chi tiết và kết quả hoặc chạy lại công việc. .

Galaxy là cài đặt dễ dàng hơn. Bản cài đặt Galaxy được tải xuống để tải xuống và chạy "sh run.sh") và thêm công cụ của riêng bạn để tạo một tệp XML theo dòng:

<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> 

... và đặt nó vào/thư mục công cụ và thêm một dòng trong tool_conf.xml để nói cho thiên hà về công cụ mới của bạn (Ở đó bạn cũng có thể loại bỏ các công cụ tin sinh học, vì vậy chúng không làm hỏng trình đơn công cụ của bạn).

Yabi là phức tạp hơn để cài đặt (xem tệp readme), nhưng quá trình này có thể được mịn nếu bạn đang ở trên đúng loại hệ thống. Mặt khác, nó cho phép bạn thậm chí làm cấu hình công cụ trong giao diện web, chứ không phải là một tệp XML như trong Galaxy.

Galaxy vẫn là người có cộng đồng lớn nhất, được phản ánh về số lượng đối tượng địa lý/công cụ đã tích hợp (Xem toolshed cho công cụ/trình bao bọc được chia sẻ).

Các vấn đề liên quan