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. Java 干货之深入理解Java泛型

    一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义的类.如果要编写可以应用多中类型的代码,这种刻板的限制对代码得束缚会就会很大. ---<Thinking in Java> ...

  2. 闯缸鱼:看懂python如何实现整数加和,再决定是否自学编程

    玩鱼缸的新手都知道有一种鱼叫"闯缸鱼",皮实好养,帮助新手判断鱼缸环境是否准备好.这篇笔记,最初用来解答一个编程新手的疑问,后来我发现,整理一下也可当做有兴趣自学python 编程 ...

  3. NOIP模拟测试8反思

    被动态逆序对戏耍,来写博客这次考试油炸了 模板爆零,哈希调半天导致T3没时间,我都干了些什么&_& T3思路: 利用环的性质先拼成一条链,然后二分边界. 证明就不说啦(其实是我不会) ...

  4. 建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板

    随着互联网越来越生活化,二维码的使用越来越普遍,不论是扫码支付还是扫码关注引流,似乎我们总是离不开二维码,那么很多需要推广的文章或社区想要自己的二维码,那么你是不是需要在网站直接提供给用户呢?很多开发 ...

  5. mysql group by使用方法注意

    mysql group by使用方法注意 group by 后面只用能用having 不能加 where等域名

  6. css3mask淡出文字

    css3mask淡出文字<pre>.p0_11wrap { width: 0.299rem; height: 7.68rem; overflow: hidden; background: ...

  7. docker项目——搭建飞机大战小游戏

    项目2:搭建打飞机小游戏,验证数据持久化(最底下有链接) 第一步:拉取镜像 [root@localhost docker-image]# docker load < httpd_img.tar. ...

  8. windows中修改IP映射的位置

    windows中修改IP映射的位置 置顶 2018年08月05日 14:42:44 wangxiaolong0 阅读数:1473   在安装linux之后,发现windows不能通过映射来访问linu ...

  9. 深入理解计算机系统 第九章 虚拟内存 Part1 第二遍

    这次花了4小时40分钟,看了第 559~575 页,共 17 页 第一遍对应地址 https://www.cnblogs.com/stone94/p/10264044.html 注意:本章的练习题一定 ...

  10. 私有git搭建

    Git简介(目前世界上最先进的分布式版本控制系统) 那什么是版本控制系统? 你可以把一个版本控制系统(缩写VCS)理解为一个特殊的“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照.当你需要 ...