文档章节

73.分发系统介绍 expect脚本远程登录 执行命令 传递参数

 王鑫linux
发布于 09/21 22:39
字数 1999
阅读 7
收藏 0

20.27 分发系统介绍

20.28 expect脚本远程登录

20.29 expect脚本远程执行命令

20.30 expect脚本传递参数

 

 

 

 

 

20.27 分发系统介绍:

 

 

 

场景:业务越来越大。用的比如app,后端(也就是服务器)所使用的编程语言为php。那要想运行这个php的代码,就要搞一个LAMP或者LNMP的环境。最后还需要把你们的代码上传达到服务器上去(说白了就是做一个网站嘛)

但是在平时工作中业务不断在迭代,有新的功能出现,那这时候就要去改代码。几台机器的话还好,要是几十台的话,就要搞一个分发系统能够把每天或者每一段时间更新的代码,分别的发布到这几十台机器上去。

当然还会有开源的一些工具可以帮我们做到。但是这里我们要用shell编程能够实现的一种上线的工具。所谓的分发系统也就是上线的shell脚本。核心叫做expect,expect也可以说是一种脚本语言(和shell非常像),我们可以用它能够实现传输文件,还可以实现远程执行命令,不需要我们去输入密码。说着这可能会想到用ftp或xftp以及lrzsz上传。以后会讲到非常标准的上线的体系

在这里要准备一台模板的机器,这台机器的代码是最新的代码,是准备要上线的代码。然后给要上线的这几十台机器的IP要知道,还有这几十台机器对应用户的密码。之后就是使用expect借助rsync把这些代码推送到这五十台机器上去。计入需要执行一些命令,还可以用expect登录进去去执行这些命令。就是这样的一个过程

 

 

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

20.28 expect脚本远程登录:

 

 

 

 

 

~1.yum install -y expect

~2.自动远程登录

#! /usr/bin/expect

set host "192.168.133.132" #定义host的变量。expect里面定义变量的格式就是这样写的。注意前面要加set

set passwd "123456"

spawn ssh root@$host #登录机器的语句

expect { #expect核心语句

"yes/no" { send "yes\r"; exp_continue} #相当于用户交互。我们初次登录另一台机器的时候会提示一些。这个就是针对这些提示做出的判断

"assword:" { send "$passwd\r" }

}

interact #结束。

最后结束语是interact:表示但是需要停留在远程的机器上,不需要退出

最后结束语是expect eof:表示登录后停留一两秒后退出

如果什么都不加: 登录后马上退出来

 

 

实例:

[root@axinlinux-01 ~]# cd /usr/local/sbin/

[root@axinlinux-01 sbin]# vim 1.expect

#! /usr/bin/expect

set host "192.168.208.130"

set passwd "wangxin789"

spawn ssh root@$host

expect {

"yes/no" { send "yes\r"; exp_continue}

"assword:" { send "$passwd\r" }

}

interact

[root@axinlinux-01 sbin]# ./1.expect #这样执行这个脚本

-bash: ./1.expect: 权限不够

[root@axinlinux-01 sbin]# chmod a+x 1.expect #加上可执行的权限。否则会报权限不够

[root@axinlinux-01 sbin]# ./1.expect #再次执行成功

以下,就是我们脚本中,做出的一些判断与交互。相当于以脚本的方式登录了

spawn ssh root@192.168.208.130

The authenticity of host '192.168.208.130 (192.168.208.130)' can't be established.

ECDSA key fingerprint is SHA256:2YEHWSxuaj+NF8PI1ipI8BeYOqoajfpRICmS59xgQEw.

ECDSA key fingerprint is MD5:3e:75:16:b7:8e:40:10:0f:f3:e9:79:34:48:69:2a:e4.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.208.130' (ECDSA) to the list of known hosts.

root@192.168.208.130's password:

Last login: Fri Sep 21 21:25:28 2018 from 192.168.208.1

[root@axinlinux-02 ~]# #成功登录

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

20.29 expect脚本远程执行命令:

 

 

 

 

 

~1.自动远程登录后,执行命令并退出

~2.#!/usr/bin/expect

set user "root"

set passwd "123456"

spawn ssh $user@192.168.133.132

 

expect {

"yes/no" { send "yes\r"; exp_continue}

"password:" { send "$passwd\r" }

}

expect "]*" #就是我们在输入命令时前面的主机名[root@axinlinux-01]#,因为root的话是#,其他用户是$。所以这里用了*,不管匹配的是哪个

