← 返回文章列表
POST / 2024-11-21

使用 nc 在两台主机之间传输文件

介绍如何使用 nc(Netcat)在两台主机之间传输文本或二进制文件,并补充进度显示、数据转发和安全注意事项。

nc(Netcat)是一个轻量级网络工具,可以通过 TCP 或 UDP 连接读写数据。借助 Shell 的管道和重定向功能,它可以快速在两台主机之间传输文本或二进制文件。

nc 不提供加密、身份认证和完整性校验。建议仅在可信网络中临时使用;传输敏感文件时,请优先选择 scpsftprsync -e ssh

快速上手

假设接收端 IP 为 10.26.27.130,监听端口为 1234

接收端:先监听端口

nc -l 1234 > citybanner.txt

发送端:发送文件

nc 10.26.27.130 1234 < citybanners_0809.txt

也可以使用管道:

cat citybanners_0809.txt | nc 10.26.27.130 1234

传输完成后,可以在两端计算摘要,确认文件是否完整:

sha256sum citybanner.txt
sha256sum citybanners_0809.txt

macOS 可使用:

shasum -a 256 citybanner.txt
shasum -a 256 citybanners_0809.txt

显示传输进度

如果已安装 pv,可以在发送端显示传输量、速度和进度:

pv file.txt | nc 192.168.1.1 20000

接收端仍然先执行:

nc -l 20000 > file.txt

常用参数

  • -l:监听模式,即作为接收连接的一端。
  • -p:指定本地端口。部分 nc 实现要求监听时使用,另一些实现不允许与 -l 同时使用。
  • -n:不进行 DNS 解析,将地址直接视为 IP。
  • -u:使用 UDP;默认使用 TCP。
  • -v:显示更详细的连接信息。
  • -w <秒数>:设置连接或空闲超时时间,具体行为取决于 nc 实现。

不同系统自带的 nc 可能是 OpenBSD Netcat、GNU Netcat 或 Ncat,参数存在差异。请先运行以下命令查看本机支持的语法:

nc -h

例如,常见监听写法有两种:

# OpenBSD Netcat(常见于 macOS、BSD 和部分 Linux 发行版)
nc -l 10000

# 部分传统 Netcat 版本
nc -l -p 10000

Windows 用户可以使用 Nmap 项目提供的 Ncat,或根据需要选择其他可信的 Netcat 实现。

命令行数据通信

服务端

nc -l 10000

客户端

nc -n 192.168.1.100 10000

连接建立后,任意一端输入内容并按回车,数据就会发送到另一端。连接关闭后,大多数 nc 实现会随之退出。

通常,一个监听中的 nc 一次只处理一个连接。如果需要持续接收多个连接,应使用当前实现提供的保持监听参数,或通过脚本循环启动 nc

文件传输

文本文件和二进制文件都可以通过标准输入、标准输出进行传输。下面统一使用兼容 OpenBSD Netcat 的监听语法;如果本机要求 -p,请改为 nc -l -p 10000

服务端向客户端发送文件

服务端发送:

nc -l 10000 < source.bin

客户端接收:

nc -n 192.168.1.100 10000 > target.bin

客户端向服务端发送文件

服务端接收:

nc -l 10000 > target.bin

客户端发送:

nc -n 192.168.1.100 10000 < source.bin

如果发送完成后连接没有自动关闭,可以根据本机版本使用 -N-q 0,或手动结束发送端。具体支持情况以 nc -h 为准。

数据转发

通过管道连接多个 nc 进程,可以实现简单的数据中转。使用前请确认防火墙允许相关端口,并确保监听端先启动。

单向数据中转

中转端先监听两个端口:

nc -l 10000 | nc -l 10001

客户端 1 向中转端发送数据:

nc -n 192.168.1.100 10000 < source.txt

客户端 2 从中转端接收数据:

nc -n 192.168.1.100 10001 > target.txt

双向数据转发

普通管道只能单向传输。借助命名管道(FIFO),可以建立简单的双向转发。

客户端 1 先监听:

nc -l 10000

中转端执行:

mkfifo nc-relay.fifo
cat nc-relay.fifo | nc -n 192.168.1.100 10000 | nc -l 10001 > nc-relay.fifo

客户端 2 连接中转端:

nc -n 192.168.1.100 10001

使用完毕后删除命名管道:

rm nc-relay.fifo

这种方式适合临时调试,不适合作为长期运行的转发服务。生产环境应使用具备访问控制、日志和加密能力的专用工具。


本文整理自 CSDN 博主「xflm」的文章,原文遵循 CC BY-SA 4.0 协议:

使用 nc 进行网络通信与文件传输