以前同步数据习惯用rsync,最近使用AWS的Transfer Family服务,即SFTP,发现rsync无法用了,因为必须结合ssh,但是SFTP跟ssh不一样。曾经尝试将sftp挂载为本地盘使用rsync,但是发现这样的挂载不稳定,sftp会莫名断开。查询后发现rclone,测试后发现也不错。

安装:

sudo apt install unzip

sudo -v ; curl https://rclone.org/install.sh | sudo bash

这种安装方式会自动安装最新版,如果使用ubuntu命令安装:apt install rclone

默认安装的是1.50.2的旧版,这个版本会有很多莫名其妙的问题。例如与sftp使用key验证的时候,会提示:failed to parse private key file: ssh: key is not password protected

安装完成后,查看版本信息:

rclone --version

rclone的使用_sftp


输入安装命令:sudo -v ; curl https://rclone.org/install.sh | sudo bash后,如果提示rclone.org网站证书有问题,则可能是curl太旧导致,参考:https://blog.51cto.com/helpdesk/6718433

在Synology或者其它Linux下安装的话,可以先下载安装包然后将rclone copy到对应目录下即可。

curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip

unzip rclone-current-linux-amd64.zip

cd rclone-*-linux-amd64  

将rclone copy到对应文件夹

sudo cp rclone /usr/bin/

sudo chown root:root /usr/bin/rclone

sudo chmod 755 /usr/bin/rclone 

验证:which rclone


rclone 创建配置文件是交互式,这个有点意思:

rclone config

按照提示一步步输入即可

rclone的使用_sftp_02

完成后的配置文件可通过命令找到保存位置:

rclone config file

rclone的使用_sftp_03

具体文件内容,后续可以通过修改文件实现更改配置的目的

rclone的使用_rclone_04

这里最后一行我添加了1条规则: set_modtime = false

因为AWS的SFTP存储我设置连接到S3,无法将文件的属性时间设置为默认时间,而是S3根据文件上传时间自动添加。如果不加这一条,会提示无法修改时间的错误。

具体命令:

rclone copy -P --no-update-modtime --size-only /share/Test/ aff:/Test/

解析:

-P 即显示过程,类似rsync -v

--no-update-modtime --size-only 无法根据文件修改时间检查是否同步,因为sftp上的时间是文件上传时间,始终跟本地上文件的时间不一致,如果不加会导致文件不断被重复上传,因此改为通过检查文件大小来决定是否同步旧文件,因为文件如果被修改过,size肯定会发生变化

/share/Test/ 指定本地需要同步的文件夹

aff:/Test/ aff是创建的配置的名字,:/Test/是SFTP上对应的文件夹

文件或文件夹过滤

--filter-from filter-list.txt

- /dir1/

- /dir2/

+ *.pdf

- **

这里- 或者 + 表示包括+ 还是排除 - 的意思

查看远程连接目录

rclone lsd remote:


安装的时候如果提示这个错误:

unzip: invalid option -- 'a' BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) multi-call binary.

表示本机当前没有安装unzip,通过 apt install unzip 安装即可


参数

--transfers=30: 默认同时传输4个文件,用此参数指定同时传30个文件,适用大量小文件需要上传的情况

--no-traverse:不检查远程服务器端是否已有本地文件,能加速本地数据上传,但是会导致数据重复传

--multi-thread-streams=5: 单线程和5线程,对比如下,适用需要上传大文件大情况

rclone的使用_sftp_05

--inplace: 不产生临时文件

--min-age 1d: 传输超过1天的旧文件(即不传最新的文件)

--max-depth 3: 检查文件夹的层级,例如此为检查当前文件夹下3层内文件夹,超过的话则不同步


2025-1-17 遇到一个新情况,配置pem文件,确认是正确的,也重新生成了几次,但是用同步命令时,却提示:failed to parse private key file ssh: no key found

目前原因未明,通过修改参数中的key_pem, 为 key_file, 使用默认生成的rsa key解决

rclone的使用_sftp_06