R-Shell开源项目实战解析:用Rust打造命令行SSH工具,支持连接管理、远程执行、SFTP与MCP

在日常运维和开发中,很多人都要同时管理多台服务器。
比如:
- 一台跑生产 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)
构建步骤:
git clone https://github.com/MageGojo/r-shell-cli.git
cd r-shell-cli
cargo build --release --manifest-path cli/Cargo.toml
产物路径:
cli/target/release/r-shell
把它拷到 PATH 目录后即可直接使用:
sudo cp cli/target/release/r-shell /usr/local/bin/
r-shell --version
查看帮助:
r-shell --help
r-shell <command> --help
九、命令实战示例
下面按子命令给出可直接复制的示例。
1. 管理保存的连接
# 列表(表格 / JSON)
r-shell connections list
r-shell connections list --json
# 新增(公钥认证)
r-shell connections add \
--name prod \
--host 203.0.113.10 \
--username deploy \
--auth publickey \
--key-path ~/.ssh/id_ed25519
# 更新字段
r-shell connections update <connection_id> --port 2222
# 删除
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-shell exec -c prod -- uname -a
r-shell exec -c prod -- "ls -la /var/www && df -h"
r-shell exec --host 203.0.113.10 --user deploy -- systemctl status nginx
3. 交互式终端
r-shell shell -c prod
按 Ctrl-] 可以强制退出本地 shell 循环。
4. 列出远程目录
r-shell ls -c prod /var/log
r-shell ls -c prod /var/log --json
5. SFTP 文件传输
# 本地 -> 远程
r-shell upload -c prod ./app.tar.gz /tmp/app.tar.gz
# 远程 -> 本地
r-shell download -c prod /tmp/remote.log ./local.log
6. 远程系统资源快照
r-shell stats -c prod
示例输出:
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/s
7. 启动 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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)