惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
H
Help Net Security
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
博客园 - 叶小钗
Y
Y Combinator Blog
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
WordPress大学
WordPress大学
C
Check Point Blog
Recent Announcements
Recent Announcements
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
B
Blog

卡库伊2.0

用cloudflare来识别访客IP判断国家 批量计算文件hash Indesign的一些技巧 一个无广告和弹窗的搜狗输入法 – 卡库伊2.0 Linux挂载nas路径 – 卡库伊2.0 ffmpeg将mp4转为m3u8 – 卡库伊2.0 php和nginx默认端口冲突 – 卡库伊2.0 引用中文字体文件太大如何解决 – 卡库伊2.0 计划任务:git同步 – 卡库伊2.0 Cloudflare免费缓存 – 卡库伊2.0 搜狗输入法去广告和弹窗 – 卡库伊2.0 FRP+反代的重定向 – 卡库伊2.0 网页小游戏 – 卡库伊2.0
通过SSH同步数据
sunplace · 2026-08-03 · via 卡库伊2.0

A → B 数据同步搭建指南

角色说明:A = RockyLinux 10(无公网IP,数据源),B = OracleLinux 8(有公网IP,接收备份)。同步方向固定为 A 主动推送到 B,因为只有 A 能发起连接。


OracleLinux 8 一般默认已装好 openssh-server,确认一下:

systemctl status sshd

没启动就装并启动:

sudo dnf install -y openssh-server
sudo systemctl enable --now sshd

确认防火墙放行 22 端口(如果用了 firewalld):

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

如果 B 是云服务器,还要去云厂商的安全组/网络策略里放开 22 端口的入方向规则。


第二步:B 上创建专用的接收用户(可选但推荐)

不用 root 直接接收,单独建一个用户,权限收窄,更安全:

sudo useradd -m -s /bin/bash syncuser
sudo mkdir -p /data/backup_from_A
sudo chown syncuser:syncuser /data/backup_from_A

第三步:A 上安装 rsync 和 openssh-client

RockyLinux 10 通常默认都有,确认:

rsync --version
ssh -V

没有就装:

sudo dnf install -y rsync openssh-clients

第四步:A 上生成密钥对,实现免密登录 B

在 A 上,用运行同步任务的那个用户(比如 root,或者你专门建的备份用户)执行:

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_to_B -N ""

-N "" 表示不设密码,方便脚本免交互调用;-f 指定单独的文件名,避免跟你已有的默认密钥冲突。

把公钥传到 B:

ssh-copy-id -i ~/.ssh/id_ed25519_to_B.pub syncuser@B的公网IP

如果 B 的 SSH 端口不是默认 22,要加 -p 端口号。这一步会要求输入一次 syncuser 的密码,之后就再也不用了。

验证免密登录:

ssh -i ~/.ssh/id_ed25519_to_B syncuser@B的公网IP

能直接进去不问密码,说明配置成功。


第五步:(可选)在 A 上写 SSH config 简化命令

编辑 ~/.ssh/config

Host B
    HostName B的公网IP
    User syncuser
    Port 22
    IdentityFile ~/.ssh/id_ed25519_to_B

配置好之后,后面 rsync 命令里直接用 B 这个别名代替完整的用户名+IP+端口,命令更简洁,改 IP 或端口也只需要改这一处。


第六步:执行同步

用 SSH config 别名的写法:

rsync -avz --delete /path/to/local/data/ B:/data/backup_from_A/

不用别名的完整写法:

rsync -avz --delete -e "ssh -i ~/.ssh/id_ed25519_to_B -p 22" /path/to/local/data/ syncuser@B的公网IP:/data/backup_from_A/

参数说明:

  • -a 归档模式,保留权限、时间戳、软链接、属主属组
  • -v 显示详细过程,便于调试;正式定时任务里可以去掉,减少日志体积
  • -z 传输时压缩
  • --delete 让目标目录跟源目录保持一致,源里删了的文件目标也会删掉;如果只想增量添加不想同步删除,去掉这个参数
  • 源路径末尾的 / 必须保留,表示只同步目录内容本身,不带这个斜杠会在目标里多套一层目录

第七步:加入定时任务

在 A 上编辑 crontab:

crontab -e

加一行,比如每天凌晨3点同步一次:

0 3 * * * rsync -avz --delete /path/to/local/data/ B:/data/backup_from_A/ >> /var/log/rsync_to_B.log 2>&1

如果同步的是你之前那套本地备份脚本产出的目录(/var/backups/for_rl10),可以直接把这行 rsync 命令追加到备份脚本末尾,本地打包完立刻推送,不用单独再开一个定时任务。


排查要点

  • 如果连接失败,先用 ssh -v 加详细模式排查,看是密钥没生效还是端口/防火墙问题
  • 如果 crontab 里跑失败但手动执行正常,大概率是 cron 环境变量(尤其是 $HOME$PATH)跟交互式 shell不一致,导致密钥文件路径找不到——排查方式跟之前处理 mysql 认证问题时是同一个思路,可以在 rsync 命令里把密钥路径写成绝对路径,不依赖 ~
  • 同步大量小文件时速度慢,是 rsync 正常特性(要逐个比对文件),可以考虑加 --info=progress2 看整体进度,或者用 -e "ssh -T -c [email protected] -o Compression=no -x" 这类调优参数提升传输速度(前提是数据本身不可再压缩,比如已经是 tar.gz)