• 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

  • 相关阅读:
    Linear Predictors
    Non-Programmer's Tutorial for Python 3/File IO
    Python File I/O
    Introduction to Machine Learning
    Python3.6爬虫+Djiago2.0+Mysql --数据爬取
    MySql5.7 找回密码
    pyinstaller 打包python3.6文件成exe 运行
    python 连接mssql数据库
    Nopi 导出设置行高
    python登录aspx网站
  • 原文地址:https://www.cnblogs.com/kilometerwine/p/9723335.html
Copyright © 2020-2023  润新知