shell中的交互模式:expect

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

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

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

  1、tcl下载与安装

    下载: wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz

    解压: 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是如何实现的。

 1 #!/usr/bin/expect
 2 set timeout 5
 3 set passwd {9m[S)UWe4r}
 4 spawn su root
 5 expect {
 6   "password" { send "$passwd\r";exp_continue }
 7   "Password" { send "$passwd\r";exp_continue }
 8   eof {;}
 9 }
10 exec sleep 5
11 expect {
12     "#" send{"touch tt\r"}
13     eof {;}
14 }
15 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,在执行完成后保持交互状态将控制权交给控制台;

谢谢!

原创博客,转载请注明出处!欢迎邮件沟通:[email protected]

原文地址:https://www.cnblogs.com/SunHuaJ/p/9098172.html

时间: 2024-11-13 01:59:00

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

在 shell 中使用 vi 模式

作为一名大型开源社区的参与者,更确切地说,作为 Fedora 项目的成员,我有机会与许多人会面并讨论各种有趣的技术主题. 我最喜欢的主题是"命令行"或者说 shell,因为了解人们如何熟练使用 shell 可以让你深入地了解他们的想法,他们喜欢什么样的工作流程,以及某种程度上是什么激发了他们的灵感. 许多开发和运维人员在互联网上公开分享他们的" dot 文件"(他们的 shell 配置文件的常见俚语),这将是一个有趣的协作机会,让每个人都能从对命令行有丰富经验的人中

shell 脚本交互模式expect批量上传ssh密钥

#!/usr/bin/bash###批量上传密钥 V.1.0 by chenght 2019-03-29 password=12345qwertfor i in {2..254} ######批量获取ip地址do{ip=192.28.1.$iping -c1 -W1 $ip &>/dev/null ####记录成功的ipif [ $? = 0 ];thenecho "$ip">>ip.txt EOF 交互内容容易出错,请注意 /usr/bin/expect &

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

matplotlib交互模式与pacharm单独Figure设置 觉得有用的话,欢迎一起讨论相互学习~Follow Me Matpotlib交互模式 在运行python程序时有时候需要生成以下的 动态图模式 来显示程序运行的结果 此时需要使用matplotlib的 交互模式 ,在Ipython中时默认使用交互模式的. 在pycharm中使用 import matplotlib.pyplot as plt plt.ion() .... plt.ioff() plt.show() 框架来开启 交互模

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

最近项目需求,需要写一些shell脚本交互,管道不够用时,expect可以很好的实现脚本之间交互,搜索资料,发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. expect是spawn: 后面加上需要执行的shell命令,比如说spawn sudo touch testfile 1.3 expect: 只有spawn执行的命令结果才会被expect捕捉到,因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,Li

Python 交互模式中 Delete/Backspace 键乱码问题

进入 Python 交互模式,按下 Delete/Backspace 键,会出现 ^H 字符 解决方式: 1. 进到 Python 的Modules目录 [[email protected] Python-2.7.12]# pwd/root/Python-2.7.12[[email protected] Python-2.7.12]# cd Modules/ 2. 取消文件中 readline 部分对应的注释 vim Setup readline readline.c -lreadline -l

shell 中嵌套expect 详解

之前我在写shell脚本中嵌套expect遇到了这样的问题,最后经过研究发现,在expect中的shell命令是需要转换才能生效的.否知错误百出,让人吐血不已.下面我讲解下我所遇到的问题. 我要实现通过ping检测存活主机.如果存活将这个IP存入root/uphost.txt 这个文件中.并且用expect免输密码登录存活主机.登录存活主机后,检测这个主机上的80是否开启,如果没有开启就开启80.    如果主机不存活.就将这个主机ip存在/root/downhost.txt. 现在的问题出在s

[shell脚本]-在shell中定义expect function

概述 使用shell脚本加expect 实现批量登录,互信等,免交互式操作,之前主要写两个脚本,一个是expect脚本里面主要是接受参数,进行ssh 免交互操作,另一个是shell脚本,里面调用expect的脚本,传入参数, 现在需要把expect和shell脚本内容全部合并在shell脚本中 可以用shell function 里面定义expect 例子: shell 脚本中定义function, 然后把<< EOF 所有内容,当作expect 标准输入 #!/bin/bash functi

python中命令行模式和交互模式

命令行模式和Python交互模式 1.看到类似C:\>是在Windows提供的命令行模式: 在命令行模式下,可以执行python进入Python交互式环境,也可以执行python hello.py运行一个.py文件. 2.看到>>>是在Python交互式环境下: 在Python交互式环境下,只能输入Python代码并立刻执行. 在命令行模式运行.py文件和在Python交互式环境下直接运行Python代码有所不同.Python交互式环境会把每一行Python代码的结果自动打印出来,

Linux CentOS 7 shell中的特殊字符及与管道相关的命令(cut,sort,wc,uniq,tee,tr,split)

一. shell特殊符号cut命令 1.特殊符号 * :任意个任意字符 ? :任意单个字符# :注释\ :转义字符 | :管道符 2.几个和管道相关的命令 (1) cut cut 把文件分段 cat /etc/passwd cut -d: -f 3  /etc/passwd    cut -d: -f 3,6,5  /etc/passwd cut -d: -f 3-6  /etc/passwd cut -c 10 /etc/passwd   取第十个字符 cut -c 5-10 /etc/pas