Transparente Durchreiche zur Konsole?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Wie mache ich eine transparente Durchreiche zur Konsole (bash, cmd, usw.. )?

Das Ganze sollte eine CGI-HTML-Seite werden mit einem Konsolenfenster und soll sich identisch verhalten, wie die Konsole im Hintergrund (auch ncurses soll 1 zu 1 rüberkommen).

Die einzige Einschränkung, die ich in kauf nehmen muss ist, dass ich für die Eingabezeile ein extra form-Feld bauen muss, um auch übermitteln zu können oder (ncurses buttons und tab-navigation :?: )?

Gruss, Dominik
Vortec
User
Beiträge: 52
Registriert: Dienstag 10. Dezember 2002, 11:54

Ncurses wirst du im Browser nicht so ohne weiteres darstellen können. Du kannst dir zwar theoretisch eine Lösung mit DHTML, Javascript und vielen Anfragen an den Webserver basteln, allerdings ist das mit einer Menge Aufwand und Wissen verbunden. Es gibt dafür keine einfache Lösung.
Etwas anderes wäre eine simple Webshell, in der der User alle Befehle die sich "pipen" lassen (sprich: "ls", "cat", "echo", usw.) eintippen kann. Deren Output könntest du in eine Art Buffer schreiben und diesen an den Client schicken. Die Befehle führst du dann im Script mit os.popen() aus.
| [url=http://www.sourceforge.net/projects/propolice/]propolice[/url] | [url=http://del.icio.us/vortec/]bookmarks[/url] | [url=http://www.BlowIRC.net/]irc[/url] | [url=irc://irc.BlowIRC.net/python]#python[/url] |
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Das mit dem DHTML ist kein Problem, da ich davon mehr Ahnung habe als von GUI-Programmierung, soll das ganze Projekt (*) über HTML laufen.

Was mir nicht klar ist, ist der Python Teil.

Wie kommunitiere ich mit der Shell in beide Richtungen?

In welcher Form kann ich ncurses auslesen?
Und wie kann ich die Benutzeraktion zurückgeben?

Keine simple Webshell, ich will eine Representation der richtigen Shell, die im Hintergrund arbeitet.

os.popen(), ich hatte etwas in dieser Art vermutet :wink:
Deren Output könntest du in eine Art Buffer schreiben
Bedeutet das, dass ich die Shell per Python starten muss, mit spezial Optionen, um die stdin, stdout und stderr umleiten zu konnen?

*GMC (Gentoo Menagement Console oder ähnlicher Stuss mit diesen Buchstaben :wink: )

Danke, Dominik
Vortec
User
Beiträge: 52
Registriert: Dienstag 10. Dezember 2002, 11:54

Wie kommunitiere ich mit der Shell in beide Richtungen?
Nunja. Du könntest dir einen Stream bauen, dessen Dessenfluss erst endet wenn du es willst. D.h., du hörst einfach nicht auf Daten an den Browser zu senden (welche natürlich nur dann gesendet werden wenn auch wirklich etwas passiert), wie bei Webchats. Das wäre die eine Richtung. Die andere Richtung könnte sich mit JavaScript lösen lassen. Ich hatte so etwas auf einem Plonesprint mal gesehen, dort hatte Jean-Paul Ladage ein Produkt vorgestellt, welches JavaScript benutzte, um Daten an den Server zu schicken (der Zweck war Nutzereingaben zu speichern) ohne einen Reload des Browsers zu provozieren, halt nur mit JavaScript. Wie das genau geht, weiß ich nicht - da fragst du ihn am besten mal selber oder schaust im Internet.
In welcher Form kann ich ncurses auslesen?
Das könnte der schwierigste Teil werden. Deswegen sprach ich im ersten Post von "Wissen" was du hierfür benötigst. Mein Wissen reicht dazu nicht aus, vielleicht fragst du mal in einem C-Forum.
Und wie kann ich die Benutzeraktion zurückgeben?
Siehe oben.
Bedeutet das, dass ich die Shell per Python starten muss, mit spezial Optionen, um die stdin, stdout und stderr umleiten zu konnen?
Damit meinte ich eigentlich, die Befehle die der User eingetippt hat und deren Output in eine Variable oder File zu speichern, damit er sich ganz "Bash-like" fühlt. Halt dass nicht nur der letzte Befehl angezeigt wird, sondern alle. Gilt aber nur für die simple Webshell.
| [url=http://www.sourceforge.net/projects/propolice/]propolice[/url] | [url=http://del.icio.us/vortec/]bookmarks[/url] | [url=http://www.BlowIRC.net/]irc[/url] | [url=irc://irc.BlowIRC.net/python]#python[/url] |
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich sag dir, das ist unglaublich schwer und unter Windows wirst du das sowieso nicht schaffen.

Es ist schon schwer genug eine Shell mit einem Tk zu erstellen, von HTML ganz zu schweigen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Ich sag dir, das ist unglaublich schwer und unter Windows wirst du das sowieso nicht schaffen.
So krass? Es soll ein Linux admin tool werden, folglich ist mir Windows wurst, jedoch währe es cool über putty ein Linux fernadministrieren zu können :wink:
Es ist schon schwer genug eine Shell mit einem Tk zu erstellen, von HTML ganz zu schweigen.
Wo ist der Unterschied, abgesehen davon, dass ich von Tk keine Ahnung habe?
HTML hatte ich gewählt, da ich da Heimvorteil besitze (ich dachte zu erst an wxPython).
Eigentlich ist mir das Frontend egal, da ich die GUI (soweit möglich) von der Logik trennen möchte.
Das könnte der schwierigste Teil werden. Deswegen sprach ich im ersten Post von "Wissen" was du hierfür benötigst. Mein Wissen reicht dazu nicht aus, vielleicht fragst du mal in einem C-Forum.
Da wirst du wohl Recht haben.

Ist die Ncurses-ausgabe in ASCII?

Gruss, Dominik
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Slalomsk8er,

hmm was du machen willst, geht doch über ssh, damit kannst du dich an einem entfernten Rechner ganz normal in der Console einloggen. Jedes Consoletool kannst du dann dort aufrufen, auch Tools die ncurses verwenden.
Ansonst gibts unter Linux auch z.B. Screen, mit dem sich sogar grafische Programme auf dem entfernten Rechner starten lassen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Slalomsk8er hat geschrieben:Es soll ein Linux admin tool werden, folglich ist mir Windows wurst, jedoch währe es cool über putty ein Linux fernadministrieren zu können :wink:
Und was hindert dich daran? Das mache ich auch so.
Slalomsk8er hat geschrieben:
Es ist schon schwer genug eine Shell mit einem Tk zu erstellen, von HTML ganz zu schweigen.
Wo ist der Unterschied, abgesehen davon, dass ich von Tk keine Ahnung habe?
HTML hatte ich gewählt, da ich da Heimvorteil besitze (ich dachte zu erst an wxPython).
Eigentlich ist mir das Frontend egal, da ich die GUI (soweit möglich) von der Logik trennen möchte.
Ich habe von einem Tk gesprochen, nicht von Tk.. wenn dann wohl eher PyGTK oder wx ;) GTK hat wesentlich mehr Interaktionsmöglichkeiten als DHTML, läuft auch viel schneller als JavaScript.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Hauptsächlich, wird es eine Administrationstool, bei dem man die Docu, für das was man macht, gerade nebenan hat.

Also als erstes Zugriff auf die Shell und zwar beliebig oft (screen, bash und eventuell ssh, für nicht locale Dinge).

Als nächstes ein Docubrowser für info, man (über die Shell) und die eigene Projekt bezogene Docu (z.B. Gentoo Installation).

Nun kommt noch ein Tool um Config-Dateien besser bearbeiten zu können. Mit Dropdownlisten und so (solche Dinge, sind der Grund, weshalb ich das nicht direkt in der Bash realisieren kann), wo man die gängigen Werte für die Variablen ablesen und auch gleich auswählen kann.

Und zum Schluss, ein Log, das alles aufzeichnet. Möglicherweise könnte man daraus auch gleich automatisch simple Shellscripts erstellen lassen.

Falls es euch interessiert, hier ist die Entstehungsgeschichte.

Gruss, Dominik
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Alles, bis auf die Shell ließe sich recht leicht realisieren. Nur von DHTML würde ich dir abraten, das macht alles noch viel komplizierter, da es so nett eingeschränkt ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Alles, bis auf die Shell ließe sich recht leicht realisieren. Nur von DHTML würde ich dir abraten, das macht alles noch viel komplizierter, da es so nett eingeschränkt ist.
DHTML ist für mich einfacher als wxPython (GUI-Programmierung habe ich absolut nicht begriffen).

Möglicherweise werde ich Xul verwenden http://www.mozilla.org/projects/xul/ http://www.xulplanet.com/.

Was mir Kopfzerbrechen bereited ist nicht das GUI, sondern die Kommunikation mit der Shell. Hat jemand Tips oder Links für mich?

Gruss, Dominik
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Slalomsk8er hat geschrieben:DHTML ist für mich einfacher als wxPython (GUI-Programmierung habe ich absolut nicht begriffen).
Die Welt endet nicht bei wx.

Müsstest mal schauen was die Bash so zu pipes sagt, aber ich vermute, dass du diese Idee zumindest in Python und JavaScript begraben kannst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Ich bin am experimentieren, bis jetzt habe ich eine shell (-i, interactive) im pythonscript in der shell ;)

