1、Expect简介

Expect是由 Don Libes 基于Tcl语言开发的,并被广泛应用于交互式操作和自动化测试的场景中,它尤其适用于需要对多台服务器执行相同操作的环境中,可以大幅度提高系统管理人员的工作效率。目前,大部分 Unix/Linux 系统安装有expect。万一系统中没有,可以从 http://expect.nist.gov/| f52496c84460745c17c9a9c5df59acb61 | 下载相应的包安装。

Expect作为基于Tcl的高级语言,增加了一些特殊的语法。传统意义上的Expect是以Tcl扩展包的形式出现的,任何Tcl语言编写的应用程序都可以加载Expect功能;此外,Expect已经以模块的方式移植到了Perl和Python语言中,因此用户同样可以在Perl和Python脚本中利用Expect强大的交互功能。

2、Expect语言最基本的命令

sendexpectspawn 是Expect语言最基本的命令。
send命令会发送字符床给指定进程(process)。
expect命令会等待接受该进程返回的结果并且会根据返回的字符串来决定下一步的操作。
spawn命令可以发起一个进程的运行。
进入expect环境后才可以执行的expect内部命令

$ expect
expect1.1> send ....
expect1.1> expect ....
........

send命令接收一个字符串作为参数并发送给指定的进程从send "hello world"这行代码中,send会送出字符串 hello world 。如果expec早已经开始与某一个程序进行交互,那么这个字符串将被发送给该程序;而在通常情况下,这个字符串会被送到标准输出设备。

expect命令则等待一个响应,通常是来自于expect正在与之交互的进程,或者来自于标准输入设备;它会等待一个指定的字符串或者满足给定的正则表达式的任何字符串。我们可以创建一个名为response.expect的文件,来看expect是如何处理的,其内容如下:

#!expect -f
expect "hi"
send "hello there"

终端中运行 $ expect response.expect,它会等待来自标准输入设备的响应,知道用户输入hi并回车,它才会发送 hello there到标准输出设备,并回车。然后结束expect脚本的运行。但是如果用户没有输入hi并回车,那么expect会继续等待hi;输入其他的字符并不会影响到expect的工作。通常情况下,expect会一直等待输入,直到最终超时退出。此外,expect还支持使用正则表达式来预防expect匹配到未预想到的输入数据。

spawn命令会调用另一个程序。它的第一个参数要启动程序的名字;剩余的参数则会被传递给该程序作为参数。比如:

expect1.1> spawn ssh username@192.168.1.1

命令会衍生出一个ssh进程,以username用户的身份登陆ip地址为192.168.1.1的电脑中。

用户通过spawn,send和expect这三个基本命令,就可以编写一段expect程序来实现自动化工作。

3、Gentoo下Expect的安装

$ sudo emerge -avt dev-tcltk/expect

4、示例:Expect两个脚本的实现

4.1 通过lftp登陆别人的电脑

当你想通过lftp登陆别人的电脑同步文件时,若只执行lftp sftp:://user@x.x.x.x登陆了别人的电脑,你会发现其实这只是一种假象,实际上你并没有成功登陆别人的电脑,所以你需先执行ssh user@x.x.x.x然后在执行上述命令,即可登陆成功。这样做的话,你需要多次输入ip、用户名、密码,很费时间。为了能够提高效率,可以借助expect脚本。过程如下:创建一个ssh.expect的脚本,分别说一下执行脚本时有参数的脚本内容和无参数的脚本内容。

有参数的脚本内容如下:

