expect实现自动交互由浅入深

作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

安装expect,直接yum install expect -y

expect中相关命令

命令 解释
spawn 启动新的进程
send 用于向进程发送字符串
expect 从进程接收字符串
interact 允许用户交互
exp_continue 匹配多个字符串在执行动作后加此命令

一般步骤:

启动expect进程(spawn)--> 接收进程字符串(expect) --> 匹配字符串,成功发送字符串(send),否则等待 --> 结束

好了就直接步入主题吧,不扯那些没用的。直接上实例:

一. 入门例子:实现自动登录

  1. [root@localhost shell.sh]# vim test.exp
  2. #!/usr/bin/expect
  3. set timeout 30
  4. spawn ssh -l root 192.168.1.106
  5. expect {
  6. "(yes/no)?" { send "yes\r" }
  7. "password:" { send "jiajie\r" }
  8. }
  9. interact
参数 解释
#!/usr/bin/expect 说明使用的shell环境
set timeout 30 设置超时时间,单位为秒,-1为没有限制
spawn ssh... 需要执行的命令,这里是ssh登陆命令
expect "(yes/no)?" 判断上次输出结果里是否包含(yes/no)?的字符串
send "yes\r" 执行交互动作,接轨上一个命令,如果上面的expect执行成功,则发送yes
interact 执行完成后保持交互状态,把控制权交给控制台

执行该实例:./test.exp

如果报错-bash: ./test.exp: Permission denied,给744权限即可。

二. 使用变量:

[root@localhost shell.sh]# vim test.exp

  1. #!/usr/bin/expect
  2. set ip 192.168.1.106
  3. set user root
  4. set password jiajie
  5. set timeout 30
  6. spawn ssh -l $user $ip
  7. expect {
  8. "(yes/no)?" { send "yes\r";exp_continue }
  9. "password:" { send "$password\r" }
  10. }
  11. interact

set:设置变量,后面直接变量,通过“$变量名”来调用

三. 使用位置参数:

  1. [root@localhost shell.sh]# vim test.exp
  2. #!/usr/bin/expect
  3. if {$argc!=3} {
  4. send_user "Usage:expect need three arguments:ip user password\n"
  5. exit 1
  6. }
  7. set ip [lindex $argv 0]
  8. set user [lindex $argv 1]
  9. set password [lindex $argv 2]
  10. set timeout 30
  11. spawn ssh -l $user $ip
  12. expect {
  13. "(yes/no)?" { send "yes\r";exp_continue }
  14. "password:" { send "$password\r" }
  15. }
  16. interact

[lindex $argv num]:表示位置参数,从num=0开始

send_user: 打印当前提示,相当于shell里的echo.

四. 执行多个命令:

  1. [root@localhost shell.sh]# vim test.exp
  2. #!/usr/bin/expect
  3. if {$argc!=3} {
  4. send_user "Usage:expect need three arguments:ip user password\n"
  5. exit 1
  6. }
  7. set ip [lindex $argv 0]
  8. set user [lindex $argv 1]
  9. set password [lindex $argv 2]
  10. set timeout 30
  11. spawn ssh -l $user $ip
  12. expect {
  13. "(yes/no)?" { send "yes\r";exp_continue }
  14. "password:" { send "$password\r" }
  15. }
  16. expect "]#" { send "useradd jj\r" }
  17. expect "]#" { send "echo jiajie|passwd --stdin jj\r" }
  18. send "exit\r"
  19. expect eof
  20. exit -onexit {
  21. send_user "useradd jj is successfully.\n"
  22. send_user "Jobs has finished,Goodbye.\n"
  23. }

执行后的结果输出:

  1. [root@localhost shell.sh]# ./test.exp 192.168.1.106 root jiajie
  2. spawn ssh -l root 192.168.1.106
  3. root@192.168.1.106's password:
  4. Last login: Sat Sep 9 03:47:48 2017 from web
  5. [root@localhost ~]# useradd jj
  6. [root@localhost ~]# echo jiajie|passwd --stdin jj
  7. Changing password for user jj.
  8. passwd: all authentication tokens updated successfully.
  9. [root@localhost ~]# exit
  10. logout
  11. Connection to 192.168.1.106 closed.
  12. useradd jj is successfully.
  13. Jobs has finished,Goodbye.

