当前位置: 首页 > news >正文

Flask登录页面后点击按钮在远程CentOS上自动执行一条命令

templates文件夹和app.py在同一目录下。

templates文件夹下包括2个文件:index.html     login.html

app.py代码如下:

import os
import time
from flask import Flask, render_template, request, redirect, session, make_response
import mysql.connector
from contextlib import contextmanagerapp = Flask(__name__)
app.secret_key = 'your_secret_key'# MySQL 连接配置
mysql_config = {'host': 'localhost','user': '数据库用户名','password': '密码','database': '数据库名称','buffered': True
}# 数据库连接上下文管理器
@contextmanager
def get_db_connection():try:cnx = mysql.connector.connect(**mysql_config)yield cnxexcept mysql.connector.Error as err:print(f"MySQL 操作出错: {err}")finally:if 'cnx' in locals() and cnx.is_connected():cnx.close()# 从 MySQL 获取用户名和密码
def get_user_credentials(username):with get_db_connection() as cnx:cursor = cnx.cursor()query = "SELECT password FROM users WHERE username = %s"cursor.execute(query, (username,))result = cursor.fetchone()cursor.close()return result[0] if result else None# 模拟按钮点击时间记录
class ButtonClickManager:def __init__(self, cooldown=3):self.last_click_time = 0self.cooldown = cooldowndef can_click(self):current_time = time.time()if current_time - self.last_click_time < self.cooldown:return Falseself.last_click_time = current_timereturn Truebutton_manager = ButtonClickManager()@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')stored_password = get_user_credentials(username)if stored_password and stored_password == password:session['username'] = usernamereturn redirect('/')else:return render_template('login.html', error='用户名或密码错误')return render_template('login.html')@app.route('/', methods=['GET', 'POST'])
def index():if 'username' not in session:return redirect('/login')return render_template('index.html', username=session['username'])@app.route('/send_email', methods=['POST'])
def send_email():if not button_manager.can_click():return "操作过于频繁,请稍后再试", 429try:# 调用脚本os.system("/home/auto/sendemail.sh")return "邮件发送脚本已执行"except Exception as e:return f"执行脚本时出错: {str(e)}", 500@app.route('/logout')
def logout():session.pop('username', None)return redirect('/login')if __name__ == '__main__':app.run(debug=True, port=5001)