send "touch /tmp/12.txt\r"

expect "]*"

send "echo 1212 > /tmp/12.txt\r"

expect "]*"

send "exit\r" #最后的命令exit回车。自然脚本也就结束了

 

 

 

 

 

实例:

[root@axinlinux-01 sbin]# vim 2.expect

#!/usr/bin/expect

set user "root"

set passwd "123456"

spawn ssh $user@192.168.133.132

 

expect {

"yes/no" { send "yes\r"; exp_continue}

"password:" { send "$passwd\r" }

}

expect "]*"

send "touch /tmp/12.txt\r"

expect "]*"

send "echo 1212 > /tmp/12.txt\r"

expect "]*"

send "exit\r"

[root@axinlinux-01 sbin]# chmod a+x 2.expect #一样设置x权限

[root@axinlinux-01 sbin]# ./2.expect #运行它

spawn ssh root@192.168.208.130

root@192.168.208.130's password:

Last login: Fri Sep 21 21:49:27 2018 from 192.168.208.128

[root@axinlinux-02 ~]# touch /tmp/12.txt #可以看到在02的机器上运行了脚本里的命令

[root@axinlinux-02 ~]# echo 1212 > /tmp/12.txt

[root@axinlinux-02 ~]# [root@axinlinux-01 sbin]# #最后又回到了01上

[root@axinlinux-02 ~]# cat /tmp/12.txt #检查一下是否有

1212

[root@axinlinux-02 ~]# ls -l !$

ls -l /tmp/12.txt

-rw-r--r-- 1 root root 5 9月 21 22:04 /tmp/12.txt

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

 

20.30 expect脚本传递参数:

 

 

 

 

 

传递参数(像shell有$1$2。也相当于是他的内置变量)。如果想执行多个命令,就传递多个参数

#!/usr/bin/expect

 

set user [lindex $argv 0] #这是他的第一个参数(把这个参数的值赋给user,也就是我们登录时要输入的)。用方括号括起来的就是user。这也是他的格式

set host [lindex $argv 1] #这是他的第二个参数

set passwd "123456"

set cm [lindex $argv 2] #第三个参数(也就是我们进去后要执行的命令,这个参数)

spawn ssh $user@$host

 

expect {

"yes/no" { send "yes\r"}

"password:" { send "$passwd\r" }

}

expect "]*"

send "$cm\r" #就是定义我们进去以后执行的参数

expect "]*"

send "exit\r"

 

 

实例:

[root@axinlinux-01 sbin]# vim 3.expect

#!/usr/bin/expect

 

set user [lindex $argv 0]

set host [lindex $argv 1]

set passwd "123456"

set cm [lindex $argv 2]

spawn ssh $user@$host

 

expect {

"yes/no" { send "yes\r"}

"password:" { send "$passwd\r" }

}

expect "]*"

send "$cm\r"

expect "]*"

send "exit\r"

[root@axinlinux-01 sbin]# ./3.expect root 192.168.208.130 ls #我们输入这三个参数。用户名 目标IP 要执行的命令

spawn ssh root@192.168.208.130

root@192.168.208.130's password:

Last login: Fri Sep 21 22:22:39 2018 from 192.168.208.1

[root@axinlinux-02 ~]# ls #可以看到进去后执行了这个命令

aaa.txt anaconda-ks.cfg shell zabbix-release-3.2-1.el7.noarch.rpm

[root@axinlinux-02 ~]# [root@axinlinux-01 sbin]#

[root@axinlinux-02 ~]# [root@axinlinux-01 sbin]# ./3.expect root 192.168.208.130 "ls;w;vmstat 1"

#以上,如果想进去执行多个命令,就传递多个参数,用分号间隔,并且用双引号引起来(作为一个参数传递)

spawn ssh root@192.168.208.130

root@192.168.208.130's password:

Last login: Fri Sep 21 22:26:20 2018 from 192.168.208.128

[root@axinlinux-02 ~]# ls;w;vmstat 1 #可以看到我们传递参数的三个命令

aaa.txt anaconda-ks.cfg shell zabbix-release-3.2-1.el7.noarch.rpm

22:28:52 up 1:05, 3 users, load average: 0.01, 0.03, 0.05

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root tty1 21:24 1:04m 0.05s 0.05s -bash

root pts/0 192.168.208.1 22:22 6:13 0.02s 0.02s -bash