send "exit\r":登录出当前环境。

expect eof:结束expect匹配。

exit -onexit{...}:打印结束的提示信息。

五. shell脚本调用expect(1)

  1. [root@localhost shell.sh]# vim test.sh
  2. #!/bin/bash
  3. ip=$1
  4. user=$2
  5. password=$3
  6. expect <<EOF
  7. set timeout 10
  8. spawn ssh -l $user $ip
  9. expect {
  10. "yes/no" { send "yes\n";exp_continue }
  11. "password" { send "$password\n" }
  12. }
  13. expect "]#" { send "useradd jj\n" }
  14. expect "]#" { send "echo jiajie|passwd --stdin jj\n" }
  15. expect "]#" { send "exit\n" }
  16. expect eof
  17. EOF

执行后的输出结果:

  1. [root@localhost shell.sh]# ./test.sh 192.168.1.106 root jiajie
  2. spawn ssh -l root 192.168.1.106
  3. root@192.168.1.106's password:
  4. Last login: Sat Sep 9 04:10:46 2017 from web
  5. [root@localhost ~]# useradd jj
  6. [root@localhost ~]# echo jiajie|passwd --stdin jj
  7. Changing password for user jj.
  8. passwd: all authentication tokens updated successfully.
  9. [root@localhost ~]# exit
  10. logout
  11. Connection to 192.168.1.106 closed.
  12. [root@localhost shell.sh]#

五. shell脚本调用expect(2)

通过shell脚本通过调用expect脚本实现批量认证:

expect脚本:

  1. [root@localhost shell.sh]# vim scp.exp
  2. #!/usr/bin/expect
  3. if {$argc!=3} {
  4. send_user "Usage:expect need three arguments lisk thks:file host dir\n"
  5. exit 1
  6. }
  7. set srcname [lindex $argv 0]
  8. set hostname [lindex $argv 1]
  9. set destname [lindex $argv 2]
  10. set password "jiajie"
  11. spawn scp $srcname root@$hostname:$destname
  12. set timeout 30
  13. expect {
  14. # -timeout 2
  15. "yes/no" {send "yes\r";exp_continue}
  16. "*password:" {send "$password\r"}
  17. # timeout {puts "expect connect failure,please contact admin.";return}
  18. }
  19. expect eof
  20. exit -onexit {
  21. send_user "Jobs has finished,Goodbye.\n"
  22. }

shell脚本:

  1. [root@localhost shell.sh]# vim scp.sh
  2. #!/bin/bash
  3. if [[ "$#" != "2" ]];then
  4. echo "Usage:$0 src_filename des_filename"
  5. exit 0
  6. fi
  7. IP_LIST=(
  8. 192.168.1.106
  9. 192.168.1.170
  10. 192.168.1.10
  11. )
  12. . /etc/init.d/functions
  13. for ip in ${IP_LIST[*]}
  14. do
  15. expect scp.exp $1 $ip $2 &> /dev/null
  16. if [ $? -eq 0 ];then
  17. action "$ip" /bin/true
  18. else
  19. action "$ip" /bin/false
  20. fi
  21. done

scp.sh脚本通过调用expect脚本来实现分发功能。执行结果如下:

  1. [root@localhost shell.sh]# sh scp.sh /etc/fstab /tmp/
  2. 192.168.1.106 [ OK ]
  3. 192.168.1.170 [ OK ]
  4. 192.168.1.10 [FAILED]

因为并没有192.168.1.10所有报错。

