引言

在实际运维、测试、数据分析、开发流程中,我们经常会处理成百上千条命令操作,例如:

  • 各种脚本任务(启动、备份、重启、日志查看)

  • 数据处理流程(爬取 → 清洗 → 统计 → 可视化)

  • 配置自动化(环境部署、参数变更)

  • Git 操作(拉取、推送、合并、冲突处理)

如何高效组织这些操作?传统做法如 bash 脚本 or Makefile 存在诸多限制:

  • 难以组织、无分组、查找不便

  • 不支持搜索/筛选/分页交互

  • 缺乏状态反馈、没有界面结构感

因此我们构建一个 终端交互式命令管理面板,支持以下特性:

  • ✅ 分组展示命令(如 dev、deploy、git)

  • ✅ 支持分页与快速搜索

  • ✅ 高亮显示当前项、运行状态反馈

  • ✅ 一键执行 / 复制命令

  • ✅ 支持配置文件导入、自动补全


一、功能目标

模块说明
分组管理支持多个命令组和命令项定义
搜索过滤可输入关键字过滤显示项
高亮互动上下移动 / 分页浏览 / 回车执行
状态输出显示执行状态(成功/失败)
数据持久配置文件支持 JSON / YAML / TOML
扩展能力适配各类 CLI/SSH/脚本调度命令


二、技术栈

用途
textual基于 rich 的 TUI(终端 UI)框架
subprocess执行外部命令并捕获输出
pyperclip复制命令到剪贴板(可选)
yaml/json命令配置支持
threading/asyncio支持命令异步执行反馈

安装依赖

bash

复制编辑

pip install textual rich pyperclip pyyaml


三、项目结构

bash

复制编辑

cli_dashboard/ ├── main.py # 启动入口 ├── config.yaml # 命令配置文件 ├── dashboard.py # UI 面板主逻辑 ├── executor.py # 命令执行器 └── utils.py # 通用函数


四、配置文件 config.yaml

yaml

复制编辑

groups: - name: DevOps commands: - name: 启动服务 command: "python run.py" - name: 重启服务 command: "systemctl restart myapp" - name: Git 管理 commands: - name: 拉取更新 command: "git pull" - name: 查看日志 command: "git log --oneline" - name: 数据处理 commands: - name: 运行分析脚本 command: "python analysis.py"


五、命令执行模块 executor.py

python

复制编辑

import subprocess def execute(cmd): try: result = subprocess.run(cmd, shell=True, capture_output=True, text=True) if result.returncode == 0: return (True, result.stdout.strip()) else: return (False, result.stderr.strip()) except Exception as e: return (False, str(e))


六、UI 面板主逻辑 dashboard.py

我们使用 textual 构建界面:

python

复制编辑

from textual.app import App, ComposeResult from textual.widgets import Header, Footer, Static, Input, ListView, ListItem from textual.containers import Vertical import yaml from executor import execute class CommandPanel(App): CSS_PATH = "styles.css" def __init__(self, config_file="config.yaml"): super().__init__() self.config_file = config_file self.all_items = [] self.filtered_items = [] def compose(self) -> ComposeResult: yield Header() yield Input(placeholder="🔍 输入关键字过滤命令", id="search") yield ListView(id="cmdlist") yield Static(id="output") yield Footer() def on_mount(self): self.load_commands() def load_commands(self): with open(self.config_file, "r", encoding="utf-8") as f: data = yaml.safe_load(f) for group in data.get("groups", []): gname = group.get("name") for cmd in group.get("commands", []): label = f"[bold]{gname}[/] · {cmd['name']}" self.all_items.append({"label": label, "cmd": cmd["command"]}) self.query_one("#cmdlist").clear() for item in self.all_items: self.query_one("#cmdlist").append(ListItem(Static(item["label"]))) def on_input_changed(self, event: Input.Changed): keyword = event.value.strip().lower() listbox = self.query_one("#cmdlist") listbox.clear() for item in self.all_items: if keyword in item["label"].lower(): listbox.append(ListItem(Static(item["label"]))) def on_list_view_selected(self, event: ListView.Selected): idx = event.index cmd = self.all_items[idx]["cmd"] self.query_one("#output").update(f"[green]运行中:[/] {cmd}") success, output = execute(cmd) if success: self.query_one("#output").update(f"[bold green]✅ 执行成功:[/]\n{output}") else: self.query_one("#output").update(f"[bold red]❌ 执行失败:[/]\n{output}")


