expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信.

1 安装expect工具
expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程是:
spawn启动指定进程 -> expect获取指定关键字 -> send想指定进程发送指定指令 -> 执行完成, 退出.
由于expect是基于tcl的, 所以需要确保系统中安装了tcl:
# 检查是否安装了tcl:
[root@localhost ~]# whereis tcl
tcl: /usr/lib64/tcl8.5 /usr/include/tcl.h /usr/share/tcl8.5

# 如果没有安装, 使用yum安装tcl和expect:
[root@localhost ~]# yum install -y tcl
[root@localhost ~]# yum install -y expect

# 查看expect的安装路径:
[root@localhost ~]# command -v expect
/usr/bin/expect

2 expect的常用命令
命令 说明
spawn
启动新的交互进程, 后面跟命令或者指定程序
expect
从进程中接收信息, 如果匹配成功, 就执行expect后的动作
send
向进程发送字符串
send exp_send
用于发送指定的字符串信息
exp_continue
在expect中多次匹配就需要用到
send_user
用来打印输出 相当于shell中的echo
interact
允许用户交互
exit
退出expect脚本
eof
expect执行结束, 退出
set
定义变量
puts
输出变量
set timeout
设置超时时间
3 作用原理简介
3.1 示例脚本
这里以ssh远程登录某台服务器的脚本为例进行说明, 假设此脚本名称为remote_login.sh:
#!/usr/bin/expect

set timeout 30
spawn ssh -l root 172.16.22.131
expect "password*"
send "123456\r"
interact

3.2 脚本功能解读
(1) #!/usr/bin/expect
上述内容必须位于脚本文件的第一行, 用来告诉操作系统, 此脚本需要使用系统的哪个脚本解析引擎来执行.
具体路径可通过command -v expect命令查看.
注意:
这里的expect和Linux的bash、Windows的cmd等程序一样, 都是一种脚本执行引擎.
脚本需要有可执行权限(chmod +x remote_login.sh, 或chmod 755 auto_login.sh), 然后通过命令./remote_login.sh运行即可;
如果输入sh remote_login.sh, 意义就不一样了: 明确调用sh引擎去执行此脚本, 此时首行的#!/usr/bin/expect就失效了.
(2) set timeout 30
设置连接的超时时间为30秒.
(3) spawn ssh -l root 172.16.22.131
spawn、send等命令是expect工具中的内部命令, 如果没有安装expect工具, 就会出现"spawn not found"等错误.
不要用which spawn之类的命令去找spawn, 因为并没有这样的程序.
(4) expect "password*"
这个命令用来判断上次输出结果里是否包含"password*"的字符串, 如果有则立即返回, 否则就等待一段时间后返回. 这里的等待时长就是前面设置的timeout, 也就是30秒.
(5) send "123456\r"
这里就是执行交互动作, 作用等同于手工输入密码.
提示: 命令字符串结尾加上\r, 这样的话, 如果出现异常等待的状态就能够停留下来, 作进一步的核查.
(6) interact
expect执行完成后保持用户的交互状态, 这个时候用户就可以手工操作了.
如果没有这一句, expect执行完成后就会退出脚本刚刚远程登录过去的终端, 用户也就不能继续操作了.
4 其他脚本使用示例
4.1 直接通过expect执行多条命令
注意首行内容, 这种情况下就只能通过./script.sh来执行这类脚本了:
#!/usr/bin/expect -f

set timeout 10
# 切换到root用户, 然后执行ls和df命令:
spawn su - root
expect "Password*"
send "123456\r"
expect "]*" # 通配符
send "ls\r"
expect "#*" # 通配符的另一种形式
send "df -Th\r"
send "exit\r" # 退出spawn开启的进程

expect eof # 退出此expect交互程序

4.2 通过shell调用expect执行多条命令
注意首行内容, 这种情况下可通过sh script.sh、bash script.sh 或./script.sh, 都可以执行这类脚本:
#!/bin/bash

ip="172.16.22.131"
username="root"
password="123456"

# 指定执行引擎
/usr/bin/expect <<EOF
set time 30
spawn ssh $username@$ip df -Th
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect eof
EOF

5 spawn not found 的解决
出现这个错误的基本上都是出学者: Linux 执行shell脚本有两种方式:
一种是将脚本作为sh的命令行参数, 如sh remote_login.sh, 或sh /data/remote_login.sh;
一种是将脚本作为具有执行权限的可执行脚本, 如./remote_login.sh, 或/data/remote_login.sh.
而作为sh命令行参数来运行, 那么脚本第一行的#!/usr/bin/expect就会失效, 所以才会出现spawn not found、send not found等错误, 所有上面的automate_login.sh脚本必须用以下命令运行:
./automate_expect.sh

