使用expect命令实现shell脚本自动交互

文章目录

通过shell脚本我们可以简化很多linux下的操作,提高工作效率。但是在需要与用户进行交互的场景下,常规的shell命令就不行了。今天我们来介绍下expect命令,通过该命令我们可以实现shell脚本的自动交互。

expect命令介绍

expect 是用来进行自动化控制和测试的工具。主要是和交互式软件telnet ftp passwd fsck rlogin ssh tip 等进行自动化的交互。对于大规模的linux 运维很有帮助。

官网地址:http://expect.sourceforge.net/

expect使用方法

1、expect的安装

一般机器不会自带expect,需要手动安装。

系统为RHEL/CentOS:

1
yum install expect

系统为Debian/Ubuntu:

1
apt-get install expect

2、expect的指令

expect常用的指令分别有:spawn、send、expect、interact、set、exp_continue等。

spawn: 用于启动一个新的进程。

1
2
3
​​​​​​​命令格式:spawn [spawn-args] program [program-args]
 
​​​​​​​通常我们要通过spawn打开一个交互进程,如:sshftpscp之类,后面再通过send、expect命令与之交互。

send:

1
2
3
命令格式:send [-flags] string
 
通过send指令向进程发送一个字符串。如:send "uname\r",向进程发送uname命令,要注意后面的"\r"表示回车的意思。

expect:

1
2
3
4
5
6
7
8
9
10
命令格式:expect [[-opts] pat1 body1] ... [-opts] patn [bodyn]
 
举例:
expect {
  "a" {send "hello a\r"}
  "b" {send "exit\r"}
  -re "c|d" {send "use regex\r"}
}
 
expect通常用于等待进程返回字符串。 如:expect "hi\r"表示进程返回了hi的字符串,加上-re表示正则匹配。此外expect支持多分支模式,类似switch-case的方式。

interact:

1
2
3
表示允许用户交互,进程停留在命令行状态下,等待用户进行操作。
 
注意:通常expect脚本是以expect eof或interact结束。前者表示自动化任务结束。

set:

1
主要用来设置环境变量。如set timeout 30表示等待30秒结束。

命令参数$argv:

1
2
3
expect脚本可以接受命令行传过来的参数 。
 
如:expect my.exp 1 2 3,可以通过 [lindex $argv n],获得相应的参数(n=0,1,2.....)。

exp_continue:

1
2
3
4
5
6
7
8
exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。exp_continue 类似于控制语句中的 continue 语句。
 
例如:下例将判断交互输出中是否存在 yes/no 或 *assword。如果匹配 yes/no 则输出 yes 并再次执行判断;如果匹配 *assword 则输出 123abc 并结束该段 expect 语句。
 
expect {
    \"yes/no\" {send \"yes\r\"; exp_continue;}
    \"*assword\" {set timeout 300; send \"123abc\r\";}
}

expect应用实例

远程登录服务器并创建文件夹,

1
2
3
4
5
6
7
8
9
#!/usr/bin/expect 
set timeout -1
spawn ssh root@192.168.0.107
expect {
    "password" {send "123456\r";}
    "yes/no" {send "yes\r";exp_continue}
}
expect "root" {send "mkdir testExpect\r"}
expect eof

shell脚本嵌套expect命令

仍然以远程登录服务器为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/bash
 
passwd='123456'
 
/usr/bin/expect  << EOF
set timeout -1
spawn ssh root@192.168.0.107
expect {
    "password" {send "$passwd\r";}
    "yes/no" {send "yes\r";exp_continue}
}
expect "root" {send "mkdir testExpect\r"}
expect eof
EOF

本文出自 TENNFY博客,转载时请注明出处及相应链接。

本文永久链接: https://www.tennfy.com/4873.html

下一篇文章:

上一篇文章:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

0 + 1 = ?


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

返回顶部