Featured image of post 使用 Rsync 实现 Linux 与 Windows 互传文件

使用 Rsync 实现 Linux 与 Windows 互传文件

让上传文件到服务器变得更优雅

前言

此前我一直在寻找一种好的方式,能够将本地写好的博客文件传输到服务器,要求速度快,操作简单。先前使用 Vercel 托管就没有这个烦恼,我使用的 windows 撰写博文,完事以后一键编译再上传到 GitHub 就可以了。虽然 Git 时不时抽风,也可以使用 GitHub Desktop 来解决传输的速度问题。

但是换到服务器后,难免又多了个 git pull 的命令,而且速度还很慢,虽说有 crontab 可以定时执行任务,但是绕不开始终是难题的 Github,如果要多次提交就很麻烦。方式也不够优雅,总的来说就是挺折磨的。

最近突然想起来以前看见一篇文章,可以使用 Rsync 实现文件同步,试了一下之后直接抛弃 Github.

Linux 端

我使用的系统是 Debian11,Debian 系基本可以通用.

安装 rsync

sudo apt-get install rsync

配置文件是需要我们自行创建的,放在/etc目录下,但是官方给了我们一份参考,我们直接拷贝过去就行

sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc

编辑配置文件

sudo vim /etc/rsyncd.conf

示例如下

# sample rsyncd.conf configuration file

# GLOBAL OPTIONS

# motd file=/etc/motd

# 日志文件
# log file=/var/log/rsyncd

# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
# The init.d script does its own pid file handling,
# so omit the "pid file" line completely in that case.
# pid file=/var/run/rsyncd.pid
# syslog facility=daemon
# socket options=

# MODULE OPTIONS

# 进行通信的端口,如果防火墙打开的话,需要将对应的端口添加进去
# 我没写这个,因为嫌麻烦开放了全部TCP端口,也不知道默认端口是哪个来着
# 如果指定端口那么在Windows的命令中必须要加上端口号
# port=8999

# 表示要传入的模块名,没特殊需求不需要改动
[ftp]

        comment = public archive
        # 传输文件路径 需要自己创建好 文件会传到这个目录下
        path = /home/lovir/public
        use chroot = yes
        # 最大连接数
        # max connections=10
        lock file = /var/lock/rsyncd
        # the default for read only is yes...
        # 是否把只读文件同步到服务器 yes表示不同步只读文件
        read only = no
        list = yes
        # 这里要改成自己的用户和用户组!
        uid = root
        gid = root
        # exclude = 
        # exclude from = 
        # include =
        # include from =

        # 用户名 不知道自己是谁就写root
        auth users = root
        # 密码文件存放位置
        secrets file = /etc/rsyncd.secrets
        strict modes = yes
        # 允许传入的主机,这一条很重要!
        hosts allow =*
        # hosts deny =
        ignore errors = no
        ignore nonreadable = yes
        transfer logging = no
        # log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
        timeout = 600
        refuse options = checksum dry-run
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

创建好同步文件夹

mkdir /home/lovir/public

创建并编辑密码文件(这个文件也是没有的,需要自己创建)

sudo vim /etc/rsyncd.secrets

写入这一行文字,用户名对应配置文件中的用户名,千万别写错了

root:123456

完事以后要修改权限

sudo chmod 600 /etc/rsyncd.secrets

配置文件搞好了才能启动程序,不然会报错

可以通过 systemctl list-unit-files --type=service来查看有哪些service在运行

sudo systemctl start rsync

至此Linux端配置完成

Windows 端

🔗下载链接

下载好文件,这里我放到网盘里方便大家下载(快说谢谢😎✌️)

解压完成以后配置好环境变量:把 E:\cwrsync\bin加到环境变量里

cwrsync/bin 目录下分别新建两个文件 passwd.txt 和 exlcude.txt

passwd.txt 写入Linux端的密码,就是一串数字,其他啥都不要加

image-20230724093751936

exlcude.txt 参考gitingore文件的写法

image-20230724093823124

到此完成配置,接下来详解一下指令(不要复制这段代码,我为了演示加了回车换行)

rsync -avuz
--progress
--delete
--password-file=/cygdrive/E/cwrsync/bin/passwd.txt
--exclude-from=/cygdrive/E/cwrsync/bin/exclude.txt
/public
root@127.0.0.1::ftp/

参数意义:

-a: 归档模式,使用递归传输并保持文件的属性 -v: 显示传输过程中的详细信息 -p: 显示文件传输的进度信息 -z: 传输中进行压缩,提高传输速度

--port 指定端口,之前有指定的话就写上,没有的话就忽略

--progress 显示传输过程

--password-file 登录时用到的密码文件,该文件直接把密码包含就可以,如果不加这条需要手动输密码

--exclude-from 指定不需要进行传输的文件和文件夹,没需求可忽略

--delete 在 exclude/include 规则生效后执行,假如服务器中文件比传入的文件多,则删除,少的话,则添加。

public/ 表示博客目录下的public文件夹内所有内容

