File size: 3,899 Bytes
41387a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# 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()