最近线上机器经常需要对目录进行同步,如果用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 #提示参数不够。。
 
加上两个参数后就可以了
 
 
 
本文出自 “ 菜菜光的博客” 博客,请务必保留此出处 http://1662935.blog.51cto.com/1652935/548744