专栏首页python3使用Python统计端口TCP连接数

使用Python统计端口TCP连接数

    此脚本可以用来统计某个端口上连接的IP的数量,统计连接到这一端口的所有IP、最多的IP和次数以及TCP连接状态。

    涉及到Python读取网络连接统计信息以及统计计算的一些基本操作。在编写脚本的过程中预先定义了统计信息的数据结构,在向最终结果中添加统计信息时需要用到list去重功能,因此临时创建了一个列表使用set()函数去重。set()函数不能直接add字典类型,因此先将字典转成可哈希的字符串,再将去重后的字符串转成字典。其中字典、列表和集合都属于不可哈希的类型。

    此脚本可以用于Windows、Linux以及OSX,其中OSX上运行需要使用root权限(由于psutil的原因),使用时直接使用python运行此脚本文件即可。如果提示‘ImportError’,则使用pip安装所缺的模块,非特权用户使用pip安装模块时需要使用sudo。

    脚本内已经设定port为22,可以自己修改代码,使它允许成接收命令行位置参数或者手动输入。

运行效果图如下:

1.使用root用户运行

2.使用非特权用户运行

脚本文件可以通过GitHub获取:https://github.com/DingGuodong/LinuxBashShellScriptForOps/blob/master/functions/net/tcp/port/portStatistics.py

脚本内容如下:

#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
"""
Created by PyCharm.
File:               LinuxBashShellScriptForOps:portStatistics.py
User:               Guodong
Create Date:        2016/10/27
Create Time:        10:51

Note:
    Usage:
    Using user as you want in Linux/Windows system.
    The python module 'psutil' and 'prettytable' is required, using pip
    install them.
    ```
    pip install psutil prettytable
    ```
    On OSX this function requires root privileges.

    # python portStatistics.py
    Total connections of port 22 is 10.
    +--------------+-------------------+-------------------+-----------------+--------------+
    | Total Counts | Remote IP Address | Established Conns | Time_wait Conns | Others Conns |
    +--------------+-------------------+-------------------+-----------------+--------------+
    |      5       |     10.6.28.46    |         5         |        0        |      0       |
    |      1       |     10.6.28.35    |         1         |        0        |      0       |
    |      1       |     10.6.28.27    |         1         |        0        |      0       |
    |      2       |    10.6.28.135    |         2         |        0        |      0       |
    |      1       |    10.6.28.125    |         1         |        0        |      0       |
    +--------------+-------------------+-------------------+-----------------+--------------+
    Elapsed time: 0.0104579925537 seconds.
    #

 """

import psutil
import prettytable
import time

startTime = time.time()

port = 22  # ssh -i /etc/ssh/ssh_host_rsa_key root@10.6.28.28

# define data structure for each connection, each ip is unique unit
ipaddress = {
    'ipaddress': None,
    'counts': 0,
    'stat': {
        'established': 0,
        'time_wait': 0,
        'others': 0
    }
}

# define data structure for statistics
statistics = {
    'portIsUsed': False,
    'portUsedCounts': 0,
    'portPeerList': [
        {
            'ipaddress': None,
            'counts': 0,
            'stat': {
                'established': 0,
                'time_wait': 0,
                'others': 0
            },
        },
    ]
}

tmp_portPeerList = list()
portPeerSet = set()
netstat = psutil.net_connections()

# get all ip address only for statistics data
for i, sconn in enumerate(netstat):

    if port in sconn.laddr:
        statistics['portIsUsed'] = True
        if len(sconn.raddr) != 0:
            statistics['portUsedCounts'] += 1
            ipaddress['ipaddress'] = sconn.raddr[0]
            tmp_portPeerList.append(str(ipaddress))  # dict() list() set() is unhashable type, collections.Counter

for ip in tmp_portPeerList:
    portPeerSet.add(str(ip))  # remove duplicated ip address using set()

for member in portPeerSet:
    statistics['portPeerList'].append(eval(member))

# add statistics data for each ip address
for sconn in netstat:
    if port in sconn.laddr:
        if len(sconn.raddr) != 0:
            for i, item in enumerate(statistics['portPeerList']):
                if item['ipaddress'] == sconn.raddr[0]:
                    statistics['portPeerList'][i]['counts'] += 1
                    if sconn.status == 'ESTABLISHED':
                        statistics['portPeerList'][i]['stat']['established'] += 1
                    elif sconn.status == 'TIME_WAIT':
                        statistics['portPeerList'][i]['stat']['time_wait'] += 1
                    else:
                        statistics['portPeerList'][i]['stat']['others'] += 1

# print statistics result using prettytable
if statistics['portIsUsed']:
    print "Total connections of port %s is %d." % (port, statistics['portUsedCounts'])
    table = prettytable.PrettyTable()
    table.field_names = ["Total Counts", "Remote IP Address", "Established Conns", "Time_wait Conns",
                         "Others Conns"]
    for i, ip in enumerate(statistics['portPeerList']):
        if ip['ipaddress'] is not None:
            table.add_row([ip['counts'], ip['ipaddress'], ip['stat']['established'], ip['stat']['time_wait'],
                           ip['stat']['others']])
    print table.get_string(sortby=table.field_names[1], reversesort=True)
else:
    print 'port %s has no connections, please make sure port is listen or in use.' % port

endTime = time.time()
print "Elapsed time: %s seconds." % (endTime - startTime)

tag:端口统计,python TCP连接数统计,Python统计连接数

--end--

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker通过EFK(Elasticsearch + Fluentd + Kibana)查询日志

    Elasticsearch是一个开源搜索引擎,以易用性着称。kibana是一个图形界面,可以在上面条件检索存储在ElasticSearch里数据,相当于提供了E...

    py3study
  • Python时间处理

    py3study
  • 测试python程序运行时间

    经由测试,print()花费时间大约是1e-6s,decimal运行花费的时间大约是int的三倍。

    py3study
  • [Python]Matplotlib绘图基础

    1.简介 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。 ---- 2.绘图基础 2...

    昊楠Hacking
  • Access统计函数和数字函数

    在Excel中函数基本是很常用的,形式都是:函数名(<数值或表达式>),很多函数相对简单,与在Access中用法相近,但表达式中的字段是需要用加中括号,即[字段...

    无言之月
  • 一文读懂比BitMap有更好性能的Roaring Bitmap

    1.什么是bitmap?为什么使用bitmap?Roaring bitmap与其他bitmap编码技术相比有哪些优势?2.Roaring bitmap将32位无...

    开发架构二三事
  • Python多线程操作之互斥锁、递归锁、信号量、事件实例详解

    本文实例讲述了Python多线程操作之互斥锁、递归锁、信号量、事件。分享给大家供大家参考,具体如下:

    砸漏
  • Python-时间及日期-02-时间转字符串

    系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3....

    zishendianxia
  • Python入门之函数的装饰器

    本章目录:     装饰器:         一、为什么要用装饰器         二、什么是装饰器         三、无参装饰器         四、装饰器...

    Jetpropelledsnake21
  • 【深度研究】Stacking 集成学习在多因子选股中的应用

    量化投资与机器学习微信公众号

扫码关注云+社区

领取腾讯云代金券