ITADN
schollz/croc
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

croc
Version Build Status GitHub Sponsors

本项目的未来取决于社区的支持。今天就成为赞助者

关于

croc 是一个允许任何两台计算机简单且安全地传输文件和文件夹的工具。据我所知,croc 是唯一一个 CLI 文件传输工具,能够全部做到以下几点:

  • 允许任何两台计算机传输数据(使用中继)
  • 提供端到端加密(使用 PAKE)
  • 支持便捷的跨平台传输(Windows、Linux、Mac、浏览器
  • 允许多文件传输
  • 允许恢复被中断的传输
  • 无需本地服务器或端口转发
  • IPv6 优先,并支持 IPv4 回退
  • 可以使用代理,例如 Tor

有关 croc 的更多信息,请参阅我的博客文章或阅读我最近接受的一次采访

Example

无需安装

你可以在 getcroc.com 上无需安装任何内容即可使用 croc。

浏览器版本与 CLI 完全兼容,因此你可以在两者之间发送和接收文件。

安装

你可以下载 适用于你系统的最新发行版,或从命令行安装一个发行版:

curl https://getcroc.com | bash

在 macOS 上

使用 Homebrew:

brew install croc

使用 MacPorts

sudo port selfupdate
sudo port install croc

在 Windows 上

你可以使用 ScoopChocolateyWinget 安装最新版本:

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-urlCROC_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 用于部署。根目录 Dockerfiledisco.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 经过多次迭代发展而来,感谢大家的贡献!特别感谢:

以及更多!