现在的位置: 首页 > 综合 > 正文

使用rsync+shell+expect同步目录

2012年05月01日 综合 ⁄ 共 929字 ⁄ 字号 暂无评论

最近线上机器经常需要对目录进行同步,如果用rsync的模块方式很不方便,每次同步目录的时候还要改变模块指定的目录,如果要分别同步的目录比较多就有点郁闷了。
但是rsync如果不是运行在daemon形式,即没有server端时,可以指定远端目录和本地目录的(rsync的几种运行模式之一),因此可以考虑使用shell脚本中的特殊变量$1和$2来分别指定远端目录和本地目录。
使用这种模式时,远端服务器要新建相关的可登陆账号,并设定密码,使用shell时,还是需要输入密码。。如果同步的比较多的话。。输入密码就让人崩溃了。。。还好。Linux下有一个超强的可以实现自动输入的编程工具 expect!真是个好东西。。。尤其是可以和shell相互引用。。。爽啊。。。
以下为我的脚本内容:

Shell脚本:
[root@client bin]# less rsync_pull
#!/bin/bash
#this script is for rsync!
#set –x #shell的调试命令。。粉有用啊。。。
source /usr/local/src/boyo_tools/etc/rsync_pull.conf #使用source来引用配置文件,source其实和”.”相同,就是把指定shell中的变量引用到此shell中

rsync -i -rlptDvz -H --progress --delete $USER@$IPADD:$1 $2 #没有使用a参数,因为拉取过来要改变属组和属主,其中$1和$2对应了远端目录和本地目录
#set +x

Source引用的脚本:
[root@client bin]# less ../etc/rsync_pull.conf
#!/bin/bash
#rsync configure file!
IPADD=192.168.10.159 #远端的IP地址,以后可以直接在配置文件中改动了。还是比较方便的
#PASS_FILE="/etc/passwdfile"
USER=test #拉取时用到的用户名

最后就是expect的脚本内容了:

[root@client bin]# less expect.script
#!/usr/bin/expect –f #像所有的linux下脚本一样。指定执行命令的目录

if $argc<2 { #判断输入的命令的参数个数,格式粉重要啊--!,和shell中的$#差不多意思吧
puts stderr "not enough parameters ,usage: scritp remote_dir local_dir \n" #相当于shell中的echo了
exit
}

set remote_dir [lindex $argv 0] #定义远程目录
set local_dir [lindex $argv 1] #定义本地目录
set password 123456 #定义密码
#send_user "excute:$argv0 $remotedir $local_dir"
spawn sh /usr/local/src/boyo_tools/bin/rsync_pull $remote_dir $local_dir #调用shell脚本

expect "*password:" #expect和send对来实现自动输入
send "$password\r"
expect eof

上面脚本的if格式,哎。。第一次写expect。。因为这个地方搞了好长时间。。。菜鸟的悲哀啊。。
#if的错误格式
if $argc<2
{ #这种格式会报错误。。。“{”要和if在一行。。
puts stderr "not enough parameters ,usage: scritp remote_dir local_dir \n"
exit
}

[root@client bin]# ./expect.script
wrong # args: no script following "0<2" argument

改变后执行的结果;

[root@client bin]# ./expect.script
not enough parameters ,usage: scritp remote_dir local_dir #提示参数不够。。

加上两个参数后就可以了

【上篇】
【下篇】

给我留言

留言无头像?