`
qindongliang1922
  • 浏览: 2148398 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:116346
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:124614
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:58493
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:70384
社区版块
存档分类
最新评论

shell自动化部署神器expect

阅读更多
Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。

Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年 开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。

上面是比较权威的解释,下面散仙就来通俗的说下,大概是什么个意思,使用expect可以自动完成控制台上让人工输入密码的工作,比如我有2台linux机器,这两台机器还没有建立SSH无密码登陆的验证,这时候如果我们使用ssh,scp或者是ssh-copy-id等命令,在控制台上要求人工输入密码,方能继续执行下去,这时候,假如我们要多次使用ssh干一些事,就比较繁琐了,而expect的出现,正是可以解决这种问题,因此使用expect来实现一些自动化部署和运维是非常方便的。



下面先来看下expect中的几个重要句子:

expect的核心是spawn expect send set

spawn 调用要执行的命令

expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:

send 发送需要交互的值,替代了用户手动输入内容

set 设置变量值

interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

set timeout -1表示无超时时间
set timeout 10表示超时时间为10秒

expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。



散仙在本例中使用的是centos的系统,默认是没有安装expect的,所以首先要判断系统上是否已安装expect:
[test@fse1 dir]$ rpm -qa | grep expect
expect-5.44.1.15-5.el6_4.x86_64


散仙的已经安装了,所以能够查找到,安装完毕后查看安装命令路径:
[test@fse1 dir]$ which expect
/usr/bin/expect


如果想要查看下载的包路径可以使用下面的命令:
[test@fse1 dir]$ whereis expect
expect: /usr/bin/expect /usr/share/man/man1/expect.1.gz
[test@fse1 dir]$ 




散仙今天要演示两个小例子,第一个是ssh登陆远程另一台机器,第二个是scp传输文件,注意这两个例子的前提是,两台机器之间没有提前做过SSH无密码认证:
ssh如下:
[test@fse1 dir]$ ssh 192.168.46.29
test@192.168.46.29's password: 

scp 如下:
[test@fse1 dir]$ scp -r c.sh 192.168.46.29:/home/test/
test@192.168.46.29's password:



从上面的情况来看,在没做认证之前,是均需要输入密码的,下面我们来看下,如何使用expect来实现自动登录:


expect实现在A服务器ssh自动登录B服务器,然后执行命令ls -al;du -sh *,再返回A服务器:
[test@fse1 dir]$ cat c.sh 

#ip地址
ip="192.168.46.29"
#密码
pd="test"



expect <<EOF

set timeout 10
spawn ssh $ip "ls -l;du -sh *;"
expect {
"*yes/no" {send "yes\r";exp_continue}
"*password:" {send "$pd\r"}
}


expect eof

EOF




[test@fse1 dir]$ 

[test@fse1 dir]$ sh c.sh 
spawn ssh 192.168.46.29 ls -l;du -sh *;
test@192.168.46.29's password: 
总用量 12
-rw-rw-r-- 1 test test 8 9月  18 02:42 bb.txt
-rw-rw-r-- 1 test test 4 9月  18 02:26 b.sh
-rw-rw-r-- 1 test test 3 9月  18 02:26 myid
4.0K    bb.txt
4.0K    b.sh
4.0K    myid
[test@fse1 dir]$ 



注意在EOF里面,只能实现远程登录其他服务器执行命令后,退出,而不能远程登录服务器上,一直停在远程的服务器上,如果想远程登录服务器怎么办?
[test@fse1 dir]$ cat d.sh 


ip="192.168.46.29"
pd="test"


#set timeout -1
expect -c  "

spawn ssh $ip 
expect {
\"*yes/no\" {send \"yes\r\";exp_continue}
\"*password:\" {send \"$pd\r\"}

}

interact;

"




[test@fse1 dir]$ sh d.sh 
spawn ssh 192.168.46.29
test@192.168.46.29's password: 
Last login: Thu Sep 18 04:47:59 2014 from fse1
[test@fse2 ~]$ ll
总用量 12
-rw-rw-r-- 1 test test 8 9月  18 02:42 bb.txt
-rw-rw-r-- 1 test test 4 9月  18 02:26 b.sh
-rw-rw-r-- 1 test test 3 9月  18 02:26 myid
[test@fse2 ~]$ exit;
logout
Connection to 192.168.46.29 closed.
[test@fse1 dir]$ 


注意在上面的脚本里,没用EOF而是用了expect的-c命令来实现,并且在最后没有使用expect eof关键字而是用来interact来保持远程登录状态,这一点需要注意。





下面来看下scp 的传输,这个其实就简单了,只需少量改造散仙上面的代码即可:
[test@fse1 dir]$ cat e.sh 

#scp的传输地址
ip="192.168.46.29:/home/test/"
#scp传输的文件
file="login.exp"
#密码
pd="test"
#set timeout -1
expect -c  "

spawn scp -r $file  $ip 
expect {
\"*yes/no\" {send \"yes\r\";exp_continue}
\"*password:\" {send \"$pd\r\"}

}

expect eof
"




[test@fse1 dir]$ sh e.sh 
spawn scp -r login.exp 192.168.46.29:/home/test/
test@192.168.46.29's password: 
login.exp                                                                                                                                     100%  273     0.3KB/s   00:00    
[test@fse1 dir]$ 



到此我们看见已经可以无需人工输入密码,来实现自动化了,然后我们到ip为29的机器上,查看scp是否成功:
[test@fse2 ~]$ ll
总用量 16
-rw-rw-r-- 1 test test   8 9月  18 02:42 bb.txt
-rw-rw-r-- 1 test test   4 9月  18 02:26 b.sh
-rwxrwxr-x 1 test test 273 9月  18 04:58 login.exp
-rw-rw-r-- 1 test test   3 9月  18 02:26 myid
[test@fse2 ~]$ 


可以看出,已经成功的发送到了指定机器上,虽说使用shell+expect比较方便,但纵观大型企业的自动化运维,还是使用Python的比较多。



1
1
分享到:
评论

相关推荐

    14.Shell脚本编程之expect.md

    Shell编程之expect

    人机交互自动化开发工具expect专业指导书 Exploring_Expect.pdf

    人机交互自动化开发工具expect专业指导书,英文原版,非常详细的说明和讲解

    用expect 实现切换用户时自动输入密码.txt

    昨天一个网友问如何能够将输入密码的工作在shell里面自动完成,研究了一下,发现这种交互式的工作,普通的shell实现不了,据说可以借助expect来搞定,所以初步学习了一下expect,成果和大家分享一下: 应用一: 实现...

    shell+python+expect更改设备密码并邮件通知

    #!/bin/bash i=$(cat /dev/urandom | head -n 10 | md5sum | head -c 10) echo $i &gt;&gt; /data/1.log 2&gt;&1 expect test.expect $i &gt;&gt; /data/1.log 2&gt;&1 sleep 3 python /opt/file/se.py $i

    expect5.45.3.zip

    linux下自动输入密码,不用手动输入,shell自动化脚本,expect源码,官网下载不方便的开发者可以下载使用

    利用expect命令实现Shell自动化交互的方法详解

    我们通过Shell可以实现简单的控制流功能,如:循环、...下面这篇文章主要给大家介绍了关于利用expect命令实现Shell自动化交互的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

    shell expect

    With the advent of software such as Expect for controlling interactive processes, it has become possible to improve reliability and security with relative ease. This paper reviews the reliability ...

    shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了。 从网上查到使用...

    centos7 ssh免密登录自动化配置脚本(ps:已测试过)

    shell+expect编写的 大数据集群ssh免密登录自动化配置脚本(带说明文档)

    linux shell编程 Expect简介及应用中文教程

    linux shell编程 Expect简介及应用中文教程

    expect英文版简略教程

    expect英文版简略教程 对expect shell 自动化有兴趣的可以看看

    shell_expect.sh

    shell_expect.sh

    SigmationTF自动化测试教程

    系统的管理与Shell编程知识,并且熟练掌握ITCL与EXPECT脚本语言。 本文适合SigmationTF自动化测试工程师课程的进修或培训使用,对本文 内容涉及的实验部分需要参考相关操作系统和设备操作手册。

    linux自动化交互脚本expect详解

    用来实现自动的交互式任务,无需人为干预。在实际开发中,运行shell脚本有时候会输入linux密码或者是mysql密码等,而expect可以帮我们输入。 二、安装 expect在linux系统中没有自带,需要我们自行安装,在Ubuntu系统...

    expect_tcl_shell

    Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令。spawn命令激活一个Unix程序来进行交互式的运行。  send命令向进程发送字符串。expect命令等待进程的某些字符串。 expect支持正规表达式并能同时...

    expect安装包以及部署文档

    expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!

    Expect 手册中文版

    Expect-----能与交互式程序进行“可程序化”会话的脚本语言 概述: Expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及什么是...

    Shell学习15天(Expect)- 07day

    expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software  expect自动交互流程: spawn...

    shell中嵌套执行expect命令实例

    主要介绍了shell中嵌套执行expect命令实例,一直都想把expect的操作写到bash脚本里,这样就不用我再写两个脚本来执行了,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics