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

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

    Expect 是一种工具,主要用于实现自动化交互式的操作,它由 Don Libes 开发,基于 Tcl(Tool Command Language)语言。通过使用 Expect,可以将原本需要手动进行的操作,例如 SSH 登录、FTP 登录等,编写成脚本自动...

    自动化部署 MySQL Shell脚本

    MySQL Shell脚本是一种高效的方法,用于自动化MySQL数据库的部署、管理及维护任务。在IT行业中,尤其是在运维领域,自动化是提升效率和减少错误的关键。本文将深入探讨如何使用Shell脚本来实现MySQL的自动化部署。 ...

    自动化部署教程.docx

    自动化部署教程 自动化部署是指使用自动化工具和技术来实现软件的部署和管理,旨在提高部署效率和可靠性。下面将从 pexpect 和 Fabric 两个方面对自动化部署进行讲解。 1. pexpect 模块 pexpect 是一个 Python ...

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

    `Expect`是一种用于自动化交互式命令的工具,它能模拟用户与基于文本的交互式程序进行对话。通过编写脚本来控制这些对话,我们可以实现一系列自动化任务,如远程登录、安装软件包等场景中的密码输入自动化。 #### ...

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

    总结,Linux Shell编程中的 Expect 工具是一个强大而实用的自动化工具,尤其适合处理需要用户交互的场景。通过学习 Expect,你可以更有效地管理和维护你的Linux系统,减少手动干预,提升工作效率。希望这个中文教程...

    expect安装包以及部署文档

    在大规模的服务器管理和自动化部署场景中,expect的效率和便利性得到了广泛的认可。 expect的核心概念在于它可以模拟用户输入,响应程序的输出,并根据预期的输出进行下一步操作。这使得它在批量执行SSH登录、复制...

    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.43.0和tcl8.4.11.zip

    `SHELL`标签表明`Expect`脚本可以和shell脚本结合使用,进一步提升命令行操作的自动化水平。`SFTP`标签则表示`Expect`可以用来处理SFTP会话,实现文件的安全上传和下载,这对于系统维护和备份工作非常实用。 在实际...

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

    ### 利用expect命令实现Shell自动化交互的方法详解 #### 背景介绍 在Linux环境中,经常需要执行一些远程操作,比如通过SSH进行远程登录、使用SCP进行远程文件复制、或者利用SFTP进行文件传输等。这些操作通常涉及...

    expect5.45.3.zip

    在实际应用中,结合Shell脚本,我们可以将Expect整合到更复杂的自动化流程中。例如,可以在Shell脚本中调用Expect脚本,并在成功登录后执行一系列远程操作,然后再退出。 总的来说, Expect 5.45.3是Linux系统自动...

    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 ...

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

    本文将详细介绍如何使用shell和expect脚本在CentOS7系统上实现SSH免密登录的自动化配置。 首先,我们需要理解SSH免密登录的基本原理。SSH免密登录依赖于公钥认证机制。每个SSH用户都有一个密钥对,包括公钥和私钥。...

    用Expect实现Linux自动远程登陆.pdf

    Expect 是 Unix 系统中的一种软件工具,用于自动化控制和测试,常用于交互式软件中,如 telnet、ftp、passwd、fsck、rlogin、ssh 等。通过 Expect,可以实现 Linux 的自动远程登录,简化登录过程,提高远程操作的...

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

    `shell脚本无密码登录 expect的使用方法详解`这个主题就是关于如何通过shell脚本和expect工具来实现自动化登录和执行远程操作,无需手动输入密码。这种方法尤其适用于需要定期执行的自动化任务,例如文件传输或系统...

    shell脚本远程启动其他服务器的tomcat传输文件自动登录判断启动停止

    这个"shell脚本远程启动其他服务器的tomcat传输文件自动登录判断启动停止"的方案,就是一种典型的自动化运维实践,它结合了多个核心工具和技术,包括shell脚本、expect、ssh以及scp,用于实现远程服务器管理与文件...

    expect在windows下使用的

    `Expect`是一个强大的脚本工具,主要用于自动化交互式命令行程序。它的工作原理是模仿终端行为,通过发送期望的输入并捕获预期的输出来控制这些程序,尤其适合于自动登录、运行远程命令、自动化系统配置等场景。在...

    expect-5.21-for-win.rar

    《使用Expect 5.21 for Windows:自动化Shell交互脚本的利器》 在Windows操作系统环境中,虽然原生不支持Unix-like的shell脚本,但通过工具如Expect,我们可以实现类似的功能,进行命令行程序的自动化交互。Expect...

    shell中嵌套执行expect命令实例

    在Shell脚本中嵌套执行`expect`命令是一种非常实用的技术,特别是在自动化运维、部署或需要与交互式程序进行通信时。`expect`是一个Unix/Linux下的工具,用于自动化那些需要用户输入交互的程序,比如SSH登录、SCP...

Global site tag (gtag.js) - Google Analytics