Spaces:
Sleeping
Sleeping
# 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() | |