Linux expect 自动交互脚本用法

2022-06-12 10:56:22 浏览数 (1)

最近用到自动交互脚本进行数据库备份,以前虽然也有用来使用 ftp 远程获取文件,还来没有系统记录过,趁这次机会总结一下。

安装 expect

expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

expect自动交互流程:

  1. spawn启动指定进程
  2. expect获取指定关键字
  3. send向指定程序发送指定字符
  4. 执行完成退出.

注意该脚本能够执行的前提是安装了 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

0 人点赞