linux EXPECT

2023-11-18



    expect 概念
   Expect除支持Unix/Linux平台外,它还支持Windows平台
   用过secureCRT的人应该知道有个自动登录的设置,那就是利用expect实现的


    expect 安装需要那些包支持----tcl包和tk包
linux上

[root@str0121bk RPMS]# rpm -ivh expect-5.38.0-74.i386.rpm
warning: expect-5.38.0-74.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
error: Failed dependencies:
       libtcl.so.0 is needed by expect-5.38.0-74
        libtk.so.0 is needed by expect-5.38.0-74

solaris上  

expect-5.43.0-sol10-x86-local.gz Expect is a program that performs programmed dialogue with other interactive programs
- installs in /usr/local. You should also get tcl-8.5a4 , tk-8.5a4 and, if you don't have gcc installed, libgcc.

    

   expect几大基本命令
spawn telnet 192.168.1.12  激活一个Unix程序 
expect “   “             等待进程的某些字符串
send “   “               向进程发送字符串
send_user “   “          send_user相当于echo和printf
set timeout 5              expect 类似C SHELL,赋值用set语句,不用=
 

   expect 命令特点
   expect类似switch/case,能同时等待多个字符串,并对每一个字符串执行不同的操作
   expect还能理解一些特殊情况,如超时和遇到文件尾
expect timeout
expect eof


   expect { }——用于多个pattern,相当于case语句
expect {
 pattern
  {
   action
   }
 pattern
  {
   action
   }
  pattern
  {
   action
   }
}
 

  expect 的 括号要么不加,一加就是两层

expect "*$*"
send "exit\n"
expect {
        "*$*" 
        {
        send "exit\n"
        }
      }


   
   expect括号的作用

spawn ftp 10.1.1.1
...
expect timeout 
exit     

由于expect脚本是顺序执行的,那么当程序执行到这个expect timeout的时候就会阻塞,程序会一直等待到timeout然后退出
 expect { 
timeout exit 
Connect 
}     
换成括号,timeout只要被辨认,就会执行后面的exit



    其实不必特别处理expect { timeout exit 0 },expect 的set timeout 3就能解决异常中断/等待的问题
比如FTP SERVER连接不上时,仍执行自动FTP 脚本

set timeout 3      超过timeout,就跳过expect语句
                     执行expect下面的send语句
$ ./expecttest
spawn ftp 192.168.1.11
ftp: connect: Connection refused
ftp> macg     
?Invalid command
ftp> 008421

bin
?Invalid command
ftp> ftp> Not connected.
ftp> get asian_0264_4.mpg
Not connected.
ftp> quit
success 



   expect函数
定义在前
proc name {参数1 参数2} {
command
command
}
引用在后
name 参数1值  参数2值


   expect文档内命令行参数的引用: [ index $argv num ]
spawn ftp [index $argv 1]
expect "*Name*"
send "anonymous "
expect "*Password:*"
send [exec whoami]
expect "*ok*ftp>*"
send "get [index $argv 2] "
expect "*ftp>*"


   usage: send [args] string


   interact指令 ----在expect 里面引如interact交互动作,使expect更灵活,可以自动也可以手动

for {} {1} {} {
expect
eofbreak
"*UNREF FILE*CLEAR?"{send "r "}
"*BAD INODE*FIX?"{send "y "}
"*?"{send "n "}
}
for {} {1} {}{
expect
eofbreak
"*UNREF FILE*CLEAR?"{send "y "}
"*BAD INODE*FIX?"{send "y "}
"*?"{interact +}
}

在这个版本里面,如果脚本遇到了”?”执行interact命令把控制交给用户
此时用户的手工输入击键交给fsck处理。
当执行完后,用户可以通过按"+"键来退出或者把控制交还给expect



=================================expect编程注意事项=======================================

   expect 必须带#!/usr/bin/expect,否则运行出错

   send 如何输入回车符号? 
