最近用到自动交互脚本进行数据库备份,以前虽然也有用来使用 ftp 远程获取文件,还来没有系统记录过,趁这次机会总结一下。
安装 expect
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect自动交互流程:
- spawn启动指定进程
- expect获取指定关键字
- send向指定程序发送指定字符
- 执行完成退出.
注意该脚本能够执行的前提是安装了 expect。 所以首先需要完成安装,安装很简单,直接使用 yum 进行安装。
expect 依赖于 tcl,需先安装 tcl 使用 yum list tcl
获取列表,再通过 yum install tcl.x86_64
接着安装 expect,yum install expect
四个命令
Expect中最关键的四个命令是send,expect,spawn,interact。
- send:用于向进程发送字符串
- expect:从进程接收字符串
- spawn:启动新的进程
- interact:允许用户交互
常用命令
代码语言:javascript复制spawn 交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间
使用示例
下面以我最近使用的脚本来一行行进行分析。
代码语言:javascript复制#!/usr/bin/expect # 这个必须放在首行,可以通过 whereis expect 获取到路径
set timeout -1 # 设置超时时间,不限制时间可以设置为 -1
set user root # 设置 变量user
set pass 123456 # 设置 变量pass
set dir /data/pgsql_bak_data
set ip 192.168.2.1
set filen /data/pgsql_bak_data/pgsql.sql
set date [ clock format [ clock seconds ] -format "%Y%m%d" ]
# spawn启动指定进程,使用 scp 命令将本地文件上传至远程主机
spawn scp ${filen}_${date} ${user}@${ip}:${dir}
# 判断上次输出结果里是否包含“${user}@${ip}'s password:”的字符串,如果有则立即返回,否则就等待一段时间(timeout)后返回
expect "${user}@${ip}'s password:"
# 发送内容pass,类似于我们使用时输入密码,将该步骤交给脚本完成
send "${pass}r"
# 执行完成后自动退出
expect eof
结合以上,想必读者对这个命令应该也有所了解了,照葫芦画瓢,可以实现很多场景,如ssh、ftp等,可以大大提高我们的效率,expect还是很强大的。
这里我只会一些简单的应用,没有专业运维使用得这么熟练。见谅~
免交互expect eof和interact的区别
二者都是结束符号
- expect eof :等待执行结束,用于执行自动化任务,无需后续继续交互,直接完成并退出。
- interact:执行完成后保持交互状态,把控制权交给用户,不是免交互的状态,需要自行输入需要执行的命令。
Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://cloud.tencent.com/developer/article/2020776