7月19日任务

20.27 分发系统介绍
20.28 expect脚本远程登录
20.29 expect脚本远程执行命令
20.30 expect脚本传递参数

20.27 分发系统介绍

公司业务逐渐扩大时,假如使用的网站或者APP的后端服务器所使用的语言是PHP,如果要想运行PHP代码,需要配置一个lamp或lnmp的环境,最后还需要把代码上传到服务器上去,但是在平常工作中经常有一些新的业务改变,这个时候就需要去修改代码,如果服务器不多还可以快速的在服务器上修改,但是如果有50台或更多服务器,那么就不可能直接在服务器进行修改了,这个时候就可以使用到分发系统这样的上线工具进行上线,发布上线代码,所谓的分发系统也就是上线的shell脚本,最核心的东西就是expect,expect也可以说是一种脚本语言,和shell很像,可以用它去实现传输文件,还可以实现自动远程登录执行命令,不需要输入密码。

使用什么工具上线代码,所谓上线就是把开发人员写的代码发布到线上环境去。

分发系统如何实现发布上线代码,首先要准备一台模板的机器,这台机器上的代码是最新的代码,是需要准备上线的代码,另外要给这50台电脑上线代码,还需要知道50台电脑的IP和对应的用户密码,然后使用expect脚本借助于rsync把这些代码推送到50台机器上,假如说还需要执行一些命令,还可以使用expect远程登录后去执行命令,就是这样的一个过程实现新代码上线发布。

20.28 expect脚本远程登录

1、yum安装expect 软件包

[root@jimmylinux- ~]# yum install -y expect

2、编写expect脚本

示例1:通过expect脚本自动远程登录,并执行命令。

[root@jimmylinux- sbin]# vi .expect

#! /usr/bin/expect
set host "192.168.52.129" 定义变量
set passwd "***@126.com" 定义变量
spawn ssh root@$host 登录机器的语句
expect {
"yes/no" { send "yes\r"; exp_continue} 初次登录一台机器会提示yes/no 对话框
"assword:" { send "$passwd\r" }
}
interact
[root@jimmylinux- sbin]# ssh 192.168.52.129  因为之前有登录过,所以不会提示yes/no 对话框
root@192.168.52.129's password: [root@jimmylinux- sbin]# vi /root /.ssh/known_hosts 清空文件里的内容,再次登录时候就会提示yes/no

执行效果

[root@jimmylinux- sbin]# chmod a+x .expect

[root@jimmylinux- sbin]# ./.expect
spawn ssh root@192.168.52.129 root@192.168.52.129's password:
Last login: Thu Jul :: from 192.168.52.128 [root@jimmylinux- ~]# 已经自动登录到192.168.52. 这台机器

20.29 expect脚本远程执行命令

示例2:通过expect脚本自动远程登录,并执行命令最后退出。

[root@jimmylinux- sbin]# vi .expect

#!/usr/bin/expect
set user "root"
set passwd "***@126.com"
spawn ssh $user@192.168.52.129 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@jimmylinux- sbin]# chmod a+x .expect

[root@jimmylinux- sbin]# ./.expect
spawn ssh root@192.168.52.129 root@192.168.52.129's password:
Last login: Thu Jul :: from 192.168.52.1 [root@jimmylinux- ~]# touch /tmp/.txt [root@jimmylinux- ~]# echo > /tmp/.txt [root@jimmylinux- ~]# [root@jimmylinux- sbin]# [root@jimmylinux- sbin]# ./.expect
spawn ssh root@192.168.52.129 root@192.168.52.129's password:
Last login: Thu Jul :: from 192.168.52.128 [root@jimmylinux- ~]# ls -l /tmp/.txt
-rw-r--r-- root root 7月 : /tmp/.txt [root@jimmylinux- ~]# cat !$
cat /tmp/.txt

比较1.expect和2.expect脚本的区别,1脚本仅仅是登录进去,然后interact表示expect脚本结束了,但是会停留在机器上不会退出登录的机器,2脚本登录完之后,还需要执行几条命令,最后才是退出结束脚本。

[root@jimmylinux- sbin]# cat .expect
#! /usr/bin/expect
set host "192.168.52.129"
set passwd "1982ya@163.com"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}
interact
[root@jimmylinux- sbin]# cat .expect
#!/usr/bin/expect
set user "root"
set passwd "1982ya@163.com"
spawn ssh $user@192.168.52.129 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"

20.30 expect脚本传递参数

shell里面有$1 $2,expect也是可以传递参数的,也相当于是内置变量。

示例3:expect脚本传递参数

 [root@jimmylinux- sbin]# vi .expect

 #!/usr/bin/expect

 set user [lindex $argv ]
set host [lindex $argv ]
set passwd "***@126.com"
set cm [lindex $argv ]
spawn ssh $user@$host expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"

执行效果

 [root@jimmylinux- sbin]# vi .expect
[root@jimmylinux- sbin]# chmod a+x .expect
[root@jimmylinux- sbin]# ./.expect root 192.168.52.129 "ls;w;vmstat 1" 传递多条命令,需要使用双引号引起来,中间用分号分隔。
spawn ssh root@192.168.52.129
root@192.168.52.129's password:
Last login: Thu Jul :: from 192.168.52.128
[root@jimmylinux- ~]# ls;w;vmstat
.txt anaconda-ks.cfg cc.txt sed
.cap .txt awk grep test
.txt .txt b.txt jimmylinux zabbix-release-3.2-.el7.noarch.rpm
:: up :, users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ 192.168.52.1 : : .02s .02s -bash
root pts/ 192.168.52.128 : .00s .03s .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

