最近为了提高工作效率,想着把平时需要定期进行的代码替换工作进行自动化。于是写了一个shell脚本。整个脚本的思路很简单,就是把另一个环境上的最新编译好的代码文件夹打包放到本地目录,将新代码文件夹里面的配置文件替换成原本地配置文件。代码如下:
!/bin/ksh
Local_dir=$HOME/chouke_test #本地存放UMC文件夹目录
Remote_dir=/orasvr_tmp/yssett # 编译环境存放UMC目录
today=`date +'%y%m%d'` #当天的日期
# log目录及文件
LOG_DIR=$HOME/chouke_log
if [ -d $HOME/chouke_log ] #检查日志文件夹是否存在
then
echo "日志文件夹存在"
else
mkdir $HOME/chouke_log
fi
LOG_FILE=${LOG_DIR}/chouke_$(date +%Y%m%d).log
#1.替换代码
cd ${Local_dir} #检查UMC文件夹是否存在,并将其备份
if [ -d UMC ]
then
mv UMC UMC_bak_${today}
echo "备份本地UMC文件夹!"
else
echo "本地UMC文件夹不存在,创建该文件夹!"
mkdir UMC
fi
expect -c " #远程登录到编译环境,将UMC文件夹打包
set timeout 100;
spawn ssh 用户名@IP地址 -p 22 \"tar -cvf UMC_${today}.tar.gz UMC;\";
expect {
*assword* { send \"密码\r\" }
} ;
expect 用户名@IP地址 { send exit\r } ;
expect eof ;
"
ftp -n << !
open IP地址
user 用户名 密码
binary
cd ${Remote_dir}
prompt
mget UMC_${today}.tar.gz # 下载最新UMC文件夹到本地
exit
bye
!
echo "解压UMC压缩包..."
tar -xvf UMC_${today}.tar.gz && echo "解压完成!"
rm -f UMC_${today}.tar.gz
expect -c " #远程登录到编译环境,将文件夹压缩包删除
set timeout 1;
spawn ssh 用户名@IP地址 -p 22 \"rm -f UMC_${today}.tar.gz;\";
expect {
*assword* { send \"密码\r\" }
} ;
expect 用户名@IP地址 { send exit\r } ;
expect eof ;
"
echo "编译环境UMC文件夹压缩包已删除"
cd ${Local_dir}/UMC/etc
mv config.xml config.xml.${today}
cp ${Local_dir}/UMC_bak_${today}/etc/config.xml ./ #将原来中的config.xml换到当前目录中
echo "替换config.xml"
cd ${Local_dir}
chmod 755 -R UMC #给新文件夹下面的文件赋予运行权限
. .profile
echo "代码抽壳完成!"
整个脚本里面比较关键的一点就是如何登录到远程服务器上面将其代码文件夹进行打包,然后下载下来。在脚本中我用的是ssh命令实现自动登录远程服务器,使用expect命令实现在脚本中自动输入用户名和密码。
下面介绍一下expect命令:
Expect是一个用来实现自动交互功能的软件套件,系统管理员可以使用它来实现对命令或程序提供输入,而这些命令或程序是希望从终端(terminal)获得输入,通常是手工输入。Expect通常有一系列expect-send对组成。expect等待输出中输出特定的字符,通常是一个提示符,比如本例中这个提示符就是“Password”;send发送特定的响应,比如本例中发送的就是远程服务器的登录密码,而这个响应本来是应该由手动输入的。
代码中:
1. [set timeout 100]是用来设置超时时间,表示等待上一步操作的响应的超时时间。值得注意的是,如果你的某一步操作需要比较长的时间,比如打包一个大文件,最好把超时时间设置的长一些,免得操作到一半被终止。
2. [spawn ssh 用户名@IP地址 -p 22 ]是用来expect的内部命令,主要作用是给ssh进程加个壳,用来传递交互指令。
3. [expect {*assword* { send \"密码\r\" }} ;]这一条表示判断上次的输出结果里是否包含“assword”字符串,如果包含,则执行后面的交互动作。
4. [send \"密码\r\" ]这里是执行交互动作,等同意手动输入密码。
5. [expect eof]这个命令表示等待退出命令,一旦接收到标识子进程已经结束的eof字符,expect即退出。