linux批量部署war工具,Linux 批量一键部署工具 Expect

Linux 批量一键部署工具 Expect

既然没有遇到过,做好准备总是好的。这是自己送给自己的话,现在运维做自动话越来越多,自己就学以下,记录笔记。目前主流的有puppet、Expect、pssh等等,今天就用Expect做自动部署和日常管理维护。

一、Expect简介

expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。

我们熟知的shell编程功能虽然很强大,但是不能实现有交互功能的多机器之前的操作,例如ssh和scp等。而expect可以帮助我们来实现。

二、安装

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

三、Expect使用

这里使用Expect批量管理和部署服务器大致分为两个步骤,使用for循环读取服务器IP、密码列表并取值,远程执行命令。如下需求,在两台服务器上执行自己命令mkdir /tmp/`date +%Y%m%d`,看下面实现方法。

首先定义一个expect登录脚本:

1、login.exp,内容如下:

[root@Server ~]# vi /data/sh/login.exp

#!/usr/bin/expect -f

set ip [lindex $argv 0 ]#读取ip

set passwd [lindex $argv 1 ]#读取密码

set command [lindex $argv 2]#命令

set timeout 10#登录后下次执行命令间隔

spawn ssh root@$ip#spawn   意思是执行命令,expect内命令,shell中不存在

expect {

"yes/no" { send "yes\r";exp_continue }#选择yes

"password:" { send "$passwd\r" }#读取

}

expect "*#*" { send "$command\r" }#执行命令

expect eof

2、创建批量执行脚本auto_exec.sh

[root@Server ~]# vi auto_exec.sh

#!/bin/sh

CMD="$*"

for i in `awk '{print $1}' passwd.txt`#fou循环读取ip

do

j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`#密码

expect /data/sh/login.exp $i $j "$CMD"#执行

done

3、建立批量IP、密码文件

[root@Server ~]# vi passwd.txt

192.168.17.135 123456

192.168.17.128 123456

192.168.17.136 123456

四、测试脚本

直接执行:

[root@Server ~]# /bin/sh auto_exec.sh "mkdir -p /tmp/`date +%Y%m%d`"

登录三台服务器在/tmp下有日期文件

五、SCP远程拷贝

如果需要远程推送文件,重新建立文件login.scp相关参数和auto_exec.sh变量:

1、login.scp内容如下:

[root@Server ~]# vi login.scp

#!/usr/bin/expect -f

set ip [lindex $argv 0 ]

set passwd [lindex $argv 1 ]

set src_file [lindex $argv 2]

set des_dir [lindex $argv 3]

set timeout 1

spawn scp -r $src_file root@$ip:$des_dir

expect {

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

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

}

expect "#*"

expect eof

2、auto_exec.sh脚本内容如下:

[root@Server ~]# vi auto_exec.sh

#!/bin/sh

read -p "Please Enter insert Source File or DIR: " src_file

echo ======================================================

sleep 1

read -p "Please Enter insert Destination DIR: " des_dir

for i in `awk '{print $1}' passwd.txt`

do

j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt`

expect login.scp $i $j $src_file $des_dir

done

密码保持不变即可。

[root@Server ~]# /bin/sh auto_exec.sh

Please Enter insert Source File or DIR: login.scp#本地文件

======================================================

Please Enter insert Destination DIR: /home

spawn scp -r login.scp root@192.168.17.135:/home#发送到客户端的文件

六、一键安装expect、scp批量auto_exec.sh脚本:

#!/bin/sh

if

[ ! -e /usr/bin/expect ];then

yum install expect -y

fi

#Judge passwd.txt exist

if

[ ! -e ./passwd.txt ];then

echo -e "The passwd.txt is not exist......Please touch ./passwd.txt ,Content Example:\n192.168.1.11 passwd1\n192.168.1.12 passwd2"

sleep 2 &&exit 0

fi

#Auto Tuoch login.exp File

cat >login.exp <

就是以上几个脚本的合成。

以下是expect用法

