python 实现自动化mysql授权操作

#!/usr/bin/python
#coding=utf-8
#backup mysql
#创建者 Larryd
#时间 2019/06/24
print ("##############################################")
print ("#          在执行此脚本前请先执行            #")
print ("######       pip install pymysql      ########")
print ("##############################################")
import time
print ("##############################################")
print ("# 请按Ctrl+C停止此脚本执行上述命令后再次运行 #")
print ("#             否则运行可能出现错误           #")
print ("#            如已安装 请忽略继续执行         #")
print ("##############################################")
#time.sleep(2)
import os
import shutil
import pymysql
import re
import sys
import getpass
import commands
import linecache
#数据库连接以及选项
def admin():
	db = "mysql"
	req2 = raw_input ("数据库是否在本地Y/N:")
	if req2 == "Y" or req2 == "y":
		host = "localhost"
		user = "root"
		passwd = raw_input("请输入数据库连接密码:")
		try:
			conn = pymysql.connect(host, user, passwd, db)
		except:
			print ("密码错误,连接失败···")
			admin() 
		print("本地数据库可以连接···")
	elif req2 =="N" or req2 == "n":
		user = raw_input ("请输入数据库登录用户:")
		r_user = raw_input("请再次输入:")
		if user != r_user:
			print ("两次输入不一致···")
			admin()
		#检测用户输入的ip格式是否正确
		def judge(host2):
                        com_ip=re.compile('^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$')
                        if com_ip.match(host2):
                                return True
                        else:
                            return False
                if __name__=='__main__':
                        host2=raw_input("请输入需要操作的mysql主机IP:")
                        if judge(host2):
                                pass
                        else:
                                print ("输入错误,即将返回···")
				admin()
		passwd = raw_input("请输入数据库连接密码:")
		try:
			conn = pymysql.connect(host2, user, passwd,db)
                except:
                        print ("账户密码密码错误,连接失败···")
                        admin()
		print("本地数据库可以连接···")
		time.sleep(1)
	else:
		print("输入错误···即将退出")
		sys.exit()
	while True:
		print("###########################")
		print("###  1 备份       2 恢复###")
		print("#######    3 退出   #######")
		print("###########################")
		chose = raw_input("请选择你的操作1/2/3:")
		if chose == "1":
        		db2 =raw_input("输入你想备份数据库名称:")
        		cursor= conn.cursor()
			#创建一个文件写入datadir
			commands.getstatusoutput("rm -rf /data/test.txt")
		        file = open(r'/data/test.txt', 'w')
		        sql = """show variables like '%datadir%';"""
			#错误处理,写入失败输出IndexError
		        try:
		                cursor.execute(sql)
		                results = cursor.fetchall()
		                i = 0
		                for row in results:
                        		file.write('%s :: %s\n' % (row[0],row[1]))
                		i+=1
        		except IndexError as e:
                		conn.rollback()
                		print (e)
        		file.close()
        		# 工作目录切换到数据目录
        		a = commands.getstatusoutput("awk  '{print $3}' /data/test.txt")
        		os.chdir(a[1])
			#判断输入是否为系统库
        		if os.path.isdir(db2) == True:
				if db2=="mysql" or db2=="performance_schema" or db2=="information_schema" or db2=="sys":
               				print "(输入的数据库为自带的数据库···)"
					continue
				#定义备份文件名称
				timestr = time.strftime("%Y%m%d%H%M%S",time.localtime(time.time()))
				folder = "/data/sql_backup/"+timestr
				#创建备份目录并执行备份
				commands.getstatusoutput("mkdir /data/sql_backup")
				dump_sql = "mysqldump -u%s -p%s %s >%s.sql"%(user, passwd, db2, folder)
				os.system(dump_sql)
				print ("导出成功/数据目录为/data/sql_backup")
			else:
				print ("不存在这个库···")
		elif chose == "2":
			#判断输入路径是否正确
			path = raw_input ("请输入你的备份目录:")
			if os.path.isdir(path) == True:
				pass
			else:
				print ("路径输入有误···")
				admin()
			os.chdir(path)
			print ("##############################")
			print ("## 1:.gz    2:.zip   3:.sql ##")
			print ("########    4:返回主页  ######")
			print ("##############################")
			db3 = raw_input ("请选择备份文件类型1/2/3")
			while True:
				if db3 == "1":
					#判断输入是否合法
					def judge(num):
						num1=re.compile('^([0-9][0-9][0-9][0-9])$')
						if num1.match(num):
							return True
						else:
							return False
					if __name__=='__main__':
						date = raw_input("选择你想恢复的日期月/日 如 0625:")
						if judge(num):
							pass
						else:
							print ("输入错误,即将返回···")
							continue
					#得到备份文件的名称
					com1 = "ls %s |grep %s > /data/test.txt"%(path, date)
					os.system(com1)
					os.chdir("/data/")
					FileName = linecache.getline('test.txt',1)
					#解压得到sql文件
					com2 = "rm -rf %s/*.sql &&  tar xf %s "%(path, FileName)
					os.system(com2)
					#得到sql文件的名称
					com3 = "ls %s |grep .sql> /data/test.txt"%(path)
					os.system(com3)
					os.chdir("/data")
					sql_name = linecache.getline('test.txt',1)
					#删除已有的库后执行导入操作
					print ("再做导入操作之前,为了避免数据发生冲突,请先删除原有得数据Y/N")
					d_db = raw_input ("请输入需要删除得库名:")
					com4 = "mysql -u%s -p%s -e 'drop database %s;'"%(user, passwd, d_db)
					com5 = "mysql -u%s -p%s -e 'create database %s;'"%(user, passwd, d_db)
					com6 = "mysql -u%s -p%s < %s/%s"%(user,passwd,path,sql_name)
					os.system(com4)
					os.system(com5)
					os.system(com6)
					os.chdir(path)
					if os.path.isdir(c_drop) == True:
						print ("导入成功")
					else:
						print ("导入失败···")
						print ("正在返回···")
						sys.exit()
				elif db3 == "2":
                                        def judge(num):
                                                num1=re.compile('^([0-9][0-9][0-9][0-9])$')
                                                if num1.match(num):
                                                        return True
                                                else:
                                                        return False
                                        if __name__=='__main__':
                                                date = raw_input("选择你想恢复的日期月/日 如 0625:")
                                                if judge(num):
                                                        pass
                                                else:
                                                        print ("输入错误,即将返回···")
                                                        continue
                                        com1 = "ls %s |grep %s > /data/test.txt"%(path, date)
                                        os.system(com1)
                                        os.chdir("/data/")
                                        FileName = linecache.getline('test.txt',1)
                                        com2 = "rm -rf %s/*.sql &&  unzip  %s "%(path, FileName)
                                        os.system(com2)
                                        com3 = "ls %s |grep .sql > /data/test.txt"%(path)
                                        os.system(com3)
					os.chdir("/data")
                                        sql_name = linecache.getline('test.txt',1)
                                        print ("再做导入操作之前,为了避免数据发生冲突,请先删除原有的数据Y/N")
                                        d_db = raw_input ("请输入需要删除的库名:")
                                        com4 = "mysql -u%s -p%s -e 'drop database %s;'"%(user, passwd, d_db)
                                        com5 = "mysql -u%s -p%s -e 'create database %s;'"%(user, passwd, d_db)
                                        com6 = "mysql -u%s -p%s < %s/%s"%(user,passwd,path,sql_name)
					os.system(com4)
					os.system(com5)
					os.system(com6)
                                        os.chdir(path)
                                        if os.path.isdir(d_db) == True:
                                                print ("导入成功")
                                        else:
                                                print ("导入失败···")
                                                print ("正在退出···")
                                                sys.exit()
				elif db3 == "3":
                                        def judge(num):
                                                num1=re.compile('^([0-9][0-9][0-9][0-9])$')
                                                if num1.match(num):
                                                        return True
                                                else:
                                                        return False
                                        if __name__=='__main__':
                                                date = raw_input("选择你想恢复的日期月/日 如 0625:")
                                                if judge(num):
                                                        pass
                                                else:
                                                        print ("输入错误,即将返回···")
                                                        continue
                                        com1 = "ls %s |grep %s > /data/test.txt"%(path, date)
                                        os.system(com1)
                                        os.chdir("/data/")
                                        FileName = linecache.getline('test.txt',1)
                                        com3 = "ls %s |grep .sql > /data/test.txt"%(path)
                                        os.system(com3)
					os.chdir("/data")
                                        sql_name = linecache.getline('test.txt',1)
                                        print("再做导入操作之前,为了避免数据发生冲突,请先删除原有得数据Y/N")
                                        d_db = raw_input ("请输入需要删除得库名:")
                                        com4 = "mysql -u%s -p%s -e 'drop database %s;'"%(user, passwd, d_db)
                                        com5 = "mysql -u%s -p%s -e 'create database %s;'"%(user, passwd, d_db)
                                        com6 = "mysql -u%s -p%s < %s/%s"%(user, passwd, path, sql_name)
					os.system(com4)
					os.system(com5)
					os.system(com6)
                                        os.chdir(path)
                        		cursor= conn.cursor()
                     			#创建一个文件写入本地mysql datadir
                     			commands.getstatusoutput("rm -rf /data/test.txt")
                        		file = open(r'/data/test.txt', 'w')
                        		sql = """show variables like '%datadir%';"""
                        		try:
                                		cursor.execute(sql)
                                		results = cursor.fetchall()
                                		i = 0
                                		for row in results:
                                        		file.write('%s :: %s\n' % (row[0],row[1]))
                                		i+=1
                        		except IndexError as e:
                                		conn.rollback()
                                		print (e)
                        		file.close()
                        		### 判断是否存在库文件
                        		a = commands.getstatusoutput("awk  '{print $3}' /data/test.txt")
                        		os.chdir(a[1])
                        		if os.path.isdir(d_db) == True:
                                                print ("导入成功")
						sys.exit()
                                        else:
                                                print ("导入失败···")
                                                print ("正在返回···")
						sys.exit()
				elif db3 == "4":
					admin()
				else:
					print("输入有误···")
                         		continue
		elif chose == "3":
			sys.exit()
		else:
			print("输入有误···")
			continue
admin()

此处getpass是设置密码的时候用的为了实验我并未加进去
大神勿喷···

你可能感兴趣的:(运维)