webssh / app.py
airsltd's picture
hi
1d2aa43
from flask import Flask, render_template, request, jsonify
import subprocess
import os
app = Flask(__name__)
session_state = {"cwd": "/", "env": os.environ.copy()}
def execute_command(cmd, state):
if not cmd.strip():
return []
if cmd.strip() == "exit":
return ["logout"]
try:
if cmd.startswith("cd "):
path = cmd[3:].strip().strip("'\"")
if path == "":
path = state["env"].get("HOME", "/")
elif path == "~":
path = state["env"].get("HOME", "/")
elif not path.startswith("/"):
path = os.path.join(state["cwd"], path)
if os.path.isdir(path):
state["cwd"] = os.path.realpath(path)
return []
else:
return [f"cd: {cmd[3:].strip()}: No such file or directory"]
result = subprocess.run(
cmd,
shell=True,
cwd=state["cwd"],
capture_output=True,
text=True,
timeout=10,
env=state["env"],
)
output = result.stdout
if result.stderr:
output += result.stderr
if not output:
return []
return output.rstrip("\n").split("\n")
except subprocess.TimeoutExpired:
return ["Command timed out"]
except Exception as e:
return [f"{cmd}: {str(e)}"]
@app.route("/")
def index():
return render_template("index.html")
@app.route("/execute", methods=["POST"])
def execute():
data = request.json
cmd = data.get("command", "")
output = execute_command(cmd, session_state)
return jsonify({"output": output, "command": cmd})
@app.route("/reset", methods=["POST"])
def reset():
session_state["cwd"] = session_state["env"].get("HOME", "/")
return jsonify({"status": "reset"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=7860)