1.Expect概述java
2.Expect安装(底层语言Tcl)linux
3.Expect基本命令shell
4.Expect执行方式编程
5.Expect案例vim
1.Expect是创建在tcl语言基础上的一个工具,Expect是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的linux运维颇有帮助。数组
2.在linux运维和开发中,咱们常常须要远程登陆服务器进行操做,登陆的过程是一个交互的过程,可能会余姚输入yes/no password等信息。为了模拟这种输入,可使用Expect脚本。bash
1.挂载光盘服务器
2.制做本地YUM源运维
执行安装命令:yum -y intall expectssh
该命令不能自动回车换行,通常要加\r(回车)
expect的一个内部命令判断上次输出结果里是否包含指定的字符串,若是有则当即返回,不然就等待超时时间后返回
只能捕捉由spawn启动的进程的输出
#####3.spawn:启动进程,并跟踪后续交互信息
单位是:秒
timeout -1为永不超时
默认状况下,timeout是10秒
容许expect继续向下执行指令
回显命令,至关于echo
Expect脚本能够接受从bash传递的参数,可使用[lindex $argv n]得到,n从0开始,分别表示第一个,第二个,第三个....参数
expect eof实在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof即在等待这个标记
[root@ce~]#more a.sh #!/usr/bin/expect //Expect二进制文件的路径 set timeout 60 //60秒等待时间 log_file test.log //日志文件 log_user 1 //日志用户 set hostname [lindex $argv 0] //追加参数0,统计变量,加载第1位置 set password [lindex $argv 1] //追加参数1,统计变量,加载第2位置 spawn ssh root@$hostname expect { //进行匹配 "(yes/no)" {send"yes/r";exp_continue} //输入yes,继续执行 "*password" //参数2 {send"$password\r"} //交给控制台人为输入 } interact [root@ce~]#chmod a+x a.sh [root@ce~]#./a.sh
[root@localhost opt]# yum install expect -y //安装服务 [root@localhost opt]# vim a.sh #!/usr/bin/expect #超时时间 set timeout 20 log_file test.log log_user 1 #参数传入 set hostname [lindex $argv 0] set password [lindex $argv 1] #追踪命令 spawn ssh root@$hostname #捕捉信息而且匹配,免交互执行 expect { "(yes/no)" {send "yes\r";exp_continue} "*password" {send "$password\r"} } #控制权交给控制台执行 interact [root@localhost opt]# chmod +x a.sh [root@localhost opt]# ./a.sh 192.168.56.129 123123 spawn ssh root@192.168.56.129 The authenticity of host '192.168.56.129 (192.168.56.129)' can't be established. ECDSA key fingerprint is SHA256:DSqXtMX4L3DIIYCai7ACEftdbCIH5n0Y5SPpGCzsjdw. ECDSA key fingerprint is MD5:14:93:39:65:27:31:a6:28:8b:28:d1:2c:fb:32:7b:4d. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.56.129' (ECDSA) to the list of known hosts. root@192.168.56.129's password: Last login: Thu Oct 10 09:46:08 2019 from 192.168.56.1 //此时已远程登陆对方主机 [root@localhost ~]# 登出 //按Ctrl+d退出远程登陆 Connection to 192.168.56.129 closed.
[root@ce~]#more b.sh #!/bin/bash hostname=$1 password=$2 /usr/bin/expect<<-EOF spawn ssh root@${hostname} expect { "(yes/no)" {send "yes\r";exp_continue} "*password" {send"$password\r"} } expect "*]#" send "exit\r" expect eof EOF [root@ce~]#source b.sh
[root@localhost opt]# vim b.sh #!/bin/bash hostname=$1 password=$2 /usr/bin/expect<<-EOF spawn ssh root@${hostname} expect { "(yes/no)" {send "yes\r";exp_continue} "*password" {send "$password\r"} } expect "*]#" send "exit\r" expect eof EOF [root@localhost opt]# chmod +x a.sh [root@localhost opt]# ./a.sh 192.168.56.129 123123 spawn ssh root@192.168.56.129 The authenticity of host '192.168.56.129 (192.168.56.129)' can't be established. ECDSA key fingerprint is SHA256:DSqXtMX4L3DIIYCai7ACEftdbCIH5n0Y5SPpGCzsjdw. ECDSA key fingerprint is MD5:14:93:39:65:27:31:a6:28:8b:28:d1:2c:fb:32:7b:4d. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.56.129' (ECDSA) to the list of known hosts. root@192.168.56.129's password: Last login: Thu Oct 10 09:46:08 2019 from 192.168.56.1 [root@localhost ~]# 登出 Connection to 192.168.56.129 closed. //自动退出远程控制
[root@localhost opt]# vim c.sh #!/bin/bash user=$1 password=$2 #非交互命令放在expect外面 useradd $user #开始进行交互 expect << EOF spawn passwd $user expect "新的*" send "${password}\r" expect "从新*" send "${password}\r" expect eof; EOF [root@localhost opt]# chmod +x c.sh [root@localhost opt]# ./c.sh tom tom123 spawn passwd tom 更改用户 tom 的密码 。 新的 密码: 无效的密码: 密码少于 7 个字符 从新输入新的 密码: passwd:全部的身份验证令牌已经成功更新。 [root@localhost opt]# su zhou //切换普通用户zhou [zhou@localhost opt]$ su tom //切换新建立的普通用户tom 密码: //提示输入密码 [tom@localhost opt]$ //此时进入tom用户
#!/usr/bin/expect #超时时间 set timeout 20 log_file test.log log_user 1 #参数传入 set hostname [lindex $argv 0] set password [lindex $argv 1] #追踪命令 spawn ssh root@$hostname #捕捉信息而且匹配,免交互执行 expect { "Connection refused" exit "service not known" exit "(yes/no)" {send "yes\r";exp_continue} "*password" {send "$password\r"} } #控制权交给控制台执行 interact exit