OK, ihr habt recht
Ich hab eine neue Version fertig... Damit kann man Fast wie mit Putty arbeiten

Naja, zimindest ist es durch ein wenig JavaScript leichter immer wieder ein neues Kommando ein zu geben, denn per JavaScript wird der Fokus auf das Eingabefeld gesetzt... Außerdem geschied die Ausgabe nun als normales HTML... Somit ist der Prompt nun per <strong> Formatiert und alles ist leichter "lesbar"...
Code: Alles auswählen
#!/usr/bin/python
__version__ = "0.0.3"
import cgitb ; cgitb.enable()
import os, sys, locale, subprocess
print "Content-type: text/html\n\n"
html='''
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=%(charset)s" />
<title>console @ %(uname)s</title>
<script type="text/javascript">
function setFocus() {
document.form.cmd.focus();
}
</script>
<style type="text/css">
#cmd {
background-color:#FFEEEE;
}
#cmd:focus {
background-color:#EEFFEE;
}
</style>
</head>
<body onLoad="setFocus();">
%(stdout)s
<form name="form" id="form" method="post" action="%(self)s">
<input type="hidden" name="stdout" value="%(stdout_raw)s">
<input type="hidden" name="current_dir" value="%(current_dir)s">
<p><input name="cmd" type="text" id="cmd" size="150" /></p>
</form>
</body>
</html>'''
def GetCGIdata():
"CGI POST und GET Daten zur einfacheren Verarbeitung zusammen in ein Dict packen"
CGIdata={}
if os.environ.has_key('QUERY_STRING'):
# GET URL-Parameter parsen
for i in os.environ['QUERY_STRING'].split("&"):
i=i.split("=")
if len(i)==1:
if i[0]!="":
CGIdata[ i[0] ] = ""
else:
CGIdata[ i[0] ] = i[1]
from cgi import FieldStorage
FieldStorageData = FieldStorage()
# POST Daten auswerten
for i in FieldStorageData.keys():
CGIdata[i]=FieldStorageData.getvalue(i)
return CGIdata
CGIdata = GetCGIdata()
def cmd( command ):
process = subprocess.Popen( command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
return process.stdout.read() + process.stderr.read()
if CGIdata.has_key("stdout"):
# Alte Ausgaben wieder anzeigen
txt = CGIdata["stdout"]
else:
txt = ""
if CGIdata.has_key("current_dir"):
# Ins alte Verzeichnis wechseln
os.chdir( CGIdata["current_dir"] )
if CGIdata.has_key("cmd"): # Es wurde ein Befehl eingegeben
command = CGIdata["cmd"]
# Eingabe an altem Prompt anhängen
txt += command+"<br>"
# Eingegebener Befehl ausführen und Ausgaben anhängen
txt += cmd( command )
current_dir = os.getcwd()
# Neues, aktuelles Prompt anhängen
txt += "<strong>%s</strong>>" % current_dir
print html % {
"charset" : locale.getdefaultlocale()[1],
"uname" : cmd("uname -a"),
"self" : os.environ['SCRIPT_NAME'],
"stdout" : txt.replace("\n","<br>"),
"stdout_raw" : txt,
"current_dir" : current_dir
}
Ein Problem bereitet mir aber noch die Handhabung von Verzeichnis-Wechseln...
Wenn per subprocess ein "cd \" ausgeführt wird, ist danach per os.getcwd() ermitteltes Verzeichnis immer noch das Verzeichnis in dem die Python-Datei gestartet wurde...
Somit ist ein umher wandern im Dateisystem noch nicht möglich
Ich hab mir zwei Lösungen überlegt... Ich untersuche den eingegebenen Befehl, ob es ein "cd" oder "chdir" ist... Wenn ja, wird der nicht wirklich ausgeführt, sondern nur die Variable "current_dir" angepasst... Der nächste Befehl wird dann im richtigen Verzeichnis ausgeführt...
Oder Aber ich erweitere jeden Befehl mit "; pwd" um das aktuelle Verzeichnis anzeigen zu lassen... Diese Anzeige Filtere ich raus und setzte damit die Variable "current_dir", für`s nächte mal...