Spaces:
Sleeping
Sleeping
Commit
·
285c547
1
Parent(s):
f054e62
initial commit
Browse files
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()
|