自动化交互程序Expect应用实践

Expect自动化交互程序应用实践

1.Expect简介

1.1什么是Expect

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

1.2为什么要使用Expect

在现在的企业运维中,自动化运维已经成为运维的主流趋势,但是在很多情况下,执行系统命令或程序时,系统需要以交互式的形式要求运维人员输入指定的字符串,之后才能继续执行命令。例如,为用户设置密码时,一般情况下需要手工输入2次密码。ssh远程连接服务器时需要输入yes和密码信息,才能连接。

expect自动化交互工作流程简单说明,以此执行如下操作:

spawn 启动指定进程------>expect获取期待的关键字--->send向指定进程发送指定字符---->进程执行完毕,退出结束。

2.Expect安装

rpm  -qa expect查看机器是否已安装。

yum -y install  expect

3.小试牛刀:实现expect自动化功能

此次准备的是3台虚拟机,IP和主机名如下

IP地址              主机名

192.168.132.20     salt-master

192.168.132.11     salt-minion01

192.168.132.10     salt-minion02

expect脚本如下:

[[email protected] tmp]# cat tuwei.exp

#!/usr/bin/env expect   ------解析器,使用expect解析

spawn ssh [email protected]  uptime---执行ssh命令

expect {

"yes/no" {send "yes\r";exp_continue}

"*password" {send "x9i86wrz\r"}

send "x9i86wrz\n"

}

expect eof

执行时使用expect tuwei.exp

结果如下:

[[email protected] tmp]# expect tuwei.exp

spawn ssh [email protected] uptime

The authenticity of host '192.168.132.11 (192.168.132.11)' can't be established.

RSA key fingerprint is 14:7f:3a:76:0b:db:11:eb:03:62:9e:0f:f8:b8:e4:45.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.132.11' (RSA) to the list of known hosts.

[email protected]'s password:

21:25:26 up  1:07,  1 user,  load average: 0.00, 0.00, 0.00

4.expect常用命令

spawn:通过spawn命令执行一个命令或者程序,之后所有的expect操作都会在这个执行过的命令或程序中进行,包括自动交互功能。

spawn 选项 命令或程序

如 spawn  ssh  [email protected] uptime

expect:获取spawn命令执行后的信息,看是否和事先定义的相匹配,一旦匹配就执行后面的动作。如:

expect "*password" {send "123456\r"}或者放在不同行

expect "*password"

send "123456\r"

send:expect匹配指定的字符串后,发送指定字符串给系统。

exp_continue:表示让程序继续匹配(用于多次匹配字符串并执行不同的动作)

send_user:打印expect脚本信息,类似shell里的echo命令,而且有echo -e的功能。

exit:退出脚本,还可以利用该命令对脚本做一些关闭前的清理和提示等工作。

exit -onexit {

send_user "Good bye.\n"

}

5.变量

5.1普通变量

基础语法如下:

set 变量名  变量值

如 set password "123456"

打印变量的基础语法:

puts $变量名

5.2特殊参数变量

类似与shell中的$0,$1,$2,用于接收及控制expect脚本传参。

$argv 表示参数数组

[lindex $argv n]接收expect脚本传参,n从0开始。

如set file [lindex $argv 0]

set host  [lindex $argv 1]

$argc表示传参的个数,$argv0 表示脚本的名字。

6.if条件语句

基础语法为:

if  {条件表达式} {

指令

}

if  {条件表达式} {

指令

}  else

{

指令

}

例如:

if {$argc != 2} {

send_user "usage:expect $argv0 file host"

exit

}

7.Expect中的关键字

关键字用于匹配过程,一般用于expect命令中。

eof(end of file)用于匹配结束符

timeout:控制时间的关键字变量。可以通过为该变量赋值来规定整个expect操作的时间,服务于expect全局的。

set timeout  30   -----设置30s超时

8.企业生产场景expect案例

此次准备的是3台虚拟机,IP和主机名如下

IP地址              主机名

192.168.132.20     salt-master

192.168.132.11     salt-minion01

192.168.132.10     salt-minion02

8.1批量执行命令

expect自动交互脚本test.exp

#!/usr/bin/env expect

if { $argc != 2 } {

send_user "usage:expect $argv0 ip command"

exit

}

set host [lindex $argv 0]

set cmd [lindex $argv 1]

set password "x9i86wrz"

spawn ssh [email protected]$host  $cmd

expect {

"yes/no" {send "yes\r";exp_continue}

"*password" {send "$password\r"}

}

expect eof

shell循环执行expect脚本 test.sh

#!/bin/sh

