服务器及mysql账号密码过期时间监控
一、需求引入
这事其实发生在昨天,开发说线上静态网的同步有问题。同步流程是:发新闻的人在在自己本机电脑登录内网服务器的新闻编辑后台,然后脚本会定时把编辑好的文章传到gitlab,线上服务器再定时,且只能单向拉取gitlab代码(实际上是内网后台编辑好的文章)
第一步肯定是去看看服务器情况啦。堡垒机登录到服务器,说账号密码过期,急需改密码。输入原密码,再输入要更改的新密码。然鹅,设置新密码一直给我报错:
这堆机器因为之前要过等保二级,所以设置了很多坑运维的策略(公司只有我一个运维,所以就是自己坑自己呗。。)。例如服务器只能从堡垒机登录,端口范围开放,禁止root直接远程登录。以为从阿里云控制台的Workbench进行远程连接,是可以为所欲为的(说不定账号没有被锁的概念,或者设置的root禁止远程登陆是不生效的),事实证明我太天真了,登不上 = =。用内网能通的其他机器ssh跳过去(其实应该做个免秘钥或者本机普通账号sudo直接切超管的),也是不行,而且我还发现另外一台服务器也是账号过期的,悲惨的事果然是接二连三的。
总的来说,就是啥情况都遇到了:普通账号被锁,root账号禁止登服务器,无法登陆服务器。最后咋办呀,等呗,等自动解锁。小心翼翼试各种长度的密码,40位长度终于让我过了!!!(肯定设置的密码策略里面有些不符合)
超管用户登进去之后我立马手动运行了同步脚本(先给开发交差),注意:账号过期是会导致该账号下的计划任务是执行不了的!!!
然后去看关于密码复杂度和过期策略的两个文件: /etc/pam.d/system-auth 和 /etc/login.defs。
为了当天能一劳永逸,先把账号密码设置个永不过期先: chage -M 99999 用户
然后把那个密码策略文件(/etc/pam.d/system-auth )的 ”。。。pam_cracklib.so 。。。ocredit=-1” 注释掉,新增复制一行,只留下minlen=8 这个字符为止,后面全部不要(如上图)。
我知道这样操作是非常可恨的,所以今天有空就把这监控过期的活做了,密码设为90天过期
二、问题解决
直接贴代码,相信有点shell基础的朋友都能看懂的啦,哈哈哈哈~~~(不懂可以留言找我,QQ号为:378876091,记得大学毕设的时候就是有个好心技术人留了QQ号,帮我顺利毕业的)
几个点,大家注意下:
利用:chage -l 去获取密码过期时间(命令行返回结果的最后一列),记得月份获取的时候要处理下英文转换为阿拉伯数字
数学运算接收变量前要加个let,let 命令是BASH 中用于计算的工具(我试过去掉,马上给我报错)
最后利用时间戳来比较当前时间和过期时间的差值,JUDGE_DAY是你自定义的:设置差xx天过期
判断账号是否过期要加个预判,never代表账号是永不过期
1 #!/bin/bash 2 3 PHONE="159xxxx0136" 4 DATE=`date +%F_%T` 5 6 #还差多少天提醒报警 7 JUDGE_DAY=380 8 9 #钉钉机器人token 10 TOKEN="https://oapi.dingtalk.com/robot/send?access_token=xxxxx" 11 12 user=(xx root) 13 14 for (( i=0; i<${#user[@]}; i++)) do 15 user_name=`echo ${user[i]}` 16 17 ## 一、密码过期 18 #1、年 19 pwd_end_year=`chage -l ${user_name} | head -2| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $2}'| awk '{print $1}'` 20 21 if [ "${pwd_end_year}" == "" ];then 22 exit 0 23 fi 24 25 #2、月(英文要处理成阿拉伯数字) 26 pwd_end_month=`chage -l ${user_name} | head -2| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $1}'` 27 28 case ${pwd_end_month} in 29 'Jan') pwd_end_month=1;; 30 'Feb') pwd_end_month=2;; 31 'Mar') pwd_end_month=3;; 32 'Apr') pwd_end_month=4;; 33 'May') pwd_end_month=5;; 34 'Jun') pwd_end_month=6;; 35 'Jul') pwd_end_month=7;; 36 'Aug') pwd_end_month=8;; 37 'Sep') pwd_end_month=9;; 38 'Oct') pwd_end_month=10;; 39 'Nov') pwd_end_month=11;; 40 'Dec') pwd_end_month=12;; 41 esac 42 43 #3、日 44 pwd_end_day=`chage -l ${user_name} | head -2| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $2}'` 45 46 pwd_end_date_s=`/bin/date -d "${pwd_end_year}"-"${pwd_end_month}"-"${pwd_end_day}" +%s` 47 check_date_s=`/bin/date +%s` 48 let pwd_diffday=(${pwd_end_date_s}-${check_date_s})/86400 49 50 echo "用户 $user_name 密码过期时间还剩: ${pwd_diffday} 天 !!!" 51 #echo ${pwd_diffday} 52 53 if [ ${pwd_diffday} -le ${JUDGE_DAY} ]; then 54 curl -H "Content-Type:application/json" -X POST --data '{"msgtype":"text","text":{"content":"当前时间:'$DATE' 某某服务器: '${user_name}' 密码过期还剩'${pwd_diffday}'天,请及时修改密码 !!!"} , "at": {"atMobiles": ['${PHONE}'], "isAtAll": false}}' ${TOKEN} > /dev/null 2>&1 55 fi 56 57 58 ## 二、账号过期 59 #判断账号是否永不过期 60 judge=`chage -l ${user_name} | head -4| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $1}'` 61 62 if [ "$judge" = "never" ]; then 63 echo "$user_name 用户的账号永不过期,不用监控!!" 64 sleep 2 65 break; 66 fi 67 68 #1、年 69 account_end_year=`chage -l ${user_name} | head -4| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $2}'| awk '{print $1}'` 70 71 if [ "${account_end_year}" == "" ];then 72 exit 0 73 fi 74 75 #2、月(英文要处理) 76 end_month=`chage -l ${user_name} | head -4| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $1}'` 77 78 case ${end_month} in 79 'Jan') end_month=1;; 80 'Feb') end_month=2;; 81 'Mar') end_month=3;; 82 'Apr') end_month=4;; 83 'May') end_month=5;; 84 'Jun') end_month=6;; 85 'Jul') end_month=7;; 86 'Aug') end_month=8;; 87 'Sep') end_month=9;; 88 'Oct') end_month=10;; 89 'Nov') end_month=11;; 90 'Dec') end_month=12;; 91 esac 92 93 account_end_month=`echo ${end_month}` 94 95 96 #3、日 97 account_end_day=`chage -l ${user_name} | head -4| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $2}'` 98 99 account_end_date_s=`/bin/date -d "${account_end_year}"-"${account_end_month}"-"${account_end_day}" +%s` 100 check_date_s=`/bin/date +%s` 101 102 #天 103 let account_diffday=(${account_end_date_s}-${check_date_s})/86400 104 105 echo "用户 $user_name 账号过期时间还剩: ${account_diffday} 天 !!!" 106 #echo ${account_diffday} 107 108 if [ ${account_diffday} -le ${JUDGE_DAY} ]; then 109 curl -H "Content-Type:application/json" -X POST --data '{"msgtype":"text","text":{"content":"当前时间:'$DATE' 某某服务器: '${user_name}' 账号过期还剩'${account_diffday}'天,请及时修改密码 !!!"} , "at": {"atMobiles": ['${PHONE}'], "isAtAll": false}}' ${TOKEN} > /dev/null 2>&1 110 fi 111 done
运行结果:
这是mysql的密码过期监控(竟然找不到脚本放到哪个服务器上了 = =),需要登录进去用具体指定
参考这个文章写的:https://blog.csdn.net/weixin_30409849/article/details/97180165
1 for account in 检查的用户 2 do 3 account_plc=`mysql -h$ip -P$port -u$superuser -p$superuserpwd -e "select password_last_changed from mysql.user where user='${account}';" |grep -v password_last_changed` 4 5 cur_time=`mysql -h$ip -P$port -u$superuser -p$superuserpwd -e "select now();" |grep -v "now()"` 6 7 minus=`mysql -h$ip -P$port -u$superuser -p$superuserpwd -e "select datediff('${cur_time}', '${account_plc}');" |grep -v datediff` 8 9 10 let minus=90-$minus 13 14 echo "remain: $minus" 15 16 done