expect – 自动交互脚本
最后更新于:2022-04-02 03:50:28
[TOC]
## 安装
`yum install expect -y `
## 命令
### spwan
它启动一个进程,之后所有expect操作都在这个进程中进行
### expect
等候一个相匹配内容的输出,一旦匹配则执行expect后面的动作命令,
```
-re 使用正则 expect -re ".*password" {send "root1234\r"}
```
`expect` 就会匹配命令执行后的输出,然后执行expect后面包含在{}中的send或exp_send动作,匹配及动作可以放在下一行,就可以省略{}
例子
```
spwan ssh root@192.168.1.26
expect -re ".*password"
send "root1234\r"
```
### 启用选项
```
-c 执行脚本前先执行的命令,可多次使用。
-d debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
-D 启用交换调式器,可设一整数参数。
-f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
-i 交互式输入命令,使用"exit"或"EOF"退出输入状态。
-- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。
-v 显示expect版本信息。
```
### 命令介绍
```
close 关闭当前进程的连接。
debug 控制调试器。
disconnect 断开进程连接(进程仍在后台运行)。
exit 退出expect。
exp_continue [-continue_timer] 继续执行下面的匹配。
exp_internal [-f file] value:
```
## 场景
### 自动登录ssh执行命令
```
#!/usr/bin/expect -f
set ip [lindex $argv 0 ] # 接收第1个参数,作为IP
set username [lindex $argv 1 ] # 接收第2个参数,作为username
set mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码
set timeout 10 # 设置超时时间
spawn ssh $username@$ip # 发送ssh请求
expect { # 返回信息匹配
"*yes/no" { send "yes\r"; exp_continue} # 第一次ssh连接会提示yes/no,继续
"*password:" { send "$mypassword\r" } # 出现密码提示,发送密码
}
interact # 交互模式,用户会停留在远程服务器上面
```
### 自动建立FTP会话
```
#!/usr/bin/expect -f
set ip [lindex $argv 0 ] # 接收第1个参数,作为IP
set userid [lindex $argv 1 ] # 接收第2个参数,作为Userid
set mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码
set timeout 10 # 设置超时时间
# 向远程服务器请求打开一个FTP会话,并等待服务器询问用户名
spawn ftp $ip
expect "username:"
# 输入用户名,并等待服务器询问密码
send "$userid\r"
expect "password:"
# 输入密码,并等待FTP提示符的出现
send "$mypassword\r"
expect "ftp>"
# 切换到二进制模式,并等待FTP提示符的出现
send "bin\r"
expect "ftp>"
# 关闭ftp的提示符
send "prompt\r"
expect "ftp>"
# 下载所有文件
send "mget *\r"
expect "ftp>"
# 退出此次ftp会话,并等待服务器的退出提示EOF
send "bye\r"
expect eof
```
';