croc 文件传输教程:跨平台加密发送、断点续传与自建中继

介绍 croc 在 Windows、Linux 和 macOS 间加密传输文件的方法,涵盖安装、口令接收、目录与文本传输、断点续传、代理及自建 relay。

临时把一个大文件从 Windows 传到 Linux,常见方案不是需要登录云盘,就是要配置 SSH、开放端口或搭建临时 HTTP 服务。croc 把这个过程简化为一个发送命令和一段短语:两端通过中继建立连接,再使用 PAKE 派生密钥进行端到端加密。

croc 支持 Windows、Linux 和 macOS,可以发送单个文件、多个文件、目录或短文本,并能继续中断的传输。默认公共中继适合临时使用;对网络边界、可用性或连接记录有更严格要求时,也可以运行自己的 relay。

快速答案

发送端运行:

1
croc send report.zip

终端会显示一段类似 example-code-phrase 的接收短语。Windows 接收端直接运行:

1
croc example-code-phrase

Linux 和 macOS 的当前推荐方式是通过环境变量传入口令,避免口令出现在进程名称中:

1
CROC_SECRET=example-code-phrase croc

确认发送方、文件名和大小无误后接受传输。不要把接收短语发布到群聊、工单或公开日志;拿到短语的人可能尝试加入传输。

croc 为什么不需要端口转发

croc 默认让发送端和接收端都主动连接 relay,因此两台设备即使位于不同 NAT 或防火墙之后,通常也不需要配置公网 IP、入站端口或本地服务器。

relay 负责协助两端找到彼此并转发数据。文件内容由发送端和接收端通过 PAKE(Password-Authenticated Key Agreement,口令认证密钥协商)生成的密钥进行端到端加密。中继解决的是连通性问题,短语则参与建立双方共享的加密会话。

这不代表可以忽略口令安全。自动生成的短语应通过可信渠道交给接收者,传输前仍要核对文件信息。对敏感环境,还应评估中继可见的连接元数据、终端历史、剪贴板和接收目录权限。

安装 croc

Windows

使用 WinGet:

1
winget install schollz.croc

也可以选择 Scoop 或 Chocolatey:

1
scoop install croc
1
choco install croc

安装完成后检查版本:

1
croc --version

macOS

Homebrew 用户运行:

1
brew install croc

使用 MacPorts:

1
2
sudo port selfupdate
sudo port install croc

Linux

Arch Linux:

1
sudo pacman -S croc

Fedora:

1
sudo dnf install croc

如果发行版仓库没有合适版本,可以从官方 Releases 下载对应文件,或使用官方提供的安装脚本:

1
curl https://getcroc.schollz.com | bash

在生产设备上执行远程脚本前,建议先下载并审查内容。已经安装 Go 1.22 或更高版本时,也可以从源码安装:

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

发送文件、目录和多个项目

发送一个文件:

1
croc send backup.tar.zst

发送整个目录:

1
croc send project-assets

一次发送多个文件和目录:

1
croc send notes.md photo.jpg logs config

发送项目目录时,可以排除不需要的依赖和虚拟环境:

1
croc send --exclude "node_modules,.venv,.git" my-project

--exclude 接收逗号分隔的名称。传输前最好先确认排除范围,避免把密钥文件、环境变量文件、缓存和大型依赖目录一起发送。

自定义接收短语

默认随机短语适合大多数情况。若需要通过电话等方式传达,可以指定至少六个字符的短语:

1
croc send --code correct-horse-27 report.zip

自定义短语必须足够难猜。不要使用项目名、手机号、日期或 123456 之类的弱口令。短语只应交给预期接收者,传输结束后不要重复用于其他文件。

Linux 和 macOS 接收端推荐这样使用:

1
CROC_SECRET=correct-horse-27 croc

在可信的单用户系统中,可以用经典方式恢复把短语直接作为参数的行为:

1
croc --classic

经典方式更方便,但口令可能通过进程参数暴露给本机其他进程或监控工具。多人共用的服务器不建议这样设置。

发送文字、使用管道和二维码

发送短文本或 URL:

1
croc send --text "https://example.com/download"

从标准输入发送内容:

1
cat result.json | croc send

接收后直接写入文件:

1
croc --yes example-code-phrase > result.json

向手机发送时,可以让终端显示二维码:

1
croc send --qr photo.jpg

二维码同样包含加入传输所需的信息,不应展示在公开直播、截图或录像中。

断点续传怎么使用

