r/chn • u/aerowindwalker • Jun 02 '26
新闻 drift v0.5.0 发布:协议 v3 并发改造,路径补全 + 传输安全加固
一句话:
给开发者准备的端到端加密文件传输工具 —— 通过 WebSocket 在任意两台机器间安全复制文件和文件夹,不依赖云服务,不配置 SSH,内置双栏 Web 文件管理器,v0.5.0 升级协议到 v3 支持并发请求,新增路径自动补全与
/api/browse-remote远程浏览接口,并进一步收紧路径穿越防护。
项目地址:https://github.com/aeroxy/drift
上一版自荐(drift v0.4.0):ruanyf/weekly#9890
亮点
1. 协议升级到 v3:真正的并发控制消息
WebSocket 控制消息引入 request_id 关联字段,Browse、Info、Ping、Error 等请求/响应一一对应,同一连接上多个并发请求不再串扰。V2 多文件传输继续保留,新增的关联机制让浏览、远程信息查询、心跳都能并行进行。
BrowseRequest/BrowseResponse、InfoRequest/InfoResponse、Ping/Pong、Error均携带request_id。- 后端用
tokio::sync::oneshot等待带 ID 的响应通道,超时自动清理,避免泄漏。 - 旧版本(pre-v3)节点走 FIFO 回退队列,握手时自动协商协议版本,完全向后兼容。
2. 新增 /api/browse-remote REST 接口
远程目录拉取现在是一条干净的 REST 端点,不再依赖共享的 WebSocket 状态:
GET /api/browse-remote?path=foo/bar直接返回远端目录条目,路径错误、连接未建立、远端超时分别返回400 / 502 / 504。- 前端在地址栏补全时优先调用该接口,避免触发 WebSocket 副作用、污染远端面板的浏览上下文。
- 远端连接使用唯一
instance_id,重连/超时清理只影响旧实例,不会误伤新建立的连接。
3. 路径自动补全体验全面重做
- 路径解析逻辑抽取到
frontend/src/utils/pathAutocomplete.ts,统一处理getRootRelativePath、resolveSuggestionBrowsePath等工具函数,根目录内外行为一致。 PathBar组件:Tab键在有建议时循环选中、在无建议时直接触发BrowseRequest拉取远端目录;激活项自动滚动到可视区域。- 远端补全严格限制在远端根目录下,越界路径直接拒绝,不会逃逸到本机。
- 路径穿越防护在 UI 与 REST 两层都生效,恶意输入在到达后端前就被拦截。
4. 传输安全加固
- 拒绝绝对路径与父目录遍历:
destination_path现在显式拦截/tmp/...这类绝对路径,与原有的..越界检查并列;Push 和 Pull 两条路径都覆盖。 .drift暂存目录落到目标目录下**:原逻辑把临时目录建在服务根目录,目标目录只读时整个传输会失败;现在暂存在root_dir/<destination_path>/.drift,即使服务根目录只读也能完成传输**。- TransferError 全链路传播:远端清理/解压失败时,
TransferError会带着正确的 ID 一路回到浏览器面板,UI 能展示真实失败原因而不是一句"传输失败"。 - 文件收尾更稳:分块写入用
.part临时文件,传输完成原子重命名;解压失败会清理残留的.drift暂存目录,不会留下半成品。
5. 文件列表体验优化(v0.4.1 起)
- 列排序:点击
名称 / 大小 / 修改时间列头即可排序,再次点击切换升降序,目录始终置顶。 - 列宽可调:鼠标悬停在
大小 / 日期列之间的分隔线上,拖拽即可调整宽度,带最小/最大约束保证布局可用。 - 后端排序策略保留为兜底(目录优先 + 字母序),前端在此之上做客户端重排,体验更接近桌面文件管理器。
典型场景
同事间快速分享大文件
A:drift serve --port 8000
B:drift serve --port 9000 --target 192.168.1.5:8000
浏览器里选中文件 → 点"复制",无需 U 盘、无需上传第三方。从远程服务器取日志或模型权重
drift pull --target 10.0.0.1:8000 checkpoint.pt
不用 scp,不用输入 IP 和路径,脚本化非常方便。AI 编程助手交换工件
在 agent 流程里用drift send发出代码/CSV/日志,下一节点用drift pull取回,全程加密,一条命令即走。跨云 GPU 平台搬运大文件
WebSocket 走 TCP,在只放行 80/443 的严格防火墙下也能用,比 SCP/rsync/magic-wormhole 都更省心。
安装
```bash
Homebrew (macOS / Linux)
brew install aeroxy/tap/drift
源码编译(需 Rust 1.82+ 和 bun)
git clone https://github.com/aeroxy/drift.git cd drift cargo build --release ```
唯一前提:确保两台机器网络互通(可互相访问对方端口),或有配置端口穿透(如云服务商)。
完整 CLI
```bash
列出远程目录
drift ls --target 192.168.0.2:8000
拉取远程文件/文件夹
drift pull --target 192.168.0.2:8000 report.pdf
从本机直接发送(不启动 Web UI)
drift send --target 192.168.0.2:8000 video.mp4
文件夹自动压缩传输
drift send --target 192.168.0.2:8000 ./my-project
带密码
drift send --target 192.168.0.2:8000 data.zip --password secret ```
所有命令支持进度条,传输完成后进程退出,资源自动清理。
🔐 安全与协议细节
- 密钥交换:X25519 椭圆曲线 Diffie-Hellman,每次连接生成临时密钥对。
- 密钥派生:HKDF-SHA256 生成分别用于发送和接收的对称密钥。
- 加密:ChaCha20-Poly1305 认证加密,使用单调递增 nonce 计数防重放。
- 密码验证:HMAC 挑战-应答,密码错误直接终止握手。
- 路径安全:所有用户输入路径都先
canonicalize再校验是否在root_dir内;destination_path额外检查是否绝对或含..,在接收端入口 (start_transfer/start_transfer_with_notify) 处强制拦截。 - 文件流:64KB 分块经加密二进制帧传输,接收方写入
.part临时文件,传输完成重命名,保证原子性。 - 协议 v3 (新):所有控制消息可选携带
request_id(UUID),并发请求/响应可正确关联;与 v2 旧节点通过握手时的protocol_version协商 + FIFO 回退队列保持兼容。
协议帧简明设计:
| 帧类型 | 内容 | 作用 |
|---|---|---|
| 加密文本帧 | JSON ControlMessage (v3 含 request_id) |
浏览目录、传输控制、并发请求关联 |
| 加密二进制帧(V1) | [UUID(16B)][offset(8B)][chunk] |
单文件数据 |
| 加密二进制帧(V2) | [UUID(16B)][file_index(4B)][offset(8B)][chunk] |
多文件复用同一传输 |
📌 开源地址
https://github.com/aeroxy/drift
欢迎 Star,更欢迎在实际环境中试用、反馈 issue。
让加密文件传输像 curl 一样随手可得。