Linux 局域网传输大文件

2021-07-02

今天需要把一个大文件(约20G)拷贝到路由器的硬盘上。一般大家会想到用 scp 命令。scp 是 ssh copy 的缩写。我试了一下,速度只有 5M 多。要花将近一个小时才能拷完,实在不能忍。于是我就研究了一下怎么才能加快传输速度。

那为什么会慢呢?主要是 ssh 会对通信内容做加密🔐处理,发送端要加密,接收端要解密。但我的接收端是一台二手的华硕 AC1900P,主频是双核 1.4G,不支持 AES 硬解密。所以解密 ssh 数据的时候比较吃力。速度慢也是正常。所以我们需要找一种不用加密的办法来传。其实我的家庭局域网可以看成安全的环境,加密传输确实没有必要。

明文传输有好多办法。比如可以 http 协议,也可以使用 ftp 协议。但一般的 http 服务器默认都不支持上传文件,ftp 服务器更是难以配置。最简单的就是使用 netcat。

netcat 功能非常强大,可以执行简单的网络通信。

安装好 netcat 之后需要在接收端等待接收文件:

nc -l -p 1234 > bak.tgz

nc 就是 netcat 的命令,少数平台需要写成 netcat。-l 表示监听端口,等待接收数据。-p 1234表示要监听的端口号,我们这里监听的是1234端口。后面的> bak.tgz表示将收到的数据重定向到bak.tgz文件。如果没有这个重定向,netcat 会将收到的数据输出到 stdout。

接下来就可以在发送端发传输文集了:

nc 192.168.1.1 1234 < bak.tgz

nc 后面依次指定接收端的 IP 和端口号。再后面的 < bak.tgz 又是一个重定向,意思是将 bak.tgz 文件的内容通过管道传给 nc。nc 会先跟接收端建立 tcp 连接,然后将整个文件的内容慢慢传过去。

我自己试了一下,传输速度稳定在 30M 左右。考虑到我本来就是机械硬盘,再加上网络损耗和CPU操作,这个速度也算不错了。

「taoshu」微信公众号