博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
expect 自动化交互软件
阅读量:6006 次
发布时间:2019-06-20

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

一、expect简介

expect是基于TCL的相对简单的一种免费的脚本编程工具语言,用来实现自动和交互式任务程序进行通信,无需人的手工干预,如:SSH、FTP等。这些程序正常情况下都需要手工进行交互,而使用expect就可以模拟人手工交互的过程,实现自动和远端程序的交互,从来达到自动化运维的目的。

官方解释:expect是一个用来实现自动交互功能的软件套件(expect is a software suite for automating interactive tools)

expect支持Unix、linux、windows平台。

二、expect安装

安装expect软件:

1、去expect官网下载rpm包安装:http://download.csdn.net/detail/wang7dao/4416172

# rpm -ihv expect-5.43.0-8.el5.i386.rpm

# rpm -ihv expect-devel-5.43.0-8.el5.i386.rpm

2、使用yum安装 

#yum install expect -y

三、expect语法

expect程序工作流程:

sqawn启动进程==》expect期待关键字==》send向进程发送字符==》退出结束。

spawn:是expect的初始命令,它用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法执行,如:spawn ssh root@10.0.0.10  在spawn命令后面,直接加上要启动的进程,命令等信息

spawn支持的选项有:-open 启动文件进程,-ignore 忽略某些信号。

expect:使用方法:expect 表达式  动作  表达式 动作  .....

expect命令用于等候一个匹配内容的输出,一旦匹配上就执行expect后面的动作或命令,这个命令接受几个特有参数,用的最多的是-re,表示使用正则表达式的方式来匹配,如:

spawn ssh root@10.0.0.10

expect "password:"  {send "123456\r"}

从例子看出,expect是依附于spawn命令的,当执行ssh命令后,expect就匹配命令执行后的关键字:"password:",如果匹配到关键字就会执行后面包含在{}括号中的send或exp_send动作,匹配及动作可以放在二行,如不需要使用{}括号可以写成多行:

spawn ssh root@10.0.0.10

expect "password:"

send "123456\r"

expect命令还有一种用法,它可以在一个expect匹配中多次匹配关键字,并给出处理动作,只需要将关键字放在一个大括号中就可以了,当然还要有exp_continue:

spawn ssh root@10.0.0.10

expect {

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

"*password:"  { exp_send "123456\r" }  

}

exp_send 和send:

使用基本相同,是expect中的动作命令。它可以发送一些特殊符号如:\r(回车),\n(换行),\t(制表符),等,这些都与TCL中的特殊符号相同。

exp_continue:命令它要处于expect命令中,然后它属于一个动作命令,完成的工作就是从头开始遍历,也就是说如果没有这个命令,匹配第一个关键字以后就会继续匹配第二个关键字,但有个这个命令后,匹配第一个关键字以后,第二次匹配仍然从第一个关键字开始。

send_user:用来把后面的参数输出到标准输出中去,如:

send_user "please input password:"

这个语句就可以在标准输出中打印please input password:字符了。

exit:直接退出脚本,也可以在退出前输出一些信息,如:

exit -onexit {

    send_user "say you baby!\n"

}

expect变量:

set: 变量名  变量值       #用来设置变量的方法

如:set file [lindex $argv 0]  #接收参数变量1

    set host [lindex $argv 1]  #接收参数变量2

    set password "123456"

puts $变量名     #读取变量的方法

expect关键字:

eof:用于匹配结束符

timeout:它是expect中的一个重要变量,它是一个全局性的时间控制开关。

如:set timeout 200

    -timeout 200

四、expect使用案列

列1:ftp拷贝文件自动输入密码拷贝

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/expect   #声明程序执行命令
set 
password 123456   
#设置密码
#download
spawn 
scp 
root@192.168.1.218:
/root/a
.wmv 
/home/yangyz/  
#生成进程链接远程服务器
set 
timeout 300  
#设置超时时间
expect 
"root@192.168.1.218's password:"  
#匹配内容输出
set 
timeout 300 
send 
"$password\r"  
#发送密码给进程
set 
timeout 300 
send 
"exit\r"    
#发送退出命令
expect eof

列2:自动ssh登陆

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/expect
spawn 
ssh 
-p22 root@10.0.0.100 
/sbin/ifconfig 
eth0
set 
timeout 30
expect {
-timeout 1
"yes/no"  
{ exp_send 
"yes\r"
;exp_continue }
"*password:"  
{ exp_send 
"123456\r" 
}
timeout  { puts 
"expect was timeout by hehe."
;
return 
}
}
expect eof
exit

