# app.py import gradio as gr import subprocess # --- SICHERHEITSHINWEIS --- # Diese Webshell führt beliebigen Code auf dem Server aus. # Machen Sie diesen Space NICHT öffentlich, es sei denn, Sie verstehen die Risiken. # Jeder, der Zugriff auf diesen Space hat, kann Befehle ausführen. # Am besten nur für private oder organisatorische Spaces verwenden. # ------------------------- WARNING_MESSAGE = """ ⚠️ **SICHERHEITSWARNUNG** ⚠️ Dies ist eine funktionierende Web-Shell. Jeder Befehl, den Sie hier eingeben, wird direkt auf dem Server des Hugging Face Space ausgeführt. - **Machen Sie diesen Space nicht öffentlich!** Fremde könnten ihn missbrauchen, um den Container zu beschädigen, Angriffe zu starten oder Ihre Daten (falls vorhanden) zu kompromittieren. - Nutzen Sie diesen Space nur für private Zwecke oder innerhalb Ihrer Organisation. - Seien Sie vorsichtig mit den Befehlen, die Sie ausführen (z. B. `rm -rf /`). """ def execute_command(command): """ Führt einen Shell-Befehl sicher aus und gibt stdout und stderr zurück. """ if not command: return "Bitte geben Sie einen Befehl ein.", "" try: # Führe den Befehl aus. # shell=True ist notwendig, um eine "echte" Shell-Umgebung zu haben # (z.B. für Pipes | oder cd), aber es ist auch ein Sicherheitsrisiko. # Deswegen die große Warnung oben! process = subprocess.run( command, shell=True, capture_output=True, text=True, timeout=600 # Timeout von 60 Sekunden, um Endlos-Prozesse zu verhindern ) # Kombiniere Standardausgabe und Standardfehler für die Anzeige stdout = process.stdout stderr = process.stderr # Gib eine informative Nachricht zurück, wenn kein Output kam if not stdout and not stderr: return "Befehl ausgeführt, keine Ausgabe.", "" return stdout, stderr except subprocess.TimeoutExpired: return "", "Fehler: Der Befehl hat das Zeitlimit von 60 Sekunden überschritten." except Exception as e: return "", f"Ein unerwarteter Fehler ist aufgetreten: {str(e)}" # Wir definieren das Gradio Interface with gr.Blocks(theme=gr.themes.Monochrome(), css=".gradio-container {background-color: #1a1a1a;}") as demo: gr.Markdown(f"# 🐍 Python Web-Shell für Hugging Face Spaces") gr.Markdown(WARNING_MESSAGE) with gr.Row(): command_input = gr.Textbox( label="Shell-Befehl eingeben", placeholder="z.B. ls -l, whoami, pwd, pip list" ) execute_button = gr.Button("🚀 Ausführen") with gr.Row(): with gr.Column(scale=2): gr.Markdown("### ✅ Standardausgabe (stdout)") # KORREKTUR: Der Parameter `language="bash"` wurde entfernt. output_stdout = gr.Code(label="stdout", interactive=False) with gr.Column(scale=1): gr.Markdown("### ❌ Standardfehler (stderr)") # KORREKTUR: Der Parameter `language="bash"` wurde entfernt. output_stderr = gr.Code(label="stderr", interactive=False) # Verknüpfe die Button-Klicks und die Eingabe mit der Funktion execute_button.click( fn=execute_command, inputs=command_input, outputs=[output_stdout, output_stderr] ) command_input.submit( fn=execute_command, inputs=command_input, outputs=[output_stdout, output_stderr] ) gr.Markdown("---") gr.Markdown("### Nützliche Beispielbefehle:") gr.Examples( examples=[ "ls -la", "pwd", "whoami", "env", "pip list", "df -h", "cat /proc/cpuinfo", "uname -a" ], inputs=command_input ) # Starte die App if __name__ == "__main__": demo.launch()