index.html   

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>主页</title><style>body {font-family: "微软雅黑", sans-serif;text-align: center;padding-top: 50px;}button {padding: 10px 20px;background-color: #007BFF;color: white;border: none;border-radius: 3px;cursor: pointer;}button:disabled {background-color: #ccc;cursor: not-allowed;}</style><script>function sendEmail() {const button = document.getElementById('send-email-button');button.disabled = true;fetch('/send_email', {method: 'POST'}).then(response => response.text()).then(data => {alert(data);}).catch(error => {alert('出错了: ' + error.message);}).finally(() => {setTimeout(() => {button.disabled = false;}, 3000);});}</script>
</head><body><h1>欢迎,{{ username }}</h1><button id="send-email-button" onclick="sendEmail()">点我发送邮件</button><a href="/logout">退出登录</a>
</body></html>

 login.html

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录</title><style>body {font-family: "微软雅黑", sans-serif;}form {width: 300px;margin: 0 auto;padding: 20px;border: 1px solid #ddd;border-radius: 5px;}input {width: 100%;padding: 10px;margin-bottom: 10px;border: 1px solid #ddd;border-radius: 3px;}button {width: 100%;padding: 10px;background-color: #007BFF;color: white;border: none;border-radius: 3px;cursor: pointer;}button:hover {background-color: #0056b3;}.error {color: red;text-align: center;margin-bottom: 10px;}</style>
</head><body>{% if error %}<p class="error">{{ error }}</p>{% endif %}<form method="post"><input type="text" name="username" placeholder="用户名" required><input type="password" name="password" placeholder="密码" required><button type="submit">登录</button></form>
</body></html>    

在CENTOS上启动5001端口的服务器:

nohup /root/anaconda3/envs/py39/bin/gunicorn -w 4 -b 0.0.0.0:5001 app:app > /home/log/sendemail_code_gunicorn_log.txt 2>&1 &

相关文章:

Flask登录页面后点击按钮在远程CentOS上自动执行一条命令

templates文件夹和app.py在同一目录下。 templates文件夹下包括2个文件&#xff1a;index.html login.html app.py代码如下&#xff1a; import os import time from flask import Flask, render_template, request, redirect, session, make_response import mysql.con…...

深度解析:文件夹变白色文件的数据恢复之道

在数字化时代&#xff0c;数据的重要性不言而喻。然而&#xff0c;当我们在使用计算机时&#xff0c;偶尔会遇到一些棘手的问题&#xff0c;其中“文件夹变白色文件”便是一个令人困惑且亟待解决的难题。这一现象不仅影响了文件的正常访问&#xff0c;更可能隐藏着数据丢失的风…...

【Matlab】-- 基于MATLAB的飞蛾扑火算法与反向传播算法的混凝土强度预测

文章目录 文章目录 01 内容概要02 MFO-BP模型03 部分代码04 运行结果05 参考文献06 代码下载 01 内容概要 本资料介绍了一种基于飞蛾扑火算法&#xff08;Moth Flame Optimization, MFO&#xff09;与反向传播算法&#xff08;Backpropagation, BP&#xff09;的混凝土强度预…...

【Python实例学习笔记】图像相似度计算--哈希算法

【Python实例学习笔记】图像相似度计算--哈希算法 一、哈希算法的实现步骤&#xff1a;二、对每一步都进行注解的代码 一、哈希算法的实现步骤&#xff1a; 1、缩小尺寸&#xff1a; 将图像缩小到8*8的尺寸&#xff0c;总共64个像素。这一步的作用是去除图像的细节&#xff0c…...

2025DevSecOps标杆案例|智能制造国际领导厂商敏捷安全工具链实践

某智能制造国际领导厂商是涵盖智能家居、楼宇科技&#xff0c;工业技术、机器人与自动化和数字化创新业务五大业务板块为一体的全球化科技集团&#xff0c;连续入选《财富》世界500强&#xff0c;每年为全球超过4亿用户、各领域的重要客户与战略合作伙伴提供产品和服务。 数智化…...

【YOLOv11】目标检测任务-实操过程

目录 一、torch环境安装1.1 创建虚拟环境1.2 启动虚拟环境1.3 安装pytorch1.4 验证cuda是否可用 二、yolo模型推理2.1 下载yolo模型2.2 创建模型推理文件2.3 推理结果保存路径 三、labelimg数据标注3.1 安装labelimg3.2 解决浮点数报错3.3 labelimg UI界面介绍3.4 数据标注案例…...

第十七章:Python数据可视化工工具-Pyecharts库

一、Pyecharts简介 资源绑定附上完整资源供读者参考学习&#xff01; Pyecharts是一个基于百度开源可视化库ECharts的Python数据可视化工具&#xff0c;支持生成交互式的HTML格式图表。相较于Matplotlib等静态图表库&#xff0c;Pyecharts具有以下优势&#xff1a; 丰富的图表…...

解决【vite-plugin-top-level-await】 插件导致的 Bindings Not Found 错误

解决【vite-plugin-top-level-await】 插件导致的 Bindings Not Found 错误 环境设置 操作系统: macOS硬件平台: M1 Pro前端框架: Vue 3Node.js 版本: 20 在使用 Vue 项目时&#xff0c;我们尝试集成 vite-plugin-top-level-await 插件以支持顶层 await 语法。然而&#xff…...

《八大排序算法》

相关概念 排序&#xff1a;使一串记录&#xff0c;按照其中某个或某些关键字的大小&#xff0c;递增或递减的排列起来。稳定性&#xff1a;它描述了在排序过程中&#xff0c;相等元素的相对顺序是否保持不变。假设在待排序的序列中&#xff0c;有两个元素a和b&#xff0c;它们…...

六十天前端强化训练之第三十七天之Docker 容器化部署实战指南(大师级详解)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、Docker 核心知识体系 1.1 容器革命&#xff1a;改变开发方式的技术 1.2 Docker 三剑客 1.3 Docker 生命周期管理 1.4 关键命令详解 二、前端容器化实战案例&#xff…...

RabbitMQ--延迟队列事务消息分发

目录 1.延迟队列 1.1应用场景 1.2利用TTL死信队列模拟延迟队列存在的问题 1.3延迟队列插件 1.4常见面试题 2.事务 2.1配置事务管理器 3.消息分发 3.1概念 3.2应用场景 3.2.1限流 3.2.2负载均衡 1.延迟队列 延迟队列(Delayed Queue)&#xff0c;即消息被发送以后, 并…...

列表,元组,字典,集合,之间的嵌套关系

在 Python 中&#xff0c;列表、元组、字典和集合的嵌套关系需要遵循各自的特性&#xff08;如可变性、可哈希性&#xff09;。以下是它们之间的嵌套规则、示例和典型应用场景的详细梳理&#xff1a; 1. 列表&#xff08;List&#xff09;的嵌套 特性&#xff1a; 可变、有序…...

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…...

鸿蒙HarmonyOS NEXT设备升级应用数据迁移流程

数据迁移是什么 什么是数据迁移&#xff0c;对用户来讲就是本地数据的迁移&#xff0c;终端设备从HarmonyOS 3.1 Release API 9及之前版本&#xff08;单框架&#xff09;迁移到HarmonyOS NEXT&#xff08;双框架&#xff09;后保证本地数据不丢失。例如&#xff0c;我在某APP…...

MCP从零开始

MCP简介 MCP&#xff0c;全称是Model Context Protocol&#xff0c;模型上下文协议&#xff0c;由Claude母公司Anthropic于去年11月正式提出。MCP解决的最大痛点就是Agent开发中调用外部工具的技术门槛过高的问题。 能调用外部工具&#xff0c;是大模型进化为智能体Agent的关…...

Three.js 快速入门教程【十九】CSS2DRenderer(CSS2D渲染器)介绍,实现场景中物体或设备标注标签信息

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...

横扫SQL面试——连续性登录问题

横扫SQL面试 &#x1f4cc; 连续性登录问题 在互联网公司的SQL面试中&#xff0c;连续性问题堪称“必考之王”。&#x1f4bb;&#x1f50d; 用户连续登录7天送优惠券&#x1f31f;&#xff0c;服务器连续报警3次触发熔断⚠️&#xff0c;图书馆连续3天人流破百开启限流⚡” …...

爱因斯坦求和 torch

目录 向量点积 矩阵乘法 矩阵转置 向量转换相机坐标系 在 Python 的科学计算库&#xff08;如 NumPy&#xff09;中&#xff0c;einsum 是一个强大的函数&#xff0c;它可以简洁地表示各种张量运算。下面是几个不同类型的使用示例&#xff1a; 向量点积 向量点积是两个向量…...

Spring Initializr搭建spring boot项目

介绍 Spring Initializr 是一个用于快速生成 Spring Boot 项目结构的工具。它为开发者提供了一种便捷的方式&#xff0c;可以从预先定义的模板中创建一个新的 Spring Boot 应用程序&#xff0c;从而节省了从头开始设置项目的大量时间。 使用 Spring Initializr&#xff0c;你…...

【实战】渗透测试下的文件操作

目录 Linux查找文件 Windows查找文件 查找可写目录 windows Linux 创建 Windows Linux 压缩 解压 远程解压文件 Linux查找文件 >find / -name index.php 查找木马文件 >find . -name *.php | xargs grep -n eval( >find . -name *.php | xargs grep -n ass…...

MATLAB 控制系统设计与仿真 - 30

用极点配置设计伺服系统 方法2-反馈修正 如果我们想只用前馈校正输入&#xff0c;从而达到伺服控制的效果&#xff0c;我们需要很精确的知道系统的参数模型&#xff0c;否则系统输出仍然具有较大的静态误差。 但是如果我们在误差比较器和系统的前馈通道之间插入一个积分器&a…...

P1091 [NOIP 2004 提高组] 合唱队形

题目链接&#xff1a; 思路&#xff1a; 题目意思&#xff0c;找出最少的同学出列&#xff0c;保证学生 1-t 上升&#xff0c; t-n 下降。我们只要求出每个点的最长上升子序列和最长不上升子序列&#xff0c;然后总人数-最长上升子序列和最长不上升子序列1&#xff0c;就是最少…...

小林coding-12道Spring面试题

1.说一下你对 Spring 的理解?spring的核心思想说说你的理解&#xff1f; 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc&#xff1f;依赖倒置&#xff0c;依赖注入&#xff0c;控制反转分别是什么&#xff1f;依赖注…...

通过Spring Boot集成WebSocket进行消息通信

文章目录 通过Spring Boot集成WebSocket进行消息通信1. 创建 Spring Boot 项目2. 添加 WebSocket 依赖3. 配置 WebSocket4. 创建 WebSocket 处理器5. 创建控制器&#xff08;可选&#xff09;6. 前端页面测试7. 运行项目注意事项 通过Spring Boot集成WebSocket进行消息通信 1.…...

ComfyUI发展全景:从AI绘画新星到多功能创意平台的崛起

在人工智能技术迅猛发展的浪潮中&#xff0c;ComfyUI作为基于Stable Diffusion的开源工具&#xff0c;已经从最初的AI绘画辅助软件成长为支持多模态创作的强大平台。本文将全面梳理ComfyUI的发展历程、技术特点、应用场景及其在AIGC生态中的独特地位&#xff0c;同时展望这一工…...

11-项目涉及设备的问题

我们部门在开发一些项目时&#xff0c;确实需要借用设备&#xff0c;但每次开发新需求时都要从硬件部门借设备&#xff0c;开发完成后又要归还。这种频繁的借还流程不仅增加了沟通成本&#xff0c;还导致项目负责人和开发人员对设备的功能和应用场景缺乏直观的了解。有时甚至连…...

将 Markdown 表格结构转换为Excel 文件

在数据管理和文档编写过程中&#xff0c;我们经常使用 Markdown 来记录表格数据。然而&#xff0c;Markdown 格式的表格在实际应用中不如 Excel 方便&#xff0c;特别是需要进一步处理数据时。因此&#xff0c;我们开发了一个使用 wxPython 的 GUI 工具&#xff0c;将 Markdown…...

C++学习之Linux文件编译、调试及库制作

目录 1.rwx对于文件和目录的区别 2.gcc编译过程 3.数据段合并和地址回填说明 4.gcc编译其他参数 5.函数库简介 6.静态库的使用 7.动态库的简介 8.动态库制作基本流程 9.启动APP错误解决方案12 10.启动APP错误解决方案34 11.makefile一组规则 12.makefile的两个函数 …...

neo4j中导入csv格式的三元组数据

csv数据格式&#xff1a; head_entity,relation,tail_entity 02.02类以外的脂肪乳化制品&#xff0c;包括混合的和&#xff08;或&#xff09;调味的脂肪乳化制品,允许添加,β-胡萝卜素 02.02类以外的脂肪乳化制品&#xff0c;包括混合的和&#xff08;或&#xff09;调味的脂…...

高项第十六章——项目采购管理

什么是采购管理&#xff1f;项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。 项目采购管理包括编制和管理协议所需的管理和控制过程。 16_1 管理基础 什么是协议&#xff1f;协议是用于明确项目初步意向的任何文件或沟通结果&#xff0c;协议的范…...

架构师面试(二十二):TCP 协议

问题 今天我们聊一个非常常见的面试题目&#xff0c;不管前端还是后端&#xff0c;也不管做的是上层业务还是底层框架&#xff0c;更不管技术方向是运维还是架构&#xff0c;都可以思考和参与一下哈&#xff01; TCP协议无处不在&#xff0c;我们知道 TCP 是基于连接的端到端…...

五.ubuntu20.04 - ffmpeg推拉流以及Nginx、SRS本地部署

一.本地部署nginx 1.编译ffmpeg&#xff0c;参考这位博主的&#xff0c;编译选项有的enable找不到的不需要的可以直接删除&#xff0c;但是像sdl&#xff08;包含ffplay&#xff09;、h264、h265这些需要提前下载好&#xff0c;里面都有下载指令。 Ubuntu20.04 编译安装 FFmp…...

JS 手撕题高频考点

前端面试中&#xff0c;JS 手撕题是高频考点&#xff0c;主要考察 编程能力、算法思维、JS 核心知识。以下是最常见的手撕题分类 代码示例&#xff1a; 目录 &#x1f4cc; 1. 手写函数柯里化&#x1f4cc; 2. 手写 debounce&#xff08;防抖&#xff09;&#x1f4cc; 3. 手写…...

Hyperlane框架临时上下文数据管理:提升Web开发效率的利器

Hyperlane框架临时上下文数据管理&#xff1a;提升Web开发效率的利器 在现代Web开发中&#xff0c;临时上下文数据管理是实现高效请求处理的关键。Hyperlane框架通过创新的临时上下文存储机制&#xff0c;为开发者提供了一套简洁、安全的解决方案&#xff0c;让数据在请求生命…...

QT操作PDF文件

Qt 早期本身不提供原生的 PDF 操作功能。从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。Qt中有如下几种方式实现 PDF 文件的生成、读取和操作。 1、使用 QPrinter 生成 PDF 2、使用 Qt PDF 模块 (Qt 5.15+) 3、使用第三方库(比如:Poppler) 一、使用 Q…...

【算法手记8】NC95 数组中的最长连续子序列 字母收集

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:刷题 ⚙️操作环境:牛客网 目录 一.NC95 数组中的最长连续子序列 题目详情: 题目思路: 解题代码: 二.字母收集 题目详情: 题目思路: 解题代码: 结语 一.NC95 数组中的最长连续子序列 牛客网题目链接(点击即可跳转):NC95 …...

AI渗透测试:网络安全的“黑魔法”还是“白魔法”?

引言&#xff1a;AI渗透测试&#xff0c;安全圈的“新魔法师” 想象一下&#xff0c;你是个网络安全新手&#xff0c;手里攥着一堆工具&#xff0c;正准备硬着头皮上阵。这时&#xff0c;AI蹦出来&#xff0c;拍着胸脯说&#xff1a;“别慌&#xff0c;我3秒扫完漏洞&#xff0…...

使用perf工具分析Linux系统的性能瓶颈

想获取更多高质量的Java技术文章&#xff1f;欢迎访问Java技术小馆官网&#xff0c;持续更新优质内容&#xff0c;助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring 使用perf工具分析Linux系统的性能瓶颈 在现代计算系统中&#xff0c;性能瓶颈是一个经常遇到…...

知识就是力量——HELLO GAME WORD!

你好&#xff01;游戏世界&#xff01; 简介环境配置前期准备好文章介绍创建头像小功能组件安装本地中文字库HSV颜色空间音频生成空白的音频 游戏UI开发加载动画注册登录界面UI界面第一版第二版 第一个游戏&#xff08;贪吃蛇&#xff09;第二个游戏&#xff08;俄罗斯方块&…...

LeetCode算法题(Go语言实现)_20

题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;请你返回一个长度为 2 的列表 answer &#xff0c;其中&#xff1a; answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。 answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成…...

ES拼音分词自动补全实现

#测试拼音分词 POST /_analyze { "text":"如家酒店真不错", "analyzer": "pinyin" } #这里把拼音的首字母放到这里&#xff0c;也说明了这句话没有被分词&#xff0c;而是作为一个整体出现的 #还把每一个字都形成了一个拼音&#…...

Spring Boot 日志 配置 SLF4J 和 Logback

文章目录 一、前言二、案例一&#xff1a;初识日志三、案例二&#xff1a;使用Lombok输出日志四、案例三&#xff1a;配置Logback 一、前言 在开发 Java 应用时&#xff0c;日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息&#xff0c;帮助开发者…...

构建大语言模型应用:数据准备(第二部分)

本专栏通过检索增强生成&#xff08;RAG&#xff09;应用的视角来学习大语言模型&#xff08;LLM&#xff09;。 本系列文章 简介数据准备&#xff08;本文&#xff09;句子转换器向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 如上…...

mac m 芯片 动态切换 jdk 版本jdk8.jdk11.jdk17

下载 jdk 版本. 默认安装路径在. /Library/Java/JavaVirtualMachines配置环境变量 # 动态获取所有 JDK 路径 export JAVA_8_HOME$(/usr/libexec/java_home -v 1.8) export JAVA_11_HOME$(/usr/libexec/java_home -v 11) export JAVA_17_HOME$(/usr/libexec/java_home -v 17)#…...

如何通过python将视频转换为字符视频

请欣赏另类的老鼠舞 字符老鼠舞 与原版对比 对比 实现过程 1. 安装库 pip install numpy pip install Pillow pip install opencv-python pip install moviepy 2. 读取视频帧并转换为灰度图 import cv2def make_video(input_video_path, output_video_path):video_cap cv2…...

如何高效备考蓝桥杯(c/c++)组

以下是针对蓝桥杯C/C组的高效备考策略&#xff0c;结合你的当前基础&#xff08;C语法简单算法题&#xff09;&#xff0c;分阶段提升竞赛能力&#xff0c;重点突破高频考点&#xff1a; 一、蓝桥杯C/C组核心考点梳理 根据历年真题&#xff0c;重点考察以下内容&#xff08;按…...

两数之和-力扣

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…...

react撤销和恢复

创建一个历史记录栈past&#xff0c;和一个撤销过的栈future&#xff0c;&#xff0c;在每次操作store的时候&#xff0c;将当前的store的数据&#xff0c;存入历史记录栈past中&#xff0c;&#xff0c; 如果是撤销操作&#xff0c;&#xff0c;就从这个历史栈中取最后面那个数…...

华为机试—密码验证合格程序

题目 你需要书写一个程序验证给定的密码是否合格。 合格的密码要求&#xff1a; 长度超过 8 位必须包含大写字母、小写字母、数字、特殊字符中的至少三种不能分割出两个独立的、长度大于 2 的连续子串&#xff0c;使得这两个子串完全相同&#xff1b;更具体地&#xff0c;如果…...

分布式ID生成器:雪花算法原理与应用解析

在互联网分布式系统中&#xff0c;生成全局唯一的ID是一个核心问题。传统的数据库自增ID、UUID虽然各有优缺点&#xff0c;但在高并发、分库分表场景下往往无法满足需求。美团Leaf分布式ID生成器便是为了解决这些问题而诞生的&#xff0c;其核心实现便是基于Snowflake&#xff…...