做什么
netcat——读 / 写任意 TCP / UDP 连接。被称为"网络瑞士军刀"。
sudo apt install netcat-openbsd # 推荐版本
# Ubuntu 上 nc 一般是 netcat-openbsd 或 ncat(nmap 出品)
测端口(最常用)
nc -zv example.com 443
# Connection to example.com 443 port [tcp/https] succeeded!
nc -zv -w 2 192.168.1.1 22 80 443 # 测多个端口(-w 超时 2 秒)
# 测 UDP
nc -zuv example.com 53
简易聊天 / 监听
# 服务端(机器 A)
nc -l 1234
# 客户端(机器 B)
nc machine-a 1234
# 双方在终端互打字 + 互看见
文件传输
# 接收方(机器 A)
nc -l 1234 > received.zip
# 发送方(机器 B)
nc -N machine-a 1234 < file.zip # -N 发完就关
或:
# 服务端打包送出
tar czf - folder/ | nc -l 1234
# 客户端接收并解包
nc server 1234 | tar xzf -
scp / rsync 是更好的选择——nc 适合没装那些工具的环境。
假装一个 HTTP 服务器(调试用)
echo -e "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\nhello" | nc -l 8080
# 浏览器访问 :8080 看到 hello
端口扫描
nc -zv example.com 80-100 # 扫 80-100
nc -zv -w 1 192.168.1.1 1-1024 2>&1 | grep succeeded
给自己的机器扫没问题,别扫别人——可能违法。
当作端口转发
# 监听 8080,转发到 db:5432
nc -l 8080 -c 'nc db 5432'
# 或:mkfifo + 双向管道
更通用方案:socat(更强大的网络瑞士军刀)。
常用参数
| 参数 | 含义 |
|---|---|
-l |
监听模式(server) |
-p PORT |
指定本地端口(监听) |
-z |
扫描模式(只测连通,不传数据) |
-v |
verbose |
-w N |
超时 N 秒 |
-u |
UDP(默认 TCP) |
-N |
EOF 收到就关 |
-k |
监听时不退出(多次连接) |
不同的 nc 版本
Linux 上 nc 有多个版本:
netcat-openbsd(多数 Ubuntu 默认,推荐)netcat-traditional(老)ncat(nmap 出品,更强)
某些参数(如 -N)只在特定版本有——用之前 nc -h 看。
坑
nc -l默认 TCP——UDP 要-u- 不同版本 nc 的参数兼容性差——脚本里小心
- 现代防火墙 / NAT 让 nc 反向 shell 不一定通