## Python 动态更新Linux系统root账号密码并发送通知短信
有些时候我们可能需要比较高的安全,作为服务器的主流操作系统Linux更是需要经常的更换系统账号root密码以保证整个系统的安全,密码的重要性不言而喻。那,有时候会由于自己设置的密码比较复杂而忘记,因此,需要动态的自动更新系统root密码并发送短信提醒系统管理人员。实现这一功能从以下几个方面着手。
第一,系统自动更换密码可以使用shell脚本实现,因此首先需要一个随机的密码生成器,通过shell脚本更新密码。
第二,更新的密码需要记录以供系统管理人员查询。
第三,更新的同时,通过短信通知服务给系统管理人员发送短信,内容包括密码并提醒密码已更新。
根据以上三点分析我们得出需要一个脚本,一个密码本,一套短信通知服务,而这一切都可以在服务器上实现,下面,就来讲解。
Linux作为服务器的主流功能强大自不必说,其中,系统自带的密码生成方式有很多种,一种是通过urandom,一种是OpenSSL
- `openssl rand -base64 12,这条命令即可在Linux下生成长度为12的随机字符串,那么,我们取到这个值就可以作为密码了。加密方式指定为是base64。
- openssl rand hex 12
- 这个命令生成12位的随机带特殊字符的字符串,加密形式是hex
- openssl rand hex 12 -out password
- 生成12位的hex加密的密码并写入一个名字叫password的文件内
=============================================================================================
- cat /dev/urandom
生成一个无限大的密码,包括特殊符号。想要使用这种方式,需要切割出来随机的需要的个数的字符,例如:
- cat /dev/urandom |tr -dc 'a-zA-Z0-9' |head -c12
这个命令可以切割出随机的不包括特殊字符的12位字符串,这个就可以作为密码根据自己的密码策略,选择合适的长度,
切割出密码并写入文件
- cat /dev/urandom |tr -dc 'a-zA-Z0-9'|head -c12 >>password
这样就切割出一个长度12的大小写字母和数字组成的密码,并且重定向写入一个名字为password的文件中
================================================================================================
第一步和第二步已经完成,现在需要把这些合并在一起写入一个脚本中,脚本名称就叫change吧
change.sh
#/usr/bin/bash echo `cat /dev/urandom|tr -dc 'a-zA-Z0-9' |head -c6`>>password.txt while read line do echo $line | passwd --stdin root > /dev/null done<$1 #这个脚本是带参数的脚本,在脚本内,参数一般使用$1指定 #这个脚本的功能为在脚本当前目录下生成一个密码文件,然后读取密码文件最后一行 #将root密码静默修改,注意,password.txt文件可以指定路径,名称也可以随意 #注意,第一,密码本也就是password这个文件内容 #不能少于两行,第二,echo命令后跟的是反引号,以把cat命令生成的密码作为字符串存入文件 #改密码的时候为了隐藏输出,重定向到了null内
``========================================
接下来就是短信通知服务,网上比较了很多短信通知服务,发现榛子短信服务比较友好,拿来即用。下面贴网址。
http://sms_developer.zhenzikj.com/zhenzisms_user/login.#html,这个网址注册后,需要到短信平台查看系统生成的
ak,也就是access码和secret码,并且牢记,这两个码稍后会在#Python中用到。
==============================================
zhenzismsclient.py
import urllib.request import urllib.parse import ssl class ZhenziSmsClient(object): def __init__(self, apiUrl, appId, appSecret): self.apiUrl = apiUrl self.appId = appId self.appSecret = appSecret def send(self, number, message, messageId=''): data = { 'appId': self.appId, 'appSecret': self.appSecret, 'message': message, 'number': number, 'messageId': messageId } data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.Request(self.apiUrl+'/sms/send.do', data=data) context = ssl._create_unverified_context() res_data = urllib.request.urlopen(req, context=context) res = res_data.read() res = res.decode('utf-8') return res def balance(self): data = { 'appId': self.appId, 'appSecret': self.appSecret } data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.Request(self.apiUrl+'/account/balance.do', data=data) res_data = urllib.request.urlopen(req) res = res_data.read() return res def findSmsByMessageId(self, messageId): data = { 'appId': self.appId, 'appSecret': self.appSecret, 'messageId': messageId } data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.Request(self.apiUrl+'/smslog/findSmsByMessageId.do', data=data) res_data = urllib.request.urlopen(req) res = res_data.read() return res #短信平台提供的api接口,使用的是urllib爬虫连接的api
message.py
import zhenzismsclient as smsclient import os import time #subprocess.Popen(['start','changepass.sh'],shell=/bin/bash) os.popen('/usr/bin/bash change.sh password.txt') print('===============================================') time.sleep(5) with open('password.txt','r+') as file: lines=file.readlines() last=lines[-1] print(type(last),last) client = smsclient.ZhenziSmsClient('https://sms_developer.zhenzikj.com', 'ak码', 'ak码') print(client.send('需要推送密码的手机号',last)) #这个是主程序入口,也就是说这个系统只需要运行这个文件。
message.py,是短信服务通知的客户端文件,导入的第一个包是短信服务端文件第二个包是os,由于需要打开密码本查看密码并发送短信用,第三个包是time包,在启动shell脚本后给五秒时间同步密码本,保证取得的是最新密码然后。中文部分,是需更改的地方,上面所提到的ak码在榛子的网站内有。(榛子短信平台是收费的,10元钱大概可以发送短信200余次,充钱能使你更强大??)
这四个文件,message.py ,password,change.sh zhenzismsclient.py 统一放在一个文件夹内,每启动一次message.py文件密码就更新一次,同时,更新后的密码推送到系统管理员手机上,可以通过Linux系统的计划任务crontab来设计更新策略。
当然,这个系统还是有很多需要改进的地方,比如说,密码不存入文本,存入数据库中,密码的读取通过Python连接数据库来完成。四个文件一定要放在同一个文件夹内,因为,都是用的相对路径,如果改成绝对路径,需要更改changesh文件和message文件内的路径,并一一对应。切记!!首次使用时要先运行一次change.sh脚本,并检查password.txt文件,看看更新成功没有。
链接:https://pan.baidu.com/s/1rHoNsJCAC-IRQ0h3vv-C8g
提取码:1uky