2010-09-03 11 views
8

Wyobraź sobie aplikację internetową, która pozwala zalogowanemu użytkownikowi na uruchomienie polecenia powłoki na serwerze WWW za naciśnięciem jednego przycisku. Jest to stosunkowo proste w większości języków za pośrednictwem niektórych standardowych narzędzi os biblioteki.Jaki jest najlepszy sposób uruchamiania poleceń powłoki z interfejsu sieciowego?

Ale jeśli to polecenie jest już uruchomione, nie chcesz, aby Twój interfejs się zawiesił. Znowu jest to stosunkowo łatwe w obsłudze przy użyciu jakiegoś procesu w tle lub umieszczenia polecenia do wykonania w kolejce komunikatów (i może zapisanie danych wyjściowych i statusu gdzieś w celu późniejszego zużycia). Szybko wróć oszczędzając, uruchomimy to i skontaktujemy się z Tobą.

Co chcę zrobić, to pokazać wynik działania polecenia ui wywołanego przez sieć ui , tak jak to się dzieje. W ten sposób przewijasz tekst w pionie, np. Podczas pracy w terminalu.

Mam mgliste pojęcie o tym, w jaki sposób mogę się do tego podejść, przesyłając dane wyjściowe do websocket i po prostu wypisując wyjście na ekran.

Co chciałbym zadać to:

Czy są jakieś pluginy, biblioteki lub aplikacje, które już to zrobić. Coś, czego mogę użyć albo przeczytać źródło. Idealnie byłoby open source python/django lub narzędzie ruby ​​/ rails, ale inne stosy również byłyby interesujące.

Odpowiedz

1

Więc starałem się odpowiedzieć na moje własne pytanie z kodem jak ja mogłem” t znaleźć cokolwiek, co by pasowało do rachunku. Mam nadzieję, że przyda się każdemu, kto spotka się z tym samym problemem.

Redbeard 0X0A wskazał mi w ogólnym kierunku, udało mi się stanąć wzdłuż skryptu ruby ​​robiąc to, co chciałem, używając popen. Rozszerzenie tego na użycie EventMachine (ponieważ zapewniało wygodny sposób pisania serwera WebSocket) i wykorzystanie jego wbudowanej metody popen rozwiązało mój problem.

Więcej szczegółów tutaj http://morethanseven.net/2010/09/09/Script-running-web-interface-with-websockets.html i kod na http://github.com/garethr/bolt/

1

Nie jestem pewien, czy to jest to, czego chcesz, ale istnieje kilka internetowych klientów ssh tam. Jeśli zależy Ci na bezpieczeństwie i chcesz po prostu uzyskać dynamiczną informację zwrotną, możesz zajrzeć do komety lub po prostu mieć ramkę z własną sesją http, która nie kończy się, dopóki nie skończy się drukowanie.

1

Nie słyszałem żadnej bibliotek, które to zrobić, ale trzeba skonfigurować polecenia systemowego i zawołać do systemu. Będziesz wtedy musiał "pompować" standardowe wejścia i syserry i wyprowadzać dane z powrotem do twojego klienta WWW.

Jako przykład dla tego stylu problemu, spójrz na fragmenty kodu, jak ludzie używają ruby ​​/ python/etc do transkodowania wideo, tj. http://kpumuk.info/ruby-on-rails/encoding-media-files-in-ruby-using-ffmpeg-mencoder-with-progress-tracking/ - mój przykład został zaczerpnięty z tego posta na blogu.

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 

ja nie wiem, czy ten przykład ciągnie dane z obu sysout i syserr, ale na pewno trzeba ciągnąć dane z obu tych interfejsów, zazwyczaj jeśli bufor wypełnia polecenie wykonujące może zawiesić się lub zawieść (doświadczyłem tego w Pythonie). Ta metoda będzie wyglądać inaczej, jeśli jedyną rzeczą, którą zrobisz, jest zwrócenie line do klienta WWW - w terminalu wskaźnik postępu ffmpeg/mencoder pozostaje nieruchomy w dolnym wierszu, ale ta metoda da ci długą listę wskaźników postępu aktualizacje. Pipe line do terminalu, a zobaczysz, co mam na myśli.

+0

Dzięki. Uproszczenie tego podejścia daje mi backend, który myślę - użycie IO.popen zwróci wiersz po wierszu dane wyjściowe, jak to się dzieje. Następnie wystarczy, aby dostać się do frontendu. – Garethr

0

pewno nie najlepiej sposób uruchomić poleceń powłoki, ale prawdopodobnie najłatwiejszy:

#!/bin/sh 

echo Content-Type: text/plain 
echo 

/usr/bin/uptime 

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

+0

uruchamianie polecenia jest mniejszym problemem, bardziej interesuje mnie wyświetlanie linii poleceń po linii, jak to ma miejsce w interfejsie internetowym – Garethr

0

Spójrz na Galaxy (online demo) lub Yabi.

Z wyjątkiem wymogu, aby móc wyświetlać dane wyjściowe podczas wykonywania zadania, oba są doskonałym rozwiązaniem! Są one również napisane w języku Python (i Yabi nawet na django).

Zostały one zbudowane z myślą o bioinformatyce, ale tak naprawdę są zarówno ogólnymi narzędziami do pracy/przepływu pracy.

Pozwoli to na określenie parametrów w interfejsie internetowym, zobacz zadania kolejkowane/uruchomione/zakończone w osobnej kolumnie, a po zakończeniu zadań, sprawdź szczegóły i wyniki, lub ponownie uruchom zadanie, z ewentualnie zmienionymi parametrami .

Galaxy jest łatwiejsze do zainstalowania. Instalacja Galaxy sprowadza się do pobierania i uruchamiania „sh run.sh”) i dodając własne narzędzia sprowadza się do tworzenia pliku XML w wierszu:

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

... i umieścić go w katalogu/folder narzędzi i dodaj wiersz w pliku tool_conf.xml, aby poinformować galaktykę o nowym narzędziu (tam można również pozbyć się narzędzi bioinformatycznych, aby nie zepsuły menu narzędzi).

Yabi jest bardziej skomplikowany do zainstalowania (patrz plik readme), ale proces może być płynny, jeśli jesteś w odpowiednim systemie. Z drugiej strony pozwala nawet na konfigurację narzędzia w interfejsie internetowym, a nie jak plik XML, jak w Galaxy.

Jednak Galaxy jest nadal jedną z największych społeczności, co znajduje odzwierciedlenie w liczbie funkcji/już zintegrowanych narzędzi (Zobacz toolshed dla udostępnionych narzędzi/opakowania).

Powiązane problemy