加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux中expect批量更改用户密码的脚本

发布时间:2023-07-22 13:15:07 所属栏目:Linux 来源:
导读:使用expect前,我们是需要先安装了,否则expect是不可用的,下面一起来给各位总结两个expect批量修改用户密码脚本.1、使用expect前,需要先安装两个rpm包,代码如下:# rpm -ihv expect-5.43.0-8.el5.i386.rpm # rpm -ihv

使用expect前,我们是需要先安装了,否则expect是不可用的,下面一起来给各位总结两个expect批量修改用户密码脚本.

1、使用expect前,需要先安装两个rpm包,代码如下:

# rpm -ihv expect-5.43.0-8.el5.i386.rpm 

# rpm -ihv expect-devel-5.43.0-8.el5.i386.rpm 

2、批量修改密码的脚本,代码如下:

#!/usr/bin/expect 

#yemaosheng.com 

if { $argc<2 } { 

    send_user "usage: $argv0 <host file> <cmd file> \n" 

    exit 

# 机器列表数据格式:  IP  端口  旧密码  新密码 

set hostfile    [ open [lindex $argv 0] ] 

# 命令列表数据格式:  一条命令一行 

set cmdfile    [ open [lindex $argv 1] ] 

# 数据文件分割符,默认为空格 

set part "\ " 

# 过滤关键字 

set key_password "password:\ " 

set key_init "\(yes/no\)\?\ " 

set key_confirm "'yes'\ or\ 'no':\ " 

set key_ps "*]#\ " 

set key_newpassword "UNIX password:\ " 

set timeout 30 

log_file ./exprct.log 

match_max 20480 

while {[gets $hostfile _hosts_] >= 0} { 

    set hosts [string trim $_hosts_] 

    set str_index [string first $part $hosts] 

    set host [string trim [string range $hosts 0 $str_index]] 

    set temp [string trim [string range $hosts [expr $str_index + 1] [string length $hosts]]] 

    set str_index [string first $part $temp] 

    if { $str_index == -1 } { 

        set port 22 

        set pass $temp 

        set newpass $temp 

    } else { 

        set port [string trim [string range $temp 0 $str_index]] 

        set temp_pass [string trim [string range $temp [expr $str_index + 1] [string length $temp]]] 

        set str_index [string first $part $temp_pass] 

        set pass [string trim [string range $temp_pass 0 $str_index]] 

        set newpass [string trim [string range $temp_pass [expr $str_index + 1] [string length $temp_pass]]] 

    } 

    spawn ssh -p $port $host 

    while {1} { 

        expect { 

            "$key_password" { 

                send "$pass\r" 

            } 

            "$key_init" { 

                send "yes\r" 

            } 

            "$key_confirm" { 

                send "yes\r" 

            } 

            "$key_ps" { 

                while {[gets $cmdfile cmd] >= 0} { 

                    send "$cmd\r" 

                    expect { 

                        "$key_ps" { 

                            continue 

                        } 

                        "$key_newpassword" { 

                            send "$newpass\r" 

                            expect "$key_newpassword" { 

                                send "$newpass\r" 

                                expect "$key_ps" 

                                continue 

                            } 

                        } 

                    } 

                } 

                seek $cmdfile 0 start 

                send_user "\r" 

                break 

            } 

            timeout { 

                puts "$host timeout\n" 

                break  //Cuoxin.com 

            } 

        } 

    } 

    send "exit\r" 

    close 

    wait 

close $hostfile 

close $cmdfile 

exit 

3、批量修改密码的脚本.,用whereis expect确定expect位置,代码如下:

[root@rac1 ~]# whereis expect 

expect: /usr/bin/expect 

#!/usr/bin/expect 

#设置变量 

set timeout 10 

set USERNAME etnet 

set PASSWORD 123456 

#一个循环,说明对哪些机器进行操作 

foreach host { 

192.168.151.89 

192.168.151.90 

} { 

spawn ssh  

-l root ${host} 

#ssh首次登陆的验证,exp_continue会继续执行下一循环 

expect { 

        "no)?" {send "yes\r";exp_continue} 

        "password:" {send "123456\r"} 

#每个expect捕获一个提示符,send发送一条命令,命令以\r结尾。 

expect "]*" 

send "passwd ${USERNAME}\r" 

expect "password:" 

send "${PASSWORD}\r" 

expect "password:" 

send "${PASSWORD}\r" 

expect "]*" 

send "exit\r" 

补充:expect用法:

1.[#!/usr/bin/expect]

这一行告诉操作系统脚本里的代码使用那一个shell来执行,这里的expect其实和linux下的bash、windows下的cmd是一类东西.

注意:这一行需要在脚本的第一行。

2.[set timeout 30]

基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒 ,timeout -1 为永不超时.

3.[spawn ssh -l username 192.168.1.1]

spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的,所以不要用 “which spawn“之类的命令去找spawn命令,好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件.

它主要的功能是给ssh运行进程加个壳,用来传递交互指令.

4.[expect "password:"]

这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了,这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒.

5.[send "ispass\r"]

这里就是执行交互动作,与手工输入密码的动作等效.

温馨提示:命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下.

6.[interact]

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了,如果没有这一句登录完成后会退出,而不是留在远程终端上,如果你只是登录过去执行.

7.$argv 参数数组

expect脚本可以接受从bash传递过来的参数,可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数.

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章