Metadata-Version: 2.4
Name: xshell-like
Version: 0.2.5
Summary: 类 Xshell 终端工具：SSH/串口、批量连接、多页签、会话管理、SFTP、免密部署
Author: weixin_53700778
License: MIT
Project-URL: Homepage, https://gitcode.com/weixin_53700778/xshell
Keywords: ssh,serial,terminal,xshell,tabs,sftp
Classifier: Environment :: X11 Applications :: Qt
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: Operating System :: POSIX :: Linux
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Topic :: Terminals :: Terminal Emulators/X Terminals
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: PySide6>=6.5
Requires-Dist: paramiko>=2.9
Requires-Dist: pyserial>=3.5
Requires-Dist: pyte>=0.8
Dynamic: license-file

# XShell-Like 终端工具

一个用 Python/PySide6 实现的类 Xshell 桌面终端工具：**SSH + 串口双支持、批量连接、多页签、会话持久化、SFTP 文件传输**。

> 架构设计详见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)

## 功能总览

| 功能 | 说明 |
|---|---|
| SSH 终端 | paramiko，密码/密钥认证，keepalive，窗口尺寸同步（vim/top 不错位） |
| 串口终端 | pyserial，波特率/数据位/校验/停止位可配，可选本地回显 |
| 批量连接 | 左栏 Ctrl 多选 →「连接选中」，或「批量连接…」勾选列表，一次打开全部；单个失败不影响其他，结果汇总提示 |
| 批量关闭 | 页签逐个关、一键「关闭全部页签」，关窗自动全断 |
| 多页签 | QTabWidget，可关闭可拖动，双击列表项快速连接 |
| 会话管理 | 保存/编辑/克隆/删除；新建时**自动查重**（SSH 按 主机+端口+用户，串口按 设备+波特率）避免重复配置 |
| 文件共享 | 已连接 SSH 页签一键打开 SFTP 对话框：浏览/上传/下载/新建目录/删除，带进度条 |
| 广播输入 | 底部广播条回车，同一条命令发到所有已打开会话（调试多台设备利器） |
| 编码 | utf-8 / gbk / gb2312 / big5 / latin-1 按会话配置 |
| 光标 | 远端光标位置实时渲染块状光标（闪烁）；窗口聚焦时实心、失焦时变暗 |
| 缩放 | `Ctrl+=`/`Ctrl++` 放大、`Ctrl+-` 缩小、`Ctrl+0` 重置（视图菜单，全局生效并持久化）；`Ctrl+鼠标滚轮` 当前页签缩放 |
| 字体配置 | 视图菜单 →「字体设置…」：等宽字体 + 字号，全局生效并持久化 |
| 界面主题 | 现代深色主题（Fusion 风格）：圆角页签、悬停高亮、瘦滚动条，与终端融为一体 |
| 串口自动识别 | 会话对话框自动列出本机串口（Linux: ttyUSB/ttyACM 优先、ttyS 兜底；Windows: COM 口），带设备描述（如 FT232R/CH340），一键重新检测 |
| 快速连接 | 工具栏输入 `ssh ts@10.0.28.34`（也支持 `user@host:端口`、`-p 端口`）回车：自动创建会话并连接，重复输入自动复用已有配置 |
| 免密登录 | 认证方式选「免密 (默认密钥/Agent)」直接使用本机 `~/.ssh` 密钥或 ssh-agent；密码留空的会话也会先尝试免密 |
| 部署公钥 | 左栏右键会话 →「部署公钥 (免密登录)…」：把本机公钥写入远端 `authorized_keys`（等价 ssh-copy-id，纯 paramiko 实现 Windows 也可用；本机无密钥对时自动生成），成功后该会话自动切换为免密 |

## 安装与运行

```bash
# 方式一：从 PyPI 安装（推荐）
pip install xshell-like           # 国内镜像同步慢时: pip install -i https://pypi.org/simple xshell-like
xshell-like                       # 或 python -m xshell

# 方式二：从源码运行
pip install -r requirements.txt   # PySide6 / paramiko / pyserial / pyte
python -m xshell                  # 启动 GUI
QT_QPA_PLATFORM=offscreen python -m xshell   # 无显示环境（调试用）
```

会话数据保存在 `~/.config/xshell-tool/`（`sessions.json` + `settings.json`），原子写入，手工编辑后重启生效。

## 典型用法

1. **新建会话**：工具栏「新建会话」→ 选 SSH 或串口 → 填参数 → 保存。若已存在相同连接的配置会弹提示，直接复用左侧已有项即可。
2. **快速连接**：工具栏直接输入 `ssh ts@10.0.28.34` 回车——自动建会话、优先免密登录、批量结果同样生效。
3. **免密一步到位**：左栏右键目标会话 →「部署公钥 (免密登录)…」→ 输入一次密码 → 之后该会话永久免密。
4. **批量开工**：左栏 Ctrl/Ctrl+Shift 选中多台设备 →「连接选中」；或「批量连接…」勾选。结果框列出失败项和原因。
5. **批量操作**：所有页签打开后，在底部广播条输入 `show version` 回车 → 所有会话同时执行。
6. **传文件**：选中某个已连接的 SSH 页签 → 工具栏「SFTP」→ 双击进目录 / 上传 / 下载。
7. **克隆**：同型号设备只需「克隆」已有会话，改个 IP 保存。

## 测试

```bash
python -m pytest          # 全量（含真实 SSH 协议联测与 PTY 串口联测，零硬件依赖）
```

- SSH 联测：进程内 paramiko 服务器（banner + 回显 + 窗口尺寸变更）
- 串口联测：`os.openpty()` PTY 对回环
- GUI 冒烟：offscreen + 注入假传输层，零网络零硬件

## 打包发布（Linux / Windows）

使用 PyInstaller 打成免安装的独立目录（onedir，启动快、不易被杀软误报）：

```bash
# Linux
./scripts/build_linux.sh          # 产物: dist/xshell-like/xshell-like

# Windows（在 Windows 机器上，需已安装 Python）
scripts\build_windows.bat         # 产物: dist\xshell-like\xshell-like.exe
```

要点：
- **必须在目标系统上构建**（PyInstaller 不支持交叉编译）：Linux 产物在 Linux 构建，Windows 产物在 Windows 构建。
- 产物目录 `dist/xshell-like/` 整体拷贝即可分发；首次启动 Windows Defender 扫描可能拖慢，属正常现象。
- 排查打包后的问题时建议用源码方式运行（`python -m xshell`）看完整报错；GUI 版 `console=False` 不显示控制台。
- 自测：`QT_QPA_PLATFORM=offscreen timeout 6 ./dist/xshell-like/xshell-like`（退出码 124 = 常驻运行正常）。

## 安全说明

- SSH 密码在 `sessions.json` 中仅做 base64 轻混淆（防肩窥），**不是加密保险箱**。安全敏感环境请用密钥认证（`key` 方式），或密码留空每次手输。

## 已知限制（v1）

- 终端渲染为整屏 HTML 重绘（80×24 规模足够流畅），未做鼠标事件与 256 色以外的真彩优化；滚动缓冲已保存但 UI 暂未提供回滚浏览。
- SFTP 传输在 GUI 线程同步进行（每块刷新进度），超大文件会短暂阻塞界面。
- 未支持 zmodem、端口转发、宏录制（架构已预留扩展点，见设计文档 §2/§9）。
