python实现批量修改服务器密码的方法


Posted in Python onAugust 13, 2019

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

程序应该满足如下需求 :

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

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实现批量修改服务器密码的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python re正则表达式模块(Regular Expression)
Jul 16 Python
跟老齐学Python之list和str比较
Sep 20 Python
Python类属性的延迟计算
Oct 22 Python
Python 40行代码实现人脸识别功能
Apr 02 Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 Python
Python实现的选择排序算法示例
Nov 29 Python
python3判断url链接是否为404的方法
Aug 10 Python
tensorflow实现逻辑回归模型
Sep 08 Python
python绘制热力图heatmap
Mar 23 Python
Django基础知识 web框架的本质详解
Jul 18 Python
Python语言异常处理测试过程解析
Jan 08 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 #Python
Python实现微信翻译机器人的方法
Aug 13 #Python
python读写csv文件的方法
Aug 13 #Python
python根据多个文件名批量查找文件
Aug 13 #Python
详解django实现自定义manage命令的扩展
Aug 13 #Python
Python一键安装全部依赖包的方法
Aug 12 #Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 #Python
You might like
PHP操作数组相关函数
2011/02/03 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
python多线程扫描端口(线程池)
2019/09/04 Python
Python 私有化操作实例分析
2019/11/21 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
python中有关时间日期格式转换问题
2019/12/25 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
文员岗位职责
2013/11/09 职场文书
仓库组长岗位职责
2014/01/29 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
会议主持词
2014/03/17 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
公司市场部岗位职责
2015/04/15 职场文书
飞屋环游记观后感
2015/06/08 职场文书
公司欠款证明
2015/06/24 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python