macOS 上 nc -l -p 报错:BSD netcat 的参数和 Linux 不一样

Linux 上抄来的教程:

nc -l -p 1337

在 macOS 直接报错。因为 macOS 自带的是 BSD 版 netcat,参数和 Linux 上常见的 GNU/OpenBSD 版有几处不兼容。

正确写法

nc -l 1337

或者加日志:

nc -lv 1337
  • -l:监听
  • -v:verbose,显示连接信息
  • 端口号直接跟在后面,不用 -p

客户端连过来:

nc 127.0.0.1 1337

持续监听多个连接

单次 -l 处理完一个连接就退出。想常驻用 -k(keep-open):

nc -lk 1337

老版本不支持 -k 的话,套一层循环:

while true; do nc -l 1337; done

Linux vs macOS 差异速查

目的Linux (nmap-netcatnc.openbsd)macOS BSD nc
监听端口nc -l -p 1337nc -l 1337
短参组合nc -lp 1337不支持 -p 监听
持续监听nc -k -l 1337nc -lk 1337
UDP 监听nc -u -l -p 1337nc -u -l 1337
端口扫描nc -zv host 20-30一样
指定源端口发送nc -p 1234 host 80一样

-p 在 macOS 里只用于发送端指定源端口,监听时不能用。

检查你的 nc 是哪一版

which nc          # 通常 /usr/bin/nc
nc -h 2>&1 | head -3

BSD 版的帮助会显示 usage: nc [-46...。GNU 版会显示 Ncat: Version 7.xx

换成 ncat(可选)

如果不想记两套参数,直接装 nmap 自带的 ncat

brew install nmap
ncat -l 1337              # 和 Linux 上写法一样
ncat -lk 1337

ncat 参数在所有平台一致,还额外支持 SSL、SOCKS 代理,取代 BSD nc 很合适。

常见踩坑

  • 权限:监听 1024 以下端口需要 sudo
  • 防火墙:macOS 系统偏好设置里的防火墙可能拦掉外部连接
  • AirDrop / IPv6:BSD nc -l 8080 可能只绑 IPv6(::)不绑 IPv4,测试时改用 nc -4 -l 8080 强制 v4

一句话总结

macOS 的 nc 是 BSD 版,监听不用 -pnc -l 1337nc -lk 1337。要跨平台无差别用就装 ncat