教你如何在Linux中通过expect工具实现脚本的自动交互相关推荐

  1. 为什么脚本执行一行就不动了_在Linux中通过expect工具实现脚本的自动交互

    expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 1 安装expect工具 expect是建立在tcl基础上的一个自动化交互套 ...

  2. eclipse里source的快捷方法_教你如何在Linux中设置快捷方式图标

    这篇文章主要给大家介绍了关于如何在Linux中设置快捷方式图标的相关资料,文中通过示例代码的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 Linux系统 ...

  3. linux上运行onedrive,教你如何在Linux中同步微软 OneDrive

    [编者注]:本文译文完成之后不久,OneDrive 就成了中国人的昨日黄花了.编者想了想,还是发出来罢,仅以此文纪念我们逝去的这个.那个.以及这些和那些.也许若干年后我们回忆起来,我们曾经有过那么多那 ...

  4. 大神教你如何在 Linux 中启用 Shell 脚本的调试模式

    导读 脚本是存储在一个文件的一系列命令.在终端上输入一个个命令,按顺序执行的方法太弱了,使用脚本,系统中的用户可以在一个文件中存储所有命令,反复调用该文件多次重新执行命令. 在学习脚本或写脚本的初期阶 ...

  5. 电脑安装linux系统需要下载什么软件,教你如何在Linux中安装应用软件

    新的操作系统装好了,安装一些新的软件那是难免的.但是在Linux中,安装应用软件和Windows下有些不同哦.而且对于Linux初学者来说,安装软件是一件很让人头疼的事情.由于很多Linux应用软件都 ...

  6. 如何在 Linux 中创建并运行 Shell 脚本(Bash 初学者教程)

    文章目录 1.创建并运行第一个 shell 脚本 2.将 shell 脚本转换为 bash 脚本 3.为什么大多数 shell 脚本都包含 #! /bin/bash 在 shell 脚本的开头? 4. ...

  7. 路由器配置实践 教你如何在Linux中三台主机两个网段互相通信

    大家好我是你们的齐天大圣 又到了齐天大圣给大家讲解的时间了 今天我带你们做一个 大大项目 你们信不信 如果把你不小心打开这个文档 希望你能看完 这个博文花费了我两天的时间所以请尊重我的劳动 假装看完好 ...

  8. ge linux安装apt_教你如何在 Linux 中使用 apt 命令

    apt 是一个命令行实用程序,用于在 Ubuntu , Debian 和相关 Linux 发行版上安装,更新,删除和管理 deb 包.它是 apt-get 和 apt-cache 工具的最常用命令和选 ...

  9. 在linux中安装浏览器吗,教你如何在 Linux 中安装 Microsoft Edge 浏览器

    Edge浏览器最初是在Windows 10上发布的,随后是Mac OS,X Box和Andoird.开发版据说是预览版,旨在让想要在Linux上构建和测试其站点和应用程序的开发人员使用. 目前尚无法使 ...

  10. 教你如何在linux中创建个人用户主页

    1.在配置文件中开启个人用户主页的功能 2.创建个人主页+在该用户中创建保存该用户主页的数据目录文件+对该目录文件进行授权 3.重新启动httpd服务 4.访问个人主页 5.出现无法访问,需要过滤相关 ...

最新文章

  1. 面经:为了拿到字节跳动offer,鬼知道我经历了啥...
  2. 线程间定制化调用通信—— 1 高内聚低耦合的前提下,线程操作资源类 2 判断/干活/通知 3 多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)
  3. Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA
  4. 捷信达登录信息代码133_报名!广州40所热门民办初中学费均价38678,有学校涨幅133%...
  5. mysql dba工作笔记pdf_社区专家在线:Oracle数据库、MySQL、Db2 等数据库日常运维故障与性能调优在线答疑...
  6. javaScript第二天(2)
  7. ML、DL、CNN学习记录3
  8. 强化学习组队学习task06——DDPG 算法
  9. MagicDraw UML 16.8 安装教程(2)-破解补丁
  10. 编码器rtsp规则-各厂商
  11. Git提交错误:Permission denied (publickey),fatal: Could not read from remote reposito
  12. 分享一个基于labview的2048小游戏(附详细教程+代码)
  13. python查询12306余票_12306火车票余票查询Python实现邮件发送
  14. Terminal Emulator for Android(安卓终端模拟器)的使用
  15. 那天是一年的第几天?
  16. [Ubuntu 16.04] [Memos] install ssh
  17. JAVA的对象list参数的校验
  18. Kafka入门和使用
  19. 暑期实践第九天 2022-7-12
  20. ELK实践(一)使用es搭建商品搜索项目

热门文章

  1. 每个程序员1小时内必须解决的5个编程问题(转)
  2. verilog中generate用法及参数传递(转)
  3. asp.net: 应用母版页的页面,如何设置其标题?
  4. Mac新手技巧,如何使用 Safari 浏览器?
  5. VNC Connect Enterprise for mac(远程桌面软件)
  6. 如何解决PS软件工作区不能吸附到工具栏?
  7. 苹果/mac提供解决方法:macOS Big Sur 更新导致旧款 MacBook Pro 黑屏变砖
  8. 使用Movavi Photo Editor如何向视频中添加转场
  9. 在Node.js中发起HTTP请求的5种方法
  10. WPF笔记(1.8 资源与映射)——Hello,WPF!