扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1.Expect概述
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网络空间、营销软件、网站建设、靖宇网站维护、网站推广。
2.Expect安装(底层语言Tcl)
3.Expect基本命令
4.Expect执行方式
5.Expect案例
1.Expect是建立在tcl语言基础上的一个工具,Expect是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的linux运维很有帮助。
2.在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会余姚输入yes/no password等信息。为了模拟这种输入,可以使用Expect脚本。
1.挂载光盘
2.制作本地YUM源
执行安装命令:yum -y intall expect
该命令不能自动回车换行,一般要加\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
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流