码迷,mamicode.com
首页 > 系统相关 > 详细

linux通过expect批量修改密码

时间:2017-08-30 19:48:04      阅读:341      评论:0      收藏:0      [点我收藏+]

标签:release   用法   cin   prompt   pad   开始   fuse   环境   支持   

公司最近要上一批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

[root@xxx home]# rpm -qa expect
expect-5.45-14.el7_1.x86_64
[root@xxx 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 $loginuser@$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

 

 

二、用法举例:
 [root@localhost 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批量修改密码

标签:release   用法   cin   prompt   pad   开始   fuse   环境   支持   

原文地址:http://www.cnblogs.com/sharktech/p/7454767.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!