文章总结: croc是一款用Go编写的P2P文件传输工具,通过relay-assistedP2P和PAKE加密实现端到端安全传输,支持断点续传。它简化了临时跨网络文件传输,无需预先配置SSH环境。但固定服务器场景下,scp或rsync更合适。建议临时传输使用croc,固定场景继续使用scp。 综合评分: 88 文章分类: 实战经验
28K Star,用 Go 写的 P2P 文件传输,为什么比 scp 还好用
原创
go go
Go语言教程
2026年7月24日 13:04 陕西
在小说阅读器读本章
去阅读
把一份数据库备份从公司 Windows 传到家里 Mac,scp 还没敲,问题已经来了:目标机开没开 SSH?22 端口通不通?账号和密钥怎么给?机器躲在 NAT 后面又怎么连?
这种临时传文件,我一般不先碰 scp。
不是它慢,是它要求两台机器先建立一套“服务器关系”。
croc 处理的就是这个别扭点。题目里还是 28K Star,我查仓库时已经涨到 35.6K,最新版本是 2026 年 7 月 9 日发布的 v10.4.13。项目使用 Go 编写,发送文件只要一条命令。
croc send release.tar.zst
终端会生成一段短口令。接收端拿到口令后运行 croc 即可;Linux、macOS 新版建议通过环境变量传入,免得口令直接挂在进程参数里。
CROC_SECRET="短口令" croc
我第一眼看这个交互就觉得对了。
临时传一个包,不应该先创建系统账号,再配公钥,再去改安全组。croc 支持 Windows、Linux、macOS,可以传目录和多个文件,传输中断后还能继续。
不过有个地方得说准。
它不是完全脱离中继的“纯直连”,更接近 relay-assisted P2P。发送端和接收端都主动连接 relay,通过短口令进入同一个会话,再使用 PAKE 协商会话密钥,传输内容端到端加密。
接收端不需要暴露 SSH 端口,也不用为了传个文件去做端口转发。
这和 scp 的差别,不在复制命令长短,而在连接模型。
scp release.tar.zst [email protected]:/srv/drop/
这行命令看着挺干净,背后默认了一堆条件:目标地址可达、sshd 正常、账号存在、目录有权限、密钥没失效。
任何一个条件不成立,都得先修环境,再谈文件传输。
croc 两端走出站连接,对临时网络、跨系统设备、家用路由器后面的机器,确实省事不少。
我比较看重的还有断点续传。
大文件已经跑了一大半,网络抖一下又从零开始,这种工具我基本不会长期留。用 Go 做可恢复写入,关键动作其实就是偏移量和分块校验:
type Block struct {
Offset int64
Data []byte
Sum [32]byte
}
func saveBlock(dst *os.File, b Block) error {
if sha256.Sum256(b.Data) != b.Sum {
return fmt.Errorf("bad block at offset %d", b.Offset)
}
if _, err := dst.WriteAt(b.Data, b.Offset); err != nil {
return fmt.Errorf("write offset %d: %w", b.Offset, err)
}
return nil
}
这不是 croc 的源码,只是把传输思路摊开。
文件拆成块,每块记录自己的偏移,落盘前做一次校验。连接断掉以后,接收端只需要补缺失部分,不必把前面已经写完的数据再跑一遍。
Go 写这类工具很顺手。网络连接、并发任务、文件流处理,标准库已经把难啃的地方包住了;编译完又是一个独立程序,扔到不同系统上就能跑,不需要先装一串运行环境。
公司内网不想依赖公共 relay,也能自己启动一个:
croc relay
项目支持发送时指定自建 relay,默认 relay 会使用一组 TCP 端口。这个能力比“公共服务现在能不能用”更重要,真要放进团队里,传输入口最好还是握在自己手上。
但我不会拿它全面替代 scp。
固定服务器之间做发布、备份、定时同步,SSH 体系早就配好了,scp 或 rsync 更适合脚本化,也更容易接入权限和审计。
croc 真正舒服的场景,是两台原本没有账号关系、网络又不方便互通的设备,临时传一次文件。
所以“比 scp 好用”得加个范围:不是服务器运维,而是临时跨网络传文件。
scp 像一条提前铺好的专线,croc 则是两边报同一个暗号,先把路接上。
命令少只是表面。
它真正省掉的,是端口、账号、密钥和网络可达性那一串前置条件。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Go语言教程 go go《28K Star,用 Go 写的 P2P 文件传输,为什么比 scp 还好用》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论