正规的回车是\n ,注意是反杠,参数杠,不是目录杠
$ vi expecttest
#!/usr/bin/expect
set timeout 3
spawn telnet 192.168.1.12
expect "*login:*"
exec sleep 1
send "test\n"           回车
expect "*Password:*"
exec sleep 1
send "008421\n"         回车
expect "*test*"
exec sleep 1   
也可以用直接用回车,缺陷是带换行,使send语句分到两行中
#!/usr/bin/expect
set timeout 3
spawn telnet 192.168.1.12
expect "*login:*"
exec sleep 1
send "test
"                
expect "*Password:"
exec sleep 1
send "008421
"                    


   expect " "内不能包含特殊符号

expect "*[test*" 想匹配[test@localhost ~]$
系统报错
missing close-bracket
    while executing
"expect "*[test*"


            
    expect 后不必只跟一个send指令,可以跟多个send 指令
      expect "*$*"
        send "uname -p\n"
       expect "*$*"
        send "pwd\n"
        send "ls -l\n"
[test@localhost ~]$ uname -p
i686
[test@localhost ~]$ pwd
/home/test
[test@localhost ~]$ ls -l
total 4             


    expect 输入 sleep 是经常的,因为自动执行受制于系统响应时间和send内指令的执行时间
expect 没有抑制后边send指令的机能
所以只能人为加 sleep 指令

expect "ftp>"
send "bin\n"
exec sleep 1
send "get asian_0264_4.mpg\n"
exec sleep 1
expect "ftp>"
send "quit\n"   
ftp> get asian_0264_4.mpg
local: asian_0264_4.mpg remote: asian_0264_4.mpg
227 Entering Passive Mode (192,168,1,11,4,10).
150 Opening data connection for asian_0264_4.mpg.
quit
226 Transfer complete.
  Sleep 1太短了,还没传完,就quit了
expect "ftp>"
send "bin\n"
exec sleep 1
send "get asian_0264_4.mpg\n"
exec sleep 4
expect "ftp>"
send "quit\n"   
ftp> bin
200 Type set to I.
ftp> get asian_0264_4.mpg
local: asian_0264_4.mpg remote: asian_0264_4.mpg
227 Entering Passive Mode (192,168,1,11,4,11).
150 Opening data connection for asian_0264_4.mpg.
226 Transfer complete.
1269764 bytes received in 1.4 seconds (8.6e+02 Kbytes/s)
ftp> quit
221 Goodbye!  



   上面例子的另一个解决办法:选择合理的expect pattern, 可以避免执行sleep指令

#!/usr/bin/expect
set timeout 3

spawn ftp 192.168.1.11
expect "*Name*"
exec sleep 1
send "macg\n"
expect "*Password:*"
exec sleep 1
send "008421\n"
send "\n"
expect "ftp>"
send "bin\n"
expect "*set to I*"
send "get asian_0264_4.mpg\n"
expect "*complete*"
expect 合理的上一条指令的输出,好send下一条指令
send "quit\n"
expect "*$*"
send_user "success\n"
$ ./expecttest
spawn ftp 192.168.1.11
Connected to 192.168.1.11.
221 Goodbye!
500 'AUTH': command not understood.
500 'AUTH': command not understood.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.11:macg): macg
331 Password required for macg.
Password:
230 User macg logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ftp> bin
200 Type set to I.
ftp> get asian_0264_4.mpg
local: asian_0264_4.mpg remote: asian_0264_4.mpg
227 Entering Passive Mode (192,168,1,11,4,70).
150 Opening data connection for asian_0264_4.mpg.
226 Transfer complete.
1269764 bytes received in 1.5 seconds (8.4e+02 Kbytes/s)
ftp> quit
221 Goodbye!
success   



   
    expect 文件缺陷,最后一个expect语句后面的所有send语句都不执行   所以为了让所有的send语句都执行,必须用一个不带send 的expect语句结尾
(但最后一个expect语句后面的send_user语句会被执行)

$ vi expecttest
#!/usr/bin/expect
set timeout 3

