← 返回全部文章

不用网盘,Windows 和 Mac 用 croc 互传大文件

croc 用一段临时 code 让两台电脑会合,局域网优先直连,跨网时由中继转发端到端加密的文件。附安装、收发和安全使用方法。

Windows 给 Mac 临时传一个十几 GB 的文件,常见做法是先上传网盘,再让另一台电脑下载。两边明明都在线,文件却要多走一趟云端,还可能卡在容量、限速和登录验证上。

croc 是一个跨平台命令行传文件工具。发送端选中文件,程序生成一段临时 code;接收端输入同一段 code,双方会合后开始传输。它支持 Windows 、 macOS 、 Linux 和多种 BSD,也有 ARM 、 ARM64 、 RISCV64 等 Release 包。

截至 2026 年 7 月 20 日,GitHub 已有超过 3.6 万 Star,最新正式版是 v10.4.14,许可证为 MIT 。

先装到两台电脑

macOS:

brew install croc

Windows:

winget install schollz.croc

也可以使用 Scoop 或 Chocolatey:

scoop install croc

# 或
choco install croc

Arch 、 Fedora 和 Termux:

sudo pacman -S croc
sudo dnf install croc
pkg install croc

Debian 、 Ubuntu 目前没有项目维护的官方 apt 安装路径,可以到 GitHub Releases 下载对应压缩包和 checksums 文件。 checksum 可用于检查下载是否损坏,但项目没有为 v10.4.14 提供独立数字签名。源码安装可运行:

go install github.com/schollz/croc/v10@latest

构建要求应以当前 go.mod 为准:v10.4.14 声明需要 Go 1.25,README 中的 Go 1.22+ 已经落后。

三分钟完成第一次传输

发送一份文件:

croc send report.pdf

发送目录或多个项目:

croc send photos/
croc send a.txt b.pdf photos/

发送端会显示类似下面的一次性 code:

1234-word-word-word

Windows 接收端可以直接输入:

croc 1234-word-word-word

Linux 和 macOS 默认会拒绝把 secret 直接放进命令行参数,避免它出现在进程参数中。接收时直接运行:

croc

再在 Enter receive code: 提示中粘贴。这种方式也不会把 code 写进当前命令的 shell history 。脚本或自动化场景可以使用 CROC_SECRET 环境变量,但不要把含有真实 code 的赋值命令保存进 shell history:

CROC_SECRET='1234-word-word-word' croc

最好给接收文件单独建一个空目录:

mkdir -p ~/Downloads/croc-inbox
croc --out ~/Downloads/croc-inbox

运行后再按提示粘贴 code 。这样既不会把 code 写进当前命令的 shell history,也能避免接收文件与桌面、项目目录或家目录中的同名文件混在一起。

croc 终端收发演示,素材来自项目仓库。演示中的 code 只用于说明流程

code 就是一张临时取件票

任何拿到完整 code 的人,都可能抢先进入这次传输。把它通过另一条可信渠道发给接收者,文件传完就丢弃,不要长期复用。

默认随机 code 比姓名、生日、123456 这类自定义值更稳妥。自定义 code 虽然只要求至少 6 个字符,但当前实现只把从第 6 个字符开始的内容用作 PAKE 密码;前五个字符不能计入密码强度。

程序默认会把 code 复制到剪贴板。敏感环境可以关闭:

croc --disable-clipboard send report.pdf

机密文件还可以先用独立工具加密归档,再通过不同渠道发送归档密码。 croc 的端到端加密保护传输内容,不负责判断对方发来的文件是否安全。

它实际怎么传

同一局域网内,croc 会尝试发现发送端临时启动的 relay,并让数据直接在局域网里传输。跨互联网直连失败时,文件密文会经过默认公网 relay 实时转发。

croc 仓库中的 relay 示意图。实际路径取决于局域网发现、 NAT 和防火墙

默认中继是 croc.schollz.com,控制端口为 TCP 9009,通常还使用 9010~9013 作为并行数据通道。使用 croc 不要求用户自己做端口转发,但它并非互联网环境下的纯 P2P,也不能称作“文件永不经过服务器”。

当前主传输路径使用 PAKE 建立会话密钥,再通过 PBKDF2-HMAC-SHA-256 派生 32 字节密钥,控制消息和文件块由 AES-GCM 加密。公网 relay 正常情况下只转发端到端密文,看不到文件明文和文件名。

文件走公网 relay 时,会留下哪些元数据

文件经公网 relay 转发时,relay 会接触整段加密流量,可以观察连接到它的来源 IP 、连接时间、持续时间、 room 标识、连接数、流量大小和时序。这里的 room 标识由 code 前四个字符加固定字符串后计算 SHA-256 得到,与完整 code 不同。双方还会在端到端加密通道内交换部分地址和 machine ID 。

--pass 只能控制 relay 访问,不能提供基于 TLS 证书的服务器身份验证。 croc 适合临时文件传输,但不能据此宣称匿名或零元数据。

断了能不能续传

活跃连接中断后,v10 协议会按条件最多重连 10 次。程序完全退出后,再次传同一个文件也可能续传,但有明确前提:

  • 发送端再次发送同一文件,并显式复用同一个 code;
  • 接收端保留同名、同大小的未完成文件;
  • croc 根据 32 KiB 全零块判断尚未写入的区域。

它使用同名同大小文件和全零块检测来恢复缺块,无法实现 rsync 式的任意增量同步。文件大小变化后会重新处理,网络故障类型不符合重连条件时也可能需要重传。

默认遇到同名文件会询问 Resume 或 Overwrite 。--yes 只跳过通用确认,不代表允许覆盖;无人值守覆盖还需要 --overwrite,普通用户不建议把这两个参数设成默认。

几个实用功能

发送一段文本:

croc send --text 'https://example.com'

生成二维码:

croc send --qr report.pdf

跳过常见大目录:

croc send --exclude 'node_modules,.venv' project/
croc send --git project/

--exclude 当前做的是不区分大小写的子串匹配,不支持精确 glob 。发送含密钥、配置和备份的目录前,应先显式检查文件清单,不能把排除规则当作安全边界。

强制只走局域网:

croc --local send report.pdf
croc --local

接收端运行第二条命令后,再按提示粘贴 code 。

访客 Wi-Fi 、客户端隔离、 VPN 或企业防火墙可能阻断局域网发现,这时 --local 会失败。

适合和不适合的场景

croc 很适合临时的一对一跨平台传输:电脑之间搬大文件、远程给同事交付构建包、在手机终端与电脑之间传文本或压缩包。它不需要注册账号,也不用先把文件完整上传到网盘。

它不适合多人长期分发、目录版本同步、陌生人公开投递,以及要求身份治理、审计记录和服务 SLA 的企业文件交换。接收陌生文件时,即使传输过程有端到端加密,也应放进空目录并按普通外来文件做安全检查。

来源:https://github.com/schollz/croc