1. [#!/usr/bin/expect]

这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。

注意:这一行需要在脚本的第一行。

2. [set timeout 30]

基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒 。timeout -1 为永不超时

3. [spawn ssh -l username 192.168.1.1]

spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。

它主要的功能是给ssh运行进程加个壳,用来传递交互指令。

4. [expect "password:"]

这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒

5. [send "ispass\r"]

这里就是执行交互动作,与手工输入密码的动作等效。

温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。

6. [interact]

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行

7.$argv 参数数组

expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arm b bl 地址无关码_32位和64位下的arm_pwn初探

32位和64位下的arm_pwn初探前言&#xff1a;pwn的学习之路一直在进行&#xff0c;今天看了arm_pwn&#xff0c;搞环境就搞了半天&#xff0c;琢磨工具使用到做题&#xff0c;这里总结下&#xff0c;希望能帮助到大家&#xff0c;少走一点弯路&#xff0c;后期有机会继续更新。一…

如何用unit test测试controller_如何用电缆故障测试仪冲闪测试确定故障点?

原标题&#xff1a;如何用电缆故障测试仪冲闪测试确定故障点&#xff1f;当我们中试控股在使用电缆故障测试仪检测电缆故障时&#xff0c;遇到故障点二次击穿放电时&#xff0c;其波形要如何分析&#xff1f;首先我们要知道仪器在遇到故障点二次击穿时的表现是怎样的。显示故障…

linux下qt环境的运行,在Linux下使用QT环境来安装和运行WebKit

Installing and Running WebKit in Linux Using QtI’mcoming to appreciate more and more all of the hard work softwaredevelopers perform. I wouldn’t consider myself an open source elitist,but there’s something special about the associated ideologies. When a…

button 样式_缩减 SCSS 50%样式代码的 14 条实战经验

原标题&#xff1a;缩减 SCSS 50%样式代码的 14 条实战经验作者&#xff1a;feishi123前言Sass是CSS3语言的扩展&#xff0c;它能帮你更省事地写出更好的样式表&#xff0c;使你摆脱重复劳动&#xff0c;使工作更有创造性。因为你能更快地拥抱变化&#xff0c;你也将敢于在设计…

神舟电脑装linux双系统,个人windows10和Ubuntu18.04游戏笔记本uefi双磁盘双系统安装过程...

此文章为记录自己的Ubuntu的安装和使用过程本人电脑是128G固态500G机械。固态中装的是windows10&#xff0c;这次决定在机械中安装Ubuntu。虽然网上教程很多&#xff0c;但是我仍然是在参考了多个教程后才动手安装&#xff0c;于是记录自己的安装过程。该机器是神舟Z6-sl7d1,系…

请解释自动装配模式的区别?_如何从齿条优化方面有效节约机床装配时间

齿条&#xff1a;螺纹连接的设计和计算是否正确&#xff1f;如果我们真的想要节约装配成本和时间的话&#xff0c;那么我们首先就需要去选择设计正确的齿条螺钉。那么这时候就紧接着产生了第二个问题&#xff1a;我们应该如何评估并优化这种设计。当我们去观察比较齿轮和齿条这…

linux sendto 源码,Linux内核源代码解析——用户发送数据包的起源之sendto

Jack&#xff1a;我想知道用户如何把数据发送到内核空间的&#xff1f;我&#xff1a;你觉得哪里比较难理解呢&#xff1f;Jack&#xff1a;一般程序员会在程序里通过socket变量获得一个文件描述符&#xff0c;然后通过write把定义好的字符串写入到该描述符。我&#xff1a;是的…

仓库处理中 无法修改_临沂用友U8erp系统软件如何新增仓库?

存货一般是用仓库来保管的&#xff0c;对存货进行核算管理&#xff0c;首先应对仓库进行管理&#xff0c;因此进行仓库设置是供销链管理系统的重要基础准备工作之一。第一次使用本系统时&#xff0c;应先将本单位使用的仓库&#xff0c;预先输入到系统之中&#xff0c;即进行&q…

linux变量最大长度,51CTO博客-专业IT技术博客创作平台-技术成就梦想

变量操作总结&#xff1a;${Var:-Value} 变量Var 为unset 或 null 则输出Value。 有值则输出变量Var的值。${Var:Value} 变量Var 为unset 或 null 则输出Value&#xff0c;并且赋值于变量Var。 同上。${Var:Value} 变量Var 为unset 或 null 则输出变量…

Dreamwear如何创建javascript_JavaScript 太糟糕,JVM 有妙招!

虽然 JavaScript 凭借其简洁性、交互性等优势横扫了各大编程语言榜单&#xff0c;但是一直以来&#xff0c;JavaScript 应用程序的工具链极其复杂&#xff0c;引发不少开发者吐槽&#xff0c;在此&#xff0c;我们是否有更好的解决方案将其替代&#xff1f;接下来&#xff0c;本…

linux mint 18.3浏览器,在Linux Mint 19/Ubuntu 18.04中安装Tor Browser浏览器的方法

本文介绍在Linux Mint 19/Ubuntu 18.04系统中安装Tor Browser浏览器的方法&#xff0c;本文不使用Tor的默认Ubuntu存储库&#xff0c;因为它们包含旧版本的Tor。一、添加Tor存储库要在Linux Mint 19/Ubuntu 18.04系统中安装最新版本的Tor&#xff0c;我们将使用官方Tor Apt存储…

code block怎样实现图形界面_微服务入门:Openresty实现API网关

概念介绍如果大家清楚“网关”这个概念&#xff0c;那就很容易理解“API网关“&#xff0c;即所有API的入口。 从面向对象设计的角度看&#xff0c;它与外观模式类似&#xff0c;封装了系统内部架构。在单体应用架构中&#xff0c;没有「 API网关 」的概念&#xff0c;每个项目…

linux mei swap,Linux swapoff命令

Linux swapoff命令Linux swapoff命令用于关闭系统交换区(swap area)。swapoff实际上为swapon的符号连接&#xff0c;可用来关闭系统的交换区。语法swapoff [设备]参数&#xff1a;-a 将/etc/fstab文件中所有设置为swap的设备关闭-h 帮助信息-V 版本信息实例显示分区信息:# sfdi…

vue lang_推荐一个基于Vue 的 H5 快速开发模板

关注 Vue社区&#xff0c;回复“加群”加入我们一起学习&#xff0c;天天进步praisejuejin.im/post/5e612534e51d4527017971a2模板基于 vue-cli4 和 Vant-ui 搭建&#xff0c;进行大型 H5 项目开发最佳实践方案&#xff0c;让我们来一探究竟模板地址 (github.com/push-over/vue…

c语言判断字符是汉字,c语言里面判断字符是否为汉字

这是跟汉字的存储方式有关&#xff0c;西文字符用ASCII码的话&#xff0c;一个字节可以表示一个字符&#xff0c;而汉字用的是双字节表示一个汉字。那么&#xff0c;为了在机器内部区分ASCII码和汉字机内码&#xff0c;就规定汉字的两个字节的最高为都为1.例如&#xff1a;汉字…

springboot urlresource_Spring Boot上传文件+部署到Tomcat

1 概述Spring Boot上传文件,根据官方uploadfile示例修改的,可以打成war放到服务器上(笔者使用的是Tomcat).主要步骤是创建异常类,属性类,接口类与控制器类,最后进行少量修改打包部署到服务器上.2 环境win10Tomcat 9.0.30IDEA 2019.03Spring boot 2.2.2 RELEASE3 新建工程选择sp…

alc236黑苹果驱动_台式机黑苹果独显驱动

黑苹果安装离不开黑苹果驱动程序&#xff0c;常见的有网卡驱动、显卡驱动、声卡驱动、还有其他的一些常用的驱动程序&#xff0c;这里我们单独讲一下黑苹果上驱动英伟达GTX的独显驱动&#xff0c;即我们平常说的N卡&#xff0c;如果文章中介绍的有错误&#xff0c;或者您还有其…

c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序.doc

C语言课程设计报告模拟时钟转动程序PAGE课程设计报告题 目课 程 名 称 结构化程序设计课程设计院 部 名 称专 业班 级学 生 姓 名 王蕾学 号课程设计地点课程设计学时指 导 教 师金陵科技学院教务处制目 录TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc282443576&q…

c语言break在if中用法,break可用于什么语句 break语句可用于for语句和if语句中 对吗...

c语言中break语句的作用C语言中&#xff0c;break都可以用在什么地方&#xff1f;用到每一个语...break 一般是针对一个循环或者switch中的case,表示跳出当前的循环或选择&#xff0c;即在一个单层循环中&#xff0c;可以通过break 来跳出循环&#xff0c;在switch 中的case通过…

python简单实用案例_Python 21 Django 实用小案例1

8 9 10 {% csrf_token %}11 用户名&#xff1a;12 密码&#xff1a;13 验证码&#xff1a;14 15 16 17