shell自动化交互expect

阅读数:88 评论数:0

跳转到新版页面

分类

Linux

正文

一、expect介绍

expect是用来实现自动化交互功能的软件。

1、安装

(1)Centos

yum install -y expect

(2)debian或ubuntu

sudo apt-get install expect

2、四个基础命令

(1)spawn 

用来启动新的进程

例如

 spawn passwd root
(2)expect 

判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则等待超时时间后返回。

(3)send 

向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r或\n。

多条send命令会并行执行,如果需要多条并行,建议使用shell的管道符拼接的方式,如果要串行,最好一条send一条expect。(在脚本中使用中文可能会产生莫名的执行错误)

expect "密码"{ send "abc123\r" }        //同一行send部分要有{}

expect "密码"
send "abc123\r"                        //换行send部分不需要有{}

expect支持多个分支
expect {
    "string1" {
        # 执行某个操作
    }
    "string2" {
        # 执行另一个操作
    }
}

#这会在匹配到 "string1" 后,继续等待匹配 "string2"
expect {
    "string1" {
        # 执行某个操作
        exp_continue
    }
    "string2" {
        # 执行另一个操作
    }
}
(4)interact和expect of的区别

expect eof表示交互结束,退回到原用户,脚本默认是等待10s。默认的超时时间是10秒,通过 set命令可以设置会话超时时间,若不限制超时时间则应设置为-1。

set timeout 30
interact

当脚本执行到 interact 时,用户可以直接与进程交互,就像直接运行这个进程一样。

3、常用选项

-c 执行脚本前先执行的命令,可多次使用
-d debug模式
-f 从文件读取命令,仅用于使用#!时,
-i 交互式输入命令,使用exit或EOF退出输入状态

4、接收参数

expect 脚本可以接受从 bash 命令行传递的参数,使用[lindex $argv n] 获得。
其中 n 从0开始,分别表示第一个, 第二个,第三个…参数。

set hostname [lindex $argv 0]   	#相当于 hostname=$1
set password [lindex $argv 1]		#相当于 password=$2

#expect直接执行,需要使用 expect 命令去执行脚本

5、exp_continue

exp_continue 附加于某个 expect 判断项之后,可以使该项匹配后,还能继续匹配该 expect 判断语句内的其他项

exp_continue 类似于控制语句中 continue 语句,表示允许 expect 继续向下执行指令

 expect {
"(yes/no)" {send "yes\r"; exp_ continue; }
"*password" {set timeout 300; send "abc123\r";}
}

6、控制结构

(1)if

if {condition} {
    # 执行某个操作
} else {
    # 执行另一个操作
}

(2)for

for {set i 0} {$i < 10} {incr i} {
    # 执行循环操作
}

(3)while

while {condition} {
    # 执行循环操作
}

7、变量

在 Expect 脚本中,可以使用 set 命令设置变量:

set variable_name value

要访问变量的值,可以使用 $variable_name

8、获得进程输出

Expect 可以将进程的输出存储在变量中,以便后续处理。这可以通过 $expect_out(buffer) 或 $expect_out(0,string) 等形式实现:

expect "string"
set output $expect_out(buffer)

Expect 还支持使用正则表达式匹配

输出,并将匹配的子串存储在 $expect_out(1,string)$expect_out(2,string) 等变量中:

expect -re "(string1)(string2)"
set output1 $expect_out(1,string)
set output2 $expect_out(2,string)

二、expect脚本 

expect可以直接使用的其它shell中,也可以指定脚本使用expect解释器

#!/usr/bin/expect
exp_internal 1 # 开启调试

但是说实话,我自己是看不懂这个调试输出的。

三、使用实例

1、shell中使用expect -c "expect脚本内容"

#!/bin/sh
echo "begin"    #echo 是shell语法
expect -c "
spawn su root
expect \":\"
send \"root\r\"
send \"ls\r\"
expect eof 
"
echo "end"

2、shell使用expect <<EOF  expect脚本内容  EOF

#!/bin/sh
echo "begin"
expect <<EOF
spawn su root
expect ":"
send "root\r"
expect "root"
send "whoami\r"
expect eof
EOF
whoami

 




相关推荐

一、概述 1、为什么Linus不使用GPLv3 在 PC 上,只要你得到了某个程序的源代码,就可以自行编译生成二进制程序,然后替换掉原有的二进制程序,你的程序自由很容易得到保证。然而 iPod、iPh

说明:这种方式只是用于方便阅读代码,因为可以在源代间快速索引跳跃。但是最后可能会有一些warning,可以不必关心,如果是强迫症,可以使用下面这种方式来去掉。

一、概述 在Linux系统中,/usr/bin和/usr/local/bin是两个常见的目录,用于存放可执行文件(二进制文件)。 很多应用都安装在/usr/local下面,先看一下automake工具

  一、概述 vmstat命令是最常见的Linux/Unix监控工具,可以监控给定时间间隔服务器的CPU使用率、内存使用、IO情况。相比top命令,可以查看到整个机器的CPU、内存、IO的使用情况,而

一、概述 sar,System Activity Reporter。是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁

一、简介 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 二、使用方法 1、基本语法  awk '条件类型1 {动作1} 条件类型2{动作2} ...

一、概述 列出目标目录中所有的子目录和文件。 二、 语法 ls [选项] [目录名] -a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件 -A 同-a,但不列出“.”(表示当前目录)

一、概述 cd全称是change directory,用于切换当前工作目录。 注意的是,cd命令是一个内建命令,它是由 shell 提供的。因此,不同的 shell 可能会有一些差异,但基本的用法和功

一、概述 全称为print working directory,查看”当前工作目录“的完整路径,一般情况下不带任何参数 二、语法 pwd [选项] -L 即logical,逻辑路径 -P 即

一、概述 通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录。要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限。并且,所创建的文件夹(目录