使用expect脚本可以完成一定程度上的自动交互,不过又要学习了。
关于expect的简单介绍。可以看这里 http://zh.wikipedia.org/zh/Expect
下面我记录一下基本用法
expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个….参数
看下面的expect脚本的例子
<div id="crayon-53145a9320430229454941" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span>
<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="切换显示行编号"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="纯文本显示代码"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="切换自动换行"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="在新窗口中显示代码"><div class="crayon-button-icon"></div></div><span class="crayon-language">Shell</span></div></div>
<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
!/usr/bin/expect
set username [lindex $argv 0]
set password [lindex $argv 1]
set server [lindex $argv 2]
send_user “UserName is $username\n”
send_user “PassWord is $password\n”
send_user “Server is $server\n”
send_user “Total arg num is $argc\n”
send_user “last but one arg is[lindex $argv [expr $argc-1]]\n”
if { $argc != 3 && $argc != 2 } {
send_user "Usage:username password \[server\] \n"
send_user "\tthe default server is 211.65.64.1 \n"
exit
}
<div class="crayon-main" style="">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="crayon-53145a9320430229454941-1">1</div><div class="crayon-num crayon-striped-num" data-line="crayon-53145a9320430229454941-2">2</div><div class="crayon-num" data-line="crayon-53145a9320430229454941-3">3</div><div class="crayon-num crayon-striped-num" data-line="crayon-53145a9320430229454941-4">4</div><div class="crayon-num" data-line="crayon-53145a9320430229454941-5">5</div><div class="crayon-num crayon-striped-num" data-line="crayon-53145a9320430229454941-6">6</div><div class="crayon-num" data-line="crayon-53145a9320430229454941-7">7</div><div class="crayon-num crayon-striped-num" data-line="crayon-53145a9320430229454941-8">8</div><div class="crayon-num" data-line="crayon-53145a9320430229454941-9">9</div><div class="crayon-num crayon-striped-num" data-line="crayon-53145a9320430229454941-10">10</div><div class="crayon-num" data-line="crayon-53145a9320430229454941-11">11</div><div class="crayon-num crayon-striped-num" data-line="crayon-53145a9320430229454941-12">12</div><div class="crayon-num" data-line="crayon-53145a9320430229454941-13">13</div><div class="crayon-num crayon-striped-num" data-line="crayon-53145a9320430229454941-14">14</div></div>
</td>
<td class="crayon-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-line" id="crayon-53145a9320430229454941-1"><span class="crayon-p">#!/usr/bin/expect</span></div><div class="crayon-line crayon-striped-line" id="crayon-53145a9320430229454941-2"><span class="crayon-e">set </span><span class="crayon-v">username</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-i">lindex</span><span class="crayon-h"> </span><span class="crayon-v">$argv</span><span class="crayon-h"> </span><span class="crayon-cn">0</span><span class="crayon-sy">]</span></div><div class="crayon-line" id="crayon-53145a9320430229454941-3"><span class="crayon-e">set </span><span class="crayon-v">password</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-i">lindex</span><span class="crayon-h"> </span><span class="crayon-v">$argv</span><span class="crayon-h"> </span><span class="crayon-cn">1</span><span class="crayon-sy">]</span></div><div class="crayon-line crayon-striped-line" id="crayon-53145a9320430229454941-4"><span class="crayon-e">set </span><span class="crayon-v">server</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-i">lindex</span><span class="crayon-h"> </span><span class="crayon-v">$argv</span><span class="crayon-h"> </span><span class="crayon-cn">2</span><span class="crayon-sy">]</span></div><div class="crayon-line" id="crayon-53145a9320430229454941-5"><span class="crayon-i">send_user</span><span class="crayon-h"> </span><span class="crayon-s">"UserName is $username\n"</span></div><div class="crayon-line crayon-striped-line" id="crayon-53145a9320430229454941-6"><span class="crayon-i">send_user</span><span class="crayon-h"> </span><span class="crayon-s">"PassWord is $password\n"</span></div><div class="crayon-line" id="crayon-53145a9320430229454941-7"><span class="crayon-i">send_user</span><span class="crayon-h"> </span><span class="crayon-s">"Server is $server\n"</span></div><div class="crayon-line crayon-striped-line" id="crayon-53145a9320430229454941-8"><span class="crayon-i">send_user</span><span class="crayon-h"> </span><span class="crayon-s">"Total arg num is $argc\n"</span></div><div class="crayon-line" id="crayon-53145a9320430229454941-9"><span class="crayon-i">send_user</span><span class="crayon-h"> </span><span class="crayon-s">"last but one arg is[lindex $argv [expr $argc-1]]\n"</span></div><div class="crayon-line crayon-striped-line" id="crayon-53145a9320430229454941-10"><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-sy">{</span><span class="crayon-h"> </span><span class="crayon-v">$argc</span><span class="crayon-h"> </span><span class="crayon-o">!=</span><span class="crayon-h"> </span><span class="crayon-cn">3</span><span class="crayon-h"> </span><span class="crayon-o">&&</span><span class="crayon-h"> </span><span class="crayon-v">$argc</span><span class="crayon-h"> </span><span class="crayon-o">!=</span><span class="crayon-h"> </span><span class="crayon-cn">2</span><span class="crayon-h"> </span><span class="crayon-sy">}</span><span class="crayon-h"> </span><span class="crayon-sy">{</span></div><div class="crayon-line" id="crayon-53145a9320430229454941-11"><span class="crayon-h"> </span><span class="crayon-i">send_user</span><span class="crayon-h"> </span><span class="crayon-s">"Usage:username password \[server\] \n"</span></div><div class="crayon-line crayon-striped-line" id="crayon-53145a9320430229454941-12"><span class="crayon-h"> </span><span class="crayon-i">send_user</span><span class="crayon-h"> </span><span class="crayon-s">"\tthe default server is 211.65.64.1 \n"</span></div><div class="crayon-line" id="crayon-53145a9320430229454941-13"><span class="crayon-h"> </span><span class="crayon-r">exit</span></div><div class="crayon-line crayon-striped-line" id="crayon-53145a9320430229454941-14"><span class="crayon-sy">}</span></div></div></td>
</tr>
</table>
</div>
</div>
执行这个文件./launch.exp 1 2 3
屏幕上就会分别打印出参数
send_user用来发送内容给用户。
参数运用方面还有很多技巧
比如$argc 存储了参数个数,args被结构化成一个列表存在argv。$argv0 被初始化为脚本名字。
除此之外,如果你在第一行(#!那行)使用-d (debug参数),可以在运行的时候输出一些很有用的信息
比如你会看见
argv[0] = /usr/bin/expect argv[1] = -d argv[2] = ./launch.exp argv[3] = 1 argv[4] = 2 argv[5] = 3
使用这些也可以完成参数传递
另外在spawn后面加一个interact,会从自动交互状态退出到输入状态,由用户完成剩余的操作.
ecpect也支持使用逻辑结构。基本语法和大多数shell语言;类似,不过使用{}而不是()
另外花括号前后的空格不容小觑,不写就会报错.
– 是用来为划定选项尾的。
当需要像使用选项一样传一个参数,但希望这个参数不要被当作选项解释时,就需要用到这个选项。当阻止其他选项时,可以把它放在”#!”行中
#!/usr/local/bin/expect –
会让所有参数(包括脚本文件名)都存储在argv中。
openVPN 59min重连脚本
学校的OpenVPN服务器非常恶心,每当用户登录时间经过60 min 09 s后就把用户踢下线。为了解决这个问日,我使用这个expect脚本来完成这个目的
<div id="crayon-53145a9320440188879649" class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px !important; line-height: 15px !important;">
<div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span>
<div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button crayon-nums-button" title="切换显示行编号"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-plain-button" title="纯文本显示代码"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-wrap-button" title="切换自动换行"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-expand-button" title="Expand Code"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-copy-button" title="Copy"><div class="crayon-button-icon"></div></div><div class="crayon-button crayon-popup-button" title="在新窗口中显示代码"><div class="crayon-button-icon"></div></div><span class="crayon-language">Shell</span></div></div>
<div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div>
<div class="crayon-plain-wrap"><textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;">
!/usr/bin/expect
openVPN 59min 自动重连脚本
2010-12-26 11:21
set timeout 30
set username [lindex $argv 0]
set password [lindex $argv 1]
set server [lindex $argv 2]
send_user “UserName is $username\n”
send_user “Filename is $argv0 ,and args No.1-2 is :[lrange $argv 1 2] \n”
send_user “Total arg num is $argc\n”
if { $argc != 3 && $argc != 2 } {
send_user "Usage:username password \[server\] \n"
send_user "\tthe default server is 211.65.64.1 \n"
exit
}
spawn openvpn —config rnas-school.ovpn
expect “Enter Auth Username:”
send “$username\r”
expect “Enter Auth Password:”
send “$password\r”
expect “Initialization Sequence Completed”
interact
等待59min后结束spawn
exec sleep 3540
set timeout 3540
exit