psutil庫
擷取系統運作的程序和系統使用率
[root@serverc ~]# yum -y install python2
[root@serverc ~]# yum -y install python2-psutil
[root@serverc ~]# python
1.cpu資訊
- user 執行使用者程序的時間百分比
- system 執行核心程序和中斷的時間百分比
- idle cpu處于idle狀态的時間百分比
- iowait 由于IO等待而使CPU處于idle(空閑)狀态的時間百分比
import psutil
psutil.cpu_times() #使用cpu_times()方法擷取cpu的完整資訊
psutil.cpu_times(percpu=True) #顯示所有邏輯cpu資訊
psutil.cpu_times().user #使用者user的cpu時間比
psutil.cpu_count() #擷取cpu的邏輯個數,預設logical=True4
psutil.cpu_count(logical=False) #擷取cpu的實體個數
2.擷取記憶體資訊
total(記憶體總數)、used(已使用的記憶體數)、free(空閑記憶體數)、buffers(緩沖使用數)、cache(緩存使用數)、swap(交換分區使用數)
>>> mem = psutil.virtual_memory()
>>> mem
>>> mem.total
>>> mem.free
>>> mem.used
>>> psutil.swap_memory()
3.磁盤資訊
read_count(讀IO數)、write_count(寫IO數)、read_bytes(IO讀位元組數)、write_bytes(IO寫位元組數)、read_time(磁盤讀時間)、write_time(磁盤寫時間)
>>> psutil.disk_partitions() #擷取完整資訊
>>> psutil.disk_usage('/') #擷取分區的使用情況
>>> psutil.disk_io_counters() #擷取硬碟總的IO個數、讀寫資訊
>>> psutil.disk_io_counters(perdisk=True) #擷取單個分區IO個數、讀寫資訊
4.網絡資訊
bytes_sent(發送位元組數)、 bytes_recv(接收位元組數), packets_sent(發送資料包數), packets_recv(接收資料包數)
>>> psutil.net_io_counters() #擷取網絡總的IO資訊,預設pernic=False
>>> psutil.net_io_counters(pernic=True) #pernic=True 輸出每個網絡借口的IO資訊
5.其他系統資訊
psutil子產品支援擷取使用者登入、開機時間等資訊
>>> psutil.users() #傳回目前登入系統的使用者資訊
>>> import psutil,datetime
>>> psutil.boot_time() #擷取開機時間,以linux時間戳格式傳回
>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") #轉換成自然時間格式
系統程序管理方法
>>> import psutil
>>> psutil.pids() #列出所有程序PID
>>> p = psutil.Process(1555) #執行個體化一個Process對象,參數為一程序PID
>>> p.name() #程序名
'sshd'
>>> p.exe() #程序bin路徑
'/usr/sbin/sshd'
>>> p.cwd() #程序工作目錄絕對路徑
>>> p.status() #程序狀态
'sleeping'
>>> p.create_time() #程序建立時間,時間戳格式
>>> p.uids() #程序uid資訊
>>> p.gids() #程序gid資訊
>>> p.cpu_times() #程序CPU時間資訊,包括user、system的cpu時間
>>> p.cpu_affinity() #get程序CPU素和度,如果設定程序CPU素和度,将CPU号作為參數即可
>>> p.memory_info() #程序記憶體rss、vms資訊
>>> p.memory_percent() #程序記憶體使用率
>>> p.connections() #傳回打開程序socket的namedutples清單、包括fd、family、laddr等資訊
>>> p.num_threads() #程序開啟的線程數
popen類的使用
>>> import psutil
>>> from subprocess import PIPE #通過psutil的Popen方法啟動的應用程式,可以跟蹤該程式運作的所有相關資訊
>>> p = psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout=PIPE)
>>> p.name()
'python'
>>> p.username()
'root'
>>> p.communicate()
('hello\n', None)
>>> p.cpu_times() #得到程序運作的CPU時間
IP位址處理子產品IPy
[root@serverc ~]# yum -y install python-IPy
1.IP位址、網段的基本處理
>>> from IPy import IP
>>> IP('10.0.0.0/8').version() #區分IPv4與IPv6
>>> IP('::1').version()
>>> ip = IP('192.168.0.0/16')
>>> print ip.len() #輸出IP/16網段的IP個數
>>> for x in ip: #輸出IP清單
>>> print(x)
2.反向解析名稱、IP類型、IP轉換
>>> from IPy import IP
>>> ip = IP('192.168.1.101')
>>> ip.reverseName() #反向解析位址格式
>>> ip.iptype() #為私網類型'PRIVATE'
>>> IP('8.8.8.8').iptype() #為公網類型 'PUBLIC'
>>> IP('8.8.8.8').int() #轉換成整型格式
>>> IP('8.8.8.8').strHex() #轉換成十六進制格式
>>> IP('8.8.8.8').strBin() #轉換成二進制格式
>>> print(IP(0x8080808)) #十六進制轉成IP格式
3.IP與掩碼産生網段格式
>>> print(IP('192.168.1.0').make_net('255.255.255.0'))
>>> print (IP('192.168.1.0/255.255.255.0',make_net=True))
>>> print (IP('192.168.1.0-192.168.1.255',make_net=True))
結果都是:192.168.1.0/24
4.也可以通過strNormal方法指定不同wantprefixlen參數值以定制不同輸出類型的網段。
wantprefixlen的取值及含義:
- wantprefixlen = 0 無傳回值
- wantprefixlen = 1 prefix格式
- wantprefixlen = 2 decimalnetmask格式
- wantprefixlen = 3 lastIP格式
操作如下:
>>> IP('192.168.1.0/24').strNormal(0)
'192.168.1.0'
>>> IP('192.168.1.0/24').strNormal(1)
'192.168.1.0/24'
>>> IP('192.168.1.0/24').strNormal(2)
'192.168.1.0/255.255.255.0'
>>> IP('192.168.1.0/24').strNormal(3)
'192.168.1.0-192.168.1.255'
5.判斷IP位址和網段是否包含于于另一個網段中
>>> '192.168.1.100' in IP('192.168.1.0/24')
>>> IP('192.168.1.0/24') in IP('192.168.0.0/16')
判斷兩個網段是否存在重疊,采用IPy提供的overlaps方法
>>> IP('192.168.0.0/23').overlaps('192.168.1.0/24') #傳回1代表存在重疊
>>> IP('192.168.0.0/24').overlaps('192.168.2.0') #傳回0代表不存在重疊
示例 根據輸入的IP或子網傳回網絡、掩碼、廣播、反向解析、子網數、IP類型等
#!/usr/bin/env python
from IPy import IP
ip_s = raw_input('Please input an IP or net-range: ') #輸入IP位址或網段位址
ips = IP(ip_s)
if len(ips) > 1: #為一個網絡位址
print ('net: %s' %ips.netmask()) #輸出網絡位址
print ('netmask: %s' %ips.netmask()) #輸出網絡掩碼位址
print ('broadcast: %s' %ips.broadcast()) #輸出網絡廣播位址
print ('reverse address: %s' %ips.reverseNames()[0]) #輸出位址反向解析
print ('subnet: %s' %len(ips)) #輸出網絡子網數
else:
print ('reverse address: %s' %ips.reverseNames()[0]) #輸出IP反向解析
print ('hexadecimal: %s' %ips.strHex()) #輸出十六進制位址
print ('binary ip: %s' %ips.strBin()) #輸出二進制位址
print ('iptype: %s' %ips.iptype()) #輸出位址類型
[root@serverc ~]# vi ip_mask.py
DNS處理子產品dnspython
A記錄:将主機名轉換成IP位址
MX記錄:郵件交換記錄,定義郵件伺服器的域名
CNAME記錄:指别名記錄,實作域名間的映射
NS記錄:标記區域的域名伺服器及授權子域
PTR記錄:反向解析,于A記錄相反,将IP轉換成主機名
SOA記錄:SOA标記,一個起始授權區的定義
[root@serverc ~]# wget http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gz
[root@serverc ~]# tar -zxvf dnspython-1.9.4.tar.gz
[root@serverc ~]# python setup.py install
實作A記錄查詢方法
#! /usr/bin/env python
import dns.resolver
domain = raw_input('Please input an domain: ') #輸入域名位址 如www.baidu.com
A = dns.resolver.query(domain,'A') #指定查詢類型為A記錄
for i in A.response.answer: #通過response.answer方法擷取查詢回應資訊
for j in i.items: #周遊回應資訊
print j.address
[root@serverc ~]# python dns_simple.py
Please input an domain: www.baidu.com
實作MX記錄查詢方法
#! /usr/bin/env python
import dns.resolver
domain = raw_input('Please input an domain: ') #如 163.com
MX = dns.resolver.query(domain,'MX')
for i in MX:
print 'MX preference = ', i.preference,'mail exchanger = ',i.exchange
#!/usr/bin/env python
import dns.resolver
domain = raw_input('Please input an domain: ') #輸入一級域名 如baidu.com
ns = dns.resolver.query(domain, 'NS')
for i in ns.response.answer:
for j in i.items:
print j.to_text()
#!/usr/bin/env python
import dns.resolver
domain = raw_input('Please input an domain: ')
cname = dns.resolver.query(domain, 'CNAME') #指定查詢類型為CNAME記錄
for i in cname.response.answer: #結果将回應cname後的目标域名
for j in i.items:
print j.to_text()
#!/usr/bin/python
import dns.resolver
import os
import httplib
iplist=[] #定義域名IP清單變量
appdomain="www.taobao.com" #定義業務域名
def get_iplist(domain=""): #域名解析函數,解析成功IP将被追加到iplist
try:
A = dns.resolver.query(domain,'A') #解析A記錄類型
except Exception,e:
print "dns resolver error:"+ str(e)
return
for i in A.response.answer:
for j in i.items:
iplist.append(j.address) #追加到iplist
return True
def checkip(ip):
checkurl=ip+":80"
getcontent=""
httplib.socket.setdefaulttimeout(5) #定義http連接配接逾時時間(5秒)
conn=httplib.HTTPConnection(checkurl) #建立http連接配接對象
try:
conn.request("GET","/",headers = {"Host": appdomain}) #發起URL請求,添加host主機頭
r=conn.getresponse()
getcontent = r.read(15) #擷取URL頁面前15個字元,以便做可用性校驗
finally:
if getcontent == "<!doctype html>": #監控URL頁的内容一般是事先定義好的,比如"HTTP200"等
print ip+" [OK]"
else:
print ip+" [Error]"
if __name__=="__main__":
if get_iplist(appdomain) and len(iplist)>0:
for ip in iplist:
checkip(ip)
else:
print "DNS resolver error."