密码过期卡登录?看我用 Expect 实现无人值守批量修改
为了确保安全并符合规范,我们通常会在生产环境中设定用户密码每90天更新一次,这样做有助于减少密码被泄露或遭受暴力破解的风险。如果您希望在密码到期前就进行更改,可以利用Ansible中的user模块来批量处理这一任务。而当密码真的过期了,在您尝试登录服务器时,系统会友好地提示您先修改密码,之后才能继续使用系统哦。如下所示:
复制
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for didiplus.
Current password:1.2.3.4.
那么,遇到这种情况时,我们该如何进行批量处理呢?有一种工具叫做Expect,它能够帮助我们解决这个问题。不过,可能有些人还不太了解Expect具体是什么,接下来就让我为您简单介绍一下吧。
Expect是一个基于Tcl的自动化交互工具,由Don Libes在1990年创建,专门用于处理需要用户交互的命令行程序自动化。它的核心功能是模拟用户输入和响应程序输出,特别适合处理SSH登录、FTP传输、密码修改等需要人工交互的场景。
Expect核心命令基础命令结构:
复制
#!/usr/bin/expect -f
# 设置超时时间(秒)
settimeout30
# 启动交互程序
spawn 要监控的程序
# 交互控制
expect{
"模式1"{ 动作1 }
"模式2"{ 动作2 }
timeout{ 超时处理 }
}
# 发送指令
send "指令\r"
# 结束交互
expect eof1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.
关键命令详解:
spawn:启动新的交互进程expect:等待特定模式出现send:向进程发送字符串interact:将控制权交还给用户exp_continue:继续匹配后续模式set timeout:设置等待超时时间实战案例管理200台Linux服务器,密码策略设置为90天强制修改,并且密码彻底过期了。要求强制修改后才能成功登录系统。
使用该脚本现在要在脚本同级目录创建一个名为hosts.list文件,内容如下:
复制
192.168.31.101
192.168.31.102
192.168.31.1031.2.3.
先为脚本赋予执行的权限,执行如下命令:
复制
chmod +x batch_password_change.exp1.
然后,修改脚本里的用户名、旧密码和新密码,如下:
复制
....
set username "didiplus"
set old_password "password"
set new_password "password"1.2.3.4.
修改完之后,执行如下命令进行批量修改密码:
复制
./batch_password_change.exp1.
执行完成后,会输出如下结果:
THE END