歡迎光臨
每天分享高質量文章

經典!Python運維中常用的幾十個Python運維指令碼

file是一個類,使用file(‘file_name’, ‘r+’)這種方式開啟檔案,傳回一個file物件,以寫樣式開啟檔案不存在則會被建立。但是更推薦使用內建函式open()來開啟一個檔案。


首先open是內建函式,使用方式是open(‘file_name’, mode, buffering),傳回值也是一個file物件,同樣,以寫樣式開啟檔案如果不存在也會被建立一個新的。

f=open(‘/tmp/hello’,’w’)

#open(路徑+檔案名,讀寫樣式)

#讀寫樣式:r只讀,r+讀寫,w新建(會改寫原有檔案),a追加,b二進位制檔案.常用樣式

如:’rb’,’wb’,’r+b’等等

讀寫樣式的型別有:

rU 或 Ua 以讀方式開啟, 同時提供通用換行符支援 (PEP 278)

w     以寫方式開啟,

a     以追加樣式開啟 (從 EOF 開始, 必要時建立新檔案)

r+     以讀寫樣式開啟

w+     以讀寫樣式開啟 (參見 w )

a+     以讀寫樣式開啟 (參見 a )

rb     以二進位制讀樣式開啟

wb     以二進位制寫樣式開啟 (參見 w )

ab     以二進位制追加樣式開啟 (參見 a )

rb+    以二進位制讀寫樣式開啟 (參見 r+ )

wb+    以二進位制讀寫樣式開啟 (參見 w+ )

ab+    以二進位制讀寫樣式開啟 (參見 a+ )

註意:

1、使用’W’,檔案若存在,首先要清空,然後(重新)建立,

2、使用’a’樣式 ,把所有要寫入檔案的資料都追加到檔案的末尾,即使你使用了seek()指向檔案的其他地方,如果檔案不存在,將自動被建立。

f.read([size]) size未指定則傳回整個檔案,如果檔案大小>2倍記憶體則有問題.f.read()讀到檔案尾時傳回””(空字串)

file.readline() 傳回一行

file.readline([size]) 傳回包含size行的串列,size 未指定則傳回全部行

for line in f: 

print line #透過迭代器訪問

f.write(“hello\n”) #如果要寫入字串以外的資料,先將他轉換為字串.

f.tell() 傳回一個整數,表示當前檔案指標的位置(就是到檔案頭的位元數).

f.seek(偏移量,[起始位置])

用來移動檔案指標

偏移量:單位:位元,可正可負

起始位置:0-檔案頭,預設值;1-當前位置;2-檔案尾

f.close() 關閉檔案

要進行讀檔案操作,只需要把樣式換成’r’就可以,也可以把樣式為空不寫引數,也是讀的意思,因為程式預設是為’r’的。

>>>f = open(‘a.txt’, ‘r’)

>>>f.read(5)

‘hello’

read( )是讀檔案的方法,括號內填入要讀取的字元數,這裡填寫的字元數是5,如果填寫的是1那麼輸出的就應該是‘h’。

開啟檔案檔案讀取還有一些常用到的技巧方法,像下邊這兩種:

1、read( ):表示讀取全部內容

2、readline( ):表示逐行讀取

一、用Python寫一個列舉當前目錄以及所有子目錄下的檔案,並打印出絕對路徑


#!/magedu/bin/env python

import os

for root,dirs,files in os.walk(‘/tmp’):

    for name in files:

        print (os.path.join(root,name))

os.walk()

原型為:os.walk(top, topdown=True, onerror=None, followlinks=False)

我們一般只使用第一個引數。(topdown指明遍歷的順序)

該方法對於每個目錄傳回一個三元組,(dirpath, dirnames, filenames)。

第一個是路徑,第二個是路徑下麵的目錄,第三個是路徑下麵的非目錄(對於windows來說也就是檔案)

os.listdir(path) 

其引數含義如下。path 要獲得內容目錄的路徑

二、寫程式列印三角形


#!/magedu/bin/env python

input = int(raw_input(‘input number:’))

for i in range(input):

    for j in range(i):

        print ‘*’,

    print ‘\n’

三、猜數器,程式隨機生成一個個位數字,然後等待使用者輸入,輸入數字和生成數字相同則視為成功。


成功則列印三角形。失敗則重新輸入(提示:隨機數函式:random)

#!/magedu/bin/env python

import random

while True:

    input = int(raw_input(‘input number:’))

    random_num = random.randint(1, 10)

    print input,random_num

    if input == random_num:

        for i in range(input):

            for j in range(i):

                print ‘*’,

            print ‘\n’

    else:

        print ‘please input number again’

四、請按照這樣的日期格式(xxxx-xx-xx)每日生成一個檔案,例如今天生成的檔案為2016-09-23.log, 並且把磁碟的使用情況寫到到這個檔案中。


#!/magedu/bin/env python

#!coding=utf-8

import time

import os

new_time = time.strftime(‘%Y-%m-%d’)

disk_status = os.popen(‘df -h’).readlines()

str1 = ”.join(disk_status)

f = file(new_time+’.log’,’w’)

f.write(‘%s’ % str1)

f.flush()

f.close()

五、統計出每個IP的訪問量有多少?(從日誌檔案中查詢)


#!/magedu/bin/env python

#!coding=utf-8

list = []

f = file(‘/tmp/1.log’)

str1 = f.readlines() 

f.close() 

for i in str1:

    ip =  i.split()[0]

    list.append(ip) 

list_num = set(list)

for j in list_num: 

    num = list.count(j) 

    print ‘%s : %s’ %(j,num)

1. 寫個程式,接受使用者輸入數字,併進行校驗,非數字給出錯誤提示,然後重新等待使用者輸入。

2. 根據使用者輸入數字,輸出從0到該數字之間所有的素數。(只能被1和自身整除的數為素數)

#!/magedu/bin/env python

#coding=utf-8

import tab

import sys

while True:

    try:

        n = int(raw_input(‘請輸入數字:’).strip())

        for i in range(2, n + 1):

            for x in range(2, i):

                if i % x == 0:

                    break

            else:

                print i

    except ValueError:

        print(‘你輸入的不是數字,請重新輸入:’)

    except KeyboardInterrupt:

        sys.exit(‘\n’)

六、python練習 抓取web頁面



from urllib import urlretrieve

def firstNonBlank(lines): 

    for eachLine in lines: 

        if not eachLine.strip(): 

            continue 

    else: 

        return eachLine 

def firstLast(webpage): 

    f=open(webpage) 

    lines=f.readlines() 

    f.close 

    print firstNonBlank(lines), #呼叫函式

    lines.reverse() 

    print firstNonBlank(lines), 

def download(url= ‘http://www.magedu.com/72446.html’,process=firstLast): 

    try: 

        retval = urlretrieve(url) [0] 

    except IOError: 

        retval = None 

    if retval: 

        process(retval) 

if __name__ == ‘__main__’: 

    download()

七、Python中的sys.argv[]用法練習


#!/magedu/bin/python

# -*- coding:utf-8 -*-

import sys

def readFile(filename):

    f = file(filename)

    while True:

        fileContext = f.readline()

        if len(fileContext) ==0:

            break;

        print fileContext

    f.close()

if len(sys.argv) < 2:

    print “No function be setted.”

    sys.exit()

if sys.argv[1].startswith(“-“):

    option = sys.argv[1][1:]


    if option == ‘version’:

        print “Version1.2”

    elif option == ‘help’:

        print “enter an filename to see the context of it!”

    else:

        print “Unknown function!”

        sys.exit()

else:

    for filename in sys.argv[1:]:

        readFile(filename)

八、python迭代查詢目錄下檔案


#兩種方法

#!/magedu/bin/env python

import os

 

dir=’/root/sh’

”’

def fr(dir):

  filelist=os.listdir(dir)

  for i in filelist:

    fullfile=os.path.join(dir,i)

    if not os.path.isdir(fullfile):

      if i == “1.txt”:

        #print fullfile

    os.remove(fullfile)

    else:

      fr(fullfile)

 

”’

”’

def fw()dir:

  for root,dirs,files in os.walk(dir):

    for f in files:

      if f == “1.txt”:

        #os.remove(os.path.join(root,f))

        print os.path.join(root,f)

”’

九、ps 可以檢視行程的記憶體佔用大小,寫一個指令碼計算一下所有行程所佔用記憶體大小的和。


(提示,使用ps aux 列出所有行程,過濾出RSS那列,然後求和)

#!/magedu/bin/env python

#!coding=utf-8

import os

list = []

sum = 0   

str1 = os.popen(‘ps aux’,’r’).readlines()

for i in str1:

    str2 = i.split()

    new_rss = str2[5]

    list.append(new_rss)

for i in  list[1:-1]: 

    num = int(i)

    sum = sum + num 

print ‘%s:%s’ %(list[0],sum)

寫一個指令碼,判斷本機的80埠是否開啟著,如果開啟著什麼都不做,如果發現埠不存在,那麼重啟一下httpd服務,併發郵件通知你自己。指令碼寫好後,可以每一分鐘執行一次,也可以寫一個死迴圈的指令碼,30s檢測一次。

#!/magedu/bin/env python

#!coding=utf-8

import os

import time

import sys

import smtplib

from email.mime.text import MIMEText

from email.MIMEMultipart import MIMEMultipart

def sendsimplemail (warning):

    msg = MIMEText(warning)

    msg[‘Subject’] = ‘python first mail’

    msg[‘From’] = ‘root@localhost’

    try:

        smtp = smtplib.SMTP()

        smtp.connect(r’smtp.126.com’)

        smtp.login(‘要傳送的郵箱名’, ‘密碼’)

        smtp.sendmail(‘要傳送的郵箱名’, [‘要傳送的郵箱名’], msg.as_string())

        smtp.close()

    except Exception, e:

        print e

while True:

    http_status = os.popen(‘netstat -tulnp | grep httpd’,’r’).readlines()

    try:

        if http_status == []:

            os.system(‘service httpd start’)

            new_http_status = os.popen(‘netstat -tulnp | grep httpd’,’r’).readlines()

            str1 = ”.join(new_http_status)

            is_80 = str1.split()[3].split(‘:’)[-1]

            if is_80 != ’80’:

                print ‘httpd 啟動失敗’

            else:

                print ‘httpd 啟動成功’

                sendsimplemail(warning = “This is a warning!!!”)#呼叫函式

        else:

            print ‘httpd正常’

        time.sleep(5)

    except KeyboardInterrupt:

        sys.exit(‘\n’) 

#!/magedu/bin/python

#-*- coding:utf-8 -*- 

#輸入這一條就可以在Python指令碼裡面使用漢語註釋!此指令碼可以直接複製使用;

 

while True:            #進入死迴圈

        input = raw_input(‘Please input your username:’)    

#互動式輸入使用者資訊,輸入input資訊;

        if input == “wenlong”:        

#如果input等於wenlong則進入此迴圈(如果使用者輸入wenlong)

                password = raw_input(‘Please input your pass:’)    

#互動式資訊輸入,輸入password資訊;

                p = ‘123’                  

#設定變數P賦值為123

                while password != p:         

#如果輸入的password 不等於p(123), 則進此入迴圈

                        password = raw_input(‘Please input your pass again:’) 

#互動式資訊輸入,輸入password資訊;

                if password == p:        

#如果password等於p(123),則進入此迴圈

                        print ‘welcome to select system!’              #輸出提示資訊;

                        while True:           

#進入迴圈;

                                match = 0     

#設定變數match等於0;

                                input = raw_input(“Please input the name whom you want to search :”)   

#互動式資訊輸入,輸入input資訊;

                                while not input.strip():   

#判斷input值是否為空,如果input輸出為空,則進入迴圈;

                                        input = raw_input(“Please input the name whom you want to search :”)        

#互動式資訊輸入,輸入input資訊;

                                name_file = file(‘search_name.txt’)     

#設定變數name_file,file(‘search_name.txt’)是呼叫名為search_name.txt的檔案

                                while True:               

#進入迴圈;

                                        line = name_file.readline()           #以行的形式,讀取search_name.txt檔案資訊;

                                        if len(line) == 0:      #當len(name_file.readline() )為0時,表示讀完了檔案,len(name_file.readline() )為每一行的字元長度,空行的內容為\n也是有兩個字元。len為0時進入迴圈;

                                                 break       #執行到這裡跳出迴圈;

                                        if input in line:    #如果輸入的input資訊可以匹配到檔案的某一行,進入迴圈;

                                                print ‘Match item: %s’  %line     #輸出匹配到的行資訊;

                                                match = 1    #給變數match賦值為1

                                if match == 0 :              #如果match等於0,則進入   ;

                                        print ‘No match item found!’         #輸出提示資訊;

        else: print “Sorry ,user  %s not found ” %input      #如果輸入的使用者不是wenlong,則輸出資訊沒有這個使用者;

#!/magedu/bin/python

while True:

        input = raw_input(‘Please input your username:’)

        if input == “wenlong”:

                password = raw_input(‘Please input your pass:’)

                p = ‘123’

                while password != p:

                        password = raw_input(‘Please input your pass again:’)

                if password == p:

                        print ‘welcome to select system!’

                        while True:

                                match = 0

                                input = raw_input(“Please input the name whom you want to search :”)

                                while not input.strip():

                                        print ‘No match item found!’

                                        input = raw_input(“Please input the name whom you want to search :”)

                                name_file = file(‘search_name.txt’)

                                while True:

                                        line = name_file.readline()

                                        if len(line) == 0:

                                                 break

                                        if input in line:

                                                print ‘Match item: ‘  , line

                                                match = 1

                                if match == 0 :

                                        print ‘No match item found!’

        else: print “Sorry ,user  %s not found ” %input

十、Python監控CPU情況


1、實現原理:透過SNMP協議獲取系統資訊,再進行相應的計算和格式化,最後輸出結果

2、特別註意:被監控的機器上需要支援snmp。yum install -y net-snmp*安裝

“””

#!/magedu/bin/python

import os

def getAllitems(host, oid):

        sn1 = os.popen(‘snmpwalk -v 2c -c public ‘ + host + ‘ ‘ + oid + ‘|grep Raw|grep Cpu|grep -v Kernel’).read().split(‘\n’)[:-1]

        return sn1

                                                                

def getDate(host):

        items = getAllitems(host, ‘.1.3.6.1.4.1.2021.11’)

                                                                

        date = []

        rate = []

        cpu_total = 0

        #us = us+ni, sy = sy + irq + sirq

        for item in items:

                float_item = float(item.split(‘ ‘)[3])

                cpu_total += float_item

                if item == items[0]:

                        date.append(float(item.split(‘ ‘)[3]) + float(items[1].split(‘ ‘)[3]))

                elif item == item[2]:

                        date.append(float(item.split(‘ ‘)[3] + items[5].split(‘ ‘)[3] + items[6].split(‘ ‘)[3]))

                else:

                        date.append(float_item)

                                                                

        #calculate cpu usage percentage

        for item in date:

                rate.append((item/cpu_total)*100)

                                                                

        mean = [‘%us’,’%ni’,’%sy’,’%id’,’%wa’,’%cpu_irq’,’%cpu_sIRQ’]

                                                                

        #calculate cpu usage percentage

        result = map(None,rate,mean)

        return result

                                                                

if __name__ == ‘__main__’:

        hosts = [‘192.168.10.1′,’192.168.10.2’]

        for host in hosts:

                print ‘==========’ + host + ‘==========’

                result = getDate(host)

                print ‘Cpu(s)’,

                #print result

                for i in range(5):

                        print ‘ %.2f%s’ % (result[i][0],result[i][1]),

                print

                print

十一、Python監控網絡卡流量


1、實現原理:透過SNMP協議獲取系統資訊,再進行相應的計算和格式化,最後輸出結果

2、特別註意:被監控的機器上需要支援snmp。yum install -y net-snmp*安裝

“””

#!/magedu/bin/python

import re

import os

#get SNMP-MIB2 of the devices

def getAllitems(host,oid):

        sn1 = os.popen(‘snmpwalk -v 2c -c public ‘ + host + ‘ ‘ + oid).read().split(‘\n’)[:-1]

        return sn1

                                                                                      

#get network device

def getDevices(host):

        device_mib = getAllitems(host,’RFC1213-MIB::ifDescr’)

        device_list = []

        for item in device_mib:

                if re.search(‘eth’,item):

                        device_list.append(item.split(‘:’)[3].strip())

        return device_list

                                                                                      

#get network date

def getDate(host,oid):

        date_mib = getAllitems(host,oid)[1:]

        date = []

        for item in date_mib:

                byte = float(item.split(‘:’)[3].strip())

                date.append(str(round(byte/1024,2)) + ‘ KB’)

        return date

                                                                                      

if __name__ == ‘__main__’:

        hosts = [‘192.168.10.1′,’192.168.10.2’]

        for host in hosts:

                device_list = getDevices(host)

                                                                                      

                inside = getDate(host,’IF-MIB::ifInOctets’)

                outside = getDate(host,’IF-MIB::ifOutOctets’)

                                                                                      

                print ‘==========’ + host + ‘==========’

                for i in range(len(inside)):

                        print ‘%s : RX: %-15s   TX: %s ‘ % (device_list[i], inside[i], outside[i])

                print

《Linux雲端計算及運維架構師高薪實戰班》2018年11月26日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~

    *宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

    – END –


    贊(0)

    分享創造快樂