root@127.0.0.1 这里换成服务器的ip,用户名改成与刚才配置 Linux 端对应的用户名

::ftp/ 默认的,不需要改动,但是要对应服务器上的模块名

💡需要注意的是,绝对路径前面要加上/cygdrive/

比如我的密码文件路径是 E/cwrsync/bin/passwd.txt

那么需要改成 /cygdrive/E/cwrsync/bin/passwd.txt

如果实在找不到文件路径就先用以下代码测试一下

rsync -avuz public/ 用户名@ip地址::ftp/

可直接复制的代码如下,用户名和ip地址记得换掉

rsync -avuz --progress --delete --password-file=/cygdrive/E/cwrsync/bin/passwd.txt --exclude-from=/cygdrive/E/cwrsync/bin/exclude.txt public/ 用户名@ip地址::ftp/

保存上面命令为bat脚本,再加上一个hugo自动编译的命令,写完博客以后双击就可以同步啦~

这样绕开了GitHub同步的方法,再也不用为恼人的下载速度而烦恼了,尤其是随着时间增长博客体积越来越庞大的情况下,而只传public文件夹则缩小了文件体积,从而加快传输速度。

image-20230724095501897

💡还有一个关键点!

传输过去的文件是没有权限的,nginx 无法读取文件,这也就是为什么页面加载不出来的原因😇

修改nginx运行身份:sudo vim /etc/nginx/nginx.conf

把第一行改成 user root 并重启 nginx。这样 nginx 就可以以 root 身份访问文件夹,完美!

其他参数

# -v, --verbose         详细模式输出
# -q, --quiet           精简输出模式
# -c, --checksum        打开校验开关,强制对文件传输进行校验
# -a, --archive         归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
# -r, --recursive       对子目录以递归模式处理
# -R, --relative        使用相对路径信息
# -b, --backup          创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
# --backup-dir          将备份文件(如~filename)存放在在目录下。
# -suffix=SUFFIX        定义备份文件前缀
# -u, --update          仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
# -l, --links           保留软链结
# -L, --copy-links      像对待常规文件一样处理软链接
# --copy-unsafe-links   仅仅拷贝指向SRC路径目录树以外的链接
# --safe-links          忽略指向SRC路径目录树以外的链接
# -H, --hard-links      保留硬链接
# -p, --perms           保持文件权限
# -o, --owner           保持文件属主信息
# -g, --group           保持文件属组信息
# -D, --devices         保持设备文件信息
# -t, --times           保持文件时间信息
# -S, --sparse          对稀疏文件进行特殊处理以节省DST的空间
# -n, --dry-run         显示哪些文件将被传输
# -W, --whole-file      拷贝文件,不进行增量检测
# -x, --one-file-system 不要跨越文件系统边界
# -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
# -e, --rsh=COMMAND     指定使用rsh、ssh方式进行数据同步
# --rsync-path=PATH     指定远程服务器上的rsync命令所在路径信息
# -C, --cvs-exclude     使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
# --existing            仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
# --delete              删除那些DST中SRC没有的文件
# --delete-excluded     同样删除接收端那些被该选项指定排除的文件
# --delete-after        传输结束以后再删除
# --ignore-errors       即使出现IO错误也进行删除
# --max-delete=NUM      最多删除NUM个文件
# --partial             保留那些因故没有完全传输的文件,以是加快随后的再次传输
# --force               强制删除目录,即使不为空
# --numeric-ids         不将数字的用户和组ID匹配为用户名和组名
# --timeout=TIME        IP超时时间,单位为秒
# -I, --ignore-times    不跳过那些有同样的时间和长度的文件
# --size-only           当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
# --modify-window=NUM   决定文件是否时间相同时使用的时间戳窗口,默认为0
# -T --temp-dir=DIR     在DIR中创建临时文件
# --compare-dest=DIR    同样比较DIR中的文件来决定是否需要备份
# -P                    等同于 --partial
# --progress            显示备份过程
# -z, --compress        对备份的文件在传输时进行压缩处理
# --exclude=PATTERN     指定排除不需要传输的文件模式
# --include=PATTERN     指定不排除而需要传输的文件模式
# --exclude-from=FILE   排除FILE中指定模式的文件
# --include-from=FILE   不排除FILE指定模式匹配的文件
# --version             打印版本信息
# --address             绑定到特定的地址
# --config=FILE         指定其他的配置文件,不使用默认的rsyncd.conf文件
# --port=PORT           指定其他的rsync服务端口
# --blocking-io         对远程bash使用阻塞IO
# -stats                给出某些文件的传输状态
# --progress            在传输时显示传输过程
# --log-format=formAT   指定日志文件格式
# --password-file=FILE  从FILE中得到密码
# --bwlimit=KBPS        限制I/O带宽,KBytes per second
# -h, --help            显示帮助信息

参考链接

🔗hugo博客部署到腾讯云轻量级服务器

🔗使用 Rsync 从 Windows 同步数据到 Linux

🔗rsync的介绍和配置