You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask中点击页面按钮执行Shell脚本并展示运行输出

实现方案

1. 修改Flask后端代码(server.py)

新增接口用于接收前端触发请求,执行Shell脚本并返回执行结果,修改后完整代码如下:

from flask import Flask, render_template, request, jsonify
import subprocess

app = Flask(__name__)

@app.route("/")
@app.route("/home")
def home_page():
    return render_template('home.html')

@app.route("/main")
def main_page():
    return render_template('main.html')

# 新增执行脚本的接口
@app.post('/run-script')
def run_script():
    try:
        # 执行run.sh脚本,捕获标准输出和错误输出
        run_result = subprocess.run(
            ['./run.sh'],
            capture_output=True,
            text=True,
            check=True
        )
        return jsonify({
            "success": True,
            "output": run_result.stdout
        })
    except subprocess.CalledProcessError as e:
        return jsonify({
            "success": False,
            "output": e.stderr
        }), 500

if __name__ == '__main__':
    app.run(debug=True)

2. 修改主页面模板(main.html)

给按钮绑定点击事件,新增结果展示区域,请求后端接口后将输出渲染到页面,修改后完整代码如下:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">

    <title>Main Page</title>
  </head>
  <body>
    <div class="container mt-4">
        <button id="startBtn" class="btn btn-primary" type="button">Start</button>
        <!-- 结果展示区域 -->
        <div id="result" class="mt-3"></div>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
    <script>
        // 绑定按钮点击事件
        document.getElementById('startBtn').addEventListener('click', async () => {
            const resultBox = document.getElementById('result');
            resultBox.textContent = '脚本执行中,请稍候...';
            try {
                const resp = await fetch('/run-script', { method: 'POST' });
                const data = await resp.json();
                if (data.success) {
                    resultBox.innerHTML = `<h5>执行成功,输出结果:</h5><pre class="border p-2 bg-light">${data.output}</pre>`;
                } else {
                    resultBox.innerHTML = `<h5>执行失败,错误信息:</h5><pre class="border p-2 bg-light text-danger">${data.output}</pre>`;
                }
            } catch (err) {
                resultBox.innerHTML = `<h5>请求异常:</h5><pre class="border p-2 bg-light text-danger">${err.message}</pre>`;
            }
        })
    </script>
  </body>
</html>

注意事项

  • 首次运行前需要给run.sh添加执行权限,在项目根目录执行命令:chmod +x run.sh
  • 需确保main.py、run.sh的相对路径和Flask进程的工作目录匹配,避免出现找不到文件的报错
  • 该方案仅适合本地测试使用,生产环境严禁直接暴露可执行系统命令的接口,会存在严重的命令注入安全风险

内容的提问来源于stack exchange,提问作者eraisedtothepowerx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:54:01