[-= 博客目录 =-]

1-相关说明

1.1-博客介绍

本篇博客主要介绍的是在Mac环境下使用netstat和lsof以及的其作用。

1.2-netstat和lsof

Netstat

Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

lsof

lsof(list open files)是一个列出当前系统打开文件的工具。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

返回目录

2-学习过程

2.1-netstat

我们运行常用指令netstat -a,会出现如下信息:

Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 localhost.53617 tg-in-f138.1e100.https SYN_SENT
tcp4 0 0 localhost.53616 tg-in-f138.1e100.https SYN_SENT
tcp4 0 0 localhost.53615 tg-in-f101.1e100.https SYN_SENT

可知netstat就是用来显示我们机子的网络状态的,下面介绍的是如何通过参数来打印出我们想要的结果:

首先介绍一下各个参数:

-a (all)显示所有选项,默认不显示LISTEN相关

-n 拒绝显示别名,能显示数字的全部转化成数字。

-b show the number of bytes in and out

-s 按各个协议进行统计

-w wait(s) 每隔一定秒数来进行显示

更加详细的信息参考man netstat,这里不一一列举(主要是太麻烦了,懒得写)

提示:LISTEN和LISTENING的状态要加-a才能看到

提示:Mac和Linux的指令有所出入,切记不要拿Linux的指令在Mac中用

举个例子:

列出所有 tcp/udp 端口 netstat -f address_family,这个比较常用,我们平常上网所需要的用到的基本都会通过这俩端口:

Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 172.30.3.1.56841 ti-in-f102.1e100.https SYN_SENT
tcp4 0 0 172.30.3.1.56840 ti-in-f102.1e100.https SYN_SENT
tcp4 0 0 172.30.3.1.56839 hkg07s24-in-f10..https SYN_SENT
tcp4 0 0 172.30.3.1.56838 ti-in-f113.1e100.https SYN_SENT
udp4 0 0 *.65444 *.*
udp4 0 0 *.52623 *.*
udp4 0 0 *.59390 *.*
udp4 0 0 *.63755 *.*

关于-f后面的address_family如何输入在man里面有写到:

-f address_family
Limit statistics or address control block reports to those of the specified address family. The
following address families are recognized: inet, for AF_INET, inet6, for AF_INET6 and unix, for
AF_UNIX.

这里再科普一下状态:

  • LISTEN:(Listening for a connection.)侦听来自远方的TCP端口的连接请求

  • SYN-SENT:(Active; sent SYN. Waiting for a matching connection request after having sent a connection request.)再发送连接请求后等待匹配的连接请求

  • SYN-RECEIVED:(Sent and received SYN. Waiting for a confirming connection request acknowledgment after having both received and sent connection requests.)再收到和发送一个连接请求后等待对方对连接请求的确认

  • ESTABLISHED:(Connection established.)代表一个打开的连接

  • FIN-WAIT-1:(Closed; sent FIN.)等待远程TCP连接中断请求,或先前的连接中断请求的确认

  • FIN-WAIT-2:(Closed; FIN is acknowledged; awaiting FIN.)从远程TCP等待连接中断请求

  • CLOSE-WAIT:(Received FIN; waiting to receive CLOSE.)等待从本地用户发来的连接中断请求

  • CLOSING:(Closed; exchanged FIN; waiting for FIN.)等待远程TCP对连接中断的确认

  • LAST-ACK:(Received FIN and CLOSE; waiting for FIN ACK.)等待原来的发向远程TCP的连接中断请求的确认

  • TIME-WAIT:(In 2 MSL (twice the maximum segment length) quiet wait after close. )等待足够的时间以确保远程TCP接收到连接中断请求的确认

  • CLOSED:(Connection is closed.)没有任何连接状态

返回目录

2.2-lsof

我们直接执行lsof命令,会生成如下信息:

COMMAND     PID USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
……(略)
Atom 65310 mac 19u KQUEUE count=0, state=0xa
Atom 65310 mac 20 NPOLICY
Atom 65310 mac 21 PIPE 0x929a75eee67536e9 16384 ->0x929a75eee67528a9
Atom 65310 mac 22 PIPE 0x929a75eee67528a9 16384 ->0x929a75eee67536e9
Atom 65310 mac 23 PIPE 0x929a75eee67527e9 16384 ->0x929a75eee6752669
Atom 65310 mac 24 PIPE 0x929a75eee6752669 16384 ->0x929a75eee67527e9
Atom 65310 mac 25 PIPE 0x929a75eee6753c29 16384 ->0x929a75eee6750fe9
Atom 65310 mac 26 PIPE 0x929a75eee6750fe9 16384 ->0x929a75eee6753c29
Atom 65310 mac 27u KQUEUE count=0, state=0x8

在这里对每个字段进行一下介绍:

  • COMMAND:进程的名称
  • PID:进程标识符
  • USER:进程所有者
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
  • TYPE:文件类型,如DIR、REG等
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

