在日常运维和开发中,很多人都要同时管理多台服务器。
比如:
- 一台跑生产 Web 服务
- 一台跑测试环境
- 一台数据库机器
- 一台日志机器
- 临时还要连一些一次性的机器
这时最常见的麻烦不是某一次连接,而是一些很小但频繁的重复操作。
例如:
连上去敲一条命令看看状态 传一个安装包上去 把一份日志拉下来 看一眼 CPU 和内存 来回切换不同的服务器如果每次都手敲 IP、用户名、端口,再分别用 ssh、scp、sftp 来回折腾,会显得很重。
R-Shell 这个开源项目解决的就是这个问题:把保存连接、远程执行、交互终端、文件传输、系统监控收敛到一个命令行工具里。
项目地址:
https://github.com/MageGojo/r-shell-cli
一、项目背景
R-Shell 是一个用 Rust 编写的命令行 SSH 工作台,面向开发者和运维人员。
它的核心目标是:
把日常服务器操作收敛到一个可脚本化的命令行工具里和系统自带的 ssh、scp 不同,R-Shell 更强调:
- 连接信息统一管理
- 一套连接定义反复复用
- 常用操作子命令化
- 输出对管道和脚本友好
- 内置安全默认值
- 可被 AI 工具调用
对于经常在多台服务器之间切换的用户来说,这类工具可以明显减少记 IP、敲参数、来回切工具的成本。
二、它和 ssh + scp 有什么区别
很多人会问:系统自带的 ssh、scp 已经够用了,为什么还要 R-Shell。
下面这张表能说明它的定位。
| 场景 | 传统 ssh / scp | R-Shell |
|---|---|---|
| 连接信息管理 | 手写 config 或记 IP | connections 子命令统一增删改查 |
| 执行远程命令 | ssh user@host “cmd” | r-shell exec -c prod – cmd |
| 文件传输 | scp 单独记路径 | upload / download 复用连接定义 |
| 看服务器负载 | 手动 top、df、free | stats 一条命令聚合输出 |
| 给 AI 工具用 | 不支持 | 内置 MCP 服务器 |
| 安全默认值 | 取决于系统配置 | 内置主机密钥校验、凭据文件收紧 |
简单说:
R-Shell 不是要取代 ssh 而是把连接管理 + 常用操作 + 安全默认 + AI 集成 打包成一个顺手、可脚本化的工具三、项目核心功能
根据项目说明,R-Shell 主要提供以下能力。
1. 保存的连接管理
工具可以像通讯录一样管理 SSH 连接,支持增删改查。
常见使用场景:
把生产、测试、数据库机器都存起来 以后用名字引用,不用每次敲 IP 导出连接列表做备份连接信息保存在本地,列表还能输出 JSON 方便脚本处理。
2. 远程命令执行
R-Shell 支持在远程主机上执行单条命令并打印输出。
比如:
连到 prod ↓ 执行 uname -a ↓ 本地直接看到输出这对运维非常实用,尤其是批量检查状态、查看服务、抓取信息等场景。
3. 交互式终端
项目支持打开完整的交互式 PTY 终端。
这意味着用户不仅能跑一次性命令,还能用 vim、htop、less 这类需要伪终端的程序。
例如:
r-shell shell -c prod ↓ 进入远端交互式 shell ↓ 正常使用 vim / htop / top对于需要现场排查问题的场景,交互式终端比一次性命令更顺手。
4. SFTP 文件传输
R-Shell 支持基于 SFTP 的文件上传和下载。
它不依赖远端是否安装 scp,只要 SSH 通了就能传。
例如:
本地安装包 ↓ upload 到远端 /tmp或者:
远端日志 ↓ download 到本地查看对于发版、拉日志、传配置的场景,这比手动拼 scp 命令要轻很多。
5. 远程系统资源快照
项目支持一条命令查看远端的 CPU、负载、内存、交换分区、磁盘和网络吞吐。
它的做法是连续采样两次,算出使用率和速率。
例如:
r-shell stats -c prod ↓ 一屏看完 CPU / 内存 / 磁盘 / 网络对于快速判断一台机器忙不忙、磁盘满没满,这个命令很方便。
6. 本地 MCP 服务器
R-Shell 内置一个本地 MCP(Model Context Protocol)服务器。
它让支持 MCP 的 AI 工具可以管理你保存的连接:
列出所有 SSH 连接 新建一个连接 更新连接信息 删除连接服务只绑定本地,凭据不会通过 MCP 泄露出去。
四、适合哪些用户
R-Shell 的适用人群比较明确。
| 用户类型 | 使用价值 |
|---|---|
| 运维人员 | 统一管理服务器,批量执行命令、拉日志 |
| 后端开发者 | 快速连测试机执行命令、传安装包 |
| 测试人员 | 跨机器执行脚本、传测试数据 |
| DevOps | 把远程操作写进部署脚本和流水线 |
| Rust 学习者 | 学习 CLI、SSH、异步和模块化设计 |
| 安全敏感用户 | 内置主机密钥校验和凭据保护 |
如果你只管理一两台机器,R-Shell 可以作为顺手的 SSH 工具。
如果你要管理很多服务器并写自动化脚本,它的连接管理和可脚本化能力会更有价值。
五、技术栈分析
R-Shell 使用 Rust 构建,技术栈比较聚焦。
根据仓库说明,核心技术包括:
| 技术 | 作用 |
|---|---|
| Rust | 核心开发语言 |
| clap | 命令行参数解析与子命令 |
| russh | 纯 Rust 的 SSH 协议实现 |
| russh-keys | SSH 密钥处理与 known_hosts |
| russh-sftp | SFTP 子系统 |
| tokio | 异步运行时 |
| crossterm | 终端 raw mode 与无回显输入 |
| rmcp | MCP 服务器实现 |
| serde / serde_json | 数据序列化 |
这个技术组合比较适合命令行网络工具:
Rust 负责性能和稳定性 tokio 负责异步 I/O russh 负责 SSH 协议 russh-sftp 负责文件传输 clap 负责命令行界面 rmcp 负责 MCP 服务从技术学习角度看,R-Shell 适合用来研究 Rust 命令行工具、SSH 协议、异步编程和模块化设计。
六、项目模块结构
项目模块划分比较清晰,业务逻辑和入口解耦。
源码目录大致如下:
cli/src/ ├── main.rs # CLI 入口、参数解析、命令分发 ├── native_backend.rs # 连接管理器 ├── ssh.rs # SSH 握手、命令执行、PTY、SFTP ├── monitor.rs # 远程系统资源解析 ├── model.rs # 数据模型 ├── storage.rs # 本地持久化 └── mcp.rs # 本地 MCP 服务器可以按职责理解:
| 模块 | 作用 |
|---|---|
| main.rs | 参数解析、命令分发、输出格式化 |
| native_backend.rs | 维护连接池,封装执行/传输/目录等操作 |
| ssh.rs | SSH 握手、命令执行、PTY、SFTP |
| monitor.rs | 解析 /proc 与 df,计算 CPU/网络速率 |
| model.rs | 连接与工作区的数据结构 |
| storage.rs | 读写 workspace.json |
| mcp.rs | 本地 Streamable HTTP MCP 服务 |
这种拆分方式的好处是:
- 业务逻辑和界面解耦
- SSH 层和命令层解耦
- 数据模型单独维护
- 方便单独测试核心模块
- CLI 和 MCP 服务共享同一套后端
事实上,R-Shell 最初是图形界面应用,正因为核心逻辑解耦,重构成 CLI 时几乎零成本复用了全部后端。
七、工作原理
R-Shell 的一次性命令可以拆成几个阶段。
1. 解析目标
每个联网命令都接受一个目标,可以是保存的连接,也可以是临时主机。
流程如下:
读取 -c 指定的保存连接 或读取 --host / --user 临时参数 ↓ 组装出 SSH 配置 ↓ 缺密码则安全提示输入2. 建立连接
拿到配置后,连接管理器会发起 SSH 握手并认证。
流程如下:
发起 SSH 连接 ↓ 校验服务器主机密钥 ↓ 密码或公钥认证 ↓ 连接建立成功3. 执行操作
连接建立后,根据子命令执行对应操作。
流程如下:
exec → 执行命令并打印输出 ls → 列出远程目录 upload → 上传文件 download → 下载文件 stats → 采样并打印系统资源 shell → 进入交互式终端4. 用完即走
对于一次性命令,操作完成后会自动断开连接。
流程如下:
执行操作 ↓ 返回结果 ↓ 自动关闭连接这种「连接、执行、断开」的模型,让每个命令都干净独立,很适合写进脚本。
八、安装和使用
项目使用 Rust 构建,从源码安装即可。
环境要求:
安装 Rust 和 Cargo(推荐用 rustup)构建步骤:
gitclone https://github.com/MageGojo/r-shell-cli.gitcdr-shell-clicargobuild--release--manifest-path cli/Cargo.toml产物路径:
cli/target/release/r-shell把它拷到 PATH 目录后即可直接使用:
sudocpcli/target/release/r-shell /usr/local/bin/ r-shell--version查看帮助:
r-shell--helpr-shell<command>--help九、命令实战示例
下面按子命令给出可直接复制的示例。
1. 管理保存的连接
# 列表(表格 / JSON)r-shell connections list r-shell connections list--json# 新增(公钥认证)r-shell connectionsadd\--nameprod\--host203.0.113.10\--usernamedeploy\--authpublickey\--key-path ~/.ssh/id_ed25519# 更新字段r-shell connections update<connection_id>--port2222# 删除r-shell connections remove<connection_id>列表的 JSON 输出是脱敏的,只会告诉你有没有密码,不会回显明文:
[{"connection_id":"ssh-1781247286839","name":"prod","host":"203.0.113.10","username":"deploy","port":22,"auth_method":"publickey","has_password":false,"has_private_key_path":true,"status":"Disconnected"}]2. 执行远程命令
r-shellexec-cprod --uname-ar-shellexec-cprod --"ls -la /var/www && df -h"r-shellexec--host203.0.113.10--userdeploy -- systemctl status nginx3. 交互式终端
r-shell shell-cprod按 Ctrl-] 可以强制退出本地 shell 循环。
4. 列出远程目录
r-shellls-cprod /var/log r-shellls-cprod /var/log--json5. SFTP 文件传输
# 本地 -> 远程r-shell upload-cprod ./app.tar.gz /tmp/app.tar.gz# 远程 -> 本地r-shell download-cprod /tmp/remote.log ./local.log6. 远程系统资源快照
r-shell stats-cprod示例输出:
OS: Linux 6.1.0 Uptime: 12d 4h 31m CPU: 7.4% (8 cores, load 0.42) Memory: 61.2% (4.9/7.8 GB) Disk: 40.0% (3.8/9.5 GB) Network: down 1.5 KB/s up 320 B/s7. 启动 MCP 服务器
r-shell mcp# R-Shell MCP server listening on http://127.0.0.1:9123/mcp十、项目安全设计
SSH 工具一定要重视安全。
因为它直接关系到服务器访问凭据。
R-Shell 在设计上有几个安全点值得关注。
1. 主机密钥校验
项目按照标准的 known_hosts 做首次信任校验。
流程如下:
首次连接 → 记录主机密钥 后续连接 → 校验是否一致 密钥变了 → 拒绝连接,提示可能的中间人攻击这和 OpenSSH 第一次连接新主机的行为一致。
如果确认是合法变更,比如服务器重装,删掉 known_hosts 对应那一行再连即可。
2. 凭据文件收紧
存放连接的 workspace.json 在写入时会被设置为仅属主可读。
文件权限 0600 目录权限 0700避免同机器上的其他用户读到你的连接配置。
3. MCP 端点访问控制
MCP 服务只绑定本地,并且做了访问控制:
Host 头必须是回环地址,抵御 DNS rebinding Origin 跨站或 null 一律拒绝 列表接口对凭据脱敏,不返回明文4. 仍需注意使用边界
即使有这些保护,也建议注意:
- 优先使用公钥认证,少存明文密码
- 临时机器用完及时删除连接
- 定期检查 known_hosts
- 不在不可信网络下随意开放 MCP
十一、把 R-Shell 接入 AI 工具
MCP 服务器暴露的工具如下,凭据均脱敏。
| 工具 | 说明 |
|---|---|
| r_shell_ssh_connections_list | 列出保存的连接 |
| r_shell_ssh_connection_create | 创建保存的连接 |
| r_shell_ssh_connection_update | 更新保存的连接 |
| r_shell_ssh_connection_delete | 删除保存的连接 |
| r_shell_ssh_tabs_list | 列出打开的标签 |
先启动服务,再把支持 MCP 的客户端指向本地地址:
{"mcpServers":{"r-shell":{"url":"http://127.0.0.1:9123/mcp"}}}这样就能让 AI 助手帮你管理 SSH 连接,而敏感凭据不会通过 MCP 泄露。
十二、适合学习的技术点
R-Shell 不只是一个工具,也适合作为 Rust 项目学习案例。
可以重点学习这些方向。
1. clap 子命令设计
项目用 clap 的 derive 宏声明整棵命令树,自动生成 help。
这是学习 Rust CLI 工具的好例子。
2. russh 的 SSH 编程
通过 russh 实现握手、认证、命令执行、PTY 和 SFTP。
适合学习 SSH 协议在 Rust 里的用法。
3. tokio 异步模型
SSH/SFTP 是 I/O 密集场景,项目用 tokio 驱动所有异步操作。
4. 主机密钥校验
通过 known_hosts 实现首次信任和密钥变更检测。
这是很多人写 SSH 工具时容易忽略的安全点。
5. 业务与界面解耦
核心模块完全不依赖界面,CLI 和 MCP 服务共享同一套后端。
这种结构对中大型 Rust 项目很有参考价值。
十三、可以如何二次开发
如果想基于 R-Shell 学习或扩展,可以考虑以下方向。
1. 流式大文件传输
当前传输适合中小文件,可以扩展为边读边写的流式传输。
2. 目录批量传输
在单文件传输基础上,增加整个目录的递归上传下载。
3. 更多平台的 stats 适配
当前 stats 面向 Linux,可以适配更多远端系统。
4. 连接分组与标签
给保存的连接增加分组、标签、收藏,方便管理大量服务器。
5. 加密存储凭据
把本地凭据接入系统钥匙串,进一步提升安全性。
十四、实际使用建议
如果你准备用 R-Shell 做日常工具,可以这样配置。
1. 先把常用机器存起来
把高频访问的服务器用 connections add 存好,以后用名字引用。
2. 优先用公钥认证
尽量用私钥而不是明文密码,更安全也更省事。
3. 给连接起清晰名称
比如:
prod-web test-db log-server方便在列表里识别。
4. 把命令写进脚本
exec、upload、download 都适合写进部署或巡检脚本。
5. 开发者可以关注源码结构
如果你是 Rust 开发者,可以重点看 cli/src 下各模块的职责划分。
十五、总结
R-Shell 是一个很适合开发者和运维使用、也适合学习的开源项目。
从使用角度看,它解决的是多服务器运维中的高频小痛点:
统一管理 SSH 连接 一条命令执行远程操作 SFTP 上传下载文件 快速查看系统资源 让 AI 工具帮忙管理连接从技术角度看,它覆盖了 Rust 命令行工具中很多有价值的模块:
clap 子命令设计 russh SSH 编程 tokio 异步 I/O SFTP 文件传输 主机密钥校验 本地 MCP 服务如果你日常需要在多台服务器之间跑命令、传文件、看负载,R-Shell 可以作为一个轻量、安全、可脚本化的 SSH 工具。
如果你正在学习 Rust 命令行开发,它也很适合作为源码阅读和二次开发参考。
项目地址:
https://github.com/MageGojo/r-shell-cli