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-netcat 或 nc.openbsd) | macOS BSD nc |
|---|---|---|
| 监听端口 | nc -l -p 1337 | nc -l 1337 |
| 短参组合 | nc -lp 1337 | 不支持 -p 监听 |
| 持续监听 | nc -k -l 1337 | nc -lk 1337 |
| UDP 监听 | nc -u -l -p 1337 | nc -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 版,监听不用 -p:nc -l 1337 或 nc -lk 1337。要跨平台无差别用就装 ncat。