croc 支持恢复中断的传输。网络断开后,保留发送端原文件和接收端已经写入的部分文件,再重新运行传输流程。接收路径、文件内容或中继条件发生明显变化时,恢复可能无法按预期进行。

实际操作时注意三点:

  1. 不要删除或改名接收端的未完成文件;
  2. 不要在恢复前修改发送端源文件;
  3. 确认磁盘剩余空间足够容纳完整文件。

如果恢复反复失败,先改用一个小文件测试两端和 relay 的连通性,再检查版本是否相差过大、代理是否稳定,以及安全软件是否拦截连接。

通过 SOCKS5 代理传输

croc 可以指定 SOCKS5 代理。例如本机代理监听 127.0.0.1:9050

1
croc --socks5 "127.0.0.1:9050" send backup.tar.zst

代理会影响连接路径和速度,但不会替代 croc 本身的加密。接收端是否也需要代理取决于其网络环境。排障时应分别验证代理端口、DNS 处理方式和 relay 地址是否可达。

自建 croc relay

最简单的方式是在服务器上直接运行:

1
croc relay

默认使用 TCP 端口 9009-9013。需要自定义时至少提供两个端口:

1
croc relay --ports 1111,1112

发送端指定自建中继:

1
croc --relay "relay.example.com:9009" send report.zip

使用 Docker 并为 relay 设置密码:

1
2
3
4
5
6
docker run -d \
  --name croc-relay \
  --restart unless-stopped \
  -p 9009-9013:9009-9013 \
  -e CROC_PASS='CHANGE_THIS_PASSWORD' \
  docker.io/schollz/croc

发送时同时提供 relay 地址和密码:

1
2
3
croc --pass CHANGE_THIS_PASSWORD \
  --relay "relay.example.com:9009" \
  send report.zip

部署前需要在云防火墙和主机防火墙中放行实际使用的 TCP 端口。relay 密码不要直接写进共享脚本、Shell 历史或公开的 Compose 文件;更合适的做法是从受控环境变量或密钥管理系统注入。

自建 relay 可以控制中继位置、访问策略和可用性,但不能替代端点安全。发送端被植入恶意程序、接收目录权限错误或短语泄露时,自建服务器也无法解决这些问题。

自动化时需要谨慎的参数

以下命令会跳过确认并允许覆盖同名文件:

1
croc --yes --overwrite example-code-phrase

它适合明确受控的自动化任务,不适合在不可信目录中随手运行。默认的确认提示可以帮助发现文件名、大小或来源异常,除非脚本已经独立验证接收目标,否则不要同时启用 --yes--overwrite

静默发送可以使用:

1
croc --quiet send report.zip

静默模式会减少日志输出,也可能掩盖失败原因。定时任务中应同时检查退出码,并把错误输出写入受保护的日志。

常见故障排查

两端输入短语后一直无法连接

先确认两端 croc 版本、系统时间和网络访问是否正常,再检查公司防火墙、代理或运营商是否阻止 relay 端口。可以用小文件重试,判断问题来自连接还是文件本身。

Linux 或 macOS 直接运行 croc 短语 不符合预期

新版推荐把短语放入 CROC_SECRET

1
CROC_SECRET=example-code-phrase croc

这是为了减少短语通过进程名称泄露的风险,不是安装失败。

接收端已经存在同名文件

优先保留确认提示,核对来源后再决定是否覆盖。只有在脚本已验证文件身份和目标路径时,才考虑 --yes --overwrite

自建 relay 可以连接但无法传输

确认映射和放行的是完整端口范围,而不只是第一个端口。默认 relay 使用 9009-9013;自定义范围时,Docker 映射、主机防火墙、云安全组和 croc 启动参数必须一致。

croc 适合哪些场景

croc 很适合临时跨平台传文件、远程协助用户导出日志、在没有 SSH 账号的设备间传递构建产物,以及把目录从旧电脑迁移到新电脑。它不需要双方注册账号,也不要求接收端开放入站端口。

如果需要长期同步、版本历史、团队权限管理或大规模备份,Syncthing、对象存储、rsync 或专门的备份系统通常更合适。croc 的定位是简化一次性或短期传输,而不是替代完整的数据管理方案。

总结

croc 把跨网络文件传输压缩为“发送文件、分享短语、接收确认”三个步骤,同时保留端到端加密、跨平台、断点续传和自建中继能力。日常使用默认公共 relay 即可;敏感或受控网络可以部署自己的 relay,但仍要保护接收短语、终端历史、文件权限和端点设备。

项目地址:schollz/croc