分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数
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脚本传递参数的更多相关文章
- Linux - 执行命令与脚本
001 - Linux执行多条命令 方法1:在命令行下可以一次性粘贴多条语句,shell会依次执行并输出结果 方法2:在一个命令行中,用分号将各个命令隔开或者使用&&连接各个命令 示例 ...
- 详解如何在 Linux 启动时自动执行命令或脚本
我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...
- shell脚本批量ssh登陆主机并执行命令
shell脚本批量ssh登陆主机并执行命令 今天在客户现场遇到了这个问题,客户没有管理工具,无法批量登陆主机下发命令,几个个C段啊,让我一个一个登陆,.................. 所以写了个s ...
- Shell脚本中实现切换用户并执行命令操作【转】
第一种方法 cat test.sh #!/bin/bashsu - test <<EOFpwd;exit;EOF 执行结果图: 第二种方法 当然也可以用下面的命令来执行 复制代码代码如下: ...
- 在 Linux 启动或重启时执行命令与脚本
有时可能会需要在重启时或者每次系统启动时运行某些命令或者脚本.我们要怎样做呢?本文中我们就对此进行讨论. 我们会用两种方法来描述如何在 CentOS/RHEL 以及 Ubuntu 系统上做到重启或者系 ...
- 分发系统介绍 expect脚本远程登录 expect脚本远程执行命令 expect脚本传递参数
expect脚本远程登录 yum install -y expect yum install -y tcl tclx tcl-devel 自动远程登录 #! /usr/bin/expect set h ...
- expect脚本远程登录、远程执行命令和脚本传参简单用法
expect介绍: 最近想写一个自动化安装脚本,涉及到远程登录.分发文件包.远程执行命令等,其中少不了来回输入登录密码,交互式输入命令等,这样就大大降低了效率,那么有什么方法能解决呢?不妨试试expe ...
- Linux远程ssh执行命令expect使用及几种方法
expect命令实现脚本免交互 一.Linux下SSH无密码认证远程执行命令 在客户端使用ssh-keygen生成密钥对,然后把公钥复制到服务端(authorized_keys). 实现步骤: 1.客 ...
- 批量复制及执行命令shell脚本
平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可 ...
- NET Core 跨平台执行命令、脚本
一.前言 我们可能会遇到需要在程序中执行一些系统命令,来获取一些信息:或者调用shell脚本..NET Core 目前已经可以跨平台执行,那么它如何跨平台执行命令呢,请看下面的讲解. 二.Proces ...
随机推荐
- vscode debug golang
基础的配置网上的教程很多,这里只是记录自己碰到的坑. 官方文档 https://code.visualstudio.com/docs/editor/debugging#_launch-configur ...
- [考试反思]0807NOIP模拟测试14:承认
一大排并列Rank#9之一. 考试题还没改完(而且并不会模拟退火)所以题解又只能咕了 然而并不想吐槽T2对sjzyz是原题导致4个AC里面有3个他们的 虽说这次的成绩不怎么样,但是这次的考试过程是全新 ...
- 我跟上家老板说过的最后一句话:转.NET Core吧
最近几天浩子终于刚刚脱离了令人发指工作,一者是年底了,一者是不要向生活低头,就在这时我选择了第二者. 上家是做物联网的,人数不多,七八名开发人员,感觉都还可以,都很年轻没有秃顶,糊里糊涂就选择了入职. ...
- jquery layui的巨坑
jquery layui的巨坑 layui 模块不能写在ajax里 因为 layui只能执行一次 第二次会没效果 再执行需要刷新页面再执行
- 怎样判断有没有SQL注入漏洞及原理?
来源:实验楼 最为经典的单引号判断法: 在参数后面加上单引号,比如: http://xxx/abc.php?id=1' 如果页面返回错误,则存在 Sql 注入. 原因是无论字符型还是整型都会因为单引号 ...
- C语言程序设计100例之(8):尼科彻斯定理
例8 尼科彻斯定理 题目描述 尼科彻斯定理可以叙述为:任何一个整数的立方都可以表示成一串连续的奇数的和.需要注意的是,这些奇数一定是连续的,如:1,3,5,7,9,…. 例如,对于整数5,5*5 ...
- Ansibile之playbook初识
一.playbook简介 ansiblie的任务配置文件被称为playbook,俗称“剧本”,每一个剧本(playbook)中都包含了一系列的任务,这每个任务在ansible中又被称为“戏剧”(pla ...
- 本地通知-UILocalNotification
第一步:创建本地推送 本地通知 UILocalNotification // 创建⼀一个本地推送 UILocalNotification * notification = [[UILocalNotif ...
- redhat、centos7系列破解密码
redhat或者centos7,破解密码: 1.开机出现引导菜单时按下e键 2.找到linux16行,在其后追加 rd.break 参数 console=tty0 3.启动到特定的模式,由于更改密码需 ...
- 如何在 PHP 和 Laravel 中使用 Traits
事实上,PHP 作为一门编程语言存在的问题之一,就是你只能使用单继承.这意味着一个类只能从另一个类中继承.例如,可能希望从几个不同的类继承方法,以防止代码重复.在 PHP 5.4 中 一个新的语言特性 ...