常用模塊
-
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連接到了這個進程,可以分析可疑進程
- 先找一個ssh的連接
-
還有一些其他常用的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分鐘對域名進行一個解析, 通過訪問, 查看端口是否通暢, 服務器是否死機等