远程同步文件

Rsync

Rsyncopen in new window(Remote Sync),使用其 “Quick Check” 算法实现增量复制数据。可以使用 rsync 在不同目录(本地),不同服务器(远程)之前实现数据备份。在 3.x 版本可以做到一边对比差异一边复制。

1. 选项(特性)

Rsync 具有很多优异的特性,例如保持文件属性、权限;使用 rsh、ssh 等隧道加密传输文件(rsync 本身不会对数据加密)等。

具体的特性可以根据其命令参数得知:

短参数长参数描述
-v--verbose显示输出过程
-q--quiet静默模式
-P--progress显示同步的过程及传输时的进度信息
-e--rsh指定隧道
-a--archive多参数集合(-rtopgDl)
-r--recursive递归
-t--times保持修改时间属性
-o--owner保持属主
-p--perms保持权限
-g--group保持用户组
-D--devices保持设备文件信息
-l--links保持软链接
-z--compress压缩
--bwlimit=KBPS限速,限制 I/O 带宽
--delete删除,即无差异同步数据
-b--backup备份,对于已存在同样的文件名时,老文件重命名为 ~filename,可以使用 --suffix 指定
--backup-dir备份文件指定目录
--exclude=PATTERN排除传输的文件模式
--exclude-from=FILE排除 FILE 中指定模式的文件
--include=PATTERN包含传输的文件模式
--include-from=FILE包含 FILE 中指定模式的文件
--password-file=FILE从 FILE 中得到密码

其中常用参数为 -avz

2. 语法

rsync [OPTION]    SRC    DEST
rsync [OPTION]    SRC    [USER@]host:DEST
rsync [OPTION]    [USER@]HOST:SRC    DEST
rsync [OPTION]   [USER@]HOST::SRC   DEST
rsync [OPTION]    SRC    [USER@]HOST::DEST
rsync [OPTION]    rsync://[USER@]HOST[:PORT]/SRC    [DEST]

3. 常用示例

  • 目录间推送数据

    rsync /ect/hosts /opt
    # 保持属性
    rsync -vzrtopg --progress /etc/hosts /opt
    
  • 目录间同步数据

    # 同步文件
    touch /null.txt
    cat /opt/hosts
    rsync -r --delete /null.txt /opt/hosts
    cat /opt/hosts # 验证
    # 同步目录
    mkdir /null
    rsync  -r --delete /null /opt
    ls /opt # 验证
    
  • 推送数据到对应主机端口

    rsync -avz /etc/hosts root@45.78.12.89:/opt
    # 等价于
    rsync -avz /etc/hosts -e  'ssh -p 22' root@45.78.12.89:/opt 
    # 切换到对应服务器上
    cat /opt/hosts # 验证
    
  • 从服务器拉取数据

    rsync -avz -e  'ssh -p 22' root@45.78.12.89:/opt/hosts /opt
    cat /opt/hosts # 验证
    
  • 配合 sshpass 使用:

    sshpass -p 'your_password' rsync -avz /srv/app/dist tencent:/app
    

4. 可能存在的问题

看到部分文章说 rsync 传输大量小文件时会停止僵死(小文件是多小,大量是多大也没有描述清楚),这个问题搜了下,尚未得知具体的原因:

  1. Best way to copy millions of files between 2 serversopen in new window
  2. How to speed up rsync for small filesopen in new window

Scp

rsync 虽然可以增量下载,速度快一些,还有更多的功能,但是 scp 非常不占资源,rsync 在小文件众多时会导致磁盘 I/O 非常高。

1. 语法

相对于 rsyncscp 的语法则简单很多:

scp (选项) (源文件) (目标文件)

# 选项
-1:使用 ssh 协议版本1;
-2:使用 ssh 协议版本2;
-4:使用 ipv4;
-6:使用 ipv6;
-B:以批处理模式运行;
-C:使用压缩;
-F:指定 ssh 配置文件;
-i:identity_file 从指定文件中读取传输时使用的密钥文件(例如私钥),此参数直接传递给 ssh;
-l:指定宽带限制;
-o:指定使用的 ssh 选项;
-P:指定远程主机的端口号;
-p:保留文件的最后修改时间,最后访问时间和权限模式;
-q:不显示复制进度;
-r:以递归方式复制。

# 源文件:指定要复制的源文件。
# 目标文件:目标文件。格式为 `user@host:filename` (文件名为目标文件的名称)。

2. 常用示例

  • 密码形式上传文件:

    scp -r /home/shanyuhai/Download/test shanyuhai@47.111.23.259:/home/shanyuhai/downloads
    

    接着输入密码即可

  • 秘钥形式上传文件:

    scp -i ~/.ssh/id_rsa_xxx hi.png shanyuhai@47.111.23.259:/home/shanyuhai/downloads
    
  • 秘钥形式下载文件:

    scp -i ~/.ssh/id_rsa_xxx shanyuhai@47.111.23.259:/home/shanyuhai/downloads/hi.png pictures
    

还可以使用 lrzsz 来进行本地和远程的文件交互,不过需要双端都安装 lrzsz

  • 下载(sz)

    sz filename
    # 等待选择保存的本地路径
    
  • 上传(rz)

    rz
    # 等待选择文件
    # (还可以拖拽文件)