做什么

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 不一定通