linux通过expect批量修改密码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux通过expect批量修改密码相关的知识,希望对你有一定的参考价值。
公司最近要上一批CDN服务器,需要定期修改密码,原本想用自动化工具来实现这个功能,但是最近比较忙没有时间搞,所以先用脚本的方式来修改,上网搜索了一下,发现大同小异,所以参考网络上脚本做了个测试,结果一个下午没了,坑稍微有点多,在下文我会尽量解释清楚,以避免像我这样的新人掉坑,不多说,正文开始!
系统环境:CentOS Linux release 7.3.1611 (Core)
Selinux: disable
执行目录: /home
一 , 需求:linux环境下运行,需要tcl和expect支持
原理说明:利用expect的摸拟交互的功能,登录到指定的多台服务器上修改密码
共2个程序文件 passwd.sh和passwdaction,另外用户需要自建一个ip地址列表文件,每行一个ip,我这里命名为ip_list.txt
1.检查系统是否有expect和tcl
[[email protected] home]# rpm -qa expect
expect-5.45-14.el7_1.x86_64
[[email protected] home]# rpm -qa tcl
tcl-8.5.13-8.el7.x86_64
可以看到系统已经安装有这两个软件,如果没有可以用yum install -y expect tcl 安装。
password.sh 脚本文件内容:
#!/bin/bash
if [ "$1" = "" ] || [ "$2" = "" ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]
then
echo "usage: passwd.sh /path/ip_list.txt /path/passwdaction"
exit
fi
cat $1 | while read line
do
# if ==null
[ -z $line ] && continue
$2 $line;
done
echo -e ‘\n\n The password has been changed! \n‘
//以上代码表示,需要两个参数$1和$2,如果参数为空,则提示使用passall.sh /path/ip_list.txt /path/passone(注意/path为脚本文件所在目录,请根据自己的情况修改)
之后会读取变量1也就是ip_list.txt的数据,然后再读取变量2也就是passwdaction脚本.(我的理解,大神有异议欢迎指导)
passwdaction脚本的内容
#!/usr/bin/expect -f
#设置连接远程用户的账号
set loginuser "root"
#设置连接远程用户的密码
set loginpass {idcicp123}
#设置需要修改密码的用户
set passuser "root"
#设置新的密码
set newpass "idcicp123456"
#获取IP地址列表的IP
set ipaddr [lrange $argv 0 0]
#设置连接超时时间
set timeout 300
set cmd_prompt "]#|~]?"
#拦截远程服务器
spawn ssh [email protected]$ipaddr
#超时时间为300s
set timeout 300
expect {
-re "Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
} -re "password:" {
send "$loginpass\r"
} -re "Permission denied, please try again." {
exit
} -re "Connection refused" {
exit
} timeout {
exit
} eof {
exit
}
}
expect {
-re "password:" {
send "$loginpass\r"
}
-re $cmd_prompt {
send "\r"
}
}
#以下标红的地方,请自己找台测试或者在本地测试下改变密码的提示是否是这个,如果不是请将红色内容修改为系统提示的内容,否则会导致脚本卡在这里.
send "passwd $passuser \r";
expect {
"New password:" {
send "$newpass\r"
}
"passwd: Only root can specify a user name." {
exit
}
}
expect {
"Retype new password:" {
send "$newpass\r"
}
}
expect -re $cmd_prompt
send "\r"
exit
#interact
二、用法举例:
[[email protected] home]# /home/passwd.sh /home/ip_list.txt /home/passwdaction
说明: 命令行中的passwd.sh和passwdaction请大家使用上面的代码,并做相应修改即可
ip_list.txt是需要用户自建的ip列表文件,内容举例如下:
192.168.1.5
192.168.1.6
192.168.1.7
参考连接:http://blog.csdn.net/chinalinuxzend/article/details/2480228
:http://www.docin.com/p-678752172.html
以上是关于linux通过expect批量修改密码的主要内容,如果未能解决你的问题,请参考以下文章