spawn telnet 192.168.1.12
expect "*login:*"
exec sleep 1
send "test\n"
expect "*Password:*"
exec sleep 1
send "008421\n"
        send "\n"
expect "*$*"                   此句成了最后一个expect语句
send "pwd\n"
send "ls -l\n"

send_user "success\n"

$ ./expecttest
spawn telnet 192.168.1.12
Trying 192.168.1.12...
Fedora Core release 4 (Stentz)
Kernel 2.6.11-1.1369_FC4 on an i686
login: test
Password:
                                 发觉send pwd和ls –l语句都没有执行
[test@localhost ~]$ success      但send_use指令被执行
$ vi expecttest
#!/usr/bin/expect
set timeout 3

spawn telnet 192.168.1.12
expect "*login:*"
exec sleep 1
send "test\n"
expect "*Password:*"
exec sleep 1
send "008421\n"
        send "\n"
expect "*$*"
send "pwd\n"
send "ls -l\n"

expect "*$*"       结尾填加一个没什么用处的expect "*$*"



$ ./expecttest
spawn telnet 192.168.1.12
Trying 192.168.1.12...
login: test
Password:
[test@localhost ~]$
[test@localhost ~]$ pwd
/home/test
[test@localhost ~]$ ls -l
total 4                  结尾填加的expect,使最后两句send指令可以执行
-rw-rw-r--  1 test test 0 Jan  2 21:26 11

 

http://blog.sina.com.cn/s/blog_6151984a0100emri.html

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux EXPECT 的相关文章

  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while

