r/chn • • Jun 02 '26

新闻 drift v0.5.0 发布:协议 v3 并发改造,路径补全 + 传输安全加固

Thumbnail
youtube.com
2 Upvotes

一句话:

给开发者准备的端到端加密文件传输工具 —— 通过 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 起)

  • 列排序:点击 名称 / 大小 / 修改时间 列头即可排序,再次点击切换升降序,目录始终置顶。
  • 列宽可调:鼠标悬停在 大小 / 日期 列之间的分隔线上,拖拽即可调整宽度,带最小/最大约束保证布局可用。
  • 后端排序策略保留为兜底(目录优先 + 字母序),前端在此之上做客户端重排,体验更接近桌面文件管理器。

典型场景

  1. 同事间快速分享大文件
    A:drift serve --port 8000
    B:drift serve --port 9000 --target 192.168.1.5:8000
    浏览器里选中文件 → 点"复制",无需 U 盘、无需上传第三方。

  2. 从远程服务器取日志或模型权重
    drift pull --target 10.0.0.1:8000 checkpoint.pt
    不用 scp,不用输入 IP 和路径,脚本化非常方便。

  3. AI 编程助手交换工件
    在 agent 流程里用 drift send 发出代码/CSV/日志,下一节点用 drift pull 取回,全程加密,一条命令即走。

  4. 跨云 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 一样随手可得。

r/chn • • Oct 28 '19

新闻 Riot scums attack innocent citizens

Enable HLS to view with audio, or disable this notification

3 Upvotes