几个常用操作

  1. 使用 lsof -i :[端口号] 查看某端口现在运行的情况:
blackay-MacBook-Air:~ mac$ lsof -i:443
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 24659 mac 38u IPv4 0x929a75eee50611b1 0t0 TCP 172.30.3.1:60430->ec2-50-16-240-181.compute-1.amazonaws.com:https (ESTABLISHED)
node 33752 mac 38u IPv4 0x929a75eee74831b1 0t0 TCP 192.168.43.135:55147->ec2-50-17-234-140.compute-1.amazonaws.com:https (ESTABLISHED)
node 40504 mac 23u IPv4 0x929a75eeed976ef1 0t0 TCP 172.30.3.1:62175->ec2-50-19-252-69.compute-1.amazonaws.com:https (ESTABLISHED)
node 40504 mac 36u IPv4 0x929a75eee94fa851 0t0 TCP 172.30.3.1:62180->ec2-50-19-252-69.compute-1.amazonaws.com:https (ESTABLISHED)
node 41729 mac 30u IPv4 0x929a75eeead5eb11 0t0 TCP 192.168.43.135:64612->ec2-50-16-232-79.compute-1.amazonaws.com:https (ESTABLISHED)
Google 48559 mac 19u IPv4 0x929a75eee9c25b11 0t0 TCP 172.30.3.1:56594->ti-in-f100.1e100.net:https (SYN_SENT)
Google 48559 mac 81u IPv4 0x929a75eee9d87b11 0t0 TCP 172.30.3.1:56598->ti-in-f113.1e100.net:https (SYN_SENT)
  1. 使用sudo lsof -nP -iTCP -sTCP:LISTEN查看占用端口的程序
MacBook-Air:~ mac$ sudo lsof -nP -iTCP -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
QQMacMgrM 600 mac 3u IPv4 0x929a75eee5126851 0t0 TCP 127.0.0.1:50154 (LISTEN)
QQMacMgrM 600 mac 10u IPv4 0x929a75eee5568851 0t0 TCP 127.0.0.1:30100 (LISTEN)
QQMacMgrM 600 mac 32u IPv4 0x929a75eee5568851 0t0 TCP 127.0.0.1:30100 (LISTEN)
Adobe\x20 663 mac 8u IPv4 0x929a75eee5799591 0t0 TCP 127.0.0.1:15292 (LISTEN)
  1. 使用lsof -p [pid] 搜索被程序打开的所有文件及打开的文件相关联进程
MacBook-Air:~ mac$ lsof -p 59037
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
QQ 59037 mac cwd DIR 1,4 384 915270 /Users/mac/Library/Containers/com.tencent.qq/Data
QQ 59037 mac txt REG 1,4 39443376 8594340462 /Applications/QQ.app/Contents/MacOS/QQ
QQ 59037 mac txt REG 1,4 585744 8594339489 /Applications/QQ.app/Contents/Frameworks/FTMiniNN.framework/Versions/A/FTMiniNN
QQ 59037 mac txt RE

PS:PID(Process Identification)操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。只要运行一程序,系统会自动分配一个标识。暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。

只要没有成功运行其他程序,这个PID会继续分配给当前要运行的程序。

如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个PID。

返回目录

2.3-netstat和lsof区别和关联

netstat无权限控制,lsof有权限控制,只能看到本用户

losf能看到pid和用户,可以找到哪个进程占用了这个端口

有人也许会觉得这俩好像挺多功能都差不多呀?仔细想想发现他们区别还是挺大的,甚至有些功能还是互补的,结合起来使用简直无敌。我使用lsof最主要的原因就是:在使用了netstat查询到网络链接状态的时候,没有显示端口使用程序的名称以及其相关信息,所以我们通过lsof来弥补这个缺陷。

具体怎么操作呢?比如我通过netstat查到有个链接使用了55147端口:

Proto Recv-Q Send-Q  Local Address          Foreign Address
tcp4 0 0 192.168.43.135.55147 50.17.234.140.443

那么我要查找55147端口,是程序用了这个端口,那么可以用到lsof指令:

COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node 24659 mac 38u IPv4 0x929a75eee50611b1 0t0 TCP 172.30.3.1:60430->ec2-50-16-240-181.compute-1.amazonaws.com:https (ESTABLISHED)

找到了这个程序,知道了它的PID,我甚至能查看他动了我什么文件:lsof -p [PID]

COMMAND   PID USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
node 24659 mac cwd DIR 1,4 1120 2 /
node 24659 mac txt REG 1,4 30482564 8597437279 /Applications/Atom.app/Contents/Resources/app/apm/bin/node
node 24659 mac txt REG 1,4 1112560 8597441970 /Applications/Atom.app/Contents/Resources/app/apm/node_modules/git-utils/build/Release/git.node

那么问题来了,这样做有什么意义……意义就是我本来就是想通过网络监控来进行分析电脑是否有恶意代码或者程序运行,通过使用这两个命令,我将会精准的确定到每个可疑链接的所有状态。

