Python自动批量修改服务器密码
工作中,我们经常会定期更换服务器密码,如果手动去修改,不仅费时,而且容易出错。下面提供了一种思路,可以实现批量、自动修改服务器密码。
大致思路:首先,为每一台服务器设定一个唯一标识;其次,将每台服务器的唯一标识、新密码、修改指令等信息存入专门的密码服务器;最后,每台服务器定时去查询密码服务器中的信息,收到修改指令后,自行修改密码。
1、设定服务器唯一标识
每一台服务器都需要一个唯一标识,便于查找、定位。不要使用IP地址、MAC地址,因为一台服务器可能有多个IP,多个网卡,IP地址也可能经常换来换去,这样就不准确。这里我使用了CUPID+ 主板序列号的组合作为唯一标识。我们测试了30多台服务器,发现这个组合可以满足需要。当然,也有其他的方法,如给每台服务器设置配置文件等。下面是获取硬件信息的方法:
def get_disk_info(): encrypt_str = "" c = wmi.WMI() for cpu in c.Win32_Processor(): # 获取CPUID encrypt_str = encrypt_str + cpu.ProcessorId.strip() for board_id in c.Win32_BaseBoard(): # 主板序列号 encrypt_str = encrypt_str + board_id.SerialNumber.strip() return encrypt_str
2、设定新密码
在数据库中维护服务器唯一标识,新密码,更新状态,指令等信息。为了安全起见,新密码可以使用密文,当需要修改的时候,把密文转换成明文。建议使用非对称加密算法,并增加密码的复杂度。如果使用主流的一些算法,如MD5等,对于简单的密码还是有办法可以破解的。也可以将新密码分成几部分,使用的时候再进行拼接或者特殊处理。这些做法都是尽可能的提高密码的安全性。
3、修改密码
每台服务器定时去检测密码服务器上的指令,如果需要修改,则立即修改,并更新修改状态等。
def changepwd(): # 获取唯一标识 cupid = get_disk_info() # 获取修改指令及新密码 prow = getpwd(cupid) if len(prow) > 0: pnew = prow[0].get("newpwd") puser = getpass.getuser() cmd = "net user "+puser+" "+pnew # 修改密码 res = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) recode = str(res.returncode) # 更新状态 if "0" == recode: sql = "update autopwd set flag='0' where sid=\'%s\'" % (pnew, cupid) setpwd(sql) log("change password status", str(res.returncode)) else: log("change failed", "not find cpuid") sys.exit(0)
本案例中,修改密码命令是Windows的net命令,如果是Linux服务器,只需把对应的命令换成对应的Linux下的即可。以后运维人员,只需制定好新的密码、修改指令、修改时间,其余的均自动完成。