expect
更新于 2023-09-29
用来处理交互的命令
借助Expect, 可以将交互过程写脚本,完成自动交互
例如:ssh登录,ftp登录,telnet登录等。
man文档
详见manpage
安装
手册
详见manpage
常用关键字
| 关键字 |
描述 |
| expect |
从进程接收字符串 |
| send |
用于向进程发送字符串 |
| spawn |
启动新的进程 |
| interact |
允许用户交互 |
| exp_continue |
继续执行当前expect |
| send_user |
打印后跟的字符串内容 |
| interact |
专人人工交互 |
| exit |
退出expect脚本 |
| eof |
expect执行结束, 退出 |
| set |
定义变量 |
| puts |
输出变量 |
| set timeout |
设置超时时间 |
/usr/bin/expect <<-EOF
expect脚本
expect脚本跟shell脚本基本相同
当使用expect -f时
后续所有内容必须是expect可以识别的命令
不能包含常规shell命令
| Bash |
|---|
| #! /usr/bin/expect -f
expect eof
|
若想添加其它shell命令
可以在shell脚本里通过expect <<-EOF形式
| Bash |
|---|
| #! /usr/bin/sh
/usr/bin/expect <<-EOF
expect eof
EOF
#后续可以跟常规shell脚本
|
例子
| Bash |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #! /usr/bin/expect -f
# 获取第1个参数
set usr [lindex $argv 0]
# 获取第2个参数
set ip [lindex $argv 1]
# 获取第3个参数
set port [lindex $argv 2]
# 设置超时时间
set timeout 30
spawn ssh $usr@$IP:$port
expect {
"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "$mypassword\r" }
}
send "exit\r"
expect eof
|
| Bash |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | #! /usr/bin/sh
/usr/bin/expect <<-EOF
set timeout 10
spawn ssh ubuntu@ubuntu.com
expect {
"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "ubuntu\r" }
}
expect "ubuntu*" {send_user "login\n"}
send "ll ./\r"
expect ".*"
send "exit\r"
expect eof
#interact
EOF
echo "done"
|
| Bash |
|---|
| #!/bin/sh
password=pwd
expect -c "
set timeout 2
spawn rsync -u -r -e \"ssh\" --exclude=\"sitemap.xml.gz\" --delete ./html ubuntu@xx.xx.xx.xx:/home/ubuntu
expect {
\"*yes/no*\" {send \"YES\r\"; exp_continue;}
\"*password*\" {send \"$password\r\";}
}
expect eof"
|
| Bash |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #! /usr/bin/expect
# 设置超时时间
set timeout 3
# fork一个子进程执行ssh
spawn ssh root@xxx.xxx.xxx.xxx
# 捕获到密码
expect "*password*"
# 输入密码并回车
send "xxxxxx\r"
# 捕获#
expect "*#"
# 进入常用目录下
send "cd /home/wwwroot/default\r"
# 允许用户进行交互
interact
#结束命令
expect eof
|