返回目录

3-参考资料

参考的博客超过30+,这里列举一些最重要的。

返回目录

MacOS下netstat和lsof使用的若干问题的更多相关文章

  1. netstat 和 lsof 查看网络状态

    netstat和lsof都是linux下的工具,可以用于查看系统的网络状态. netstat netstat可以打印 网络连接,路由表,接口统计数据,还有多播和masquerade连接相关的东西(不熟 ...

  2. shell每隔一秒钟就记录下netstat状态

    说明 木马可能类似随机发送心跳包的操作,随机sleep.对这类情况写好了一个监听shell脚本,每隔一秒钟就记录下netstat状态. 代码 #!/bin/bash #功能:用于定时执行lsof 和 ...

  3. MacOS下ElasticSearch学习(第一天)

    ElasticSearch第一天 学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"elasticsearch&q ...

  4. MacOS下如何进行Git的冲突(Conflict)处理

    Git在做merge时经常碰到冲突的问题,多数情况都是用IDE中集成的"解决冲突"工具解决了,但有时不能依赖IDE时,就得回过头来去搞清楚Git的一些基础操作了. mergetoo ...

  5. macos下sed小试

    linux下替换是这么干的 sed -i "s/xxxxxxxxxx/video_capture_module/g" project.pbxproj 但是macos下略有不同,照搬 ...

  6. MIT6.828课程JOS在macOS下的环境配置

    本文将介绍如何在macOS下配置MIT6.828 JOS实验的环境. 写JOS之前,在网上搜寻JOS的开发环境,很多博客和文章都提到"不是32位linux就不好配置,会浪费大量时间在配置环境 ...

  7. macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号

    一.使用流程 Windows下的程序运行崩溃时,往往可以利用pdb文件快速解析出程序崩溃的具体位置,甚至可以对应到源代码的具体行数.macOS下的symbolicatecrash也具备相应的功能.对应 ...

  8. MacOS下Rails+Nginx+SSL环境的搭建(上)

    这里把主要的步骤写下来,反正我是走了不少弯路,希望由此需求的朋友们别再走类似的弯路.虽说环境是在MacOS下搭建,但是基本上和linux下的很相像,大家可以举一反三. 一.安装Rails 这个是最简单 ...

  9. 汇编语言实验1 & macOS下DOSBox的安装

    一.macOS下DOSBox的安装 1.在官网下载DOSBox-0.74.dmg 打开,此时默认z盘 一番折腾,终于搞定debug 然后为了不用每次都执行mount,遂更改配置文件自动挂在目录 再次打 ...

随机推荐

  1. 【日常记录】Unity3D 中的 Surface Shader 是不支持在 Pass中使用的,因为自动生成了 Pass

    如题 搞了好久,一直报错: Shader error in 'custom_outline_effect': Parse error: syntax error, unexpected TOK_PAS ...

  2. git工具的使用

    Git工具的出现降低了软件版本维护的成本,极大的提高了工作效率,在这里列出了一些使用方法,方便以后查看. 1.Git的初始化->创建一个Git仓库:git init 2.创建信息:git con ...

  3. windows下建立netcore控制台程序,然后传送到centos7下的docker容器里运行

    1.首先,在window下用vs2017开发netcore控制台项目. 2.把建立好的项目传送到centos7下面的容器里. docker cp sharefoldersforwindows/ 359 ...

  4. 记开发个人图书收藏清单小程序开发(三)DB设计

    主要是参考豆瓣的图书查询接口: https://api.douban.com/v2/book/isbn/:9780132350884 返回内容如下: { "rating": { & ...

  5. systemd 之 systemctl

    Systemd 常规操作与彩蛋 一.前言 上了俩个月的RHCE工程师的班,收获颇多.话说回来,在 redhat 7 中有个非常重要的概念,即:systemd systemd 是 Linux 下的一款系 ...

  6. java中如何打war包

    1.利用jdk里的工具   例如我们要打包的文件在D:\Project:运行 cmd: cd D:\Project 进入D:\Project ,然后输入jar -cvf  Project.war *回 ...

  7. [翻译] USING GIT IN XCODE [6] 在XCODE中使用GIT[6]

    USING GIT IN XCODE KEEPING IN SYNC WITH REMOTE REPOSITORIES As you make changes in your local workin ...

  8. Inside Amazon's Kafkaesque "Performance Improvement Plans"

    Amazon CEO and brilliant prick Jeff Bezos seems to have lost his magic touch lately. Investors, empl ...

  9. 铁乐学Python_day03-字符串常用操作方法

    文:铁乐与猫 2018-3-20 1)字符串首个字母大写,其它字母也会转换成小写: S.capitalize() -> str 记忆方法:capital(大写字母) def capitalize ...

  10. 团队开发中,eclipse中安装jre

    团队合作中配置jre时,jre名称应该保持一致,否则不要提交.classpath文件 window-preferences     团队合作中,JRE name一定要一致!