if [ $# -ne 1 ];then

echo "usage:$0 cmd"

exit 1

fi

cmd=$1

cat /tmp/iplist |while read ip

do

expect test.exp $ip "$cmd"

done

查看系统磁盘使用情况 sh test.sh "df -h"

[[email protected] tmp]# sh test.sh "df -h"

spawn ssh [email protected] df -h

[email protected]'s password:

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3        48G  4.0G   41G   9% /

tmpfs           285M   12K  285M   1% /dev/shm

/dev/sda1       194M   29M  155M  16% /boot

spawn ssh [email protected] df -h

[email protected]'s password:

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda5        16G  4.7G   10G  33% /

tmpfs           334M   12K  334M   1% /dev/shm

/dev/sda1       190M   54M  127M  30% /boot

/dev/sda2       2.0G  3.2M  1.9G   1% /home

8.2批量发送文件

expect自动交互脚本fenfa.exp

#!/usr/bin/env expect

if { $argc != 3 } {

send_user "usage:expect $argv0 file ip dir"

exit

}

set file [lindex $argv 0]

set host [lindex $argv 1]

set dir [lindex $argv 2]

set password "x9i86wrz"

spawn scp -P22  -r -p $file [email protected]$host:$dir

expect {

"yes/no" {send "yes\r";exp_continue}

"*password" {send "$password\r"}

}

expect eof

利用shell循环执行expect脚本

[[email protected] tmp]# cat fenfa.sh

#!/bin/sh

.  /etc/init.d/functions

if [ $# -ne 2 ];then

echo "usage:$0 file dir"

exit 1

fi

file=$1

dir=$2

cat /tmp/iplist |while read ip

do

expect fenfa.exp $file  $ip $dir >/dev/null 2>&1

if [ $? -eq 0 ];then

action "$ip"  /bin/true

else

action "$ip"  /bin/false

fi

done

脚本中添加了function 系统函数库,是为了使用action,打印结果信息。

使脚本显得更专业。

将/etc/hosts文件批量分发到所有服务器的/tmp目录

[[email protected] tmp]# sh fenfa.sh /etc/hosts    /tmp

192.168.132.11                                             [  OK  ]

192.168.132.10                                             [  OK  ]

分发后查看

[[email protected] tmp]# ls -l

total 4

-rw-r--r-- 1 root root 243 Jun 21 20:48 hosts

[[email protected] tmp]# ls -l

total 4

-rw-r--r-- 1 root root 243 Jun 21 20:48 hosts

通过发送文件方式可以批量部署ssh免秘钥。

原文地址:http://blog.51cto.com/tuwei/2141141

时间: 2024-10-04 19:40:16

自动化交互程序Expect应用实践的相关文章

自动化交互expect

一,介绍 每次服务器控制链接都需要输入密码,很麻烦,每次交互大大延长了时间 因此就有了免交互及自动化交互存在expect 二,安装 yum install expect -y 查看是否安装成功 rpm -qa expect 安装算是完成了 三,ssh链接交互 主机:三台 ---->一台主控制服务器 10.0.0.203        ----mysql服务器 10.0.0.204 -----web服务器 手动链接服务器的话需要实现两次交互操作 我们现在用expect交互 编写kingle.exp

expect实现自动化交互(转载)

综述:expect主要包含三部分,spawn,expect和send spawn实现交互命令的劫持,是自动化交互的基础:然后可以用expect来进行结果查询: expect实现对交互命令输出的解析,得到关键字的查询,如password,user,然后停止,等待交互: send对解析字段内容尽心输入:如password,user,并用\r结束,停留在交互界面:interact. 一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时

小型自动化运维--expect入门知识

小型自动化运维--expect入门知识 Expect的自动交互工作流程简单说明: spawn启动指定进程-->expect获取期待的关键字-->send向指定进程发送指定字符-->进程执行完毕,退出脚本. spawn命令 如果没有spawn命令,expect程序将会无法实现自动交互. spawn命令的语法为: spawn [选项] [需要自动交互的命令或程序] 例如:spawn ssh [email protected] uptime 说明:在spawn命令的后面,直接加上要执行的命令或

自动化交互输入密码,进行远程文件复制

此脚本功能主要是找到/data1到/data11下面在当前时间一天以外的所有文件,并复制到另外一台新机器上面. 注意:重点检验自动化交互输入密码,进行远程文件复制功能 #!/usr/bin/pyth #coding=utf-8  #字符编码 import os  #os模块 import pexpect #自动交互模块 import time #导入时间模块 dir_name=os.popen("ls -l / |grep 'data[0-9]\{1,2\}'|awk '{print $NF}'

小型自动化运维--expect脚本之指定ip,指定文件进行同步操作(一)

小型自动化运维--expect脚本之指定ip,指定文件进行同步操作 # vim 5.expect #!/usr/bin/expect set passwd "wtf" set host [lindex $argv 0] set file [lindex $argv 1] spawn rsync -av $file [email protected]$host:$file expect { "yes/no" { send "yes\r"} &quo

小型自动化运维--expect脚本之自动同步

小型自动化运维--expect脚本之自动同步 expect脚本可以运用于自动化运维多个方面,例如:可以自动到远程机器执行命令,也可以传输文件到远程机器上. 脚本如下: #!/usr/bin/expect set passwd "wtf" spawn rsync -av [email protected]:/tmp/shiyan.txt /tmp/ expect { "yes/no" { send "yes\r"} "password:&

Python学习笔记一:第一个Python程序,变量,字符编码与二进制,用户交互程序

第一个python程序 Windows:设置环境变量,X:\pthonxxx,xxx是版本号 在命令提示符下 输入python,进入解释器 >>>print("Hello World!") >>>exit() 编辑文件helloworld.py 执行:python helloworld.py Linux:./helloworld.py   声明解释器:#!/usr/bin/env python  在环境变量中找python Chmod 755 hel

Python学习笔记一:简单的交互程序

入门第一课:简单的用户交互程序 1 name = input("Name: ") #Python3.X中的input取代了Python2.X中的input_raw 2 age = int(input("Age: )) #此处若不加int语句,输入时计算机会识别为字符串,为了确保计算机识别为数字,用户也可以输入数字意外的字符.int = integer意为整数 3 job = input("Job: ") 4 salary = input("Sal

小型自动化运维--expect脚本V2版

小型自动化运维--expect脚本V2版 在实际运维工作中,需要我们向远程主机同步数据,可以用rsync来实现.那么用expect脚本怎么实现数据传输完成之后自动退出远程主机呢?在开始expect脚本V2版之前,我们先来看下,使用expect脚本来实现远程主机的登入,脚本如下: #! /usr/bin/expect set host "192.168.8.120" set passwd "wtf" spawn ssh [email protected]$host e