随机推荐

  • 嵌入式开发——文件系统部署rz、sz命令

    1 rz sz命令源码下载 下载网址 https ohse de uwe software lrzsz html 2 源码编译 tar zxvf lrzsz 0 12 20 tar gz cd lrzsz 0 12 20 configure
  • 小滴课堂-新版JavaWeb零基础到实战专题课程-19

    目录 前言 第十九章 javaweb项目实战之小滴课堂开发者论坛数据库设计 第1集 小滴课堂开发者论坛数据库ER关系图设计 第2集 小滴课堂开发者论坛Mysql相关表录入 前言 小滴课堂 旨在让编程不在难学 让技术与生活更加有趣 随着互联网
  • 转」最佳方案:迭代式开发

    前言 Fred Brooks 在 25 年前就曾写到 不要指望一次成功 无论如何你都要这样 敏捷开发 小步快跑 持续迭代 不断改进 产品升级 在用例需要之前 不要添加数据成员 在代码之前编写测试 过早的优化时万恶之源 不要过度强调代码的通用
  • 一文读懂网联-网联的业务方案和技术实现(1)

    支付产品设计必知的支付底层逻辑 网联平台全业务功能详解 2 我想 银联 大家都不陌生 我们用的银行卡基本都是银联卡 而网联想必很多人并不清楚 其实网联和银联在一个职能上平分秋色 电子支付的清算机构 我们国家并驾齐驱的2家清算机构 网联与银联
  • python学习基础(3)—循环、数据结构及函数

    循环 数据结构及函数 循环 for循环及循环嵌套 break及continue命令 while循环 列表 元组结构及字典结构 高级列表操作 高级字典操作 函数 自定义函数 系统内置函数 导入包 循环 python循环命令有两个 for循环用
  • DirectShow中H.264 SourceFilter的Pin配置

    对DirectShow SourceFilter 要在Pin上输出H 264码流 需要注意如下设置 majortype MEDIATYPE Video 73646976 0000 0010 8000 00AA00389B71 subtype
  • UNet 浅析

    文章目录 1 UNet 简介 2 UNet 详解 3 代码实例 医学图像分割 ISBI数据集 参考 1 UNet 简介 UNet 属于 FCN 的一种变体 它可以说是最常用 最简单的一种分割模型 它简单 高效 易懂 容易构建 且可以从小数据
  • 【白嫖系列】永久免费域名申请教程 eu.org

    Welcome to Aedream同学 s blog 文章目录 eu org 注册 激活注册 域名解析 eu org eu org 一个从1996开始提供免费域名的组织 其官网地址是 https nic eu org 他帮助学生 爱好者或
  • Unity的Animator与Animation之间的简单区别

    一 Animator 1 动画控制器 实现控制多个动画的播放 切换及叠加系列复杂的效果 相当于一个动画状态机 生成动画的时候不仅有动画文件 还会生成相应的 controller文件 因此占用的资源比较大 2 Animator组件介绍 Con
  • Mysql(一)三大范式、数据类型、常用函数、事务

    文章目录 一 SQL基础 1 1 SQL通用语法 1 2 SQL分类 1 2 1 DDL语句 1 2 2 DML语句 1 3 HAVNG子句和WHERE的异同点 1 4 SELECT 和 SELECT 全部字段 的写法对比 1 5 三大范式
  • C# Winform中窗体的美化—— 用IrisSkin轻松实现换肤功能

    今天经前辈提醒才知道winform窗体还有美化工具 呵呵 不得不说 孤陋寡闻了 下面总结一下irisskin2的使用步骤和遇到的问题及解决办法 1 网址 http www pc6 com softview SoftView 70918 ht
  • 解决OpenCV在Cmake时,因网络问题无法下载部分所需文件

    解决OpenCV在Cmake时 因网络问题无法下载部分所需文件 在安装CUDA Opecv进行Cmake的过程中 因为网络问题很多文件都无法下载 可以在你的opencv cache下可以看到 很多文件都是0kb的 这样肯定是不行的 我们要保
  • 6款字体转换工具网站,一键生成想要字体!

    第一字体 https www diyiziti com 图文图文吗 有图无文怎么行 平时没事儿咱也喜欢舞文弄墨一番 不过茶壶儿这书法比起名仕还是自叹不如哈 然而不得不说中国文字真的是博大精深 各种字体就像人生一样充满奇妙 第一字体网就为您提
  • postgresql 数据库版本升级 11.5升级14

    postgresql 数据库版本升级 11 5升级14 文章目录 postgresql 数据库版本升级 11 5升级14 前言 一 漏洞详情 二 版本升级 1 pg upgrade的用法 2 2 安装pg14 版本升级 后记 前言 最近因为
  • 算法_选择排序

    选择排序 选择排序的思想 对于一个给定的具有n个数的数组 从中依次找出最小 或最大 的元素 并且将它依次放到序列的起始位置 例如 4 2 7 8 10 1 5 第一次排序 1 2 7 8 10 4 5 第二次排序 1 2 7 8 10 4
  • Doris--基础--10--数据模型

    Doris 基础 10 数据模型 1 基本概念 在 Doris 中 数据以表 Table 的形式进行逻辑上的描述 一张表包括行 Row 和列 Column Row 用户的一行数据 Column 用于描述一行数据中不同的字段 1 1 Colu
  • 关于uniapp小程序端提示v-for 暂不支持循环数据问题的解决方案

    关于uniapp小程序端提示v for 暂不支持循环数据问题解决方案 需求描述 在uniapp小程序此项目中使用多层for循环时 小程序端提示 uniapp v for 暂不支持循环数据 以至于获取不到循环的数据 解决方案
  • JAVA的并发编程(八):Disruptor并发框架

    目录 一 Disruptor并发框架 1 介绍 2 关键知识点 3 实现方法 1 RingBuffer Disruptor 单线程 2 RingBuffer Squencebarrier BatchEventprocessor 多线程 单生
  • 杭电OJ 1002 A + B Problem II

    A B Problem II 页面数据来自 this page from http acm hdu edu cn showproblem php pid 1002 Time Limit 2000 1000 MS Java Others Me
  • linux EXPECT

    expect 概念 Expect除支持Unix Linux平台外 它还支持Windows平台 用过secureCRT的人应该知道有个自动登录的设置 那就是利用expect实现的 expect 安装需要那些包支持 tcl包和tk包 linux