远程多台服务器备份数据脚本
场景是这样的,新接手的项目,在国外的服务器有10多台,国内的几台,部署要求在ant代码前必须全备份上一个版本,早上登录了国内的几台机器操作后,一阵烦躁,看到四川人民在受苦受难,自己的家人也遭受了几次余震,远方的人可能更加担心。尝试了下 ssh 执行远程命令,无奈于仅有的普通用户权限,写了个 sh脚本,可以ssh到每台机器执行进行备份,但是每次都要输入密码,郁闷非常。先贴一下这个 备份脚本
echo "start dump tomcat source "
# config your web project name
project_name=test
# default you can rewrite
date_str=$(date +%Y%m%d)
# config path
extdir='/data/apache-tomcat/webapps/'
cd $extdir
# default
sudo tar -zcvf $project_name$date_str.tar.gz $project_name
echo "dump success the file at "$extdir$project_name$date_str".tar.gz"
这个会在你的工程文件夹下生成部署文档要求的备份文件,然后通过scp 命令将该文件都下载到了20台机器中,又一阵吐血
当要一个个ssh执行脚本,但是每次都要输入密码,就胃疼的厉害,于是有了下面的偷懒脚本
#!/usr/bin/expect -f
set time 30
set ipaddr "192.168.1.111"
set ipport "212"
set username "duplicatedcode"
set password "duplicatedcode"
set sh_path "/home/duplicatedcode/script/dumpTomcatSource.sh"
spawn /usr/bin/ssh -p $ipport $username@$ipaddr "sh $sh_path"
expect {
"yes/no" {send "yes/r";exp_continue}
"password:" {send "$password/r"}
}
expect "*]#"
exit
此时新的问题又出现了,我每次多要更改此文件,ip,端口,用户名,密码,地址,所有就有了下面的脚本
dumpFunction.sh
#!/usr/bin/expect -f
set time 30
set ipaddr [lindex $argv 0]
set ipport [lindex $argv 1]
set username [lindex $argv 2]
set password [lindex $argv 3]
set sh_path [lindex $argv 4]
spawn /usr/bin/ssh -p $ipport $username@$ipaddr "sh $sh_path"
expect {
"yes/no" {send "yes/r";exp_continue}
"password:" {send "$password/r"}
}
expect "*from*"
其实就是封装了一个方法,然后传入动态的参数,能够批量执行,又有下面的脚本
#!/bin/bash
# config syscofle
file_path=dump.conf
#config sh path
sh_dir=/home/duplicatedcode/script/dumpFunction.sh
#i # ipaddr
for i in `awk '{print $1}' $file_path`
do
# ipport
j=`awk -v I="$i" '{if(I==$1)print $2}' $file_path`
#username
k=`awk -v I="$i" '{if(I==$1)print $3}' $file_path`
#password
l=`awk -v I="$i" '{if(I==$1)print $4}' $file_path`
#sh_path
m=`awk -v I="$i" '{if(I==$1)print $5}' $file_path`
expect $sh_dir $i $j $k $l $m
done
awk 很久之前用过处理文件,现在又还回去了,这个sh脚本肯定有优化的空间,但是时间紧迫,就先这么着吧,虽然写的萌些,但是易读,大体的意思是读取dump.conf 文件,然后分解出需要的参数,一个for循环 执行代码,配置文件如下:
192.168.162.1 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh
192.168.162.2 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh
192.168.162.3 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh
配置文件中格式是
ip 端口 用户名 密码 脚本地址
就是这么简单,然后我在一台机器上执行 dumpAll.sh 全部机器就按照部署规范进行备份了