本文要点
- netcat(nc) 是面向 TCP/UDP 的通用网络调试工具,一条命令即可手工收发原始数据。
- 连接模式:
nc 主机 端口可以直接拼接文本协议(如 HTTP)调试 Web 服务。 - 端口探测:
nc -z -v配合超时参数,可快速判断一批端口是否开放。 - 监听传输:
nc -l与重定向/管道配合,一条命令完成文件甚至目录的快速传送。 - 注意:nc 传输为明文且无鉴权,仅适合演示与调试;大规模端口扫描请用 nmap。
netcat 网络调试工具:从端口探测到文件传输
netcat 常被称为网络界的「瑞士军刀」:一个命令、一个文件,却能把 TCP 与 UDP 的原始数据收发、端口探测、文件传输、简易聊天全部搞定。排查网络或调试服务时,比 ssh、浏览器、专用工具都更轻量、更直接。
初识 netcat:一个命令的两种实现
netcat 的原理很简单:连接一个 TCP(或 UDP)端口,把对方的输入原样送到输出。它自身不带任何加密、鉴权或协议解析,正因为「什么都不做」,反而成了最灵活的调试工具。
市面上主要有两种实现,行为略有差异:
- OpenBSD netcat(Debian/Ubuntu 的
netcat-openbsd包):默认选项更丰富,支持-q、-N、-U(Unix socket)等,是现代 Linux 发行版的默认选择。 - 传统 netcat(
netcat-traditional包):老牌实现,nc命令可能是它的别名,选项较少。
在 Ubuntu 24.04 上,默认提供的就是 OpenBSD 版。可以先确认一下正在使用哪一种:
which nc
nc -h 2>&1 | head -5
dpkg -s netcat-openbsd | grep -E "^Package|^Version"实测输出类似:
/usr/bin/nc
OpenBSD netcat (Debian patchlevel 1.226-1ubuntu2)
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl]
Package: netcat-openbsd
Version: 1.226-1ubuntu2如果系统里没有 nc,按需安装其中一种即可:
sudo apt install netcat-openbsd # 推荐,功能更全
# 或
sudo apt install netcat-traditional连接模式:手写 HTTP 请求直连 Web 服务
netcat 最基本的用法是主动连接某个端口:nc 主机 端口。建立连接后,你在终端输入的一切会原样发给对方,对方返回的内容也会原样显示出来。
基于这个特性,我们可以手工拼一段 HTTP 请求发给本机的 nginx,不借助 curl、浏览器,直接观察服务端原始响应:
printf "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n" | timeout 3 nc -w 2 127.0.0.1 80 | head -6
命令拆开看:
printf "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n":\r\n是 HTTP 协议要求的行结束符,最后空一行表示请求头结束;nc -w 2 127.0.0.1 80:连接本机 80 端口,-w 2表示空闲超时 2 秒,防止连接一直挂着;head -6:只取响应前 6 行,方便观察。
输出里清清楚楚地看到了 HTTP/1.1 200 OK 和 nginx 的版本、时间等响应头。调试 LDAP、SMTP、Redis 这类自带明文协议的组件时,用 nc 手工交互比任何客户端都更直观。
端口探测:-z 与 -v 快速扫一轮
排查「某个端口到底通不通」是运维的高频需求。nc -z(zero I/O)只建立连接、不发送数据,立刻返回结果;-v 显示详细信息;-w 设置连接超时。组合起来就可以对一批端口做快速探测:
nc -zvw 1 127.0.0.1 22 80 631 9999
输出清晰明了:
22(ssh)、80(http)、631(ipp)都返回succeeded!,端口开放;9999没有任何服务监听,报Connection refused。
几个实用变体:
- 只想要「开/关」的简洁答案,去掉
-v即可; - 批量探测一个 IP 的连续端口段(如
nc -z 192.168.1.1 1-100,部分实现支持-z后跟范围); - 重点链路加
-v讲输出,便于记入巡检记录。
不过要说明:nc 的探测是逐端口串行的,扫一两个端口很快,扫描上百个端口就很慢且容易误报。大规模端口扫描(尤其是对公网主机)请用 nmap,它会做并发、重试与更准确的协议识别:
nmap -sT -p 1-1000 目标主机监听模式:-l 搭建简易聊天机
nc -l 端口 让本机监听一个端口,等待对方连入——不设任何协议,连上来就能「说人话」。在两个终端里跑两条命令,就能搭一个简易聊天器:
# 终端 A(监听方)
nc -l 9000# 终端 B(连接方)
nc 127.0.0.1 9000之后任何一端输入并回车,另一端会立即看到。因为没有加密、没有身份校验,任何人连上来都能加入聊天——这只适合临时调试。
-l 模式还常配合 -q 使用:数据发送结束(stdin 读到 EOF)后,-q 秒数 让监听端再存活一段时间把剩余数据发完再关闭,避免传输明明没结束连接却先断了。
文件传输:一条管道千里传文件
把监听模式和管道、重定向组合起来,nc 就变成了最精简的文件传输工具。原理是:文件内容喂给 nc,在另一端 nc 把收到的内容写回磁盘。
实测一条命令完成「发送 → 接收 → 验证」:接收端监听 9000 端口并等待,发送端把主机名通过管道发过去:
(cat /etc/hostname | nc -l -q 1 9000) & sleep 1; nc -w 2 127.0.0.1 9000
实际使用中两个端分别在两台机器上执行:
# 接收方(先执行,B 机)
nc -l 9000 > backup.tar.gz# 发送方(后执行,A 机)
cat backup.tar.gz | nc B机IP 9000需求反过来的文件、压缩包同样适用,nc 主机 端口 < 文件 即可。注意 nc 的文件传输是明文且无鉴权,适合内网传非敏感数据;对外传输敏感内容请走 scp/rsync 这类加密通道。
与 tar 配合:一条命令搬走整个目录
传单个文件用 > 和 <,传整个目录就需要「先打包再传」。nc 的神奇之处在于可以把它和 tar 用管道串成一条命令,实现「打包压缩 + 传输」一步完成:
# 接收方(B 机)
nc -l 9001 | tar xzf - -C /tmp/接收目录# 发送方(A 机)
tar czf - /path/to/目录 | nc B机IP 9001实测从监听端打包发送 /etc/hostname,客户端解压到 /tmp/ncout 后能正确读回内容:
tar: Removing leading `/' from member names
--- extracted hostname ---
demotar: Removing leading / 只是 tar 去掉绝对路径前缀的正常提示。这里 -q 2 很重要:tar 打包大目录需要时间,传输结束后留给远端 2 秒收尾,否则接收端可能在解压前就断开。目录很大时建议把 -q 调大或用 -w 超时兜底。
UDP 模式:-u 覆盖无连接场景
默认 nc 走 TCP,加 -u 即可收发 UDP 数据包。UDP 面向无连接,常用于 DNS、NTP、日志转发这类场景的调试。一条命令验证收到的是不是正确的 UDP 包:
(nc -ul -q 1 9002) 2>/dev/null & sleep 1; echo "udp-payload" | nc -u -w 1 127.0.0.1 9002监听端收到 udp-payload 后打印出来,说明 UDP 收发链路正常。想监听并持续打印收到的 UDP 报文,nc -ul 9002 就能当个简易的 UDP 日志接收器。
安全提醒:nc 是把双刃剑
肯定 nc 的灵活之余,也要记住它的边界与风险:
- 明文无加密:传输内容可被中间人截获,绝不能用于密码、密钥等敏感数据;
- 无鉴权无日志:
nc -l监听的服务任何主机都能连接,内网环境加防火墙白名单更安全; - 公网监听会被全网扫描:在公网机器上
nc -l会立刻被扫描器盯上,只做临时调试、用完即关; - 反向 shell 的经典用法:攻击者常利用
nc在自己机器监听、在被攻陷主机上执行反向连接来拿 shell。这不是 nc 的错,但意味着普通服务器上不该残留无人管理的 nc 监听进程。
作为运维人员,把它当作「临时调试管道」是一种高效习惯;把它当作「正式传输方案」则是给自己埋雷。
小结
netcat 用一个极简的抽象统一了 TCP/UDP 的收发:连接、监听、探测、传输都只围绕「管道 + 重定向」两个概念展开。排查端口、手测协议、机器间临时传文件,nc 都是最快的船。而需要加密、并发、健壮的场合,它前面还有 scp、rsync、nmap 这些更专业的工具补齐。
评论 (0)
暂无评论,快来抢沙发吧!