最直接有效的方式是使用sudo lsof -i -p -n | grep listen,可一次性显示所有监听端口的协议、绑定地址、进程名及pid;若需已建立连接,则用netstat -an | grep established;ss -tulnp(需先装iproute2mac)提供更精简带pid的视图。

你想在Mac终端里一次性看清所有网络连接的实时状态,包括哪些程序正在连哪个远程地址、用了什么协议、处于什么连接阶段,而不是只看IP或路由表。
用netstat查活跃连接与监听端口
netstat是macOS原生命令,能直接列出TCP/UDP连接和端口监听情况,但默认输出太杂,必须加参数过滤。
打开终端,执行:netstat -an | grep -E "(tcp|udp)"。这会拉出全部原始连接条目,包含本地地址、远程地址、状态(ESTABLISHED、LISTEN、TIME_WAIT等)和PID(如果权限足够)。
只看已建立的连接:运行netstat -an | grep ESTABLISHED。重点扫一眼Remote Address列,确认有没有陌生IP或可疑端口。
只看本机正在监听的端口:netstat -an | grep LISTEN。注意Local Address列是否绑定了0.0.0.0(表示对外暴露)还是127.0.0.1(仅本地可访问)。
【必须加sudo才能看到PID和进程名】否则你只能看到端口,不知道哪个程序在用。执行sudo netstat -tulv,输入密码后就能看到Program Name列,比如“Google Chrome”或“node”。
用lsof精准定位端口归属
当netstat显示某个端口被占用,但没PID或你看不清进程时,lsof是更可靠的替代方案——它把网络连接当作“打开的文件”,映射更准。
方法一:查全部监听项(不解析域名和端口名):sudo lsof -i -P -n | grep LISTEN。-P禁用端口名转换(显示80而非http),-n禁用主机名解析(显示IP而非域名),避免卡顿和误导。
方法二:查特定端口,比如你发现8080被占了:sudo lsof -i :8080。输出里COMMAND列直接告诉你进程名,PID列给你编号,方便后续kill或排查。
方法三:只提取PID数字,用于脚本调用:sudo lsof -ti :3000。这行命令不输出任何文字,只返回纯数字,比如“12345”,复制就能用。
用ss替代netstat获取带PID的精简视图
ss比netstat更快更轻量,原生支持PID直出,但macOS不自带,需先装兼容版。
第一步:安装Homebrew(如未安装):/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"。
第二步:用Homebrew装iproute2mac:brew install iproute2mac。
第三步:运行sudo ss -tulnp。输出只有5列:Netid(协议)、State(状态)、Recv-Q/Send-Q(队列)、Local Address:Port、Peer Address:Port、PID/Program name。一眼就能看出nginx占着443、code-server占着8080。
第四步:快速过滤某端口,比如只看53端口:sudo ss -tulnp | grep ':53'。注意冒号要写在单引号里,否则shell会误解析。
用ping和traceroute验证连通性与路径
netstat/lsof/ss告诉你“连了谁”,但不告诉你“能不能通”。这两条命令补上最后一环。
测试能否到达百度:ping -c 4 www.baidu.com。-c 4限定发4个包,避免停不下来。看最后统计行:packet loss为0%且time平均值低于100ms才算基本正常。
测试到网关是否通畅(排除本地断网):ping 192.168.1.1。这个IP得替换成你实际的路由器地址,可在“网络偏好设置→详细信息→TCP/IP”里找到“路由器”那一行。
查数据包在哪一跳断掉:traceroute cloudflare.com。从第1跳开始看,如果第3跳开始全是*,说明问题出在你家光猫或运营商接入层;如果只有最后一跳是*,大概率是目标服务器屏蔽了ICMP。











