XShell-Like 终端工具
一个用 Python/PySide6 实现的类 Xshell 桌面终端工具:SSH + 串口双支持、批量连接、多页签、会话持久化、SFTP 文件传输。
架构设计详见 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 也可用;本机无密钥对时自动生成),成功后该会话自动切换为免密 |
安装与运行
# 方式一:从 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),原子写入,手工编辑后重启生效。
典型用法
- 新建会话:工具栏「新建会话」→ 选 SSH 或串口 → 填参数 → 保存。若已存在相同连接的配置会弹提示,直接复用左侧已有项即可。
- 快速连接:工具栏直接输入
ssh ts@10.0.28.34回车——自动建会话、优先免密登录、批量结果同样生效。 - 免密一步到位:左栏右键目标会话 →「部署公钥 (免密登录)…」→ 输入一次密码 → 之后该会话永久免密。
- 批量开工:左栏 Ctrl/Ctrl+Shift 选中多台设备 →「连接选中」;或「批量连接…」勾选。结果框列出失败项和原因。
- 批量操作:所有页签打开后,在底部广播条输入
show version回车 → 所有会话同时执行。 - 传文件:选中某个已连接的 SSH 页签 → 工具栏「SFTP」→ 双击进目录 / 上传 / 下载。
- 克隆:同型号设备只需「克隆」已有会话,改个 IP 保存。
测试
python -m pytest # 全量(含真实 SSH 协议联测与 PTY 串口联测,零硬件依赖)
- SSH 联测:进程内 paramiko 服务器(banner + 回显 + 窗口尺寸变更)
- 串口联测:
os.openpty()PTY 对回环 - GUI 冒烟:offscreen + 注入假传输层,零网络零硬件
打包发布(Linux / Windows)
使用 PyInstaller 打成免安装的独立目录(onedir,启动快、不易被杀软误报):
# 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)。
Metadata
Release files for xshell-like 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| xshell_like-0.2.0.tar.gz | 54.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xshell_like-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 97.0 kB
Release files / xshell_like-0.2.0.tar.gz
| Download URL | xshell_like-0.2.0.tar.gz |
|---|---|
| Size | 54.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e1a07427b17d4fbcc9622601e60adcf23593a5074bf0026cd95e68a01d587cc2
|
|
BLAKE2b-256 checksum How to use checksums |
d82acf7084388a58af029d3b1b16eafee914f59b39213b0d646ea24e8717df8a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Release files / xshell_like-0.2.0-py3-none-any.whl
| Download URL | xshell_like-0.2.0-py3-none-any.whl |
|---|---|
| Size | 42.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f0a6f12813b6802dc6164fe36d59518083fc5b04d791824a4ac4714884db5522
|
|
BLAKE2b-256 checksum How to use checksums |
42f47a7fcd8c4ef53657b3a2f949c76bdc8e7384f55dbd951e303633e85389f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|