博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Expect自动化交互程序
阅读量:6677 次
发布时间:2019-06-25

本文共 3455 字,大约阅读时间需要 11 分钟。

Expect介绍:

1、什么是Expect

Expect是一个用来实现自动化交互功能的软件套件,基于TCL的脚本编程工具语言,方便学习,功能强大。

 

2、为什么要使用expcet:

当今的企业运维中,自动化运维已经成为运维的主流趋势,但是在很多情况下,执行系统命令或程序时,系统会以交互的形式要求运维人员输入指定的字符串,之后才能继续执行命令,这个时候我们就需要expect交互工具来帮忙了,expect可以模拟手工交互过程,实现自动与远端程序的交互,从而达到自动化运维的目的。

 

Expect命令 作用
spawn spawn命令是一个在Expect自动交互程序的开始就需要使用的命令,通过spawn执行一个命令或程序,之后所有的Expect操作都在这个执行过的命令或程序进程中执行
expect 在expect自动交互程序执行的过程中,在 使用spawn命令执行一个命令或程序之后,会提示某些交互信息,expect命令的作用就是获取这些信息,查看是否和其事先指定的信息相匹配,一旦匹配上指定的内容,就执行expect后面的内容
send 

Expect中的动作命令,当expect匹配了指定的字符串之后,发送指定的字符串给系统,这些命令可以支持一些特殊的转义符号,例如:\r \n \t

还有一个类似的命令exp_send命令

exp_continue 属于一个动作命令,在一个expect命令中,用于多次匹配字符串并执行不同的动作中
send_user

类似shell的echo命令

exit 退出Expect脚本,以及退出前做一些关闭前的清理和提示等工作

 

 

 

 

 

 

 

 

 

 

 

 

 

示例脚本:

执行ssh命令远程获取服务器的负载值

#!/usr/bin/expectspawn ssh root@192.168.8.31 uptimeexpect {    "yes/no"    {exp_send "yes\r";exp_continue}    "*password" {exp_send "123456\r"}}expect eof
#!/bin/bashread -p "please input your username:" nameread -p "please input your password" passread -p "input your email" mailecho -n "your name is $name,"echo -n "your pass is $pass,"echo  "your email is $mail."#!/usr/bin/expectspawn /bin/sh read.shexpect {    "username" {exp_send "leon\r";exp_continue}    "*pass" {exp_send "123456\r";exp_continue}    "*mail" {exp_send "leon@123.com\r";}       }   expect eof
View Code

 

#!/usr/bin/expectset file [lindex $argv 0]     ##[lindex $argv n] 接收脚本传参 n从0开始 分别表示第一个参数[lindex $argv 0] 第二个参数 [lindex $argv 1].....set host [lindex $argv 1]set dir  [lindex $argv 2]puts "$file\t$host\t$dir"    ##puts打印变量puts $argc             ##$argc表示参数的总个数puts $argv0            ##$argv0 表示脚本的名字[root@localhost scripts]# expect 1.exp  1 2 31       2       331.exp

 

Expect中的if条件语句

if { 条件表达式 } {  指令}或if { 条件表达式 } {  指令} else { 指令}

 

#!/usr/bin/expectif { $argc != 3 } {                         #argc为传参的个数,相当于shell里面的$#    send_user "Usage expect $argv0 file host dir\n"              exit     }       set file [lindex $argv 0]    set host [lindex $argv 1]    set dir  [lindex $argv 2]    puts "$file\t$host\t$dir"                      #puts相当于echo

 

实现自动交互脚本

#!/usr/bin/expectif { $argc != 2 } {     send_user "Usage expect $argv0 ip command"    exit     }       set ip [lindex $argv 0]    set cmd [lindex $argv 1]    set password "123456"    spawn ssh root@$ip $cmd    expect {        "yes/no" {send "yes\r";exp_continue}        "*password" {send "$password\r"}    }    expect eof

 

 

实现自动交互式批量发送文件或目录:

test.exp

#!/usr/bin/expectif { $argc != 3 } {     send_user "Usage expect $argv0 file host dir "    exit     }       set file [lindex $argv 0]    set host [lindex $argv 1]    set dir  [lindex $argv 2]    set password "123456"    scp -P22 -rp $file  root@$host:$dir    expect {        "yes/no" {send "yes\r";exp_continue}        "*password" {send "$password\r"}    }    expect eof

利用shell循环执行脚本

#!/bin/bashif [ $# -ne 2 ];then    echo "Usage:$0 file dir"    exit 1fifile=$1dir=$2for n in 128 129 130     do          expect test.exp $file 192.168.33.$n $dir    done

 

开发Expec提交本自动化分发公钥到所有服务器

#!/usr/bin/expectif { $argc != 2 } {    send_user "usage: expect expect.exp file host\n"    exit    }set file [lindex $argv 0]set host [lindex $argv 1]set password "123456"spawn ssh-copy-id -i $file "-p 22 root@$host"expect {    "yes/no" {send "yes\r";exp_continue}    "*password" {send "$password\r"}    }    expect eof

开发shell脚本循环执行expect脚本分发公钥

#!/bin/shfor n in 128 129 130do     expect test.exp ~/.ssh/id_dsa.pub $192.168.33.$ndone

 

转载于:https://www.cnblogs.com/Template/p/9275680.html

你可能感兴趣的文章
Hyperledger fabric多通道多节点增删改查原版(mac)
查看>>
Android 动态加载 ListView 实现
查看>>
shell脚本的一些注意事项
查看>>
poj1664(放苹果)
查看>>
NIO(三):缓冲区 Buffer
查看>>
我的友情链接
查看>>
问问自己
查看>>
我的友情链接
查看>>
java设计模式-工厂模式
查看>>
微信小程序开发--从px到rpx:
查看>>
Mysql常用命令行大全
查看>>
Nginx安全配置研究
查看>>
10 个 Nginx 的安全提示
查看>>
消息智能路由组件SmartRoute
查看>>
解决vdbench的打印messages日志的问题
查看>>
mysql设置远程访问
查看>>
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
查看>>
VDR 2.0安装部署
查看>>
负载均衡—nginx https服务
查看>>
jackjson解决 Unrecognized field
查看>>