expect 自动化交互软件

简介:

一、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


相关文章
|
2月前
|
测试技术 开发者 Python
自动化测试之美:从零构建你的软件质量防线
【10月更文挑战第34天】在数字化时代的浪潮中,软件成为我们生活和工作不可或缺的一部分。然而,随着软件复杂性的增加,如何保证其质量和稳定性成为开发者面临的一大挑战。自动化测试,作为现代软件开发过程中的关键实践,不仅提高了测试效率,还确保了软件产品的质量。本文将深入浅出地介绍自动化测试的概念、重要性以及实施步骤,带领读者从零基础开始,一步步构建起属于自己的软件质量防线。通过具体实例,我们将探索如何有效地设计和执行自动化测试脚本,最终实现软件开发流程的优化和产品质量的提升。无论你是软件开发新手,还是希望提高项目质量的资深开发者,这篇文章都将为你提供宝贵的指导和启示。
|
3月前
|
API 数据安全/隐私保护 开发者
使用MechanicalSoup进行网页自动化交互
使用MechanicalSoup进行网页自动化交互
46 2
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
CogAgent-9B:智谱 AI 开源 GLM-PC 的基座模型,专注于预测和执行 GUI 操作,可应用于自动化交互任务
CogAgent-9B 是智谱AI基于 GLM-4V-9B 训练的专用Agent任务模型,支持高分辨率图像处理和双语交互,能够预测并执行GUI操作,广泛应用于自动化任务。
32 12
CogAgent-9B:智谱 AI 开源 GLM-PC 的基座模型,专注于预测和执行 GUI 操作,可应用于自动化交互任务
|
1天前
|
人工智能 编解码 自然语言处理
AGUVIS:指导模型实现 GUI 自动化训练框架,结合视觉-语言模型进行训练,实现跨平台自主 GUI 交互
AGUVIS 是香港大学与 Salesforce 联合推出的纯视觉 GUI 自动化框架,能够在多种平台上实现自主 GUI 交互,结合显式规划和推理,提升复杂数字环境中的导航和交互能力。
25 8
AGUVIS:指导模型实现 GUI 自动化训练框架,结合视觉-语言模型进行训练,实现跨平台自主 GUI 交互
|
7天前
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
90 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
20天前
|
缓存 监控 安全
公司电脑监控软件的 Gradle 构建自动化优势
在数字化办公环境中,公司电脑监控软件面临代码更新频繁、依赖管理和构建复杂等挑战。Gradle 构建自动化工具以其强大的依赖管理、灵活的构建脚本定制及高效的构建缓存与增量构建特性,显著提升了软件开发效率和质量,支持软件的持续更新与优化,满足企业对员工电脑使用情况的监控与管理需求。
34 3
|
30天前
|
运维 jenkins Java
Jenkins 自动化局域网管控软件构建与部署流程
在企业局域网管理中,Jenkins 作为自动化工具,通过配置源码管理、构建及部署步骤,实现了高效、稳定的软件开发与部署流程,显著提升局域网管控软件的开发与运维效率。
40 5
|
2月前
|
测试技术 持续交付
探索自动化测试在软件质量保证中的关键作用
本文深入探讨了自动化测试在现代软件开发生命周期中的重要性,以及它是如何成为确保软件产品质量的不可或缺的一环。通过分析自动化测试的优势、挑战和最佳实践,本文旨在为读者提供对自动化测试全面而深刻的理解,从而帮助他们在实际工作中更有效地应用自动化测试策略。
35 2
|
2月前
|
jenkins 测试技术 持续交付
自动化测试框架的构建与优化:提升软件交付效率的关键####
本文深入探讨了自动化测试框架的核心价值,通过对比传统手工测试方法的局限性,揭示了自动化测试在现代软件开发生命周期中的重要性。不同于常规摘要仅概述内容,本部分强调了自动化测试如何显著提高测试覆盖率、缩短测试周期、降低人力成本,并促进持续集成/持续部署(CI/CD)流程的实施,最终实现软件质量和开发效率的双重飞跃。通过具体案例分析,展示了从零开始构建自动化测试框架的策略与最佳实践,包括选择合适的工具、设计高效的测试用例结构、以及如何进行性能调优等关键步骤。此外,还讨论了在实施过程中可能遇到的挑战及应对策略,为读者提供了一套可操作的优化指南。 ####
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
自动化测试的新篇章:利用AI提升软件质量
【10月更文挑战第35天】在软件开发的海洋中,自动化测试犹如一艘救生艇,它帮助团队确保产品质量,同时减少人为错误。本文将探索如何通过集成人工智能(AI)技术,使自动化测试更加智能化,从而提升软件测试的效率和准确性。我们将从AI在测试用例生成、测试执行和结果分析中的应用出发,深入讨论AI如何重塑软件测试领域,并配以实际代码示例来说明这些概念。
70 3