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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值