neuralworm commited on
Commit
285c547
·
1 Parent(s): f054e62

initial commit

Browse files
Files changed (1) hide show
  1. app.py +113 -0
app.py ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app.py
2
+
3
+ import gradio as gr
4
+ import subprocess
5
+ import shlex
6
+
7
+ # --- SICHERHEITSHINWEIS ---
8
+ # Diese Webshell führt beliebigen Code auf dem Server aus.
9
+ # Machen Sie diesen Space NICHT öffentlich, es sei denn, Sie verstehen die Risiken.
10
+ # Jeder, der Zugriff auf diesen Space hat, kann Befehle ausführen.
11
+ # Am besten nur für private oder organisatorische Spaces verwenden.
12
+ # -------------------------
13
+
14
+ WARNING_MESSAGE = """
15
+ ⚠️ **SICHERHEITSWARNUNG** ⚠️
16
+
17
+ Dies ist eine funktionierende Web-Shell. Jeder Befehl, den Sie hier eingeben,
18
+ wird direkt auf dem Server des Hugging Face Space ausgeführt.
19
+
20
+ - **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.
21
+ - Nutzen Sie diesen Space nur für private Zwecke oder innerhalb Ihrer Organisation.
22
+ - Seien Sie vorsichtig mit den Befehlen, die Sie ausführen (z. B. `rm -rf /`).
23
+ """
24
+
25
+ def execute_command(command):
26
+ """
27
+ Führt einen Shell-Befehl sicher aus und gibt stdout und stderr zurück.
28
+ """
29
+ if not command:
30
+ return "Bitte geben Sie einen Befehl ein.", ""
31
+
32
+ try:
33
+ # Führe den Befehl aus.
34
+ # shell=True ist notwendig, um eine "echte" Shell-Umgebung zu haben
35
+ # (z.B. für Pipes | oder cd), aber es ist auch ein Sicherheitsrisiko.
36
+ # Deswegen die große Warnung oben!
37
+ process = subprocess.run(
38
+ command,
39
+ shell=True,
40
+ capture_output=True,
41
+ text=True,
42
+ timeout=60 # Timeout von 60 Sekunden, um Endlos-Prozesse zu verhindern
43
+ )
44
+
45
+ # Kombiniere Standardausgabe und Standardfehler für die Anzeige
46
+ stdout = process.stdout
47
+ stderr = process.stderr
48
+
49
+ # Gib eine informative Nachricht zurück, wenn kein Output kam
50
+ if not stdout and not stderr:
51
+ return "Befehl ausgeführt, keine Ausgabe.", ""
52
+
53
+ return stdout, stderr
54
+
55
+ except subprocess.TimeoutExpired:
56
+ return "", "Fehler: Der Befehl hat das Zeitlimit von 60 Sekunden überschritten."
57
+ except Exception as e:
58
+ return "", f"Ein unerwarteter Fehler ist aufgetreten: {str(e)}"
59
+
60
+ # Wir definieren das Gradio Interface
61
+ with gr.Blocks(theme=gr.themes.Monochrome(), css=".gradio-container {background-color: #1a1a1a;}") as demo:
62
+ gr.Markdown(f"# 🐍 Python Web-Shell für Hugging Face Spaces")
63
+ gr.Markdown(WARNING_MESSAGE)
64
+
65
+ with gr.Row():
66
+ command_input = gr.Textbox(
67
+ label="Shell-Befehl eingeben",
68
+ placeholder="z.B. ls -l, whoami, pwd, pip list"
69
+ )
70
+
71
+ execute_button = gr.Button("🚀 Ausführen")
72
+
73
+ with gr.Row():
74
+ with gr.Column(scale=2):
75
+ gr.Markdown("### ✅ Standardausgabe (stdout)")
76
+ output_stdout = gr.Code(label="stdout", language="bash", interactive=False)
77
+
78
+ with gr.Column(scale=1):
79
+ gr.Markdown("### ❌ Standardfehler (stderr)")
80
+ output_stderr = gr.Code(label="stderr", language="bash", interactive=False)
81
+
82
+ # Verknüpfe die Button-Klicks und die Eingabe mit der Funktion
83
+ execute_button.click(
84
+ fn=execute_command,
85
+ inputs=command_input,
86
+ outputs=[output_stdout, output_stderr]
87
+ )
88
+ command_input.submit(
89
+ fn=execute_command,
90
+ inputs=command_input,
91
+ outputs=[output_stdout, output_stderr]
92
+ )
93
+
94
+ gr.Markdown("---")
95
+ gr.Markdown("### Nützliche Beispielbefehle:")
96
+ gr.Examples(
97
+ examples=[
98
+ "ls -la",
99
+ "pwd",
100
+ "whoami",
101
+ "env",
102
+ "pip list",
103
+ "df -h",
104
+ "cat /proc/cpuinfo",
105
+ "uname -a"
106
+ ],
107
+ inputs=command_input
108
+ )
109
+
110
+
111
+ # Starte die App
112
+ if __name__ == "__main__":
113
+ demo.launch()