以前同步数据习惯用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
输入安装命令: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 config file
具体文件内容,后续可以通过修改文件实现更改配置的目的
这里最后一行我添加了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/
- **
这里- 或者 + 表示包括+ 还是排除 - 的意思
查看远程连接目录
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线程,对比如下,适用需要上传大文件大情况
--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解决