在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. js获取数组中任意一项

    1.获取数组任一项 在一些实际应用场景中,会要求实现一个随机的需求,随机获取某一项,来展示出来,都知道要通过javaScript的Math.random()方法来实现,这里我在Array的原型上添加了 ...

  2. 简述synchronized和java.util.concurrent.locks.Lock的异同

    1.synchronized 用在方法和代码块的区别? a. 可以只对需要同步的使用 b.与wait(),notify()和notifyall()方法使用比较方便 2.wait() a.释放持有的对象 ...

  3. Spring Boot实例Hello World Demo

    Spring Boot要求Maven的版本达到3.2或以上. 实例: POM: <project xmlns="http://maven.apache.org/POM/4.0.0&qu ...

  4. Linux文件查找命令find(转)

    Linux find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录 ...

  5. [Java]对字符串中的每一个单词个数进行统计

    这是来自一道电面的题. 单词统计非常easy想到用Map来统计,于是想到了用HashMap. 可是我却没有想到用split来切割单词,想着用遍历字符的方式来推断空格.人家面试官就说了,假设单词之间不止 ...

  6. 使用URL在线语音合成

    近期一直在做手机的项目,用到了语音合成与识别的功能.就找了几个网址做了分析,这里只实现了内容的合成.并不包括语音识别. 首先看一下谷歌的语音合成地址: http://translate.google. ...

  7. Dozer--第三方复制工具,哎哟,还不错!

    Dozer简单点说,就是拷贝工具,也是复制工具的意思,官方的解释是:Dozer is a Java Bean to Java Bean mapper that recursively copies d ...

  8. Shell脚本递归打印指定文件夹中全部文件夹文件

    #!/bin/bash #递归打印当前文件夹下的全部文件夹文件. PRINTF() { ls $1 | while read line #一次读取每一行放到line变量中 do [ -d $1/$li ...

  9. [源码管理] Windows下搭建SVN服务器

    前文所述SVN客户端使用的时候,用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行有效 ...

  10. BZOJ-4706 B君的多边形 OEIS

    题面 题意:有一个正n多边形,我们要连接一些对角线,把这个多边形分成若干个区域,要求连接的对角线不能相交,每个点可以连出也可以不连出对角线,即最终不要求所有区域均为三角形,问总方案数mod (10^9 ...