密碼過期卡登錄?看我用 Expect 實現(xiàn)無人值守批量修改
為了確保安全并符合規(guī)范,我們通常會在生產(chǎn)環(huán)境中設(shè)定用戶密碼每90天更新一次,這樣做有助于減少密碼被泄露或遭受暴力破解的風(fēng)險。如果您希望在密碼到期前就進(jìn)行更改,可以利用Ansible中的user模塊來批量處理這一任務(wù)。而當(dāng)密碼真的過期了,在您嘗試登錄服務(wù)器時,系統(tǒng)會友好地提示您先修改密碼,之后才能繼續(xù)使用系統(tǒng)哦。如下所示:
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for didiplus.
Current password:
那么,遇到這種情況時,我們該如何進(jìn)行批量處理呢?有一種工具叫做Expect,它能夠幫助我們解決這個問題。不過,可能有些人還不太了解Expect具體是什么,接下來就讓我為您簡單介紹一下吧。
什么 Expect命令
Expect是一個基于Tcl的自動化交互工具,由Don Libes在1990年創(chuàng)建,專門用于處理需要用戶交互的命令行程序自動化。它的核心功能是模擬用戶輸入和響應(yīng)程序輸出,特別適合處理SSH登錄、FTP傳輸、密碼修改等需要人工交互的場景。
Expect核心命令
基礎(chǔ)命令結(jié)構(gòu):
#!/usr/bin/expect -f
# 設(shè)置超時時間(秒)
settimeout30
# 啟動交互程序
spawn 要監(jiān)控的程序
# 交互控制
expect{
"模式1"{ 動作1 }
"模式2"{ 動作2 }
timeout{ 超時處理 }
}
# 發(fā)送指令
send "指令\r"
# 結(jié)束交互
expect eof
關(guān)鍵命令詳解:
- spawn:啟動新的交互進(jìn)程
- expect:等待特定模式出現(xiàn)
- send:向進(jìn)程發(fā)送字符串
- interact:將控制權(quán)交還給用戶
- exp_continue:繼續(xù)匹配后續(xù)模式
- set timeout:設(shè)置等待超時時間
實戰(zhàn)案例
管理200臺Linux服務(wù)器,密碼策略設(shè)置為90天強(qiáng)制修改,并且密碼徹底過期了。要求強(qiáng)制修改后才能成功登錄系統(tǒng)。
使用該腳本現(xiàn)在要在腳本同級目錄創(chuàng)建一個名為hosts.list文件,內(nèi)容如下:
192.168.31.101
192.168.31.102
192.168.31.103
先為腳本賦予執(zhí)行的權(quán)限,執(zhí)行如下命令:
chmod +x batch_password_change.exp
然后,修改腳本里的用戶名、舊密碼和新密碼,如下:
....
set username "didiplus"
set old_password "password"
set new_password "password"
修改完之后,執(zhí)行如下命令進(jìn)行批量修改密碼:
./batch_password_change.exp
執(zhí)行完成后,會輸出如下結(jié)果: