expect是建立在tcl基础上的一个工具,它用来让一些需要交互的任务自动化地完成。

因为expect是基于tcl的,所以需要你的系统中安装有tcl
如何检查?
[root@dev ~]# whereis tcl
tcl: /usr/lib/tcl8.4 /usr/share/tcl8.4
如果看不到结果,请先安装tcl

安装

> 安装tcl
解压tcl安装包后
cd tcl8.4.11/unix/
./configure --prefix=/usr/local/tcl/ --enable-shared
make && make install

> 安装expect
解压expect安装包后
cd expect-5.43
./configure --prefix=/usr/local/expect/ --with-tcl=/usr/local/tcl/lib/ --with-tclinclude=/opt/tcl8.4.11/generic/ --enable-shared
make && make install
注意:指定的/opt/tcl8.4.11/generic/ 为我们上面解压的tcl目录

> 创建连接符号
ln -s /usr/local/expect/bin/expect /usr/bin/expect
> 查看连接符号
ls -l /usr/bin/expect
lrwxrwxrwx. 1 root root 28 9月   8 11:21 /usr/bin/expect -> /usr/local/expect/bin/expect
这个符号链接将在编写expect脚本文件时用到,例如在expect文件头部会指定用于执行该脚本的shell 
#!/usr/bin/expect

> 测试
[root@localhost opt]# expect
expect1.1> exit
[root@localhost opt]#

这样就可以开始运行expect脚本了。

用法

1. [#!/usr/bin/expect] 
这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 
注意:这一行需要在脚本的第一行。

2. [set timeout 30] 
基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒。timeout -1 为永不超时,默认情况下,timeout是10秒;

3. [spawn ssh -l username 192.168.1.1] 
spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。 
它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 
spawn后面加上需要执行的shell命令,比如说spawn sudo touch testfile

4. [expect "password:"] 
这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒

5. [send "ispass\r"] 
这里就是执行交互动作,与手工输入密码的动作等效。 
温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。

6. [interact] 
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行

7. $argv 参数数组
expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数
其中,$argc为命令行参数的个数,$argv0为脚本名字本身,$argv为命令行参数。[lrange $argv 0 0]表示第1个参数,[lrange $argv 0 4]为第一个到第五个参数。与c语言不一样的地方在于,$argv不包含脚本名字本身。

8. send和send_user
send会将expect脚本中需要的信息发送给spawn启动的那个进程,而send_user只是回显用户发出的信息,类似于shell中的echo而已。

9. 如果你在第一行(#!那行)使用-d (debug参数),可以在运行的时候输出一些很有用的信息
比如你会看见
argv[0] = /usr/bin/expect argv[1] = -d argv[2] = ./launch.exp argv[3] = 1 argv[4] = 2 argv[5] = 3
使用这些也可以完成参数传递

10. exp_continue的用法

expect {
        -re "Permission denied, please try again." {
                send_user "Error:Permission denied.\n"
                exit
        }
        -re "Are you sure you want to continue connecting (yes/no)?" {
                send "yes\r";exp_continue
        }
        -re "assword:" {
                send "$loginpass\r";exp_continue
        }
        -re "Connection refused" {
                exit
        }
        timeout {
                exit
        }
        eof {
                exit
        }
}

使用exp_continue后,会重新从当前expect块的开始重新执行,可以简单理解问while循环的continue

例子

下面的脚本例子,实现了:登录一个Linux服务器,执行 df -h 等命令
vi expectExample.sh 后输入下面的脚本内容保存后,使用chmod +x expectExample.sh 命令为脚本赋予可执行权限。

#!/usr/bin/expect -f

#-------------------------------------------- set the variable,you can modify the value
set ipaddr [lrange $argv 0 0]
set port [lrange $argv 1 1]
set loginuser [lrange $argv 2 2]
set loginpass [lrange $argv 3 3]
set cmd_prompt "]#|~]?"

# 超时时间,单位(秒)
set timeout 3600

#-------------------------------------------- login by ssh
spawn ssh -p $port $loginuser@$ipaddr

expect {
        -re "Permission denied, please try again." {
                send_user "Error:Permission denied.\n"
                exit
        }
                -re "Connection refused" {
                send_user "Error:Connection refused.\n"
                exit
        }
        timeout {
                exit
        }
        eof {
                exit
        }
        -re "Are you sure you want to continue connecting (yes/no)?" {
                send "yes\r"
                exp_continue
        }
        -re "assword:" {
                send "$loginpass\r"
                exp_continue
        }
        -re $cmd_prompt {
                send "\r"

}
}

#-------------------------------------------- now,we do some commands
expect {
        -re $cmd_prompt {
                send "df -h\r"
        }
}

expect {
        -re $cmd_prompt {
                send "free -m\r"
        }
}

expect {
        -re $cmd_prompt {
                send "uptime\r"
        }
}

send "cd /opt\r"
send "mkdir shanhy123\r"
send "cd shanhy123\r"
send "echo 123 > 123.txt\r"

send "/opt/xs.sh\r"

send "exit\r"

expect eof
#interact

-------------------------------------------------

其中 xs.sh 为我写的一个测试的 shell 脚本,里面故意做了一个sleep 模拟耗时操作,代码如下:

#!/bin/bash
sleep 10
echo abc > /opt/abc.txt

注意:expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

Linux expect 用法相关推荐

  1. linux expect中文,Linux expect用法介绍

    1.expect是linux中一个交互命令,一般在 /usr/bin/expect路径下,如果该路径未加入到环境中需要先添加,其作用场景常用于交互执行输入指令 常用命令: expect 获取上一命令执 ...

  2. linux expect循环用法,Linux expect用法介绍

    1.expect是linux中一个交互命令,一般在 /usr/bin/expect路径下,如果该路径未加入到环境中需要先添加,其作用场景常用于交互执行输入指令 常用命令: expect 获取上一命令执 ...

  3. [Linux] expect用法举例

    expect有助于自动化脚本中的交互过程的自动输入,例如远程登录需要输入确认信息.密码,安装脚本需要输入确认信息.用户名.密码.选择配置选项等等. expect内部命令中的expect可以匹配一个给定 ...

  4. linux expect函数,Linux expect 用法(示例代码)

    用法 1. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和Linux下的bash.windows下的cmd是一类东西. 注意 ...

  5. expect spawn、linux expect 用法

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ######## ...

  6. linux expect 字符串,linux expect 用法

    一.概述 我们通过Shell可以实现简单的控制流功能如循环.判断等.但是对于需要交互的场合则必须通过人工来干预有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而Expect就使 ...

  7. linux expect 字符串,expect spawn、linux expect 用法小记

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: 1 #!/usr ...

  8. Linux expect用法

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理.脚本代码如下: ######### ...

  9. 如何在linux运行spawn,expect spawn、linux expect 用法

    使用expect实现自动登录的脚本网上有很多可是都没有一个明白的说明初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下 ############ ...

最新文章

  1. UVA 10795 新汉诺塔问题
  2. python条件控制语句要注意什么_关于Python条件控制怎么用?要注意什么?
  3. modis数据介绍_【更新90篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  4. python爬取网页防止重复内容_python解决网站的反爬虫策略总结
  5. 我,大学没毕业,在OpenAI搞AI,想教教你如何提升“研究品味”
  6. 前端工程师和数据科学的快乐
  7. 哔哩哔哩公司swot分析_是时候颠覆你的SWOT营销分析法了!TOWS分析法可能更适合你...
  8. 力扣(LeetCode)56
  9. Linux 启动流程详细解析
  10. 群体智能优化算法之猫群算法(Cat Swarm Optimization)
  11. [摘抄]从 GitHub 身上学到的 3 个创业经验
  12. HP U盘格式化工具
  13. 【微机原理】40道简答题
  14. acceleration transducer
  15. Device Self-test
  16. Windows11专业版安装USBCAN-II驱动后报错“……无法加载这个硬件的设备驱动程序……(代码39)”解决方案
  17. excel文件导出、下载的响应类型设置
  18. python 简单的Http服务器
  19. 中国科学技术大学研究生细胞生物学II考试复习资料
  20. 苹果华为不送充电头后,这些人赚翻了

热门文章

  1. 更改mysql表显示数据条数_layui数据表格自定义每页条数limit设置
  2. HTML-表单控件语法汇总及其案例
  3. 读书笔记-Greenplum企业应用实战:简介
  4. 给游戏人看的苹果发布会:App Store将打通三端
  5. 淘宝卖家信用升级方案
  6. Scrum晨会那些事
  7. SOLIDWORKS配置应用之零件配置
  8. 你在用苹果的时候遇到过什么样的问题?
  9. 根据头部信息http header控制nginx选择反向代理服务器
  10. 监控摄像机电子快门应用现状及技术解析