当前位置: 首页 > 工具软件 > dnspython > 使用案例 >

Linux笔记:自动化运维之常用模块psutil、IPy、dnspython

秦安怡
2023-12-01

常用模块

  • psutil

    • 用它来获取系统信息
  • IPy

    • 高效处理ip地址相关的功能
  • dnspython

    • 实现是dns的服务监控
    • 可以实现域名解析,对域名的A记录,NS记录进行相应的查询等
    • 解析结果的校验

系统信息的获取

  • 在Windows系统中可以通过任务管理器来获取系统的时时状态
  • 在linux服务器中如何获取呢?
    • 可以使用top命令可以看到CPU、内存、进程等信息
    • 可以通过df -h命令可以看到硬盘的容量
    • 可以通过w命令查看当前登录用户
    • 可以通过watch cat /proc/net/dev命令可以查看时时的网络情况
    • 可以通过cat /proc/cpuinfo i命令可以看到Cpu相关的一些列信息
    • 但是这些脚本或命令很难满足我们的需求,我们可以使用python来获取系统信息

psutil模块

1 ) 安装

  • $pip3 install psutil

2 ) 使用psutil输出系统信息

  • 进入python环境,API示例:

    >>> import psutil
    >>> psutil.cpu_count() # 查看CPU数量, CPU是8核16线程的CPU
    16
    >>> psutil.cpu_count(logical=False) # 查看物理核心Cpu数量,而非线程
    8
    >>> psutil.cpu_times() # 获取CPU使用时间
    scputimes(user=9165.24, nice=0.0, system=116.69, idle=61836.14, iowait=1.84, ) #这里输出很多信息,不一一列举了, 数值单位为cpu的周期
    >>> psutil.cpu_percent() # 获取CPU当前使用比例,单位是%,下面表示0.5%
    0.8
    >>> psutil.cpu_percent(percpu=True) # 每个cpu单独显示 这个统计有周期和频率的问题,再次运行结果会不一样,动态的
    [0.1, 0.1, 0.3, ...] # 这里输出每个CPU核心的信息
    >>> psutil.cpu_percent(percpu=True, interval=3) # interval=3 采样3秒内的数据
    [0.1, 0.1, 0.2, ...]
    >>> psutil.virtual_memory() # 查看内存的使用情况,也可以使用命令查看`free -m`
    svmem(total=10002222, available=555555, ...) # 输出一系列信息 只做举例
    >>> psutil.swap_memory() # 查看交换分区的使用情况
    sswap(total=10222222, used=0, ...) # 输出一系列信息 只做举例
    >>> psutil.disk_partitions()
    [sdiskpart(device='/dev/sda1', mountpoint='/', ...)] # 输出一系列信息
    >>> psutil.disk_usage('/') # 查看每一个分区可用的空间, 参数是分区
    sdiskusage(total=199992222222, used=222222222, ...) # 输出一系列信息
    >>> psutil.disk_io_counters() # 硬盘的io读写情况
    sdiskio(read_count=8112, write_count=4222, ...) # 输出一系列信息
    >>> psutil.net_io_counters() # 查看网络情况
    snetio(bytes_sent=562222, bytes_recv=888888, ...) # 输出一系列信息
    >>> psutil.net_io_counters(pernic=True) # 存在多块网卡, 列出每块网卡情况
    {'ens33': snetio(bytes_sent=562222, bytes_recv=888888, ...)}
    >>> psutil.pids() # 获取进程相关信息
    [1, 2, 3, 5, ...] # 输出一系列信息
    >>> p = psutil.Process(1) # 获取进程id的详细信息
    >>> p.name() # 进程名称
    'systemd'
    >>> p.exe() # 进程的可执行文件
    '/lib/systemd/systemd'
    >>> p.cwd() # 进程的工作目录
    '/'
    >>> p.status() # 进程状态
    'sleeping'
    >>> p.create_time() # 进程创建时间
    15222223222.86
    >>> p.uids() # 查看进程是哪个用户创建的
    puids(real=0, effective=0, saved=0)
    >>> p.gids() # 查看进程属于哪个群组
    pgids(real=0, effective=0, saved=0)
    >>> p.cpu_times() # 获取进程所占用的cpu时间
    pcputimes(user=1.02, system=3.92, ...) # 输出一系列信息
    >>> p.memory_percent() # 获取进程的内存占用
    0.6132332322323232322323
    >>> p.io_counters() # 查看进程的io操作
    pio(read_count=621130, write_count=67777, ...) # 输出一系列信息
    >>> p.num_threads() # 查看进程创建了多少线程
    1
    
  • 如果是一些联网相关的进程,还能看到它的一些网络信息,示例:

    • 先找一个ssh的连接
      ps -ef | grep ssh
      # 下面输出一系列信息,在此处不列举了,举例我们查到了一个进程 13141
      
    • 开始测试它的一些进程信息
      >>> p = psutil.Process(13141)
      >>> p.name() # 打印进程名称
      'sshd'
      >>> p.connections() # 打印进程连接
      [pconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.55.66', port=22), raddr=addr(ip='192.168.55.67', port=5555, status='ESTABLISHED'))] # 这个进程打开了22端口,另一个ip地址67连接到了这个进程,可以分析可疑进程
      
  • 还有一些其他常用的API

    >>> psutil.boot_time() # 获取开机时间
    1577664000000.0
    >>> import datetime
    >>> datatime.datetime.fromtimestamp(1577664000000).strftime("%Y-%m-%d %H:%M:%S")
    '2019-12-30 00:00:00:00'
    >>> psutil.users() # 获取登录用户
    [suser(name='root', ...)]
    

IPy模块

1 ) 安装

  • $pip3 install ipy

