xor_tanakh_2 / app-webshell.py
neuralworm's picture
app
41387a4
# 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()