root pts/1 192.168.208.128 22:28 0.00s 0.01s 0.00s w

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

1 0 0 1113344 2076 189972 0 0 21 2 67 65 0 0 99 0 0

0 0 0 1113168 2076 190060 0 0 0 0 138 123 0 1 99 0 0

0 0 0 1113160 2076 190068 0 0 0 0 128 112 0 0 99 0 0

0 0 0 1113128 2076 190104 0 0 0 0 141 131 0 1 99 0 0

0 0 0 1113300 2076 190064 0 0 0 0 167 137 1 0 99 0 0

0 0 0 1113176 2076 190064 0 0 0 0 144 125 0 1 100 0 0

0 0 0 1113052 2076 190064 0 0 0 0 136 117 0 1 99 0 0

0 0 0 1113052 2076 190064 0 0 0 0 100 100 0 0 100 0 0

0 0 0 1113052 2076 190064 0 0 0 0 100 98 0 0 100 0 0

1 0 0 1113176 2076 190068 0 0 0 0 127 116 0 0 100 0 0

#因为vmstat不能自动停止,但是会有超时时间,所以会自动退出来

[root@axinlinux-01 sbin]#

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
粉丝 4
博文 74
码字总数 139302
作品 0
济南
分发系统介绍expect脚本远程登录expect脚本远程执行命令 expect脚本传递参数

分发系统介绍 分发系统-expect讲解(也就是一个分发的脚本) 场景: 业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因为业...

lyy549745
07/19
0
0
2018-4-25 18周1次课 分发系统-expect讲解(上)

20.27 分发系统介绍 由于业务迭代更新,需要更改代码,如果机器很多,那么久需要一个分发系统,可以把每段时间更新的代码分别发布到机器上去 分发系统就是上线的shell脚本,核心为expect ex...

alexis7gunner
04/24
0
0
20.27 分发系统介绍;20.28 expect脚本远程登录;20.29 expect脚本远程执行

20.27 分发系统介绍 shell项目-分发系统-expect 20.28 expect脚本远程登录 1. 安装expect : [root@hao-01 ~]# yum install -y expect 自动远程登录 2. 创建配置1.expect脚本(远程登录) : ...

主内安详
04/25
0
0
分发系统介绍&expect脚本远程登录&expect脚本远程执行命令&expect脚本传递参数

20.27 分发系统介绍 应用场景 企业中随之业务的逐渐增大,后端所使用的编程语言是php,系统为LAMP/LNMP架构,需要将代码上传到服务器中;代码会不断的迭代,这就需要在业务服务器上更新代码,...

影夜Linux
07/20
0
2
20.27分发系统介绍;20.28expect脚本远程登录;20.29expect脚本远程执行命令;20.30expect脚本传递参数

20.27 分发系统介绍 shell项目-分发系统-expect 20.28 expect脚本远程登录 1. 安装expect [root@hao-01 ~]# yum install -y expect 自动远程登录 2. 创建配置1.expect脚本(远程登录) [root@h...

主内安详
2017/09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

LSM-Tree 大数据索引技术

一、LSM-Tree概述 核心思想就是放弃部分读能力,换取写入能力的最大化。LSM-Tree ,这个概念就是结构化合并树(Log-Structured Merge Tree)的意思,它的核心思路其实非常简单,就是假定内存...

PeakFang-BOK
13分钟前
0
0
vue.js响应式原理解析与实现

从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染。之后,再接触了vue.js,当时也一度很好奇vue.js是如何监测数据更新并且重新...

peakedness丶
19分钟前
0
0
Weblogic补丁升级操作步骤

linux平台: weblogic1036 1:停止weblogic服务 2:打FMJJ补丁 a:获取weblogic_home目录并执行命令:export weblogic_home="/weblogic/wls1036_x64",(此目录一般为目录“user_projects”上...

fang_faye
32分钟前
0
0
04-《Apache Tomcat 9 User Guide》之部署项目

1.Introduction Deployment is the term used for the process of installing a web application (either a 3rd party WAR or your own custom web application) into the Tomcat server. 部......

飞鱼说编程
32分钟前
0
0
一位十年的老码农他眼中的区块链

大家可能已经听说过比特币、莱特币、以太币等等,以及它们作为一种新货币在市场上的潜力。 有趣的是,很多投资比特币的人也提到了区块链之类的东西。 显然,这项技术是比特币等其他东西的"基...

小刀爱编程
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部