七、程序入口 main.py

python

复制编辑

from dashboard import CommandPanel if __name__ == "__main__": CommandPanel().run()


八、运行效果展示

启动项目:

bash

复制编辑

python main.py

界面效果:

csharp

复制编辑

┌────────────────────────────────────────────┐ │ CLI 插件命令面板(分组展示) │ ├────────────────────────────────────────────┤ │ 🔍 输入关键字过滤命令:python │ │ │ │ ▸ DevOps · 启动服务 │ │ DevOps · 重启服务 │ │ Git 管理 · 拉取更新 │ │ 数据处理 · 运行分析脚本 │ │ │ ├────────────────────────────────────────────┤ │ ✅ 执行成功: │ │ ... output from subprocess here ... │ └────────────────────────────────────────────┘

支持方向键切换命令、回车执行,输出实时更新。


九、功能增强建议

功能模块说明
命令分组折叠支持点击分组展开/折叠命令
命令参数输入每条命令支持动态参数填写
执行日志记录自动记录运行成功/失败与时间戳
图标/emoji 支持命令项支持展示图标(如 🚀、🗂)
多配置文件切换支持 --config 切换配置源
插件任务扩展与实际脚本、远程 SSH、API 联动


十、适用场景

场景应用价值
运维脚本统一入口跨环境部署、服务控制集中管理
数据开发流程管理数据提取、模型更新、清洗绘图流程集中调用
Git 团队操作面板常见分支、拉取、提交命令快速执行
教学示范帮助学生理解多命令流程、结构化运行


十一、总结

本项目构建了一个终端交互式命令控制面板,具备:

  • ✅ 分组展示结构清晰

  • ✅ 搜索高效,适合命令量大的项目

  • ✅ 回车执行、状态输出一目了然

  • ✅ 基于配置即可扩展命令项,无需修改主逻辑

你可以将它用于运维面板、部署入口、教学工具,甚至打包为私有命令中心平台。

bbs.yantuchina.com/read.php?tid=339663

bbs.yantuchina.com/read.php?tid=339664

learnku.com/articles/90356

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914122.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914122.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914122.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式笔记_结构型_代理模式

1. 代理模式介绍代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常在客户端和目标对象之间起到中介作用,能够在不改变目标对象的前提下增加额外的功能操作,比如延迟初始化、访问控制、日志记录等…

C语言<数据结构-单链表>(收尾)

上篇博客我将基础的尾插、尾删、头插、头删逐一讲解了,这篇博客将对上篇博客进行收尾,讲一下指定位置操作增删以及查找这几个函数,其实大同小异:一.查找函数:查找函数其实就是一个简单的循环遍历,所以不加以…

十年架构心路:从单机到云原生的分布式系统演进史

十年架构心路:从单机到云原生的分布式系统演进史 这里写目录标题十年架构心路:从单机到云原生的分布式系统演进史一、技术生涯的起点:单体架构的黄金时代1.1 典型技术栈1.2 记忆深刻的故障二、分布式架构转型期2.1 服务化拆分实践2.2 分布式事…

使用docker搭建nginx

安装docker 和 docker compose验证docker版本配置docker目录配置代理,使docker能访问外网能否ping通最后直接拉入镜像即可docker pull nginx

Intel新CPU助攻:微软Copilot+将登陆台式电脑

微软的Copilot PC计划已经推出一年多,但目前仅支持平板电脑和笔记本电脑,以及少数迷你电脑。 随着Intel下一代桌面处理器——代号为“Arrow Lake Refresh”的推出,Copilot PC功能有望扩展到桌面计算机。 要支持Copilot PC的所有功能&#xff…

【Kubernetes】跨节点 Pod 网络不通排查案例

最近在部署一个集群环境的时候,发现集群中一个子节点与其他子节点不通,而 master 节点可与任何子节点互通,通过抓包排查后,发现是 Linux 路由决策导致的。因此,在此记录下来,希望对大家有所帮助。1、环境及…

【算法训练营Day11】二叉树part1

文章目录理论基础二叉树的递归遍历前序遍历中序遍历后序遍历总结二叉树的层序遍历基础层序遍历二叉树的右视图理论基础 二叉树在结构上的两个常用类型: 满二叉树完全二叉树 在功能应用上的比较常用的有: 二叉搜索树: 节点有权值、遵循”左…

