9c08d7593dbcbd5dd6eaf50ba76f6e6a1f41fb07
User asked: '窗口应该可以前后左右拉' Added custom edge drag handling in MainWindow (QMainWindow's default resize support exists but ignored + we want full control for maximized state too): New methods in ui/main_window.py: - _hit_test_edge(pos) -> 'L'/'R'/'T'/'B'/'TL'/'TR'/'BL'/'BR'/'' 6px margin around window. Returns which edge (or corner) the cursor is on. Returns '' when maximized/fullscreen. - _edge_to_cursor(edge): sets Qt.SizeHor/Ver/FDiag/BDiag cursor - _do_resize(global_pos): computes new geometry based on drag delta. Respects self.minimumWidth/Height (QMainWindow's auto min size from menu/toolbar/statusbar) and screen bounds. - _restore_from_max(global_pos): when maximized, click+drag on TOP edge → showNormal() + set geometry to mouse-relative size + continue drag from 'TL' corner (like Windows native behavior) - mousePressEvent/Move/Release: hook into resize state - leaveEvent: clear cursor when leaving window - changeEvent: clear resize state on window state change State fields added in __init__: - self._resize_edge, self._resize_start_geo, self._resize_start_pos - self._resize_margin = 6 - self._dragging_from_max = False Fix: 'QTabWidget.RightSide' was wrong API; used 'QTabBar.RightSide' in the multi-tab commit (unrelated, but I noticed while testing). New test_resize.py (5 tests, all pass): - 8-region hit-test (4 edges + 4 corners) - Right-edge drag → width grows - Left-edge drag → x moves right (width limited by minW) - Top-left corner drag - Maximized + click top edge → restored to normal Existing tests (core 6/6, UI 3/3) still pass. Build: 57MB exe.
SSHClient
基于 PyQt5 + paramiko 的 Windows SSH 客户端,支持远程终端、SFTP 文件浏览、CPU/内存/磁盘/网络实时监控,以及 OpenAI 兼容的 AI Agent(可调用工具操作远程主机)。
✨ 功能特性
| 模块 | 说明 |
|---|---|
| 多主机管理 | 增删改查、密码/私钥双认证、配置导入导出、配置持久化到 ~/.sshclient/ |
| 远程终端 | 真实交互式 shell(Xshell 风格)、ANSI 颜色、本地历史、Ctrl+A/E/U/K/W 快捷键 |
| 命令片段 | 20+ 预置常用命令(ss/df/ps/docker/systemctl…),一键发送到终端,自定义增删改 |
| SFTP 文件浏览 | 目录树浏览、上传/下载(带进度条)、新建目录、删除、重命名、双击进入 |
| 实时监控 | CPU/内存/负载/启动时间/磁盘/网络速率/进程列表,1-10 秒可调刷新间隔 |
| 趋势迷你图 | CPU 和内存使用率实时折线图,最近 60 个采样点,一目了然 |
| 进程管理 | 进程表(500 条)、搜索过滤、CPU/内存排序、树形视图、右键杀进程、批量操作 |
| AI Agent | OpenAI 兼容 API(OpenAI / DeepSeek / Moonshot / 通义千问 / Ollama 等),5 个工具自动调用 |
| 暗色主题 | 视图菜单一键切换暗/亮主题,偏好自动持久化 |
| 跨平台 | 代码兼容 Windows / macOS / Linux(PyQt5 + paramiko) |
📦 在 Windows 上构建 exe
最简单的方式:双击 build_windows.bat
- 安装 Python 3.10+(勾选 Add to PATH)
- 把整个项目目录拷到 Windows 电脑
- 双击
build_windows.bat,等 2-3 分钟 - 产物:
dist\SSHClient.exe(单文件,约 50-60 MB,可拷给任何人直接双击运行)
手动方式:
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
pyinstaller build.spec --clean --noconfirm
🚀 在 Linux/macOS 上开发
./build.sh # 一键打包当前平台二进制
python main.py # 直接开发运行
🧪 测试
source venv/bin/activate
python test_core.py # 核心模块 smoke test(无网络依赖)
python test_ui.py # UI 组件加载测试(offscreen 渲染)
python test_e2e.py # 端到端测试(需本机或可访问的 sshd)
🎮 使用说明
1. 添加主机
左侧 ➕ 新增主机,填主机名/IP、端口、用户名、密码(可选私钥文件)。
2. 连接
选中主机 → 🔌 连接。状态指示器变绿后即可使用。
3. 终端
⌨ 终端 Tab 直接输入命令回车执行。支持 ANSI 颜色、↑↓ 历史回放、Ctrl+A/E/U/K/W 行编辑快捷键。
命令片段:工具栏下拉框选择预置命令(ss/df/ps/docker/systemctl 等),一键发送到终端。点击 ⚙ 管理自定义片段。
4. 文件浏览
📁 文件 Tab 双击目录进入,双击文件直接下载。可拖入 / 上传任意文件。
5. 监控
📊 监控 Tab 点击 开始监控,指标会按设定间隔刷新。CPU/内存用大字突出,下方有实时趋势折线图,磁盘用进度条,网络显示当前速率。下半区是进程管理表,支持搜索过滤、CPU/内存排序、树形视图、右键杀进程。
6. AI Agent
- 先点 ⚙ AI 设置,选择预设(OpenAI/DeepSeek/Kimi/通义千问/Ollama)或自定义填 API Key
- 回到 🤖 AI Agent Tab,用自然语言提问:
- "帮我看 CPU 为什么这么高"
- "找出 /var/log 下最大的 10 个文件"
- "重启 nginx 服务"
- AI 会自动调用工具(执行命令、查指标等)并给出结论
安全提示:AI Agent 可以执行任意命令,请使用只读权限的 API Key,或在 prompt 中限定危险操作前需确认。
🔌 支持的 AI 提供商
| 预设 | Base URL | 模型 |
|---|---|---|
| OpenAI | https://api.openai.com/v1 |
gpt-4o-mini |
| DeepSeek | https://api.deepseek.com/v1 |
deepseek-chat |
| Moonshot Kimi | https://api.moonshot.cn/v1 |
moonshot-v1-8k |
| 通义千问 | https://dashscope.aliyuncs.com/compatible-mode/v1 |
qwen-turbo |
| 智谱 GLM | https://open.bigmodel.cn/api/paas/v4 |
glm-4-flash |
| Ollama (本地) | http://127.0.0.1:11434/v1 |
qwen2.5:7b |
| 自定义 | - | 任意 OpenAI 兼容端点 |
📂 项目结构
sshclient/
├── main.py # 入口
├── requirements.txt # 依赖
├── build.spec # PyInstaller 打包配置
├── build_windows.bat # Windows 一键打包
├── build.sh # Linux/macOS 打包
├── core/ # 业务逻辑
│ ├── ssh_client.py # SSH 连接 + SFTP
│ ├── monitor.py # 远程系统监控
│ ├── ai_agent.py # AI Agent (OpenAI 兼容)
│ ├── manager.py # 多主机管理 + 配置持久化
│ └── snippets.py # 命令片段管理 + 持久化
├── ui/ # PyQt5 界面
│ ├── main_window.py # 主窗口
│ ├── widgets.py # FileBrowser / MonitorPanel / SparklineChart / AIChatPanel
│ ├── terminal_panel.py # 交互式终端面板
│ ├── host_dialog.py # 主机编辑对话框
│ ├── config_dialog.py # AI 设置对话框
│ ├── snippet_dialog.py # 命令片段管理对话框
│ ├── theme.py # 亮色/暗色主题 QSS
│ └── workers.py # 后台线程
└── test_*.py # 测试脚本
🔧 故障排查
| 问题 | 解决 |
|---|---|
python 不识别 |
安装 Python 时勾选 "Add Python to PATH" |
打包失败 ModuleNotFoundError |
用 pip install <module> 后重新打包 |
| exe 启动黑窗闪过 | 已用 console=False,如还出现请检查杀毒软件 |
| SSH 连接超时 | 检查防火墙、22 端口、目标主机 sshd 是否运行 |
| AI 设置测试连接失败 | 检查 API Key 是否正确、Base URL 是否可访问、代理设置 |
📄 License
MIT
Description
Releases
1
sshclient_v0.0.1
Latest
Languages
Python
98.5%
Batchfile
0.9%
Shell
0.6%
