在shell开发中,我们连接FTP或者passwd或sudo等操作时,需要手动输入密码。对于自动化而言,这显然是不合适的。而expect的强交互模式解决了这个问题。工作中偶有涉及到这个,个人也是简单的了解,解决实际问题,作学习记录。

一:安装【参考地址:https://www.cnblogs.com/lixigang/articles/4849527.html

  expect需要Tcl编程语言的支持,所以expect需要安装两个东西。一个tcl,一个expect;[安装前,可通过 "which/whereis expect"判断服务器是否已安装]

  1、tcl下载与安装

    解压: tar -xzvf tcl8.4.11-src.tar.gz   【-C 目标地址]
    配置:cd tcl8.4.11/unix && ./configure --prefix=/usr/tcl --enable-shared && make &&make install
    拷贝:安装完毕以后,将目录unix下面的tclUnixPort.h copy到tcl8.4.11 目录下的generic目录中
  2、expect下载与安装
    下载:wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
    解压:tar -xzvf  expect5.45.tar.gz
    配置:cd expect5.45   [切换到解压路径下]
       安装: ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic  && make && make install 
  3、创建软链
    ln -s /usr/expect/bin/expect /usr/bin/expect   [指向引用,这时可以检查一下自己的Linux是否已安装expect。有的话就安装正确了。]
 
 
二:命令介绍
  我们通过对一个简单脚本的分析,来看看expect是如何实现的。
 #!/usr/bin/expect
set timeout
set passwd {9m[S)UWe4r}
spawn su root
expect {
"password" { send "$passwd\r";exp_continue }
"Password" { send "$passwd\r";exp_continue }
eof {;}
}
exec sleep
expect {
"#" send{"touch tt\r"}
eof {;}
}
expect eof

1、#!/usr/bin/expect

        如果通过sh命令方式调用,则忽略该语句,实际脚本仍以bash脚本语言来执行,应用expect命令调用该文件;如将expect文件赋予可执行权限,输入对应路径加文件名(或./文件名),即可实现expect脚本语言方式处理【如果处理过程中,还希望用到bash,可通过在bash脚本中添加/bin/bash方式,调用bash shell。】

2、set timeout 10
        设置超时时间,单位:秒
 
3、设置变量passwd
    通过set方式,不需要添加“=”,也可以通过$args传递参数,使用[lindex $args n]调用参数,其中n从0开始, 分别表示第一个,第二个,第三个....参数。如我们将传递的第一个参数赋值给脚本内部变量:set  my_var "[lindex $args 0]"
4、spawn  su root
    启动一个进程,并给这个进程加上一个外壳,可用来传递交互信息。
 
5、expect ...
    是expect的一个内部命令,等待进程发送的某些字符串(如"password");类型于switch/case,能同时等待多个字符串,并对每一个字符串执行不同的操作。本例中使用了大括号(必须两个),也可以直接后接字符串如:expect “Password”  ;send "$passwd\r"
    使用exp_continue后,会重新从当前expect块的开始重新执行,可以简单理解问while循环的continue
 
6、sleep
    由于自动执行受限于系统响应时间和send内指令的执行时间,设置sleep时间,单位:秒
 
7、eof
    进程的结束在expect的最后有两种选择。一个是用eof匹配,在spawn进程结束后会向expect发送eof,结束进程。也可以使用interact,在执行完成后保持交互状态将控制权交给控制台;
 
谢谢!
 
 
 
 原创博客,转载请注明出处!欢迎邮件沟通:shj8319@sina.com
 

