zoukankan      html  css  js  c++  java
  • python实现批量修改服务器密码

    需求:机房、线上有多台主机,为了保障安全,需要定期修改密码。若手动修改,费时费力易出错。

    程序应该满足如下需求 :

    1、在现有的excel密码表格,在最后一个字段后面生成新的密码,另存为一个新的excel密码文件

    2、根据新的excel密码文件,更新服务器密码,将更新后的结果保存到另外一个excel文件。

    a、原始excel文件字段格式,最后一个字段为原始密码

    IP USER PORT pwd

    b、生成新的密码文件字段格式,最后一个字段为更新密码

    IP USER PORT pwd pwd20180929

    c、生成新的密码文件字段格式,最后一个字段为更新是否成功的标识

    IP PORT USERNAME OLDPASS NEWPASS FLAG

    按照面向对象编程的思想,可以设计2个类,excelhandler和ChangePassword
    excelhandler主要负责excel文件的读取,写入,增加一个生成密码文件
    ChangePassword主要利用paramiko登陆服务器进行密码更新

    excelhandler类

    #_*_ coding: utf-8 _*_
    '''
    @author liaogs
    '''
    import json
    import xlrd
    import xlwt
    import time
    import datetime
    import base64
    import random
    from xlutils.copy import copy
    
    
    class excelhandler():
        def __init__(self,path):
            self.path = path
            self.workbook = None
            self.rows = 0
            self.cols = 0
            self.serverlist = []
    
        def read_excel(self):
            self.workbook = xlrd.open_workbook(self.path)
            sh1 = self.workbook.sheet_by_index(0)
            self.rows = sh1.nrows
            self.cols = sh1.ncols
            for row in  range(1,sh1.nrows):
                server = []
                for col in [0,1,2,sh1.ncols-2,sh1.ncols-1]:
                    server.append(sh1.cell(row,col).value)
    
                self.serverlist.append(server)
    
        def gen_new_password_excel(self):
            old_excel = xlrd.open_workbook(self.path)
            new_excel = copy(old_excel)
            ws = new_excel.get_sheet(0)
            coldt = "pass"+ str(datetime.date.today())
            ws.write(0,self.cols,coldt)
            for row in range(1,self.rows):
                ws.write(row,self.cols,self.gen_key())
            dt = time.strftime("%Y%m%d%H%M%S",time.localtime())
            new_excel.save(dt+self.path)
    
    
        def write_excel(self,serverlist):
            wb = xlwt.Workbook()
            ws = wb.add_sheet(u'sheet1',cell_overwrite_ok=True)
            header = ["IP","PORT","USERNAME","OLDPASS","NEWPASS","FLAG"]
            for col in range(0,6):
                ws.write(0,col,header[col])
            for row in range(len(serverlist)):
                for col in range(0,6):
                    ws.write(row+1,col,serverlist[row][col])
            dt = time.strftime("%Y%m%d%H%M%S", time.localtime())
            wb.save(dt+".xlsx")
    
        def get_server_list(self):
            return self.serverlist
    
        def get_rows(self):
            return self.rows
    
        def get_cols(self):
            return self.cols
    
        def gen_key(self):
            pool = "1234567890abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM"
            length = len(pool)
            key = ""
            for i in range(28):
                c = random.randint(0,length)
                key += pool[c:c+1]
            return key

    ChangePassword类

    #_*_ coding: utf-8 _*_
    '''
    @author liaogs
    '''
    import paramiko
    import sys
    
    class ChangePassword():
        def __init__(self,hostip,port,username,oldpass,newpass):
            self.hostip = hostip
            self.port = port
            self.username = username
            self.oldpass = oldpass
            self.newpass = newpass
            self.updateflag = False
    
        def run_change(self):
            s = paramiko.SSHClient()
            s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            tasklist = []
            try:
                s.connect(hostname=self.hostip, port=self.port, username=self.username, password=self.oldpass)
                print ('"%s" is updating password' % self.hostip)
                stdin, stdout, stderr = s.exec_command('echo %s |passwd --stdin root' % self.newpass)
                r_message = stdout.read()
                if "successfully" in r_message:
                    self.updateflag = True
                    print('%s is successful' %self.hostip)
                else:
                    print('%s is failed' %self.hostip)
                    self.updateflag = False
                s.close()
            except Exception:
                self.updateflag = False
                print("connection error")
    
            tasklist = [self.hostip, self.port, self.username, self.oldpass, self.newpass, self.updateflag]
            return tasklist
    View Code

    main

    #_*_ coding: utf-8 _*_
    '''
    @author liaogs
    '''
    import re
    import sys
    from excelhandler import excelhandler
    from changepassword import ChangePassword
    
    if __name__ == '__main__':
        if len(sys.argv) == 1:
            eh = excelhandler("pass.xlsx")
        else:
            eh = excelhandler(sys.argv[1])
        eh.read_excel()
    
        def updatepassword():
            ret = eh.get_server_list()
            tasklist = []
            for i in range(len(ret)):
                print(ret[i][0],ret[i][2],ret[i][1],ret[i][3],ret[i][4])
                cp = ChangePassword(hostip=ret[i][0],port=int(ret[i][2]),username=ret[i][1],oldpass=ret[i][3],newpass=ret[i][4])
                task = cp.run_change()
                tasklist.append(task)
    
            print(tasklist)
            eh.write_excel(tasklist)
    
        while True:
            inp = input("1、生成密码 2、更新密码>>")
            if str(inp) == "1":
                eh.gen_new_password_excel()
    
            elif str(inp) == "2":
                updatepassword()
    
            elif inp == "exit":
                exit()
            else:
                continue

    代码下载:https://github.com/liaogs/changepassword.git

  • 相关阅读:
    笨方法学python中执行argv提示ValueError: not enough values to unpack (expected 4, got 1)
    VMware workstation安装
    Redis bigkey分析
    MySQL drop table 影响及过程
    MySQL 大表硬连接删除
    ES elasticsearch 各种查询
    ES elasticsearch 各种聚合
    ES elasticsearch 聚合统计
    ES elasticsearch 实现 count单字段,分组取前多少位,以地理位置中心进行统计
    MySQL行溢出、varchar最多能存多少字符
  • 原文地址:https://www.cnblogs.com/kilometerwine/p/9723335.html
Copyright © 2011-2022 走看看