Shell编程基础(十一)使用 expect 脚本处理人机交互

这篇具有很好参考价值的文章主要介绍了Shell编程基础(十一)使用 expect 脚本处理人机交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

安装expect

先检测是否有安装

yum list installex expect

或者 使用 rpm
rpm -q expect

如果没有安装,就先安装

yum install -y expect

适用场景

我们在执行某些程序时,可能会出现需要用户在过程中输入某些选项才能继续执行的场景。
比如
删除一个文件时,如果没有使用 -f 参数,系统会提示是否确认删除

rm tt.txt
rm: remove regular empty file ‘tt.txt’?

rm tt.txt
rm: remove regular file ‘tt.txt’?

又或者 ssh 远程连接服务器,也会有一些需要用户输入的东西

ssh root@192.168.0.104
The authenticity of host '192.168.0.104 (192.168.0.104)' can't be established.
ECDSA key fingerprint is SHA256:SK7IZ3gggoPEzJJXgp4RSQ8IFiPLOW/SMhwomRMR9kI.
ECDSA key fingerprint is MD5:d6:a5:d6:84:a3:f4:dd:ed:f5:ce:4a:67:c3:cd:cf:16.
Are you sure you want to continue connecting (yes/no)?

当我们确认连接后,又会弹出输入密码的提示

Warning: Permanently added '192.168.0.104' (ECDSA) to the list of known hosts.
root@192.168.0.104's password:

如果我们想要实现一些自动话的操作,是会被卡在这里的。

编写expect实现人机交互

基于上面两个场景,分别编写两个expect脚本处理
expect 大致的语法结构为

spawn 需人机交互的命令
expect 必须有空格 {
“交互提示语中的词,就模糊匹配,包含就行” {send “要输入的内容**\r**”} \r 或 \n 不可少,表示回车确认
}
执行完命令后。如果expect 执行环境开启了一个的shell进程,则需要考虑执行完后对expect所在 shell进程的处理 interact (停留在所属shell进程中),expect_eof (退出所在shell进程)
如果只是在本机执行简单命令,则需要处理

自动确认删除文件

#!/usr/bin/expect
spawn rm tt.txt
expect {
  "rm: remove regular" {send "y\n"}
}
  1. 声明脚本解释器
  2. 使用 spawn 调起需要交互的程序
  3. 定义 匹配的提示信息以及对应的输入信,再通过 \r 或者 \n 确认

登录远程服务器自动确认并输入密码

#!/usr/bin/expect
spawn ssh root@192.168.0.104
expect {
 "yes/no" {send "yes\r";exp_continue}
 "password" {send "root\r"}
}
interact
  1. 声明 expect 脚本解释器
  2. 调起 需要交互的程序
  3. 匹配提示信息,并给定模拟输入的信息;exp_continue:如果匹配过了该项,在当前交互中还能继续匹配后面的交互信息
  4. interact,一旦ssh连接成功,此时的shell进程是远程机器上的进程;一般连接上机器后,还会做一些其他操作;因此这里使用 interact 保留当前会话,以便于执行后面的其他命令

在shell中执行 expect 脚本程序

expect 主要应用场景就是模拟用户与机器交互。一旦需要用户确认的交互完成后。通常还是会回到 shell 环境中进行其他工作。
因此,通常会将expect 脚本嵌入到 shell 脚本中,让expect做完自己那一部分工作就回到shell环境中。
我们可以直接在 shell脚本中直接编写expect 代码 或者 在shell 中调用expect脚本

  • 直接在shell中编写expect代码,**expect eof **
#!/bin/bash
echo "连接远程服务器..."
/usr/bin/expect <<-EOF
spawn ssh root@192.168.0.104
expect {
"yes/no" {send "yes\r";exp_continue}
"password" {send "root\r"}
}
# 在目标机器上查看ip
expect "#" {send "ip a\r"}
# 立即退出目标机器,如果没有这行,会等待默认超时时间10s,退出
expect "#" {send "exit\r"}

expect eof
EOF

以上脚本执行的功能是:
连接远程服务器-确认连接-输入密码-然后登录成功后的提示符是类似 [用户@host 当前目录]# 这样的提示 - 再进行匹配,然后执行 ip a 命令,查看目标机器id - 再匹配 # 退出远程连接,回到本地机器。

  • 在shell中调用expect脚本(通过 interact 和 expect eof 控制连接后,保持连接还是退出 而且这种有更好的维护体验,各管各嘛)
    expect.exp 脚本内容
