文档章节

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

a
 axin-linux
发布于 09/21 22:39
字数 1999
阅读 9
收藏 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]#

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
a
粉丝 4
博文 75
码字总数 142878
作品 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
10/30
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

没有更多内容

加载失败,请刷新页面

加载更多

Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 一、...

王磊的博客
18分钟前
1
0
Ext grid 渲染

// 单元格字体颜色渲染function renderer_Meta_useStatus(value, cellmeta, record,rowIndex, columnIndex, store){ var color = ""; if("空闲"==value){ color = "green";......

MoksMo
28分钟前
4
0
log4j2在spring中的配置

<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,这个用于设置l......

TonyTaotao
33分钟前
3
0
java 中间变量缓存机制(i++,++i)

public class Test { public static void main(String[] args) { int i = 0; i = i ++ ; System.out.println(i); } } 答案是 0 如果是 i = ++......

shzwork
40分钟前
5
0
初识多线程及其原理-笔记

什么情况下应该使用多线程? 通过并行计算提高程序执行性能 需要等待网络、I/O响应导致耗费大量的执行时间, 可以采用异步线程的方式来减少阻塞 tomcat7 以前的io模型 客户端阻塞 线程级别阻...

Java搬砖工程师
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部