Python运维中常用的_脚本
Posted 九酒馆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python运维中常用的_脚本相关的知识,希望对你有一定的参考价值。
首先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 ") #如果要写入字符串以外的数据,先将他转换为字符串.
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写一个列举当前目录以及所有子目录下的文件,并打印出绝对路径
#!/usr/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 要获得内容目录的路径
二、写程序打印三角形
#!/usr/bin/env python
input = int(raw_input(‘input number:‘))
for i in range(input):
for j in range(i):
print ‘*‘,
print ‘ ‘
三、猜数器,程序随机生成一个个位数字,然后等待用户输入,输入数字和生成数字相同则视为成功。
成功则打印三角形。失败则重新输入(提示:随机数函数:random)
#!/usr/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 ‘ ‘
else:
print ‘please input number again‘
四、请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2016-09-23.log, 并且把磁盘的使用情况写到到这个文件中。
#!/usr/bin/env python
#!coding=utf-8
import time
import os
new_time = time.strftime(‘%Y-%m-%d‘)
disk_status = os.popen(‘df -h‘).readlines()
st1 = ‘‘.join(disk_status)
f = file(new_time+‘.log‘,‘w‘)
f.write(‘%s‘ % str1)
f.flush()
f.close()
五、统计出每个IP的访问量有多少?(从日志文件中查找)
#!/usr/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)
-
写个程序,接受用户输入数字,并进行校验,非数字给出错误提示,然后重新等待用户输入。
-
根据用户输入数字,输出从0到该数字之间所有的素数。(只能被1和自身整除的数为素数)
#!/usr/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(‘ ‘)
六、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.usr.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[]用法练习
#!/usr/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.argv1
** **
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迭代查找目录下文件
#两种方法
#!/usr/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那列,然后求和)
#!/usr/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检测一次。
#!/usr/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(‘ ‘)
#!/usr/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() )为每一行的字符长度,空行的内容为 也是有两个字符。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,则输出信息没有这个用户;
#!/usr/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*安装
"""
#!/usr/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(‘ ‘)[:-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‘ % (resulti,resulti),
十一、Python监控网卡流量
1、实现原理:通过SNMP协议获取系统信息,再进行相应的计算和格式化,最后输出结果
2、特别注意:被监控的机器上需要支持snmp。yum install -y net-snmp*安装
"""
#!/usr/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(‘ ‘)[:-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])
以上是关于Python运维中常用的_脚本的主要内容,如果未能解决你的问题,请参考以下文章
纯干货!python 在运维中的应用 (一):批量 ssh/sftp