expect

news/2025/3/18 20:26:57/文章来源:https://www.cnblogs.com/halu126/p/17425832.html

脚本开始

#!/usr/bin/expect

开启交互命令

spawn ssh $user@$ip

模式匹配

一般情况expect跟在 spawn后面 用来匹配spawn启动的命令的输出 并使用send给命令提供输入

也可以直接在命令行里进入expect解析器里,直接测试expect的模式匹配

expect单模式

expect 后面可以是单一分支

expect "hi" {send "You said hi\n"}

expect多模式

expect 后面也可以是多分支,有任何一个分支出现就可以,不分先后顺序, 有多个分支时,可以用{} 将所有的分支括起来,就可以换行了,单左{ 必须和expect 在同一行 expect "hi" { send "You said hi\n" } "hehe" { send "Hehe yourself\n" } "bye" { send "Good bye\n" }

expect eof

spawn启动的命令结束时,会返回eof, 脚本结尾的 expect eof 表示模式匹配 命令结束的eof 是一种特殊的模式匹配

exp_continue

exp_continue 在 expect 分支中出现,表示再次进入该expect,进行重复等待expect后面的分支出现,没有exp_continue时,执行完匹配的模式后,退出该expect,程序往后执行 expect "hi" {send "You said hi\n";exp_continue}

设置超时

设置超时时间 set timeout 10 #单位 秒

set timeout -1 # 用不超时

set timeout # 默认是10s

超时时间是指每个expect的超时时间, 如果expect后面有 exp_continue 会重置超时时间

变量

变量赋值

使用set 给变量赋值 变量不用声明,可以直接进行赋值 set password 123456wht # 默认就是字符串 set password "123456wht" # 我喜欢用双引号引住

使用变量

$password 直接引用 也可以把引用放到双引号里 expect "password" { send "$password\n" }

使用参数

set ip [lindex $argv 0] #第一个参数 set user [lindex $argv 1] #第二个参数

puts "${argv0}" # 获得命令名称

puts "$argv0" # 获得命令名称

puts "参数个数${argc}" puts [lindex ${argv} 0] #第一个参数 puts [lindex ${argv} 1] #第二个参数

脚本结束

expect eof 和 interact 都是放到脚本的最后 interact表示把交互主动权从expect交给用户,让用户进行后续的与程序的交互 expect eof表示 等待由spawn开启的程序结束

exit 直接结束交互 退出expect

执行shell命令

在expect中(其实是tcl种) 使用中括号括起来要执行的内容,并返回执行结果

常见有 set username [lindex ${argv} 0]

lindex是tcl种的一个命令: 从指定的list种取出 指定位置的元数

set password_file [exec sh -c "echo file_name"]

sh -c "xxxx命令字符串" 使用sh执行指定的命令字符串

调试脚本

expect -d expect脚本文件名称 会打印很详细的交互内容

在shell中调用 expect

expect <<-EOF set timeout 10 spawn ssh $user@$ip expect { "yes/no" { send "yes\n";exp_continue } "password" { send "$password\n" } } expect "]#" { send "useradd test\n" } expect "]#" { send "exit\n" } expect eof EOF

上面的一整段时shell的一行命令而已

使用expect来执行后面的字符串 <<-EOF 在shell中可以输入多行字符串,且是以EOF结尾,两种成对出现,将EOF换成abc也是一样的; 如果"<<-EOF"中没有"-"(形式:<<EOF) 结尾可以是eof/EOF 会跟expect eof冲突

疑问

在shell内执行时,可以直接使用shell定义的变量???

试了下可以耶

 

其他语法

支持 switch

`#!/usr/bin/expect set color [lindex $argv 0] switch $color { apple { puts "apple is blue" } banana { puts "banana is yellow " }

}`

支持if

#!/usr/bin/expect set test [lindex $argv 0] if { "$test" == "apple" } { puts "$test" } else { puts "not apple" }

支持for/ foreach

#!/usr/bin/expect for {set i 0} {$i<4} {incr i} { puts "$i" }

支持while

#!/usr/bin/expect set i 1 while {$i<4} { puts "$i" incr i }

支持 proc 定义函数

#!/usr/bin/expect proc test {} { puts "ok" } test

都跟c语言语法类型,注意expect里没有小括号,所有其他语言用到小括号的都使用大括号代替

 

 

参考

http://blog.leanote.com/post/wkf19911118@gmail.com/shell%E7%BC%96%E7%A8%8B%E4%B9%8Bexpect

https://www.cnblogs.com/ph829/p/5091302.html

https://yearn.xyz/posts/techs/tcl-%E8%AF%AD%E8%A8%80%E7%AE%80%E4%BB%8B/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901090.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20222227 实验一《Python程序设计》实验报告

20222227 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2222 姓名: 赫连紫阳 学号: 20222227 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的…

【STM32】超好用的开源按键状态系统lwbtn,以及超详细的移植教程

在 button_event_handler 按钮事件处理函数中,按键按下分为:按下,释放;按下类型又分为:单击、双击、持续按下。 这每一个状态/事件,进行过后,其都会进行一次回调,即回到主函数一次,故也是分为了1、按下 2、释放 3、单击 4、双击 5、持续按下 五个回调状态。 你可以在 …

rp2040笔记[1]-使用embassy实现呼吸灯并通过命令行切换状态

使用rust的embassy在rp2040芯片核心板实现呼吸灯.摘要 使用rust的embassy在rp2040芯片核心板实现呼吸灯. 关键词 rust;embassy;rp2040;blink;pwm; 关键信息项目地址:[https://github.com/ByeIO/byeefree.rp2040_quad.embassy][package] edition = "2021" name = &quo…

014 登入页-Element-Plus的图标引入和使用

1、安装图标 2、使用 这里我们用全局注册的方法 放到这里 现在我们换一种方式 在src文件夹里面 新建文件夹global,都是一些全局的东西(这个就叫全局注册) 新建文件register-icons.ts (注册图标)这页这样写这段代码是使用 JavaScript(或可能是 TypeScript,从 app: any…

20242405 实验一《Python程序设计》实验报告

20242405 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2424 姓名: 孙煜麟 学号:20242405 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能 3.编写程序,练习…

day:24 python——类的三大特性

python三大特性:封装,多态,继承 一、封装: 1、封装:封装就是隐藏对象一些不希望外部所访问到的属性和方法,保证安全 2、概念:指的是在设计时,不对外提供,隐藏起来,提供公共方法以外对其方法就是把属性和方法封装到一个抽象的类中, 3、封装相当于一个黑盒子,我们将事务相…

探秘Transformer系列之(15)--- 采样和输出

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(15)--- 采样和输出 目录探秘Transformer系列之(15)--- 采样和输出…

c语言02_数据类型上

一、c是怎么变成汇编的 1、裸函数是编译器不管的 ⑴写一个空函数(里面什么都不写),f7f5打开反汇编f11打开jmp什么都没写里面还是有一大堆(是编译器和连接器做的)⑵裸函数f7f5查看反汇编找到调用的函数0040D708f11打开再f11打开,里面一行汇编代码都没有⑶ ①空函数 f7f5运…

win11家庭版24H2,使用VMware虚拟机问题

一、安装VMware,提示 “安装程序检测到主机启用了 Hyper-v或 Device/credential Guard。。。”,我勾选了自动安装WHP后点击下一步,完成了VMware的安装。二、解压了一个虚拟机,用VMware打开并选择已复制虚拟机,出现“此平台不支持虚拟化”的错误,点击“是”也无法打开虚拟…

M-LAG

一、M-LAG简介 1.1 M-LAG使用场景​ M-LAG(Multichassis Link Aggregation Group)即跨设备链路聚合组,是一种实现跨设备链路聚合的机制。M-LAG主要应用于普通以太网络、VXLAN和IP网络的双归接入,可以起到负载分担或备份保护的作用。相较于另一种常见的可靠性接入技术——堆…

FastAPI测试策略:参数解析单元测试

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 探索数千个预构建的 AI 应用,开启你的下一个伟大创意第一章:核心测试方法论 1.1 三层测试体系架构 # 第一层:模型级测试 def test_user_model_validation():with pytest.raises(ValidationError):User(age=-5)…