linux自动化交互脚本expect详解
<div id="navCategory"><p><strong>一、介绍</strong></p></div><p> expect脚本是Tcl脚本语言的拓展。用来实现自动的交互式任务,无需人为干预。在实际开发中,运行shell脚本有时候会输入linux密码或者是mysql密码等,而expect可以帮我们输入。 </p><p><strong>二、安装</strong></p><pre class="brush:bash;toolbar:false">expect在linux系统</pre><p>中没有自带,需要我们自行安装,在Ubuntu系统下,安装命令如下<br/></p><div class="jb51code"><div><div class="syntaxhighlighterbash" id="highlighter_688887"><div class="toolbar"><br/></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="bash functions">sudo</code> <code class="bash plain">apt-get update</code></div><div class="line number2 index1 alt1"><code class="bash functions">sudo</code> <code class="bash plain">apt-get </code><code class="bash functions">install</code> <code class="bash plain">expect</code></div></div></td></tr></tbody></table></div></div><div class="codetool" id="codetool"><div class="code_n"></div></div></div><p class="maodian"> </p><p><strong>三、简单的expect脚本</strong></p><p class="maodian"> </p><p><strong>3.1、编写脚本</strong></p><p>
首先创建expect脚本</p><div class="jb51code"><div><div class="syntaxhighlighterbash" id="highlighter_641127"><div class="toolbar"><br/></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><td class="gutter"><div class="line number1 index0 alt2">
1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="bash functions">sudo</code> <code class="bash plain">vim hello.exp</code></div></div></td></tr></tbody></table></div></div><div class="codetool" id="codetool"><div class="code_n"></div></div></div><p>
在hello.exp下写如下内容:</p><div class="jb51code"><div><div class="syntaxhighlighterbash" id="highlighter_51123"><div class="toolbar"><br/></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><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><div class="line number11 index10 alt2">
11</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="bash preprocessor bold">#!/usr/bin/expect</code></div><div class="line number2 index1 alt1">
</div><div class="line number3 index2 alt2"><code class="bash functions">set</code> <code class="bash plain">timeout 5</code></div><div class="line number4 index3 alt1">
</div><div class="line number5 index4 alt2"><code class="bash plain">spawn </code><code class="bash functions">su</code></div><div class="line number6 index5 alt1">
</div><div class="line number7 index6 alt2"><code class="bash plain">expect {</code></div><div class="line number8 index7 alt1"><code class="bash spaces"> </code><code class="bash plain">assword {send </code><code class="bash string">"123456\r"</code><code class="bash plain">} </code><code class="bash comments">#你的linux密码</code></div><div class="line number9 index8 alt2"><code class="bash plain">}</code></div><div class="line number10 index9 alt1">
</div><div class="line number11 index10 alt2"><code class="bash plain">interact</code></div></div></td></tr></tbody></table></div></div><div class="codetool" id="codetool"><div class="code_n"></div></div></div><p>
运行hello.exp</p><div class="jb51code"><div><div class="syntaxhighlighterbash" id="highlighter_660782"><div class="toolbar"><br/></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><td class="gutter"><div class="line number1 index0 alt2">
1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="bash plain">expect hello.exp</code></div></div></td></tr></tbody></table></div></div><div class="codetool" id="codetool"><div class="code_n"></div></div></div><p>
运行后,你会发现你的用户就变成root用户了,我们用过linux的会知道,进入root用户是需要输入密码的,而使用了expect脚本,他就会自动帮我们输入密码。这就是expect的自动化交互。</p><p><img style="max-width:100%!important;height:auto!important;" title="linux自动化交互脚本expect详解" alt="linux自动化交互脚本expect详解" src="https://zhuji.jb51.net/uploads/img/202305/1c8f76951663b75af7d5fde92d28a7e2.jpg"/></p><p class="maodian"> </p><p><strong>3.2、解释脚本</strong></p><p>
(1) <strong>#!/usr/bin/expect</strong><br/>
指定要运行的脚本,与shell脚本中的 <code>#!/bin/bash</code> 一样意思,若你不知道你的expect安装在哪里,可以使用 <code>which expect</code>来查看。我的就安装在 /usr/bin/expect下</p><p><img style="max-width:100%!important;height:auto!important;" title="linux自动化交互脚本expect详解" alt="linux自动化交互脚本expect详解" src="https://zhuji.jb51.net/uploads/img/202305/bdd64417d776ed0d45caa6e324bc119d.jpg"/></p><p>
(2) <strong>set timeout 5</strong><br/>
set:是设置变量,可以设置<strong>自定义变量</strong>,也可以设置expect脚本<strong>内部变量</strong>的值<br/>
timeout:<strong>timeout</strong>是expect脚本的<strong>内部变量</strong>,我们自定义名称的使用不能使用这种<strong>内部变量名</strong>。timeout意思是超时时间,单位是秒,默认是10s超时,也可以设置-1,永不超时</p><p>
set timeout 5:意思是在expect语句中,5s后超时,不再作出选择。</p><p>
(3) <strong>spawn su</strong><br/>
开启一个新的进程来执行 <code>su</code> 命令</p><p>
(4) <strong>expect { assword send {“123465\r”}}</strong><br/>
expect:从进程中接收信息, 如果匹配成功, 就执行expect后的动作<br/>
send:向进程发送字符串</p><div class="jb51code"><div><div class="syntaxhighlighterbash" id="highlighter_435188"><div class="toolbar"><br/></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><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></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="bash plain">expect { </code></div><div class="line number2 index1 alt1"><code class="bash spaces"> </code><code class="bash plain">assword send {</code><code class="bash string">"123465\r"</code><code class="bash plain">}</code></div><div class="line number3 index2 alt2"><code class="bash plain">}</code></div></div></td></tr></tbody></table></div></div><div class="codetool" id="codetool"><div class="code_n"></div></div></div><p>
说明:判断输出的信息有没有包含<code>assword</code>的字符串,如果有,则发送一个命令<code>123456\r</code>( \r是敲回车),并退出expect语句;如果没有,则等待timeout的时间后退出expect语句。</p><p>
(5) <strong>interact</strong><br/>
执行完spawn内的命令后不退出,剩下的操作由我们人工来执行。如登陆ssh,expect脚本可以帮我们登录(不用手动输入密码),登陆之后需要我们手动交互。</p><p class="maodian"> </p><p><strong>3.3、总结</strong></p><p>
看到这里,相信你已经知道了expect脚本本质:提前知道了linux系统的返回信息,并捕获这些信息,来作出应答。</p><p class="maodian"> </p><p><strong>四、正文</strong></p><p class="maodian"> </p><p><strong>4.1、常用命令说明</strong></p><p>
</p><table><thead><tr class="firstRow"><th>
命令</th><th>
说明</th></tr></thead><tbody><tr><td>
set timeout n</td><td>
设置expect语句超时时间为n秒。-1为永不超时</td></tr><tr><td>
set name value</td><td>
设置变量名为name,其值为value</td></tr><tr><td>
set name </td><td>
设置变量名为name,其值为 传入 expect脚本的第一个 参数 。第一个参数的索引值为0,第二个为1,依次类推</td></tr><tr><td>
spawn</td><td>
启动新的进程,执行命令或者指定程序</td></tr><tr><td>
expect</td><td>
接收进程中返回的信息, 如果匹配成功(有大小写区分), 就执行expect后的动作</td></tr><tr><td>
send</td><td>
向进程发送字符串</td></tr><tr><td>
send_user</td><td>
用来打印信息,相当于shell中的echo</td></tr><tr><td>
exp_continue</td><td>
执行完expect后的动作后,使expect不退出,继续往下匹配</td></tr><tr><td>
expect eof</td><td>
不允许用户交互,直接退出(这个用的会比interact多)</td></tr><tr><td>
interact</td><td>
允许用户交互</td></tr></tbody></table><p><br/></p><p><strong>4.2、示例:运行shell脚本</strong></p><p>
(1)创建一个shell脚本,1.sh</p><div class="jb51code"><div><div class="syntaxhighlighterbash" id="highlighter_932380"><div class="toolbar"><br/></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><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></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="bash preprocessor bold">#!/bin/bash</code></div><div class="line number2 index1 alt1">
</div><div class="line number3 index2 alt2"><code class="bash functions">echo</code> <code class="bash string">"read print"</code></div><div class="line number4 index3 alt1"><code class="bash functions">read</code> <code class="bash plain">-p </code><code class="bash string">"please input name in there "</code> <code class="bash plain">NAME</code></div><div class="line number5 index4 alt2"><code class="bash functions">echo</code> <code class="bash plain">${NAME}</code></div><div class="line number6 index5 alt1">
</div><div class="line number7 index6 alt2"><code class="bash functions">read</code> <code class="bash plain">-p </code><code class="bash string">"input password in there "</code> <code class="bash plain">PASSWORD</code></div><div class="line number8 index7 alt1">
</div><div class="line number9 index8 alt2"><code class="bash functions">echo</code> <code class="bash plain">${PASSWORD}</code></div></div></td></tr></tbody></table></div></div><div class="codetool" id="codetool"><div class="code_n"></div></div></div><p>
该脚本的意思就是输入你的账号,密码,并打印出来</p><p>
(2)创建一个expect脚本,1.exp。让1.exp帮我们输入信息</p><div class="jb51code"><div><div class="syntaxhighlighterbash" id="highlighter_15361"><div class="toolbar"><br/></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr class="firstRow"><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><div class="line number11 index10 alt2">
11</div><div class="line number12 index11 alt1">
12</div><div class="line number13 index12 alt2">
13</div><div class="line number14 index13 alt1">
14</div><div class="line number15 index14 alt2">
15</div><div class="line number16 index15 alt1">
16</div><div class="line number17 index16 alt2">
17</div><div class="line number18 index17 alt1">
18</div><div class="line number19 index18 alt2">
19</div><div class="line number20 index19 alt1">
20</div><div class="line number21 index20 alt2">
21</div><div class="line number22 index21 alt1">
22</div><div class="line number23 index22 alt2">
23</div><div class="line number24 index23 alt1">
24</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="bash preprocessor bold">#!/usr/bin/expect</code></div><div class="line number2 index1 alt1">
</div><div class="line number3 index2 alt2"><code class="bash comments">#若要运行shell脚本,写shell脚本的绝对路径</code></div><div class="line number4 index3 alt1"><code class="bash plain">spawn </code><code class="bash functions">bash</code> <code class="bash plain">/home/hadoop/test/1</code><code class="bash plain">.sh</code></div><div class="line number5 index4 alt2">
</div><div class="line number6 index5 alt1"><code class="bash comments">#设置expect语句的超时时间。默认10s</code></div><div class="line number7 index6 alt2"><code class="bash functions">set</code> <code class="bash plain">timeout 3</code></div><div class="line number8 index7 alt1">
</div><div class="line number9 index8 alt2"><code class="bash plain">expect {</code></div><div class="line number10 index9 alt1"><code class="bash spaces"> </code><code class="bash comments">#expect类似于swtich语句,在括号{}内匹配语句,只要一找到匹配的语句,就会执行,</code></div><div class="line number11 index10 alt2"><code class="bash spaces"> </code><code class="bash comments">#执行完之后就会退出,而加上exp_continue之后不会退出,会继续往下执行。</code></div><div class="line number12 index11 alt1">
</div><div class="line number13 index12 alt2"><code class="bash spaces"> </code><code class="bash comments">#这里是匹配字符串,不需要双引号,有大小写区分</code></div><div class="line number14 index13 alt1"><code class="bash spaces"> </code><code class="bash plain">name {</code></div><div class="line number15 index14 alt2"><code class="bash spaces"> </code><code class="bash plain">send </code><code class="bash string">"meizhaowei\r"</code></div><div class="line number16 index15 alt1"><code class="bash spaces"> </code><code class="bash plain">send_user </code><code class="bash string">"success\n"</code></div><div class="line number17 index16 alt2"><code class="bash spaces"> </code><code class="bash comments">#回显示给用户的信息,类似与echo,打印信息到控制台上</code></div><div class="line number18 index17 alt1"><code class="bash spaces"> </code></div><div class="line number19 index18 alt2"><code class="bash spaces"> </code><code class="bash plain">exp_continue</code></div><div class="line number20 index19 alt1"><code class="bash spaces"> </code><code class="bash plain">}</code></div><div class="line number21 index20 alt2"><code class="bash spaces"> </code><code class="bash plain">assword {send </code><code class="bash string">"123456\r"</code><code class="bash plain">}</code></div><div class="line number22 index21 alt1"><code class="bash plain">}</code></div><div class="line number23 index22 alt2">
</div><div class="line number24 index23 alt1"><code class="bash plain">expect eof </code><code class="bash comments">#与interact相反,执行完程序不进入人工交互</code></div></div></td></tr></tbody></table></div></div><div class="codetool" id="codetool"><div class="code_n"></div></div></div><p>
(3)运行</p><p><img style="max-width:100%!important;height:auto!important;" title="linux自动化交互脚本expect详解" alt="linux自动化交互脚本expect详解" src="https://zhuji.jb51.net/uploads/img/202305/946e02b9cd41d96cd9d01c0effc04f13.jpg"/></p><p>
正常来说,运行1.sh会让你手动输入name与password,但是这里运行了1.exp后,就能让1.exp来帮你输入1.sh的信息</p><p>
到此这篇关于linux自动化交互脚本expect的文章就介绍到这了,更多相关linux expect自动化交互脚本内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!</p>
頁:
[1]