linux中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
            }
        }
    }
    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开始,分别表示第一个,第二个,第三个....参数

时间: 2024-09-28 19:21:34

linux中expect批量修改用户密码的脚本的相关文章

linux系统批量修改用户密码

脚本目的:批量修改linux系统用户密码 条件:必须是修改的用户是root,因为只有root才有权限使用passwd命令 说明:先把IP.用户.密码.端口信息写到old_info文件中,脚本从这个文件读取对应的信息,利用expect免交互登陆系统.将随机生成的8位密码修改为root用户新密码.然后将新密码保存到net_info文件中. 1 2 3 4 5 # cat old_info  #     ip     user    passwd    port #------------------

linux中shell批量添加用户和设置随机密码脚本

有一个朋友问我如何批量创建用户和设置密码 ,我就简单给他写了两个脚本,让他自己参考下并自己根据实际情况进行修改,毕竟他需要的用户名和密码都是实际生产环境的. 这里分两种情况,一种是测试for循环批量添加用户,一个是根据实际生产环境进行批量添加.分别写一下案例如下: 1,for添加指定类型用户以及设置随机密码. 脚本作用:批量添加user1-10用户并设置随机8位数随机密码 #!/bin/bash #test add user and set passwd for n in `seq 10` do

Linux中如何批量修改文件的扩展名

风信网(ithov.com)原创文章:在管理Linux的过程中,需要批量的对文件进行修改扩展名的操作,如果一个一个的修改,哪的确是一件非常痛苦的事,我们可以借助以下的方法以实现轻构.快速的批量修改文件扩展名. # for i in *.mp3; do mv $i `basehttp://www.aliyun.com/zixun/aggregation/11696.html">name $i .mp3`.bak ;done 将所有以.mp3结尾的文件扩展名修改为.mp3.bak结尾 在deb

linux中expect批量scp传输文件

1.单台传输脚本  代码如下 复制代码 cat /root/soft_shell/allscp.sh #!/usr/bin/expect if {$argc < 2} {         send_user "usage: $argv0 src_file username ip dest_file passwordn" exit } ##set key [lindex $argv 0] set src_file [lindex $argv 0] set username [lin

Linux中如何批量为用户设磁盘配额

1.先给一个已存在的用户建好配额: a:修改/etc/fstab文件(如:LABEL=/     /  ext3  defaults,usrquota,grquota    1   1) b:重新启动系统使设置生效:reboot c:创建配额文件:quotacheck -cmug / (查看已建立的配额文件:ls /aquota.*) d:设置配额:edquota -u 用户名 使用quota -u 用户名查询配额 repquota -u /  显示配额 quotaoff |on -auvg关闭

java-JAVA客户信息保存在user数据表中,设计一个程序,实现修改用户密码的功能。

问题描述 JAVA客户信息保存在user数据表中,设计一个程序,实现修改用户密码的功能. 客户信息保存在user数据表中,设计一个程序,实现修改用户密码的功能. 解决方案 无非就是最简单的数据库读和改.看你用什么数据库搜索 java数据库增删改查 +你用的数据库就能找到现成的代码. 解决方案二: jdbc连接数据库,剩下的,自己学习java如何操作数据库,都是初学者该明白的东西 解决方案三: 首先是链接数据库,然后就是操作数据库,进行修改 解决方案四: 1,在Java中使用JDBC连接数据库co

Domino下通过代理公式批量修改用户属性值

Domino下通过代理公式批量修改用户属性值---勾选强制用户在下次登陆时更改Internet口令选项 我们大家都知道目前在windows下最常用的两套邮件系统是Mircrosoft Exchange和IBM Lotus,Microsoft Exchange使用起来比较方便,管理也比较方便,我们都知道Microsoft Exchange是跟域集成的,以至邮箱账户信息跟域账户登陆验证信息也就统一了;而IBM Lotus就不一样了,跟域不集成,如果在域环境下部署,会有产生两套信息系统,域账户跟邮箱账

在Linux中添加普通新用户

  在Linux中添加普通新用户 ,超级用户(也称为"root")是一个具有修改系统中任何文件权力的特别账号.在日常工作中,最好不要使用超级用户账号进入系统,因为任何错误操作都可能导致巨大的损失.由于超级用户账号是系统建立后提供的惟一一个账号,因此,您需要建立和使用一个一般用户账号进行日常工作. 超级用户可以创建新的用户账号,下面的命令将建立一个名为joe的新用户: # adduser joe # passwd joe (键入joe的口令) Linux采用了将系统管理员和一般用户分开的

MySQL 修改用户密码及重置root密码

    为数据库用户修改密码是DBA比较常见的工作之一.对于MySQL用户账户的密码修改,有几种不同的方式,推荐的方式使用加密函数来修改密码.本文主要描述了通过几种不同的方式来修改用户密码以及mysql root账户密码丢失(重置root密码)的处理方法.   1.密码修改的几种方法 a.可以在创建用户的时候指定密码,以及直接使用grant创建用户的时候指定密码. 对于已经存在的用户直接使用grant方式也可以修改密码 如下: --演示版本 root@localhost[(none)]> sho