shell中的交互模式:expect的更多相关文章

  1. shell 中scp密码输入 --expect

    这里必须先安装: yum install expect -y expect是一种自动交互语言,能实现在shell脚本中为scp和ssh等自动输入密码自动登录. 下面给出scp和ssh的使用示例: 1. ...

  2. matplotlib交互模式与pacharm单独Figure设置

    matplotlib交互模式与pacharm单独Figure设置 觉得有用的话,欢迎一起讨论相互学习~Follow Me Matpotlib交互模式 在运行python程序时有时候需要生成以下的 动态 ...

  3. linux shell执行中需要交互输入回车,Yes/NO Y/N

    最近写自动安装脚本遇到redis-server安装的时候,需要输入3个回车,对此尝试无果,最后google比较满意的解决办法: shell 脚本需要交互,比如输入回车,输入YES/NO Y/N之类进行 ...

  4. shell脚本交互:expect学习笔记及实例详解

    最近项目需求,需要写一些shell脚本交互,管道不够用时,expect可以很好的实现脚本之间交互,搜索资料,发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. ...

  5. shell中交互输入自动化

    shell中交互输入自动化 shell中有时我们需要交互,但是呢我们又不想每次从stdin输入,想让其自动化,这时我们就要使shell交互输入自动化了.这个功能很有用的哟.好好学习. 1    利用重 ...

  6. shell 中的expect 用法

    expect一般用于实现用脚本来自动远程登录,对远程机器执行相关操作 测试机上的expect目录一般在/usr/bin/expect路径 下面是从网上查询的用法总结: 1. expect中的判断语句: ...

  7. Shell 编程 免交互 expect

    本篇主要写一些shell脚本免交互expect的使用. 概述 Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题. 安装 ...

  8. shell中使用expect命令进行远程执行命令脚本

    expect是用来实现自动交互功能的工具之一,使用expect-send来实现交互过程. 注意: 1.脚本的执行方法与bash shell不一样,比如:expect example.sh 2.向一个脚 ...

  9. linux自动化交互脚本expect详解set timeout 5是 意思是在expect语句中,5s后超时,不再作出选择。

    linux自动化交互脚本expect详解  更新时间:2020年10月21日 10:13:20   作者:lendsomething     这篇文章主要介绍了linux自动化交互脚本expect的相 ...

随机推荐

  1. 【1】Django概述

    道生一,一生二,二生三,三生万物 无名天地之始,有名万物之母 ——老子 python程序web项目开发,是非常重要的一部分,Python为基础的web项目开发的框架有很多,django无疑是最强大we ...

  2. springboot整合mybatis统一配置bean的别名

    mybatis.type-aliases-package=cn.byzt.bean 只需要将 javaBean 的路径配置到 springboot 的配置文件中,这里如果是多个路径,用英文逗号分隔多个 ...

  3. 【 Codeforces Round #519 by Botan Investments B】Lost Array

    [链接] 我是链接,点我呀:) [题意] [题解] 枚举k 不难根据a得到x[0..k-1] 然后再根据a[k+1..n]来验证一下得到的x是否正确就好. [代码] #include <bits ...

  4. How many integers can you find

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  5. eclipse实现批量修改文件的编码方式

    http://blog.csdn.net/haorengoodman/article/details/38493007 在eclipse+MyEclipse环境下,打开一个jsp文件,经常发现汉字无法 ...

  6. 【日常学习】【搜索/递归】codevs2802 二的幂次方题解

    转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看 题目描写叙述 Description 不论什么一个正整数都能够用2的幂次方表示. 比如:13 ...

  7. POJ 2068

    就是必胜点与必败点的计算而已.计算每一种情况.设st[i][j]为在第i个人剩下j个石头时的情况,拿它转移后的情况比较.可以到达必败点,则当前为必胜点.若只能到达必胜点,则当前点为必败点. #incl ...

  8. chcp - 设置或者显示活动代码页编号

    chcp - 设置或者显示活动代码页编号 学习了:https://baike.baidu.com/item/CHCP/9061635?fr=aladdin

  9. hdu - 3498 - whosyourdaddy(反复覆盖DLX)

    题意:N(2 ≤ N ≤ 55)个点,M(0 ≤ M ≤ N*N)条无向边,删除一个点会把与其相邻的点一起删掉.问最少删几次能够删掉全部点. 题目链接:pid=3498">http:/ ...

  10. 安装多个版本号jdk后java -version不改变的问题解决

    1.问题 比方先安装了jdk7后,再安装jdk6,java -version就是显示java1.6,即使把JAVA_HOME和path改动为java7的路径,java -version依旧还是显示6. ...