Linux expect脚本与shell脚本相结合

本文介绍了如何在Linux环境中将expect脚本与shell脚本结合使用,以实现远程登录多台服务器并执行特定任务。通过expect的expect和send命令,可以自动响应系统提示并发送命令。示例中,脚本用于启动远程服务器上的应用程序,需要注意脚本路径、日志处理及其它服务的启动配置。
部署运行你感兴趣的模型镜像

expect基础

在使用expect时,基本上都是和以下四个命令打交道:

命令作用说明
send用于向进程发送字符串命令接收一个字符串参数,并将该参数发送到进程
expect从进程接收字符串命令和send命令相反,expect通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令
spawn启动新的进程spawn后的send和expect命令都是和使用spawn打开的进程进行交互
interact允许用户交互主要用于退出自动化,进入人工交互

expect脚本我们这里只使用了expect 和 send,expect意味着出现的提示信息,send就可以书写正常的linux命令,具体看例子。具体书写还是要靠大家自己调试,基本框架都是我这个例子里面。

这个例子是bash脚本和expect脚本相结合

#! /bin/bash     
# bash脚本的标志

/usr/bin/expect <<EOF                    
# 这里意味着bash脚本中嵌套着expect脚本
set timeout -1    
# 设置超时时间,-1意思是永远也不超时
spawn ssh root@192.168.1.15 
# 意味着远程登录到我这个应用的数据库服务器

expect {
	"*(yes/no)*" {
		 send "yes\n"
		 expect "passwd:"
		 send "Pandora!74\n"
	}
	"*password:" {
		send "Pandora!74\n"
	}
}
# 第一次远程登录别的服务器的时候会出现一些
# 提示,你可以在你自己的应用上ssh +IP尝试一下,我这里  
# 会出现(yes/no),接着会让我输入密码。第二次登录就是  
# 直接提示输入密码。所以这里是‘或’关系中嵌套  
# 着‘与’关系。根据{}的组合来进行理解

expect "*#"
# expect是出现的提示信息,不同的系统不一样,你的可能是 “*$”,这里是正则表达式的匹配用法
send "ps -ef | grep oracle\n"
# send是输入的命令
expect "*oracle*oraclehrdb"
send "exit\n"
# 退出远程的数据库服务器,回到本地应用服务器
expect "*#"
spawn ssh root@192.168.20.217        
# 远程登录到另一台应用服务器,启动这个应用服务器上面的启动脚本

expect {
	"*(yes/no)*" {
		send "yes\n"
		expect "asswd:"
		send "Pandora!74\n"
	}
	"*password:" {
		send "Pandora!74\n"
	}
}

expect "*#"
send "cd /opt/jboss-eap-6.2\n"
expect "*#"
send "sh zidong.sh\n"
expect "*#"
send "exit\n"
expect eof
EOF                          
# 退出expect脚本

#最终启动自己的Jboss
ps -ef | grep jboss | grep -v grep | cut -c 9-15 | xargs kill -s 9

rm -rf /opt/jboss6/jboss-eap-6.2/standalone/tmp/*

nohup /opt/jboss6/jboss-eap-6.2/bin/standalone.sh  -Djboss.bind.address=0.0.0.0 -Dorg.jboss.as.logging.per-deployment=false  & >> /opt/jboss6/nohup.out

这样最终你就可以实现只在一个服务器上写一个启动脚本,远程登录到其他的应用服务器,启动那个应用上的脚本。我这里只是远程登录了两个,你可以按照例子远程多个。

注意事项:
1、这个脚本一定要放到和Jboss的启动脚本一个路径,否则就会出现不能够执行的状况,因为获取不到JBOSS的变量。

2、我们的应用的启动脚本都会有一句tail –f nohup.out ,把启动日志放到前台,我们这里不需要放到前台,因为放到前台会有很多的日志信息,看起来很乱,因此不需要加这个语句,只需要让JBOSS自己在后台运行就可以。因此你可以自己再另写一个启动JBOSS的脚本。

3、我这里只是我系统的例子,因为我已经吧所有的oracle设置为开机启动了,因此这里只需要查看一下oracle的状态就可以,也可以不查看,加入开机启动即可。

4、最好把自己系统上的一些其余的软件都设置为开机启动,或者写到我们这脚本里面也可以

另一个数据库是mysql数据库,因为我的MySQL没有实现开机自启,我就把启动MySQL放到了脚本里面。

#!/bin/bash

/usr/bin/expect <<EOF
set timeout -1
spawn ssh root@192.168.20.208   
# MySQL数据库服务器

expect {
"*(yes/no)*" {
  send "yes\n"
  expect "asswd:"
  send "Pandora!74\n"}
"*password:" {send "Pandora!74\n"}
}

expect "*#"                     --查看MySQL运行状态,没有运行就启动,正在运行就退出
send "service mysql status\n"
expect {
"*ERROR! MySQL is not running*"  {
	send "service mysql start\r";
	expect "*#"
	send "exit\n"
}
"*SUCCESS! MySQL running*" {send "exit\n"}
}

expect eof
EOF

ps -ef | grep jboss | grep -v grep | cut -c 9-15 | xargs kill -s 9          
# 杀进程

rm -rf /opt/jboss-eap-6.2/standalone/dppm-deploy/dppm-web.war

cp-r/opt/Jenkins/test_NewPackage/dppm-web.war /opt/jboss-eap-6.2/standalone/dppm-deploy/

nohup bin/standalone.sh  -c=dppm.xml -Derrors.port.offset=0 -Dfile.encoding=utf-8 -Djboss.bind.address=0.0.0.0  -Dorg.jboss.as.logging.per-deployment=false > ./nohup.out 2>&1 &

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值