Flutter 之 table_calendar 控件

1.库导入在pubspec.yaml文件中dev_dependencies:table_calendar: ^3.2.02. 代码编写TableCalendar(daysOfWeekHeight: 20,availableGestures: AvailableGestures.horizontalSwipe,firstDay: DateTime.now().subtract(const Duration(days: 365)),lastDay: DateTime.now(),cal…

【leetcode】1486. 数组异或操作

数组异或操作题目题解题目 1486. 数组异或操作 给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] start 2*i(下标从 0 开始)且 n nums.length 。 请返回 nums 中所有元素按位异或(XOR)后得到的…

php7.4使用 new DateTime;报错 Class DateTime not found

php7.4使用 new DateTime;报错Uncaught Error: Class ‘app\home\c\DateTime’ not found 查了半天资料,最后找到了解决办法 DateTime 是 php 内置的类,不隶属于任何命名空间,如果你需要在命名空间中使用须有 \ 声明,解决办法就是…

Gartner《构建可扩展数据产品建设框架》心得

一、背景与价值 1.1 “数据产品”为什么忽然重要? 传统模式:业务提出需求 → IT 建数据集 → ETL 管道爆炸 → 维护成本指数级上升。 新范式:把“数据”包装成“产品”,以产品思维迭代演进,强调复用、自助、可扩展。 Gartner 观察到:大量组织把“报表”或“数据仓库”重…

CentOS/RHEL LVM 磁盘扩展完整教程

CentOS/RHEL LVM 磁盘扩展完整教程📝 前言 在Linux系统管理中,磁盘空间不足是经常遇到的问题。特别是在生产环境中,当根分区空间告急时,我们需要通过添加新磁盘来扩展存储空间。本教程将详细介绍如何在CentOS/RHEL系统中使用LVM&a…

LVGL应用和部署(用lua做测试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】嵌入式产品做好了,下面就是测试和量产了。以按键屏幕的开发模式为例,如果仅仅是简单的功能测试,那还比较好解决&…

phpstudy搭建pikachu

一.启动mysql和nginx服务二.修改靶场文件参数点击管理打开根目录,将下载好的靶场源文件解压到www目录下三.找到此文件用记事本打开四.修改配置文件五.打开浏览器,输入127.0.0.1/pikachu六.按照步骤初始化心得体会:如果mysql启动又立刻停止,大…

【Linux】GDB/CGDB 调试器学习笔记

GDB/CGDB 调试器学习笔记🚀 前言 GDB 是 GNU 项目下功能强大的命令行调试器,适用于 C/C 等多种语言。CGDB 则是在 GDB 之上构建的轻量级 curses 界面,适合喜欢终端操作且习惯 vi 风格的人。一、GDB 入门篇 1. 编译时带调试信息 gcc -g -O0 -W…

链接代理后无法访问网络

路由方向的问题 cmd 输入 route print 查看路由多了一个不是你网络的路由 我的嘎嘎好用直接那都通 route add -p 0.0.0.0 mask 0.0.0.0 0.0.0.0 参考这个 固定ip if是代理链路的 链路口又敏感词这个文章不合规两次评论区问我

day37 早停策略和模型权重的保存

DAY 37 我今天的笔记是用cpu训练的,请自行修改为gpu训练 仍然是循序渐进,先复习之前的代码 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_…

网络爬虫分类全解析

网络爬虫作为数据获取的重要工具,其分类方式多样,不同类型的爬虫在技术实现、应用场景和功能特性上存在显著差异。深入理解这些分类,有助于开发者根据实际需求选择合适的爬虫方案。本文将从技术特性、应用场景和架构设计三个维度,系统介绍网络爬虫的主要分类。 一、按技术…

ECR仓库CloudFormation模板完整指南

概述 本文档详细介绍了一个通用的Amazon ECR(Elastic Container Registry)仓库CloudFormation模板,该模板支持多业务组、参数化配置,并包含完整的安全策略、生命周期管理和监控功能。 模板特性 核心功能 ✅ 支持4个业务组:app、ai、mall、frontend✅ 灵活的服务名手动输…

C++(STL源码刨析/List)

一 List 核心字段和接口1. 节点字段template<class T> struct __list_node {typedef void* void_pointer;void_pointer prev;void_pointer next;T data; }由于 链表 不是连续的内存块&#xff0c;所以对每一个申请到的内存块要进行统一组织&#xff0c;也就是封装成一个类…