expect实现自动交互由浅入深的更多相关文章

  1. expect 实现自动交互脚本

    1. 说明 在编写脚本时,可能会遇到需要在另一台主机上执行一个命令,或者在本机拷贝另一台主机内的一个文件.如果两台主机之间没有做互信,就会牵扯到用户输入密码的交互过程,这对编写自动脚本来说, 就行不通 ...

  2. 使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组

    背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...

  3. 使用expect实现自动交互,shell命令行自动输入

    背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...

  4. Linux--使用expect进行自动交互

    在linux下进行一些操作时,有时需要与机器进行一些交互操作,比如切换账号时输入账号密码,传输文件时输入账号密码登陆远程机器等,但有时候这些动作需要在shell脚本中进行,这个时候就可以使用expec ...

  5. expect简单自动交互-用于密码、命令输入

    1. 安装expect #yum -y install expect 2. 新建.exp文件,用于ssh交换机 #vi exp.exp #!/bin/expect set f [open ipfile ...

  6. 015_使用 expect 工具自动交互密码远程其他主机安装 httpd 软件

    #!/bin/bash#删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机rm -rf ~/.ssh/known_hostsexpect <<E ...

  7. 脚本_使用expect自动交互远程主机安装软件

    #!bin/bash#功能:使用expect工具自动交互密码,远程到其它主机,安装httpd软件#作者:liusingbon#删除~/.ssh/known-hosts后,ssh远程任何主机,系统都会询 ...

  8. linux自动交互工具expect,tcl安装和安装包,以及自动互信脚本

    linux自动交互工具expect,tcl安装,以及自动互信脚本 工作中需要对几十台服务器做自动互信,无意中发现expect命令,研究一番. 在网上找了许多资料也没有安装成功,摸索着总算成功了.现分享 ...

  9. SSH批量管理 expect自动交互

    SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html # SSH批量管理 # expect自动交互 ########### ...

随机推荐

  1. 跟我学ASP.NET MVC之四:使用Razor

    摘要: 视图引擎处理ASP.NET内容,并查找指令,典型情况是向浏览器输出插入动态内容.MVC框架视图引擎的名字是Razor. 在本文中,我将带领读者快速认识Razor,以后你们看到他们的时候能够认识 ...

  2. Python 文件读写的三种模式和区别

    #coding=utf-8 #__author:Administrator #__time:2018/5/9 13:14 #__file_name:text1 import io #能调用方法的一定是 ...

  3. python生产环境部署

    Python部署web开发程序的几种方法 fastcgi ,通过flup模块来支持,在nginx里对应的配置指令是 fastcgi_pass http,nginx使用proxy_pass转发,这个要求 ...

  4. BZOJ_1132_[POI2008]Tro_计算几何

    BZOJ_1132_[POI2008]Tro_计算几何 Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3 ...

  5. Java开源生鲜电商平台-优惠券设计与架构(源码可下载)

    Java开源生鲜电商平台-优惠券设计与架构(源码可下载) 说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等 那么对于Java开源生鲜电 ...

  6. 【Java进阶】并发编程

    PS:整理自极客时间<Java并发编程> 1. 概述 三种性质 可见性:一个线程对共享变量的修改,另一个线程能立刻看到.缓存可导致可见性问题. 原子性:一个或多个CPU执行操作不被中断.线 ...

  7. 自己动手编译Android(LineageOS)源码

    准备 设备:红米3s 设备代号:land Android版本:7.1.1 源码提供:Lineage PC配置: 系统:Ubuntu16.04 x64 至少12G RAM 至少80GB 剩余硬盘空间 良 ...

  8. 死磕 java集合之LinkedBlockingQueue源码分析

    问题 (1)LinkedBlockingQueue的实现方式? (2)LinkedBlockingQueue是有界的还是无界的队列? (3)LinkedBlockingQueue相比ArrayBloc ...

  9. Spring学习(一):理解IoC容器

    序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...

  10. ef和mysql使用(一)

    ef开发模式有3种:DateBase First(数据库优先).Model First(模型优先)和Code First(代码优先).这里我用的是code first 一个简单的例子: public ...