linux中expect的介绍与使用示例
<p><span><strong>一、概述</strong></span></p>
<p>
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。</p>
<p>
Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年 开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。 :)</p>
<p>
Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。</p>
<p>
<span><strong>二、Expect工作原理</strong></span></p>
<p>
从最简单的层次来说,Expect的工作方式象一个通用化的Chat脚本工具。Chat脚本最早用于UUCP网络内,以用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。</p>
<p>
Chat脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。例如下面的 Chat脚本实现等待标准输出出现Login:字符串,然后发送somebody作为用户名;然后等待Password:提示符,并发出响应 sillyme。</p>
<p>
引用:Login: somebody Password: sillyme</p>
<p>
这个脚本用来实现一个登录过程,并用特定的用户名和密码实现登录。</p>
<p>
Expect最简单的脚本操作模式本质上和Chat脚本工作模式是一样的。</p>
<p>
<span><strong>三、一个例子:</strong></span></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_98413">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash preprocessor bold">#!/usr/bin/expect -f </code>
</div>
<div class="line number2 index1 alt1">
<code class="bash functions">set</code> <code class="bash plain">ip </code><code class="bash plain">//</code><code class="bash plain">接收第一个参数,并设置IP </code>
</div>
<div class="line number3 index2 alt2">
<code class="bash functions">set</code> <code class="bash plain">password </code><code class="bash plain">//</code><code class="bash plain">接收第二个参数,并设置密码 </code>
</div>
<div class="line number4 index3 alt1">
<code class="bash functions">set</code> <code class="bash plain">timeout 10 </code><code class="bash plain">//</code><code class="bash plain">设置超时时间 </code>
</div>
<div class="line number5 index4 alt2">
<code class="bash plain">spawn </code><code class="bash functions">ssh</code> <code class="bash plain">root@$ip </code><code class="bash plain">//</code><code class="bash plain">发送</code><code class="bash functions">ssh</code><code class="bash plain">请滶 </code>
</div>
<div class="line number6 index5 alt1">
<code class="bash plain">expect { </code><code class="bash plain">//</code><code class="bash plain">返回信息匹配 </code>
</div>
<div class="line number7 index6 alt2">
<code class="bash spaces"> </code><code class="bash string">"*yes/no"</code> <code class="bash plain">{ send </code><code class="bash string">"yes\r"</code><code class="bash plain">; exp_continue} </code><code class="bash plain">//</code><code class="bash plain">第一次</code><code class="bash functions">ssh</code><code class="bash plain">连接会提示</code><code class="bash functions">yes</code><code class="bash plain">/no</code><code class="bash plain">,继续 </code>
</div>
<div class="line number8 index7 alt1">
<code class="bash spaces"> </code><code class="bash string">"*password:"</code> <code class="bash plain">{ send </code><code class="bash string">"$password\r"</code> <code class="bash plain">} </code><code class="bash plain">//</code><code class="bash plain">出现密码提示,发送密码 </code>
</div>
<div class="line number9 index8 alt2">
<code class="bash plain">} </code>
</div>
<div class="line number10 index9 alt1">
<code class="bash plain">interact </code><code class="bash plain">//</code><code class="bash plain">交互模式,用户会停留在远程服务器上面.</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>运行结果:</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_611857">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">root@ubuntu:</code><code class="bash plain">/home/zhangy</code><code class="bash comments"># ./test.exp 192.168.1.130 admin </code>
</div>
<div class="line number2 index1 alt1">
<code class="bash plain">spawn </code><code class="bash functions">ssh</code> <code class="bash plain">root@192.168.1.130 </code>
</div>
<div class="line number3 index2 alt2">
<code class="bash plain">Last login: Fri Sep 7 10:47:43 2012 from 192.168.1.142 </code>
</div>
<div class="line number4 index3 alt1">
<code class="bash plain"></code><code class="bash comments">#</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<span><strong>总结</strong></span></p>
<p>
以上就是关于linux下使用expect示例的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。</p>
<p>
原文链接:http://lingxiankong.github.io/blog/2014/11/25/linux-expect/</p>
頁:
[1]