列3:ssh免密钥分发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
[root@mail .
ssh
]
# ssh-keygen -t rsa
Generating public
/private 
rsa key pair.
Enter 
file 
in 
which 
to save the key (
/root/
.
ssh
/id_rsa
): 
Enter passphrase (empty 
for 
no passphrase): 
Enter same passphrase again: 
Your identification has been saved 
in 
/root/
.
ssh
/id_rsa
.
Your public key has been saved 
in 
/root/
.
ssh
/id_rsa
.pub.
The key fingerprint is:
80:a0:99:3a:46:32:ee:fb:d2:48:25:37:cc:a5:83:36 root@mail.pjy.cn
The key
's randomart image is:'
+--[ RSA 2048]----+
|  .              |
| + . o           |
|*.+ + .          |
|=E O   .         |
|+o= o   S        |
|oo               |
|..o              |
| o..             |
| .o.             |
+-----------------+
[root@mail .
ssh
]
# pwd
/root/
.
ssh
[root@mail .
ssh
]
# ls
id_rsa  id_rsa.pub  known_hosts
[root@mail .
ssh
]
# cp id_rsa.pub id_rsa.pub.bak
[root@mail .
ssh
]
# mv id_rsa.pub authorized_keys
[root@mail .
ssh
]
# mv id_rsa /server/
[root@mail .
ssh
]
# cd /server/scripts/
[root@mail scripts]
# cat sshkey.exp 
#!/usr/bin/expect
#ssh key fenfa
set 
password 
"123.com"
set 
s_file [lindex $argv 0]
set 
d_host [lindex $argv 1]
set 
d_dir [lindex $argv 2]
set 
timeout 10
spawn 
scp 
-P 22 -r -p $s_file root@$d_host:$d_dir
expect {
-timeout 5
"yes/no" 
{send 
"yes\r"
;exp_continue}
"*password:" 
{send 
"$password\r"
}
timeout {puts 
"connect to timeout"
;
return
}
}
expect eof
exit 
-onexit {
send_user 
"exit bye! \n"
}
[root@mail scripts]
# cat sshkey_fenfa.sh 
#!/bin/bash
#fenfa scripts
/etc/init
.d
/functions
for 
in 
`
cat 
/server/scripts/listip
`
do
expect sshkey.exp 
/root/
.
ssh 
$i 
/root 
&>
/dev/null
if 
[ $? -
eq 
0 ];
then
action 
"$i" 
/bin/true
else
action 
"$i" 
/bin/false
fi
done
[root@mail scripts]
# cat listip 
10.0.0.10
...
10.0.0.112
[root@mail scripts]
# ssh 10.0.0.10
Last login: Tue Aug  1 15:57:20 2017 from 10.0.0.100
[root@zabbix ~]
# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:DB:44:29  
          
inet addr:10.0.0.10  Bcast:10.0.0.255  Mask:255.255.255.0
          
inet6 addr: fe80::20c:29ff:fedb:4429
/64 
Scope:Link
          
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          
RX packets:15111544 errors:0 dropped:0 overruns:0 frame:0
          
TX packets:15940400 errors:0 dropped:0 overruns:0 carrier:0
          
collisions:0 txqueuelen:1000 
          
RX bytes:2595895595 (2.4 GiB)  TX bytes:2891681366 (2.6 GiB)
[root@zabbix ~]
# ll ~/.ssh
总用量 12
-rw-r--r-- 1 root root 398 8月   1 14:57 authorized_keys
-rw-r--r-- 1 root root 398 8月   1 15:01 id_rsa.pub.bak
-rw-r--r-- 1 root root 391 8月   1 15:55 known_hosts

列4:cisco交换机自动应用访问控制列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/expect
#telnet 
set user 
"pjycm"
set password 
"pjy@123.com"
set command 
"ip access-group 1 in"
set timeout 10
spawn telnet 10.0.0.1
expect {
        
"Username:" 
{send 
"$user\r"
;exp_continue}
        
"Password:" 
{send 
"$password\r"
;exp_continue}
        
"CM>" 
{send 
"en\r"
;exp_continue}
        
"Password:" 
{send 
"pjy@123.com\r"
;exp_continue}
        
"CM#" 
{send 
"conf t\r"
;exp_continue}
        
"CM(config)#" 
{send 
"int vlan 10\r"
;exp_continue}
        
"CM(config-if)#" 
{send 
"$command\r"
}
}
expect eof
exit

脚本写的比较简单,如在工作中应用,应加入流程控制判断语句!

本文转自 80后小菜鸟 51CTO博客,原文链接:http://blog.51cto.com/zhangxinqi/1952741

转载地址:http://ahpmx.baihongyu.com/

你可能感兴趣的文章
javascript+html 实现隐藏 显示
查看>>
BZOJ 2120 数颜色
查看>>
正则表达式学习笔记——基础知识
查看>>
织梦如何实现二级栏目导航的仿制
查看>>
网上购物系统(Task010)——FormView编辑更新商品详细信息
查看>>
Struts2 技术全总结 (正在更新)
查看>>
PowerShell_零基础自学课程_5_自定义PowerShell环境及Powershell中的基本概念
查看>>
Bzoj 2252: [2010Beijing wc]矩阵距离 广搜
查看>>
《编程之美》——寻找发帖“水王”学习与扩展 转surymj博客
查看>>
Linux 虚拟机VMware安装失败,提示没有选择磁盘
查看>>
LeetCode-Permutations
查看>>
SpringMVC的REST风格的四种请求方式
查看>>
漫谈 Clustering (1): k-means(转)
查看>>
从零搭建mongo分片集群的简洁方法
查看>>
J2EE环境配置与工具使用
查看>>
bzoj3684: 大朋友和多叉树(拉格朗日反演+多项式全家桶)
查看>>
C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别
查看>>
【经典算法】第四回:希尔排序
查看>>
css 禁止选中文本
查看>>
bzoj2165
查看>>