Linux筆記:自動化運維之常用模塊psutil、IPy、dnspython

常用模塊

  • 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分鐘對域名進行一個解析, 通過訪問, 查看端口是否通暢, 服務器是否死機等

發佈了410 篇原創文章 · 獲贊 221 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章