Kann man bei Python Variablen per URL mit geben wie bei PHP (URL?foo=bar)?

Gruss, Dominik
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Slalomsk8er hat geschrieben:Ich bin am experimentieren, bis jetzt habe ich eine shell (-i, interactive) im pythonscript in der shell ;)
Gut, ich experimentiere mit der Z-Shell und Pipes, allerdings gelingt das nicht besonders gut.
Slalomsk8er hat geschrieben:Kann man bei Python Variablen per URL mit geben wie bei PHP (URL?foo=bar)?
Meinst du jetzt online oder als Programm? Ja, kann man, guck mal in sys.argv, importiere aber erst das sys Modul.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Z-Shell, nie gehört bis jetzt.

Online, mit sys.argv hatte ich bereits in der Shell das Vergnügen.

Ich glaube die Metode, die ich suche ist Daten mit GET zu übermitteln und zwar in dem man das file, das die Daten verarbeiten soll mit den Daten als Anhang in der URL aufruft (http://localhost:8000/cgi-bin/test.py?content=home oder so). Nur wie greiffe ich die Daten ab? Etwa auch mit sys.argv oder bin ich da auf dem Holzweg?

Gruss, Dominik
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

Code: Alles auswählen

if environ.has_key('QUERY_STRING'):
        "vorhandene URL-Parameter parsen"
        for i in environ['QUERY_STRING'].split("&"):
            i=i.split("=")
            if len(i)==1:
                CGIdaten[ i[0] ] = ""
            else:
                CGIdaten[ i[0] ] = i[1]
Danke, ich glaube das ist genau was ich gemeint habe.

Nun bin ich Python CGI mässig bedient.
Also ran an die Shell ;)

Gruss, Dominik
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

In dieser gekürzten Fassung erhälst du aber nur die URL-Parameter, nicht aber die Daten aus dem FieldStorage()...
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

FieldStorage() hatte ich schon selber gefunden.

Keine angst, ich habe alles geklaut (die cooky Geschichte ist auch nett);)

Nun wüsste ich nur noch gerne, wie ich diesen Server zum laufen bringe (ich glaube nicht, dass serve_forever() hier auch geht):

Code: Alles auswählen

import CGIHTTPServer, SocketServer, socket

SERVERNAME = ""
PORT = 80
serveradresse=(SERVERNAME, PORT)

class MyServer(SocketServer.ThreadingTCPServer):
    allow_reuse_address = 1    # Seems to make sense in testing environment
    def server_bind(self):
        """Override server_bind to store the server name."""
        SocketServer.ThreadingTCPServer.server_bind(self)
        host, port = self.socket.getsockname()[:2]
        self.server_name = socket.getfqdn(host)
        self.server_port = port

class MyHandler(CGIHTTPServer.CGIHTTPRequestHandler):

    def is_cgi(self):
        """Tests whether self.path is a cgi-script"""
        path = self.path
        for x in self.cgi_directories:
            i = len(x)
            if path[:i] == x and (path[i+1:] and path[i] == '/'):
                self.cgi_info = path[:i], path[i+1:]
                return True
        return False
server = MyServer(serveradresse, MyHandler)
Quelle: http://python.sandtner.org/viewtopic.php?p=10896#10896

Ups, probieren geht über studieren. Es funzt doch mit server.serve_forever() :lol:

Gruss, Dominik
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Slalomsk8er hat geschrieben:Z-Shell, nie gehört bis jetzt.
The Z-Shell ist eine Unix Shell, die aber im Gegensatz zur Bash einen gelungenen Windows Port besitzt.
Slalomsk8er hat geschrieben:Online, mit sys.argv hatte ich bereits in der Shell das Vergnügen.

Ich glaube die Metode, die ich suche ist Daten mit GET zu übermitteln und zwar in dem man das file, das die Daten verarbeiten soll mit den Daten als Anhang in der URL aufruft (http://localhost:8000/cgi-bin/test.py?content=home oder so). Nur wie greiffe ich die Daten ab? Etwa auch mit sys.argv oder bin ich da auf dem Holzweg?
Du kannst das hier versuchen: http://python.sandtner.org/viewtopic.php?p=12224#12224
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten