社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

经典!Python运维中常用的几十个Python运维脚本

马哥Linux运维 • 7 年前 • 933 次点击  

本文由马哥教育Python自动化实战班4期学员推荐,转载自互联网,作者为mark,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛苦贡献与付出。


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




————开班喜讯————


温馨提醒:马哥教育Python自动化开发班将于8月28日在北京海淀上地开班,小班制魔鬼式授课,钜惠限时抢位中。

马哥教育2017年Python自动化运维开发实战班,马哥联合BAT、豆瓣等一线互联网Python开发达人,根据目前企业需求的Python开发人才进行了深度定制,加入了大量一线互联网公司:大众点评、饿了么、腾讯等生产环境真是项目,课程由浅入深,从Python基础到Python高级,让你融汇贯通Python基础理论,手把手教学让你具备Python自动化开发需要的前端界面开发、Web框架、大监控系统、CMDB系统、认证堡垒机、自动化流程平台六大实战能力,让你从0开始蜕变成Hold住年薪20万的Python自动化开发人才


Python学习免费交流QQ群:542679406(千人群)


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/mX37dCn4iT
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2645
 
933 次点击