20.27 分发系统介绍
20.28 expect脚本远程登录
20.29 expect脚本远程执行命令
20.30 expect脚本传递参数
20.27 分发系统介绍
公司的网站本来已经建好了,当公司的业务越来l越大时候就会需要实时更新代码,由于后端服务器有很多台来跑web服务。此时为了快速更新代码就可以使用分发系统。其中开源的上线代码的软件有很多,git等等。这里我们使用shell来编写一个分发系统来上线代码。核心使用expect脚本语言,它可以实现远程执行命令,远程传输数据等操作。
- 准备工作
1.准备1台模版机器,里面是包含有最新的代码
2.每台分发机器的IP地址和密码
3.分发系统脚本
由于分发系统的核心是使用expect,因此先实践几个例子来熟悉expect的语法命令
20.28 expect脚本远程登录
实例1.自动远程登录
expect脚本机器 kun05 192.168.80.104
被远程的机器 kun03 192.168.80.102
1.安装expect语言
1 | [root@kun05 ~]# yum install -y expect |
2.编辑脚本
1 | [root@kun05 ~]# cd /usr/local/sbin/ |
写入下面代码1
2
3
4
5
6
7
8
9
10
11
12#!/usr/bin/expect
#定义变量
set host "192.168.80.102"
set passwd "coco0769"
#执行命令
spawn ssh root@$host
#与远程机器交互 截取特定信息 发送变量
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
interact
set
定义变量spawn
执行命令expect
使用expect语句进行交互\r
表示回车exp_contunue
表示在同一个expect命令内当前内容判断执行后会继续执行下个内容判断interact
表示继续交互expect eof
表示停留远程机器上一会儿再退出
为了让远程登录时候出现提示,可以清空/root/.ssh/known_hosts
目录1
[root@kun05 ~]# > /root/.ssh/known_hosts
测试
1.添加执行权限
1 | [root@kun05 sbin]# chmod a+x expect1.exp |
2.执行脚本
1 | [root@kun05 sbin]# ./expect1.exp |
已经成功登录kun03机器上
20.29 expect脚本远程执行命令
实例2.自动远程登录,并执行命令并退出
编辑脚本
1 | [root@kun05 sbin]# vim expect2.exp |
写入下面代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#!/usr/bin/expect
set user "root"
set host "192.168.80.102"
set passwd "coco0769"
spawn ssh $user@$host
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$passwd\r"}
}
expect "]*"
send "touch /tmp/test.aa\r"
expect "]*"
send "echo 111 >/tmp/test.aa\r"
expect "]*"
send "exit\r"
测试
添加执行权限并执行脚本
1 | [root@kun05 sbin]# chmod a+x expect2.exp |
进入kun03机器看看
1 | [root@kun03 ~]# ll /tmp/test.aa |
20.28 expect脚本传递参数
实例3.远程传递参数
编辑脚本
1 | [root@kun05 sbin]# vim expect3.exp |
写入下面代码1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/usr/bin/expect
set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "coco0769"
set cmd [lindex $argv 2]
spawn ssh $user@$host
expect {
"yes/no" {send "yes\r"}
"password:" {send "$passwd\r"}
}
expect "]*"
send "$cmd\r"
expect "]*"
send "exit\r"
[lindex $argv 0]
表示要输入的第一个参数 如此类推
测试
添加执行权限并执行脚本
1 | [root@kun05 sbin]# chmod a+x expect3.exp |
当要输入参数里面有多个命令是需要用""
双引号括起来并使用;
分号分开
可以在命令行的后面增加set timeout
来指定命令的超时时间 -1
为永远1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#!/usr/bin/expect
set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "coco0769"
set cmd [lindex $argv 2]
spawn ssh $user@$host
expect {
"yes/no" {send "yes\r"}
"password:" {send "$passwd\r"}
}
expect "]*"
send "$cmd\r"
set timeout -1
expect "]*"
send "exit\r"
测试
输入vmstat命令1
2
3
4
5
6
7
8
9
10
11
12[root@kun03 ~]# [root@kun05 sbin]# ./expect3.exp "root" 192.168.80.102 "vmstat 1"
spawn ssh root@192.168.80.102
root@192.168.80.102's password:
Last login: Fri Jul 20 21:42:43 2018 from 192.168.80.104
[root@kun03 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 167852 2108 168580 0 0 35 3 85 113 0 0 99 0 0
0 0 0 167480 2108 168592 0 0 0 0 91 113 0 1 99 0 0
0 0 0 167480 2108 168592 0 0 0 0 104 119 0 0 100 0 0
0 0 0 167480 2108 168592 0 0 0 0 79 96 0 1 99 0 0
0 0 0 167480 2108 168592 0 0 0 0 89 106 0 0 100 0 0
现在是不断地执行vmstat命令