#!/usr/bin/expect
set timeout 1
set host [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $host -l $user
expect {"(yes/no)?" {send "yes"expect "Password"send "$password\r"}"Password:" {send "$password\r"}
}
send "exit \n"
spawn lftp sftp://$user@$host
expect "Password:"
send "$password\r"
interact

假如你想以xiaomi的用户名登陆ip192.168.0.50登陆密码为123的电脑,则在终端执行$ expect ssh.expect 192.168.0.50 xiaomi 123,终端显示lftp xiaomi@192.168.0.50:~>
无参数的脚本内容如下:

#!/usr/bin/expect
set timeout 1
set host 192.168.0.50
set user xiaomi
set password 123
spawn ssh $host -l $user
expect {"(yes/no)?" {send "yes"expect "Password"send "$password"}"Password:" {send "$password\r"}
}
send "exit \n"
spawn lftp sftp://$user@$host
expect "Password:"
send "$password\r"
interact

在终端执行$ expect ssh.expect,终端显示lftp xiaomi@192.168.0.50:~>
其中timeout为send将信息发送给标准输入设备等待执行的时间,你可以修改一下变量值,观察以下效果。

4.2 内核更新

注意send “123\r”中的123为你的sudo密码。

#!/usr/bin/expect
set timeout 60
set kernel [lindex $argv 0]
spawn su
expect "Password:"
send "123\r"
expect "#"
send "cd /usr/src/ \n"
expect "#"
send "cp ./linux/.config ./linux-$kernel-gentoo/ \n"
expect "#"
send "rm linux \n"
expect "#"
send "ln -s /usr/src/linux-$kernel-gentoo linux \n"
expect "#"
send "cd linux \n"
expect "#"
send "make -j4 && make modules_install \n"
expect "#"
send "mount /boot && rm /boot/kernel-* \n"
expect "#"
send "cp arch/x86/boot/bzImage /boot/kernel-$kernel-gentoo \n"
expect "#"
send "grub2-mkconfig -o /boot/grub/grub.cfg \n"
expect "#"
send "grub2-install /dev/sda \n"
expect "#"
send "exit \n"
interact
$ expect kernel_renew.expect 4.2.1//4.2.1为你内核新版本号

加速器:Expect脚本相关推荐

  1. ssh其他机器的Expect脚本

    ssh登陆其他机器的Expect脚本 #!/usr/bin/expect -fset user [lindex $argv 0] set ipaddr [lindex $argv 1] set pas ...

  2. expect脚本同步文件、 expect脚本指定host和要同步的文件 、 构建文件分发系统 、批量远程执行命令...

    为什么80%的码农都做不了架构师?>>>    20.31 expect脚本同步文件 使用expect脚本同步文件 说明:核心命令是rsync #! /usr/bin/expect ...

  3. 小型自动化运维--expect脚本之自动同步

    小型自动化运维--expect脚本之自动同步 expect脚本可以运用于自动化运维多个方面,例如:可以自动到远程机器执行命令,也可以传输文件到远程机器上. 脚本如下: #!/usr/bin/expec ...

  4. 20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行

    20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数 20.27 分发系统介绍 分发系统,什么叫分发系统,首先 ...

  5. linux 行尾加字符串,linux – cat in expect脚本在字符串结尾添加新行

    我在expect脚本中有以下内容 spawn cat version expect -re 5.*.* set VERSION $expect_out(0,string) spawn rpm --ad ...

  6. linux脚本expect分区,linux – 从不同位置执行Expect脚本

    我试图从两个不同的位置运行我的Expect脚本,它将使用引用的以下Expect可执行文件: >我的linux主目录(#!/usr/bin/expect) >另一台服务器上的清晰视图(#!/ ...

  7. 小型自动化运维--expect脚本之传递函数

    小型自动化运维--expect脚本之传递函数 [root@shiyanji ~]# vim 3.expect #!/usr/bin/expect set user [lindex $argv 0] s ...

  8. 使expect脚本传回返回值

    使expect脚本传回返回值 1.使用expect示例: spawn $SPAWN_CMD expect { -re "Enter password for new role:" ...

  9. expect脚本同步文件,expect脚本指定host和要同步的文件,构建文件分发系统,批量远程执行命令...

    2019独角兽企业重金招聘Python工程师标准>>> expect脚本同步文件 更改权限 执行脚本 查看执行结果 expect eof需要加上,作用是等脚本命令执行完再进行退出 e ...

最新文章

  1. [转自脚本之家] Javascript cookie 详解
  2. Vue-员工管理系统
  3. [蓝桥杯][2017年第八届真题]包子凑数(解题报告)
  4. Android的intent之间复杂参数的传递
  5. 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II
  6. .NET 6 对 StackOverflow 的优化
  7. Codeforces Round #447 Div. 2 A.B.C
  8. html css 样式中100%width 仍有白边解决办法
  9. 斯坦福教授亲自上课!字节跳动夏令营超硬核课程实践项目等你来战
  10. 高薪诚聘游戏引擎研发,有意者请与我联系!
  11. 软件可靠性的一些关注点
  12. WebApplication(Web应用程序)和WebSite(网站)的区别
  13. QT_kvaser动态链接库配置
  14. matlab norm函数_机器人手眼标定MATLAB及C++实现(二十九)
  15. 64位CPU对于移动设备是没有意义
  16. 我是住在山里的小和尚,我把我的寺庙生活告诉大家[转载之2]
  17. 自兴人工智能——Python第三课(字符串和字典)
  18. python中保留两位小数或者多位小数的方法
  19. win10在电脑已经连接WIFI的情况下查询到WiFi密码(不方便询问或没有办法获得密码的时候)
  20. 决策树(分类树)——红酒数据(分类树的八个参数,一个属性,四个接口,以及绘图所用的代码)

热门文章

  1. oracle sqltune,关于Oracle Baseline和DBMS_SQLTUNE工具
  2. 怎么去把文章多平台分发?
  3. 概率统计置信区间用计算机怎么算,置信区间计算器
  4. PHP单元测试框架PHPUnit的使用
  5. 支付宝手机网页支付即时到账接口
  6. 汉字转拼音 城市绑定
  7. 通勤车油耗(算法题)
  8. zynq ps/pl交互接口
  9. java 生成svg_Java Batik操作SVG,实现svg读取,生成,动态操作
  10. VC++玩转炫酷悬浮窗3---GDI+完美实现不规则窗体