2 ) 具体应用

  • 进入python环境

    >>> import IPy
    >>> IPy.IP("192.168.1.2").version() # 查看ip版本
    4
    >>> IPy.IP("::1").version()
    6
    >>> ips = IPy.IP('192.168.1.0/28') # 这是一个网段
    >>> ips.len() # 网段内的所有ip地址的数量
    16
    >>> [ip for ip in ips] # 打印网段内的ip地址
    [IP('192.168.1.0'), IP('192.168.1.1'), ...]
    >>> ip = IPy.IP("192.168.88.1") 
    >>> ip.iptype() # 查看ip类型是公网ip还是私网ip
    'PRIVATE'
    >>> io = IPy.IP('8.8.8.8')
    >>> ip.iptype()
    'PUBLIC'
    >>> ip.int() # 将ip地址转换为整数(十进制)
    134744072
    >>> ip.strHex() # 将ip地址转换为十六进制
    '0x8080808'
    >>> ip.strBin() # 将ip地址转换为二进制
    '00001000000010000000100000001000'
    # 根据ip和子网掩码生产网段
    >>> IPy.IP("192.168.1.0").make_net('255.255.255.0')
    IP('192.168.1.0/24')
    # 或者使用另一种方式
    >>> IPy.IP("192.168.1.0/255.255.255.248", make_net=True)
    IP('192.168.1.0/29')
    # 还有一种方式
    >>> IPy.IP("192.168.1.0-192.168.1.255", make_net=True)
    IP('192.168.1.0/24')
    # 判断ip地址和网段是否包含在另一个网段中
    >>> '192.168.8.1' in IPy.IP('192.168.8.0/24')
    True
    ### 判断两个网段是否出现重复的情况
    >>> IPy.IP("192.168.0.0/23").overlaps("192.168.1.0/24")
    1 # 1表示存在
    >>> IPy.IP("192.168.0.0/24").overlaps("192.168.1.0/24")
    0 # 0表示不存在
    

dnspython 模块

1 ) 安装

  • $ pip3 install dnspython

2 ) 具体应用举例

  • 进入python环境

    >>> import dns.resolver
    >>> res = dns.resolver.query("www.baidu.com", "A") # 查询百度的A记录
    >>> [item.address for item in res]
    ['119.75.213.61', '119.75.216.20']
    >>> res = dns.resolver.query("qq.com", "MX") # 查询腾讯的MX记录(邮件解析记录)
    >>> [item for item in res]
    [<DNS IN MX rdata: 10 mx3.qq.com.>, <DNS IN MX rdata: 20 mx2.qq.com>, <DNS IN MX rdata: 30 mx1.qq.com.>]
    >>> res = dns.resolver.query("baidu.com", "NS") # 查询百度的NS记录, 注意查询NS记录要使用一级域名
    >>> [item for item in res]
    [<DNS IN NS rdata: dns.baidu.com.>, <DNS IN NS rdata: ns4.baidu.com.>, <DNS IN NS rdata: ns3.baidu.com.>, <DNS IN NS rdata: ns7.baidu.com.>, <DNS IN NS rdata: ns2.baidu.com.>]
    
  • 通过这些信息我们可以对我们企业的域名进行监控,我们可以写一个python脚本,每隔10分钟对域名进行一个解析, 通过访问, 查看端口是否通畅, 服务器是否死机等

 类似资料: