笔者在这里主要说下netstat和lsof的使用,以及netstat在mac系统下很多功能的缺失,这个场景下,lsof是很好的补充。个人比较喜欢使用lsof,而对于netstat,即使是linux下,也推荐使用ss代替
netstat
netstat命令列出了关于你的计算机网络通讯的详细信息,网络通讯包括你的计算机通过所有的端口和应用与外界talking的所有方式。所以,征服netstat可以帮助你理解您的计算机如何和怎样建立连接的。
netstat会报告你计算机的所有激活的网络连接,考虑到现代网络设备执行的功能数量,您可以预估到这个列表的长度。可以超过1000行。过滤netstat的输出对于理解你计算机激活的端口发生了什么是最基本的,它内置的flag允许您设置options,从而可以限制命令的输出范围
netstat Flags and Options
要想看看netstat的全部有效的options,你可以敲入man netstat
以打开netstat使用手册
Tips: man是manual的简称
语法
为了添加flags和options给netstat,你可以使用下面的语法1
netstat [-AabdgiLlmnqrRsSvWx] [-c queue] [-f address_family] [-I interface] [-p protocol] [-w wait]
Warning: netstat在macOS下与linux下工作方式是不一样的,所以在macOS下使用flags和语法会导致不期望的结果
Tips: 如果这些语法你不太理解,读一读怎样阅读命令语法
常用的flags
这里列举了常用的flags:
-a 在netstat的输出中包含服务端口(server ports)
-g 列出了和广播连接(multicast connections)相关的信息
-I interface 提供指定接口(interface)的数据包数据. 所有有效的接口(interfaces) 都能通过-i flag查看, 但是en0 通常是默认的传出网络接口(interface)
-n 隐藏带有名称的远程地址标签,带来的好处是:大大加快了netstat的输出,同时只牺牲了有限的信息
-p protocol 列出与特定网络协议(protocol)关联的流量. 完整的协议(protocol)列表位于/etc/protocols,但是最重要的协议是udp和tcp
-r 显示了路由表,显示数据包是如何在网络中路由的
-s 显示所有协议(protocol)的网络统计信息,无论它们是否处于活动状态
-v 增加详细程度,特别是通过添加一列来显示与每个打开的端口关联的进程ID(pid)
netstat 使用实例
- $ netstat -apv TCP
此命令仅返回Mac上的TCP连接,包括打开的端口和活动的端口。它还使用详细输出,列出与每个连接关联的PID
- $ netstat -a | grep -i “listen”
输出带有关键字“listen”的数据并查找结果
netstat的macOS版本缺少许多用户期望的功能。所以,它在macOS上不如在Windows上有用。这时,lsof命令替代netstat提供了许多netstat缺少的功能。用lsof补充netstat
lsof
lsof显示了当前在任何应用程序中打开的任何文件,您还可以使用它来检查与应用程序相关的开放端口(port), 运行lsof -i
, 您会看到所有与Internet通信的应用程序的列表
lsof flags and options
显示每个打开的文件或互联网连接通常很冗长。这就是lsof附带flags用以限制特定结果的原因。下面的是最重要的
常用的flags
这里列举了常用的flags:
-i 展示了所有打开的网络连接(open network connections) 和使用这个连接(connection)的进程(process)的名称. 如果增加一个4,如-i4, 将展示IPv4连接; 如-i6 将展示IPv6连接.
-i flag 还可以继续扩展以指定更多详细信息,-iTCP或者-iUDP将返回仅是TCP或UDP的链接. -iTCP:25将返回端口(port)是25的TCP连接. 还可以指定端口范围,如 -iTCP:25-50.
使用 -i@1.2.3.4 将返回ip是1.2.3.4的IPv4地址. IPv6也是一样的. @符号也可以以同样的方式用于指定hostname,
-s 强制显示文件大小(file size). 但是和-i成对出现时,它的含义就不同了:它允许用户指定要返回的命令的协议和状态
-p 将lsof限制为特定的进程ID(PID)。可以使用-p 123,456,789等设置多个PID。进程ID也可以用^排除,如123,^456,它专门排除PID 456
-P 禁用端口号到端口名的转换,从而加快了输出速度
-n 禁止将网络号转换为主机名(network numbers to host names)。与上面的-P一起使用时,它可以显着加快lsof的输出
-u user 仅返回指定用户拥有的命令
netstat 使用实例
- $ lsof -nP -iTCP@lsof.itap:513
这个看起来复杂的命令列出了所有主机名为lsof.itap和端口513的TCP连接。同时使用-P无需将名称连接(connecting names)到IP地址和端口,从而使该命令的运行速度明显加快
- $ lsof -iTCP -sTCP:LISTEN
此命令返回状态为LISTEN的每个TCP连接,显示Mac上所有打开的TCP端口。它还列出了与那些打开的端口关联的进程。这是对netstat的重大升级,netstat最多列出了PID
- $ sudo lsof -i -u^$(whoami)
此命令返回当前登录用户不拥有的所有连接。使用sudo运行,可以查看不属于您的任务。在不使用sudo的情况下运行此命令将返回一个空列表
其他网络命令
检查网络的命令还有arp,ping和ipconfig