服務器及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' \n某某服務器: '${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' \n某某服務器: '${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