文章目录
一、Expect概述
- Expect
- 建立在tcl之上的一个工具
- 用于进行自动化控制和测试
- 解决shell脚本中交互相关的问题
二、基本命令
1、spawn
启动进程,并跟踪后续交互使用信息
2、expect
- 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
- 只能捕捉由spawn启动的进程的输出
- 用于接收命令执行后的输出,然后和期望的字符串匹配
3、send
- 向进程发送字符串,用于模拟用户的输入
- 该命令不能自动回车换行,一般要加\r(回车)或者\n
4、结束符
- expect eof
- 等待执行结束
- interact
- 执行完成后保持交互状态,把控制器交给控制台
5、set
- 设置超时时间,过期则继续执行后续指令
- 单位是秒
- timeout -1 表示永不超时
- 默认情况下,timeout是10秒
6、exp_continue
允许expect继续向下执行指令
7、send_user
回显命令,相当于echo
8、接收参数
- Expect脚本可以接收从bash传递的参数
- 可以使用[lindex $argv n] 获得
- n从0开始,分别表示第一个,第二个,第三个…参数
三、分支语法
-
单一分支语法
expect "password:" {send "123456\r";}
-
多分支语法
(1)send命令不具备回车换行功能,所以需要自己添加\r 或 \nexpect "aaa" {send "AAA\r"} expect "aaa" {send "AAA\r"} expect "aaa" {send "AAA\r"}
(2)只要匹配了aaa 或bbb或ccc中的任何一个,执行相应的send语句后就会退出该expect语句
expect {
"aaa" {send "AAA\r";exp_continue}
"bbb" {send "BBB\r";exp_continue}
"ccc" {send "CCC\r"}
}
(3)exp_continue表示继续后面的匹配,如果匹配了aaa,执行完send语句后还会继续向下匹配bbb
捕捉内容要用双引号引起来
expect {
"aaa" {send "AAA\r";exp_continue}
"bbb" {send "BBB\r";exp_continue}
"ccc" {send "CCC\r"}
}
四、使用Expect实现ssh的免密登录。
#!/bin/bash
#实现ssh的免密登录
yum -y install expect
ip=$1
passwd=$2
/usr/bin/expect<<EOF
spawn ssh-keygen -t rsa
expect {
"(/root/.ssh/id_rsa)"
{send "\r";exp_continue}
"(empty for no passphrase)"
{send "\r";exp_continue}
"passphrase again"
{send "\r"}
}
expect eof
EOF
/usr/bin/expect<<EOF
spawn ssh-copy-id $1
expect {
"(yes/no)"
{send "yes\r";exp_continue}
"password"
{send "$2\r"}
}
expect eof
EOF
ssh root@$1