使用rsync同步文件

最近碰到了多台机器同步文件的问题. 主要是想要把一台机器上的若干个文件复制到其他多台机器上.

如果是单台机器传输, 并且文件量不大的情况, 一般都是直接使用scp直接传过去. 可惜这次的目标机器很多, 加上需要复制多个文件到对应的不同目录, 并且文件量还不小, 因此放弃使用scp. 那用什么比较合适呢? google一下, 决定使用rsync. 主要有如下优点:

  1. 可以基于ssh方式传输
  2. 轻量级, 使用起来简单方便
  3. 有很多功能选项

好, 接下来就开始动手了~

安装

两边的机器需要都装上rsync(废话….). 两边都是debian系的机器, 直接上aptitude. 这里我想先插一句: aptitudeapt-get有什么不一样?

aptitude 和 apt-get

以前个人都习惯使用apt-*来搜索, 安装包. 后来公司的人基本都使用aptitude来安装. 当时给我的一个感觉时: aptitude相比apt-get使用起来更加方便:

  1. aptitude的操作比较统一: install, remove, search等(和yum相似). 而apt-get用起来相对复杂些
  2. aptitude输出比较好看

今天想在新机器上装dig程序, 发现使用aptitude搜索不出来对应的软件包, 而使用apt-get(apt-cache)则可以, 看了一下对应的包名称, 发现和dig完全没有关系. 然后开始google, 网上有很多说法, 推荐一下stackexchange上的这个回答 (这里我不禁想问stackexchangestackoverflow究竟是什么关系…..)

除了使用google, 我们分别man一下aptitude和apt-get:

aptitude – high-level interface to the package manager

apt-get is the command-line tool for handling packages, and may be considered the user’s “back-end” to other tools using the APT library. Several “front-end” interfaces exist, such as dselect(1), aptitude(8), synaptic(8) and wajig(1).

因此个人总结一下就是: 安装管理软件时推荐优先使用aptitude, 搜索时可以多试试apt-cache.

(不好意思, 扯地有点远, 接下来回到正题)

执行

安装好rsync后, 我们需要配置一下ssh, 因为毕竟是使用ssh方式嘛.

由于需要安装的文件比较分散, 并且都对应不同的地址, 因此使用一段脚本来进行传输(刚好可以试试bash关联数组).

下面是代码: 将一台机器上的多个文件传输到多台机器上

(rsync_code.sh) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# rsync cmd
RSYNC='rsync -Cavuz '


declare -a remote_hosts    # can be omitted
remote_hosts=(
    'remote_host1'
    'remote_host2'
    'remote_host3'
)


declare -A rsync_dest
rsync_dest=(
    ['path/of/your/source1']='path/of/your/dest1'
    ['path/of/your/source2']='path/of/your/dest2'
    ['path/of/your/source3']='path/of/your/dest3'
)


# copy the file to each remote host
for src in ${!rsync_dest[@]}; do
    echo "rsync $src => ${rsync_dest[$src]} ..."

    for rh in ${remote_hosts[@]}; do
        echo "... $rh ..."
        $RSYNC $src $rh:${rsync_dest[$src]}
    done
done

echo 'finish'

有关rsync的具体使用可以man一下.

Comments