本项目的未来取决于社区的支持。今天就成为赞助者。
关于
croc 是一个允许任何两台计算机简单且安全地传输文件和文件夹的工具。据我所知,croc 是唯一一个 CLI 文件传输工具,能够全部做到以下几点:
- 允许任何两台计算机传输数据(使用中继)
- 提供端到端加密(使用 PAKE)
- 支持便捷的跨平台传输(Windows、Linux、Mac、浏览器)
- 允许多文件传输
- 允许恢复被中断的传输
- 无需本地服务器或端口转发
- IPv6 优先,并支持 IPv4 回退
- 可以使用代理,例如 Tor
有关 croc 的更多信息,请参阅我的博客文章或阅读我最近接受的一次采访。

无需安装
你可以在 getcroc.com 上无需安装任何内容即可使用 croc。
浏览器版本与 CLI 完全兼容,因此你可以在两者之间发送和接收文件。
安装
你可以下载 适用于你系统的最新发行版,或从命令行安装一个发行版:
curl https://getcroc.com | bash
在 macOS 上
使用 Homebrew:
brew install croc
使用 MacPorts:
sudo port selfupdate
sudo port install croc
在 Windows 上
你可以使用 Scoop、Chocolatey 或 Winget 安装最新版本:
scoop install croc
choco install croc
winget install schollz.croc
使用 nix-env
你可以使用 Nix 安装最新版本:
nix-env -i croc
关于 NixOS
你可以将此添加到你的 configuration.nix:
environment.systemPackages = [
pkgs.croc
];
在 Alpine Linux 上
首先,安装依赖项:
apk add bash coreutils
wget -qO- https://getcroc.com | bash
在 Arch Linux 上
使用 pacman 安装:
pacman -S croc
在 Fedora 上
使用 dnf 安装:
dnf install croc
关于 Gentoo
使用 portage 安装:
emerge net-misc/croc
关于 Termux
使用 pkg 安装:
pkg install croc
在 FreeBSD 上
使用 pkg 安装:
pkg install croc
在 Linux、macOS 和 Windows 上通过 Conda 安装
你可以从 conda-forge 全局安装,使用 pixi:
pixi global install croc
或者安装到特定环境中,使用 conda:
conda install --channel conda-forge croc
在 Linux 上,通过 Docker 在 macOS 上
将以下单行函数添加到你的 ~/.profile(适用于任何符合 POSIX 标准的 shell):
croc() { [ $# -eq 0 ] && set -- ""; mkdir -p "$HOME/.config/croc"; docker run --rm -it --user "$(id -u):$(id -g)" -v "$(pwd):/c" -v "$HOME/.config/croc:/.config/croc" -w /c -e CROC_SECRET docker.io/schollz/croc "$@"; }
您也可以直接将其粘贴到终端中,用于当前会话。首次运行时,Docker 将拉取该镜像。croc 通过 Docker 仅在当前目录及其子目录中有效。
从源码构建
如果您愿意,可以 安装 Go 并从源码构建(需要 Go 1.22+):
go install github.com/schollz/croc/v10@latest
在 Android 上
有可用的 F-Droid 应用:
- crocgui — 原始移植版(Go,基础 UI)
- croc-app — 原生 Kotlin/Jetpack Compose 客户端,具有现代、移动优先的界面
- FlCroc — 跨平台 Flutter GUI(Android、Windows、Linux),将
croc二进制文件作为其传输核心。
在桌面端
社区制作的桌面应用:
- Croc GUI — 非官方 macOS、Windows 和 Linux 桌面 GUI,捆绑了
croc二进制文件,支持拖放传输、二维码、LAN 模式以及中继/代理选项。 - croc-desktop — 非官方 Linux、macOS 和 Windows 桌面 GUI(实验性 iOS/Android),基于 Wails v3 构建;在进程内嵌入 croc 以实现发送/接收、二维码、历史记录、日志以及可选的中继托管。
- Swamp Swap — 非官方 PyQt6 GUI 桌面应用,适用于 macOS、Windows 和 Linux,通常需要先单独安装
croc才能使用。设计紧凑且简单。
用法
要发送文件,只需执行:
$ croc send [file(s)-or-folder]
Sending 'file-or-folder' (X MB)
Code is: code-phrase
然后,要在另一台计算机上接收该文件(或文件夹),请运行:
croc code-phrase
代码短语用于建立密码认证密钥协商(PAKE),该协商为发送方和接收方生成用于端到端加密的密钥。
自定义与选项
加密临时存储
当即时点对点传输不方便时,croc 可以上传
常规文件作为客户端加密的密文:
croc send --store [file1] [file2]
该命令会打印一个浏览器链接和一个 CLI 令牌。传输在 24 小时后或第一个接收者下载、认证并验证所有文件后过期——以先发生者为准。运行 croc 且不带任何参数,并在提示符处粘贴令牌以接收它。对于自动化,请将令牌从进程列表中隐藏:
CROC_STORE_TOKEN='croc-store-v1....' croc --out ./downloads
浏览器链接的形式为
https://host/s/id#v1.decryption-key。解密密钥位于 # 之后,因为
URL 片段不包含在 HTTP 请求中,因此存储服务获取到
不透明的传输 ID,但无法获取密钥。完整的链接仍然是机密:任何
拥有该链接的人都可以解密并领取唯一允许的下载。
在传输被下载或过期之前,其发送者可以使用 本地保存的撤销回执将其删除:
croc --revoke [transfer-id]
存储模式为可选功能,且独立于 croc 的常规实时中继传输。
可通过 --store-url 或 CROC_STORE_URL 选择自托管服务。
请参阅 存储传输设计与运维指南
以了解协议、隐私、限制及部署详情。
在 Linux 或 macOS 上使用 croc
在 Linux 和 macOS 上,发送和接收流程略有不同,以避免 通过进程名称泄露密钥。您需要将密钥作为环境变量运行 croc。例如,使用密钥 *** 进行接收:
CROC_SECRET=*** croc
对于单用户系统,可以通过运行以下命令永久启用默认行为:
croc --classic
自定义代码短语
您可以使用自己的代码短语发送(至少需要 6 个字符):
croc send --code [code-phrase] [file(s)-or-folder]
允许覆盖而不提示
若要自动覆盖文件而不进行提示,请使用 --overwrite 标志:
croc --yes --overwrite <code>
保留两个文件且不提示
若要保留现有文件,并将传入的文件以新名称接收(例如 video (1).mkv),请使用 --rename 标志:
croc --yes --rename <code>
排除文件夹
若要排除某些文件夹不被发送,请使用 --exclude 标志,并以逗号分隔的排除项。这会对每个文件的相对路径执行不区分大小写的子字符串匹配,因此任何包含给定字符串之一的路径都将被排除:
croc send --exclude "node_modules,.venv" [folder]
如果需要排除某个特定文件,而不是包含某个子字符串的所有路径(例如,两个文件在不同深度具有相同的名称,但只需排除其中一个),请使用 --exclude-file。它接受以逗号分隔的相对路径,并对其进行精确匹配:
croc send --exclude-file "subfolder/image.jpg" [folder]
使用管道 - stdin 和 stdout
你可以将管道连接到 croc:
cat [filename] | croc send
要将文件接收至 stdout,您可以使用:
croc --yes [code-phrase] > out
发送文本
要发送 URL 或短文本,请使用:
croc send --text "hello world"
发送多个文件
您可以通过列出文件和/或文件夹直接发送多个文件:
croc send [file1] [file2] [file3] [folder1] [folder2]
显示二维码
要显示二维码(用于移动设备),请使用:
croc send --qr [file(s)-or-folder]
二维码打开 https://getcroc.com/?code=...,Web 客户端
会自动以仅接收模式连接。
使用代理
您可以通过添加 --socks5 来通过代理发送文件:
croc --socks5 "127.0.0.1:9050" send SOMEFILE
更改加密曲线
若要为加密选择不同的椭圆曲线,请使用 --curve 标志:
croc --curve p521 <codephrase>
更改哈希算法
为了更快地进行哈希,请使用 imohash 算法:
croc send --hash imohash SOMEFILE
剪贴板选项
默认情况下,代码短语会被复制到您的剪贴板。要禁用此功能:
croc --disable-clipboard send [filename]
要复制包含密钥作为环境变量的完整命令(在 Linux/macOS 上很有用):
croc --extended-clipboard send [filename]
这会复制完整的命令,例如 CROC_SECRET="code-phrase" croc(包括任何中继/转发标志)。
静默模式
要抑制所有输出(对脚本和自动化有用):
croc --quiet send [filename]
自托管中继
您可以运行自己的中继:
croc relay
默认情况下,它使用 TCP 端口 9009-9013。您可以自定义端口(例如,croc relay --ports 1111,1112),但至少需要 2 个端口。
要使用您的中继发送文件:
croc --relay "myrelay.example.com:9009" send [filename]
使用 Docker 自托管中继
你也可以使用 Docker 运行中继:
docker run -d -p 9009-9013:9009-9013 -e CROC_PASS='YOURPASSWORD' docker.io/schollz/croc
要使用您的自定义中继发送文件:
croc --pass YOURPASSWORD --relay "myreal.example.com:9009" send [filename]
要使用自定义端口,请设置 CROC_PORTS(逗号分隔)或 CROC_PORT(基础端口):
docker run -d -p 9010-9011:9010-9011 -e CROC_PORTS='9010,9011' -e CROC_PASS='YOURPASSWORD' docker.io/schollz/croc
Web 客户端
web/ 中的 React/Vite 客户端可以与普通的 croc CLI 对等节点
发送和接收多个文件。生产客户端及其 WebAssembly 协议
运行时仅在独立的 croc-web 服务器中打包,从而将生成的
资源与 web-server 代码排除在跨平台的 croc 二进制文件之外。croc-web 的 Linux
amd64 构建版本随每次发布单独发布。它
同时提供该站点及其同源 WebSocket 中继服务:
croc-web getcroc.com
默认情况下,这绑定到 127.0.0.1:9014 用于 HTTPS 反向代理。/
提供网站服务,而 /ws 桥接到 ipv4.getcroc.com。对于可直接访问的本地开发服务器,croc-web localhost:5173 绑定并
在 localhost:5173 上提供服务。使用 --bind、--relay 和 --ports 在
网站地址之前以自定义本地监听器或上游 croc 中继。
运行 make build-web 以生成被忽略的生产资源并构建
本地服务器。参见 web/README.md 了解前端开发、
自定义中继和反向代理说明。
部署
Disco
Disco 用于部署。根目录 Dockerfile 和 disco.json 部署
croc-web Web 客户端和 croc TCP 中继,作为从同一镜像构建的两个 Disco 服务。
Disco 通过 HTTPS 提供网站服务,而中继端口 9009-9017 直接
发布为 TCP 端口。
使用以下命令设置部署环境变量:
disco env:set \
STORE_DIR=/www/croc/storage \
SITE_URL=yoururl.com \
CROC_RELAY_PORTS=9009,9010,9011,9012,9013,9014,9015,9016,9017 \
CROC_PASS=yourpass \
--project croc
SITE_URL 必须是公共网站主机名,且不含 https://。如果项目名称不是 croc,请更改项目名称。存储目录有意未挂载到 Disco 卷上,因此每当容器被替换时,已存储的传输数据都会被清除。
CROC_RELAY_PORTS 中的端口必须与 disco.json 中的 publishedPorts 条目相匹配;Disco 无法从环境变量生成主机端口映射。请确保服务器的防火墙或云安全组中也开放了相同的 TCP 端口。
致谢
croc 经过多次迭代发展而来,感谢大家的贡献!特别感谢:
以及更多!