#!/usr/bin/expect
spawn ssh root@192.168.0.104
expect {
 "yes/no" {send "yes\r";exp_continue}
 "password" {send "root\r"}
}

expect "#" {send "ip a\r"}

interact # 保持当前连接

调用 expect 的shell脚本

#!/bin/bash
/usr/bin/expect ./expect_login.exp

以上。文章来源地址https://www.toymoban.com/news/detail-636360.html

到了这里,关于Shell编程基础(十一)使用 expect 脚本处理人机交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux实验4 shell脚本编程基础

    1.假设在/tmp下有以当前用户的帐号命名的目录,请在命令行中临时修改环境变量PATH的值,要求该目录的路径附加到该变量的最后。 2.请在命令行中临时设置命令输入提示行格式为:“当前系统时间-用户#”。 3.在命令行定义一个字符串变量str,并且赋值为“test for shell”,然

    2024年04月17日
    浏览(52)
  • shell脚本——循环语句、sed、函数、数组、免交互expect

    目录 循环语句 for while 与 until sed 基本用法 sed脚本格式 函数 注意事项 定义函数和调用函数 脚本中函数的位置 查看函数 删除函数 函数返回值 函数的传参操作 使用函数文件 递归函数  数组 声明数组 数组切片 免交互expect 定义  基本命令 for循环需要知道循环的次数 格式1:

    2024年02月11日
    浏览(64)
  • Shell脚本编程实践——第3关:使用Shell脚本创建文件目录

    任务描述 本关任务:设计一个Shell程序,在/home目录下建立一个userdata目录,在userdata目录下再建立5个目录,即user1~user5,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。 相关知识 为了完成

    2023年04月22日
    浏览(46)
  • Shell脚本同时调用#!/bin/bash和#!/usr/bin/expect

    如果你想在一个脚本中同时使用bash和expect,你可以将expect部分嵌入到bash脚本中。以下是一个示例: 在这个示例中,我们使用了bash来设置变量和调用expect。然后,我们使用 EOF 和 EOF 来定义一个here文档,其中包含了expect的命令。这样,bash脚本就可以在执行expect命令后继续执行

    2024年01月17日
    浏览(50)
  • 【Linux】shell 脚本基础使用

    在终端中输入命令可以完成一些常用的操作,但是我们都是一条一条输入命令,比较麻烦,为了解决这个问题,就会涉及到 shell 脚本,它可以将很多条命令放到一个文件里面,然后直接运行这个文件即可。 shell 脚本类似 Windows 的批处理文件 shell 脚本就是将连续执行的命令写

    2024年04月23日
    浏览(47)
  • Linux:shell脚本:基础使用(2)

    格式1:test  条件表达式 格式2:[  条件表达式  ]  (前后至少应有一个空格) 常用的测试操作符 -d:测试是否为目录(Directory) -e:测试目录或文件是否存在(Exist) -f:测试是否为文件(File) -r:测试当前用户是否有权限读取(Read) -w:测试当前用户是否有权限写入(Writ

    2024年02月13日
    浏览(53)
  • Linux:shell脚本:基础使用(4)《正则表达式-grep工具》

    正则表达式定义:         使用单个字符串来描述,匹配一系列符合某个句法规则的字符串 正则表达式的组成:         普通字符串: 大小写字母,数字,标点符号及一些其他符号         元字符:在正则表达式中具有特殊意义的专用字符 正则表达式不能单独使用,需要配

    2024年02月12日
    浏览(38)
  • Linux:shell脚本:基础使用(6)《正则表达式-awk工具》

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 1)awk命令会逐行读取文件的内容进行处理 2)awk以’:’为分隔符,将第1行数据格式化为7段,每段数

    2024年02月12日
    浏览(42)
  • 掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作等

    目录 专题一 认识主被动无人机遥感数据 专题二 预处理无人机遥感数据 专题三 定量估算农林植被关键性状 专题四 期刊论文插图精细制作与Appdesigner应用开发 近地面无人机植被定量遥感与生理参数反演 更多推荐 遥感技术作为一种空间大数据手段,能够从多时、多维、多地等

    2024年02月16日
    浏览(57)
  • Shell脚本编程进阶

    Shell脚本编程进阶 定义 for循环中LIST列表的生成方式 (1) 直接给出列表 (2) 整数列表: (3) 使用可以返回列表的命令 (4) 使用glob,如:*.sh (5) 变量引用 for特殊格式定义及使用 while循环定义 continue [N]:提前结束第N层的 本轮循环 ,而直接进入下一轮判断;最内层为第1层 break [N]:提

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包