expect自动化交互软件

author author     2022-09-13     584

关键词:

一、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 [email protected]  在spawn命令后面,直接加上要启动的进程,命令等信息

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

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

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

spawn ssh [email protected]

expect "password:"  {send "123456 "}

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

spawn ssh [email protected]

expect "password:"

send "123456 "

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

spawn ssh [email protected]

expect {

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

"*password:"  { exp_send "123456 " }  

}


exp_send 和send:

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

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


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

send_user "please input password:"

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


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

exit -onexit {

    send_user "say you baby! "

}

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拷贝文件自动输入密码拷贝

#!/usr/bin/expect   #声明程序执行命令
set password 123456   #设置密码
#download
spawn scp [email protected]:/root/a.wmv /home/yangyz/  #生成进程链接远程服务器
set timeout 300  #设置超时时间
expect "[email protected]‘s password:"  #匹配内容输出
set timeout 300 
send "$password
"  #发送密码给进程
set timeout 300 
send "exit
"    #发送退出命令
expect eof


列2:自动ssh登陆

#!/usr/bin/expect
spawn ssh -p22 [email protected] /sbin/ifconfig eth0
set timeout 30
expect {
-timeout 1
"yes/no"  { exp_send "yes
";exp_continue }
"*password:"  { exp_send "123456
" }
timeout  { puts "expect was timeout by hehe.";return }
}
expect eof
exit


列3:ssh免密钥分发

[[email protected] .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 [email protected]
The key‘s randomart image is:‘
+--[ RSA 2048]----+
|  .              |
| + . o           |
|*.+ + .          |
|=E O   .         |
|+o= o   S        |
|oo               |
|..o              |
| o..             |
| .o.             |
+-----------------+
[[email protected] .ssh]# pwd
/root/.ssh
[[email protected] .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[[email protected] .ssh]# cp id_rsa.pub id_rsa.pub.bak
[[email protected] .ssh]# mv id_rsa.pub authorized_keys
[[email protected] .ssh]# mv id_rsa /server/
[[email protected] .ssh]# cd /server/scripts/
[[email protected] 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 [email protected]$d_host:$d_dir
expect {
-timeout 5
"yes/no" {send "yes
";exp_continue}
"*password:" {send "$password
"}
timeout {puts "connect to timeout";return}
}
expect eof
exit -onexit {
send_user "exit bye! 
"
}
[[email protected] scripts]# cat sshkey_fenfa.sh 
#!/bin/bash
#fenfa scripts
. /etc/init.d/functions
for i 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
[[email protected] scripts]# cat listip 
10.0.0.10
...
10.0.0.112
[[email protected] scripts]# ssh 10.0.0.10
Last login: Tue Aug  1 15:57:20 2017 from 10.0.0.100
[[email protected] ~]# 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)
[[email protected] ~]# 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交换机自动应用访问控制列表

#!/usr/bin/expect
#telnet 
set user "pjycm"
set password "[email protected]"
set command "ip access-group 1 in"
set timeout 10
spawn telnet 10.0.0.1
expect {
        "Username:" {send "$user
";exp_continue}
        "Password:" {send "$password
";exp_continue}
        "CM>" {send "en
";exp_continue}
        "Password:" {send "[email protected]
";exp_continue}
        "CM#" {send "conf t
";exp_continue}
        "CM(config)#" {send "int vlan 10
";exp_continue}
        "CM(config-if)#" {send "$command
"}
}
expect eof
exit

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

本文出自 “EngineerQI” 博客,请务必保留此出处http://zhangxinqi.blog.51cto.com/9668428/1952741

expect自动交互式程序

...及安装1.1Expect介绍    Expect是一个用来实现自动化交互功能的软件套件。1.2为什么使用Expect    在现今的企业运维中,自动化运维已经成为运维的主流趋势,但是在很多情况下,执行系统命令或程序时... 查看详情

expect语法

首先,expect是一个简单的工具语言,如要工作就是进行自动化的人机交互。它的作者对Expect的定义:是一个实现自动交互功能的软件套件(asoftwaresuiteforautomatinginteractivetools),使用expect,它能帮助我们在合适的情景下进行合适的... 查看详情

shell进阶——expect免交互工具的使用(代码片段)

...DonLibes基于Tcl(ToolCommandLanguage)语言开发的,主要应用于自动化交互式操作的场景,是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。  expect能做什... 查看详情

自动化运维脚本语言之expect实践学习

...,一个可实现自动交互功能的软件套件,其功能就是进行自动化的人机交互;也能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序,根据脚本内容expect可以知道程序会提示或反馈什么内容以及什么是正确的应答... 查看详情

自动化交互expect(代码片段)

 自动化交互expect一,介绍    每次服务器控制链接都需要输入密码,很麻烦,每次交互大大延长了时间因此就有了免交互及自动化交互存在expect二,安装    yuminstallexpect-y     查看是否安装成功    rpm... 查看详情

expect实现自动交互脚本

...。借助expect可以将交互过程写在一个脚本里,就可以实现自动化完成。上面的问 查看详情

heredocument免交互与expect自动化交互(代码片段)

...法格式注意事项示例去掉每行之前的TAB字符多行注释Expect自动化交互概述基本命令脚本解释器spawnexpectsendexpect直接执行expect嵌入执行实现SSH自动登录免交互创建磁盘HereDocument免交互概述使用I/O重定向的方式将命令列表提供给交互... 查看详情

[转]expect实现ssh自动交互

shell脚本实现ssh自动登录远程服务器示例:#!/usr/bin/expectspawnssh[email protected]expect"*password:"send"123 "expect"*#"interact 原文链接:http://www.xuanhao360.com/linux-expects/Expect是一个用来处理交互的命令。借助Expect,我们可 查看详情

expect自动化交互脚本

紧接着上篇脚本进行拆分,分析里面的每个单词以及参数,解开交互的面纱,下面看脚本#!/bin/expectspawn ssh [email protected]expect {      "yes/no"     {send "yes "; 查看详情

ssh批量管理expect自动交互

SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html#SSH批量管理#expect自动交互##############################!/bin/sh#初次使用,以root批量执行CMD=(dateuname-rhostname)sh${[*]}./etc/init.d/functio 查看详情

expect实现交互(未完成)

expect介绍expect命令是一个实现交互功能的软件套件,是基于TCL的脚本编程语言,在企业运维中,系统会以交互的形式要求运维人员输入指定的字符串,之后才能继续执行命令。例如:为用户设置密码时,一般情况下需要手工输入... 查看详情

expect实现非交互

一、exepct介绍expect命令是一个实现交互功能的软件套件,是基于TCL的脚本编程语言,在企业运维中,系统会以交互的形式要求运维人员输入指定的字符串,之后才能继续执行命令。例如:为用户设置密码时,一般情况下需要手工... 查看详情

linux操作系统中expect如何使用?

参考技术A  在Linux系统中,expect是一个自动化交互套件,也是一个用来处理交互的命令;利用expect,我们可以将交互过程写在一个脚本上,让其自动化完成,从而帮助运维人员提高工作效率、节约时间。那么Linux系统中expect该如... 查看详情

expect远程连接脚本

Expect是Unix/Linux系统中用来进行自动化控制和测试的软件工具,它是Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,ssh,rsync等。下面是一个用expect脚本登录远程机器的示例:#!/usr/bin/expectsethost[lindex$argv0]setpasswd[lindex$ar... 查看详情

利用spawn和expect自动交互并返回交互结果

参考技术A如下脚本实现了如何利用expect和spawn实现主机间相互访问并获取结果(成功返回0,失败返回1),例如:每次ssh远程登录时都需要输入密码,而通过脚本1就可以实现不用输入密码自动登陆。1、远程Hostssh登陆脚本(ssh)2、... 查看详情

expect自动化交互脚本

接着写一个稍微复杂点的脚本,分发文件到指定服务器脚本。首先我们要知道远程分发文件的命令格式scp 源文件 验证用户@远程主机:远程目录[[email protected] ~]# scp auto_yes.exp [email protected]:/tmp/需求就... 查看详情

linux命令(239)——expect命令(代码片段)

...命令简介expect用于与互动程序进行自动交互。expect是一个自动化交互套件,主要应用于执行命令时,以交互形式按照要求输入指定字符串,实现自动交互。expect自动交互流程:spawn启动指定命令>expect获取指定关... 查看详情

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

小型自动化运维--expect入门知识Expect的自动交互工作流程简单说明:spawn启动指定进程-->expect获取期待的关键字-->send向指定进程发送指定字符-->进程执行完毕,退出脚本。spawn命令如果没有spawn命令,expect程序将会无法实现... 查看详情