MacOS下netstat和lsof使用的若干问题

[-= 博客目录 =-]

  • 1-相关说明

    • 1.1-博客介绍
    • 1.2-netstat和lsof
  • 2-学习过程
    • 2.1-netstat
    • 2.2-lsof
    • 2.3-netstat和lsof区别和关联
  • 3-资料

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)
  2. 使用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)
  3. 使用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+,这里列举一些最重要的。

返回目录

原文地址:https://www.cnblogs.com/blackay03/p/8836135.html

时间: 2024-10-04 03:08:37

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

linux下netstat --timers / -o详解及keepalive相关

在linux查看网络连接数或者网络状态,我一般用netstat或者lsof这两种,netstat的话有个时间计时功能,里面涉及到不少tcp/ip协议的知识,今天就来说一说我理解的netstat计时功能. netstat -altpno 或者 netstat -altpn --timers,看显示结果: Proto Recv-Q Send-Q Local Address    Foreign Address   State  PID/Program name  Timer 可以看到显示的标题,多出

linux下netstat --timers / -o详解及keepalive相关 2

在linux查看网络连接数或者网络状态,我一般用netstat或者lsof这两种,netstat的话有个时间计时功能,里面涉及到不少tcp/ip协议的知识,今天就来说一说我理解的netstat计时功能. netstat -altpno 或者 netstat -altpn --timers,看显示结果: Proto Recv-Q Send-Q Local Address    Foreign Address   State  PID/Program name  Timer 可以看到显示的标题,多出

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

说明 木马可能类似随机发送心跳包的操作,随机sleep.对这类情况写好了一个监听shell脚本,每隔一秒钟就记录下netstat状态. 代码 #!/bin/bash #功能:用于定时执行lsof 和 netstat 的执行状态并记录到文件 slptime=1 #默认一秒执行一次 filedir=/tmp #默认存储在/tmp下 lsoffile=lsof.log #存储lsof的执行结果 netstatfile=netstatfile.log #存储netstat执行结果 while true

[转帖]网络分析工具--【ping、tcpdump、netstat、lsof、ss】

网络分析工具--[ping.tcpdump.netstat.lsof.ss]原创小呀小二笙 发布于2019-01-01 15:32:19 阅读数 1314 收藏 https://blog.csdn.net/qq_38790716/article/details/85486681 看原文比较好 复制的话 图片没有过来. 展开 文章目录1. ping1.1 概述1.2 ping的使用1.3 ping常用参数2. tcpdump2.1 概述2.2 tcpdump使用3. netstat3.1 概述3.

macOS下安装ipython

macOS下sudo安装ipython,会提示限错误: [Errno 1] Operation not permitted: '/tmp/pip-Elrhse-uninstall/System/Library... 解决方法: pip install ipython --user -U 参考: http://chaishiwei.com/blog/994.html

MacOS下SVN的使用

之前在Mac上一直是用的Git管理项目, 到了新的部门这面是用的SVN, 这一篇就介绍一下MacOS下的SVN的使用 在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还需做一下简单的配置. 我们首先来看下,如何在Mac环境下搭建svn服务器端环境. 创建代码仓库,用来存储客户端所上传的代码 我先在/User/apple目录下新建一个svn目录,以后

macos下sed小试

linux下替换是这么干的 sed -i "s/xxxxxxxxxx/video_capture_module/g" project.pbxproj 但是macos下略有不同,照搬会报以下错误 sed: 1: "project.pbxproj": extra characters at the end of p command 正确用法 sed -i "" "s/xxxxxxxxxx/video_capture_module/g&quo

在MacOS下使用sqlalchemy 连接sqlserver2012 数据库

在MacOS下使用sqlalchemy 连接sqlserver 数据库 前言 最近有要求,要将数据库换成巨硬家的sqlserver 2012 因为在网上苦苦找不到sqlalchemy 配置连接SqlServer的具体中文步骤,翻了官方文档后把步骤整理出来 前期准备 已经安装好sqlalchemy 运行环境介绍 系统:MacOS 10.13.1 Beta Python 环境: 3.6.0 sqlalchemy 1.1.4 pycode 4.0.19 sqlserver 2012 实施步骤 在sql

macOS下MySQL 8.0 安装与配置教程

原文:macOS下MySQL 8.0 安装与配置教程 一.前言 1.本教程主要内容 适用Homebrew安装MySQL MySQL 8.0 基础适用于配置 MySQL shell管理常用语法示例(用户.权限等) MySQL字符编码配置 MySQL远程访问配置 2.本教程环境信息与适用范围 环境信息 软件/环境 版本/说明 macOS macOS High Sierra MySQL MySQL 8.0.12 适用范围 软件 版本 macOS macOS MySQL 8.0.x 二.MySQL安装