分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数的更多相关文章

  1. Linux - 执行命令与脚本

    001 - Linux执行多条命令 方法1:在命令行下可以一次性粘贴多条语句,shell会依次执行并输出结果 方法2:在一个命令行中,用分号将各个命令隔开或者使用&&连接各个命令 示例 ...

  2. 详解如何在 Linux 启动时自动执行命令或脚本

    我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...

  3. shell脚本批量ssh登陆主机并执行命令

    shell脚本批量ssh登陆主机并执行命令 今天在客户现场遇到了这个问题,客户没有管理工具,无法批量登陆主机下发命令,几个个C段啊,让我一个一个登陆,.................. 所以写了个s ...

  4. Shell脚本中实现切换用户并执行命令操作【转】

    第一种方法 cat test.sh #!/bin/bashsu - test <<EOFpwd;exit;EOF 执行结果图: 第二种方法 当然也可以用下面的命令来执行 复制代码代码如下: ...

  5. 在 Linux 启动或重启时执行命令与脚本

    有时可能会需要在重启时或者每次系统启动时运行某些命令或者脚本.我们要怎样做呢?本文中我们就对此进行讨论. 我们会用两种方法来描述如何在 CentOS/RHEL 以及 Ubuntu 系统上做到重启或者系 ...

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

    expect脚本远程登录 yum install -y expect yum install -y tcl tclx tcl-devel 自动远程登录 #! /usr/bin/expect set h ...

  7. expect脚本远程登录、远程执行命令和脚本传参简单用法

    expect介绍: 最近想写一个自动化安装脚本,涉及到远程登录.分发文件包.远程执行命令等,其中少不了来回输入登录密码,交互式输入命令等,这样就大大降低了效率,那么有什么方法能解决呢?不妨试试expe ...

  8. Linux远程ssh执行命令expect使用及几种方法

    expect命令实现脚本免交互 一.Linux下SSH无密码认证远程执行命令 在客户端使用ssh-keygen生成密钥对,然后把公钥复制到服务端(authorized_keys). 实现步骤: 1.客 ...

  9. 批量复制及执行命令shell脚本

    平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可 ...

  10. NET Core 跨平台执行命令、脚本

    一.前言 我们可能会遇到需要在程序中执行一些系统命令,来获取一些信息:或者调用shell脚本..NET Core 目前已经可以跨平台执行,那么它如何跨平台执行命令呢,请看下面的讲解. 二.Proces ...

随机推荐

  1. Java12 Collectors.teeing 你需要了解一下

    前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象, ...

  2. vue H5页面手机端 利用canvas 签名

    签名首先用一个canvas标签,上面加三个代码,分别是点击,移动,离开.这里点击是开始画笔的地方,如果不加@touchstart 笔头会发生偏移,可以试试. @toucheend也是如此.尾巴也会出现 ...

  3. 运用wxs制作微信小程序左滑功能和跳转,性能更优越

    锲子 微信小程序自定义左滑功能加上跳转,换成以往,左滑功能的逻辑一般是在js中实现,但在拖动方面,性能并不是那么的流畅.如今,官方新扩展了一套脚本语言wxs,在IOS设备上运行,性能会比JS快2~20 ...

  4. 【XSY2488】【HDU5818】Joint Stacks

    这题合并栈让我们想到了左偏树. 我们可以维护val值为时间,dis值为size的左偏树,定义两个根root1和root2,表示两个栈的栈顶,建大根的左偏树. 接下来的插入,删除,两个栈合并都是左偏树的 ...

  5. C++学习笔记2_函数.函数指针.函数模板

    1. 内联函数void printAB(int a,int b){ cout<<(a)<<(b)<<endl;}int main(void){ for(int i= ...

  6. 梯度下降法及一元线性回归的python实现

    梯度下降法及一元线性回归的python实现 一.梯度下降法形象解释 设想我们处在一座山的半山腰的位置,现在我们需要找到一条最快的下山路径,请问应该怎么走?根据生活经验,我们会用一种十分贪心的策略,即在 ...

  7. CSP-S 94 (sb lsc gc赛)

    不要问我为什么题解倒着写,因为在填坑! 关于这场比赛就是我sb的再现 考完试旁边_LH叱的一声说道:“lsc真**垃圾”; lsc:........确实很垃圾! ------------------- ...

  8. 从Gartner IT Symposium,看RPA“一半是海水一半是火焰”

    2019年,艺赛旗和Gartner建立了咨询合作,并在企业发展策略中汲取了Gartner的部分建议.今年Gartner在全球召开了多场IT Symposium,并在Symposium发布2020的相关 ...

  9. HTTPS加密流程理解

    HTTPS加密流程 由于HTTP的内容在网络上实际是明文传输,并且也没有身份验证之类的安全措施,所以容易遭到挟持与攻击 HTTPS是通过SSL(安全套接层)和TLS(安全传输协议)的组合使用,加密TC ...

  10. canvas与工作流的不解之缘

    html的标签 <canvas>用于图形的绘制,通过脚本 (通常是JavaScript)来完成,canvas简而言之就是个画布.上一篇文章我们提到工作流的一个重要组成部分:流程建模,也就是 ...