用 Relayium CLI 通过 SSH 在自己的服务器上留一份异地副本
最近更新: 2026-09-01
如果你已经能 ssh 到某台机器上——VPS、家庭服务器、NAS、工作站都算——那就可以用 Relayium CLI 把文件的一份副本放过去,不用搭同步服务,也不用注册账号。传输走的是你现有的 SSH 连接,字节直接进你的服务器,从不经过 Relayium。
先把它能给你什么说清楚:一份此刻状态的异地副本。它不是有版本历史的备份。你覆盖掉的文件,这里不会保留昨天那一版;而定时跑的镜像,会在下一次运行时把源端的删除或损坏一起带过去。如果你需要恢复到上周的样子,请再配一层快照或者会保留历史的备份工具。
本文介绍怎么 push 和 pull 目录、完整性校验覆盖到哪里、为什么 push 不会往同一个目标跑第二次,以及如何用 cron 让这份副本保持最新。
开始之前
下面用到的都是 relayium CLI,所以没装的话先装上。在 macOS 或 Linux 上,一条命令就能把预编译二进制放进你的 PATH:
curl -fsSL https://relayium.com/install.sh | sh
- 想自己挑文件,或在 Windows 上?从发布页下载二进制——relayium.com/cli 列出了所有安装方式(装了 Go 也可 go build ./cmd/relayium)。
- relayium --version 可确认是否装好。不装这一步,下面的命令只会报 “command not found”。
把一个目录 push 到你的服务器
你需要准备
- 你已经在用的 SSH 访问权限。ssh user@your-server true 必须静默返回——push 复用的就是这条连接,它自己不做任何额外配置。
- 服务器上一个可写的落点。目标路径的上一级目录必须存在,且那个 SSH 用户对它有写权限。
- 服务器上可选装 relayium,它换来的是发送前的冲突预检和逐文件 SHA-256。不装 push 也能用,走一条什么都不校验的普通 tar 流。
- 不需要 Relayium 账号,两端也都不需要跑守护进程。这里的一切都不会与 Relayium 的服务器通信。
push 接受一个或多个源,以及一个 scp 风格的目标地址。Relayium 会用你平常的密钥和配置通过 SSH 连过去,再把文件流式写入目标目录:
确认 push 将要复用的那条 SSH 访问。静默返回就说明你的密钥、主机别名和端口都已正确。
ssh user@your-server true查清你会走哪条协议。打印出路径就是原生协议——发送前的冲突预检加逐文件 SHA-256;什么都不打印就是走 tar 流兜底,那条路逐文件什么都不校验。
ssh user@your-server command -v relayium把目录 push 上去。目标是 scp 风格的写法,末尾的斜杠表示“放进这个目录里”。
relayium push ./photos user@your-server:backups/如果你的 ssh 配置里还没有这台主机,就为这一条命令临时指定密钥或端口。
relayium push -i ~/.ssh/id_ed25519 -p 2222 ./photos user@your-server:backups/确认落地结果。push ./photos 会在目标下重建 photos/,所以文件夹名会一起带过去。
ssh user@your-server ls backups/photos
成功时你会看到什么
走原生协议时,push 每传完一个文件打印一行,并以 0 退出。对着裸机服务器则只打印一行汇总——那是 tar 兜底,同样算成功。
relayium push ./photos user@your-server:backups/
photos/IMG_0413.jpg (2314518 bytes)
photos/IMG_0414.jpg (1998233 bytes)
# against a server with no relayium installed, one summary line instead:
sent 2 file(s) (zero-dependency mode)- 它会复用你的 ~/.ssh/config,所以你早就配好的主机别名、密钥和端口都能直接生效。
- 如果服务器上装了 relayium,就走原生协议:发送任何字节之前先对整批做冲突预检,传输的每个文件都做 SHA-256 校验并先落到暂存区再安装。
- 如果没装,就退回到把 tar 流通过管道送给远端自己的 tar -x -k,所以一台没有 relayium 的裸服务器也能收——但那条路逐文件什么都不校验,而且可能让一批文件只装了一半。
把文件 pull 回来
恢复就是把同一条命令反过来写:给出一个远程源和一个本地目标目录。恢复备份,或者把服务器上的产物同步回笔记本,都用它:
relayium pull user@your-server:backups/ ./restore
- 和 push 不同,pull 始终需要远端已经装好 relayium——它没有 tar 兜底方案,远端要是没装,请先装好。
完整性校验是内置的,续传不是
两端都装了 relayium 时,push 传输的每个文件都会用 SHA-256 哈希做端到端校验,并先落到暂存区再安装——落到服务器上的内容,和你发出去的逐字节一致。这一半是真的,也正是值得在目标端装上 relayium 的理由。
push 不做的事情是续传。它也不是事务:文件是一个一个装上去的,所以中途断线会把已经落地的文件留在原地——而正因为这些文件现在存在了,重跑同一条 push 会被冲突检查拒绝,而不是接着传。请显式补传缺失的路径,或者改用 relayium sync:它才是会跳过已匹配文件、并在下次运行时接着传半截文件的那个模式。
--no-resume 在 push 和 pull 上能被接受,但什么也不做。它只在接收 sync 的 serve 监听端上才是真的有效——那里才可能出现半截文件。
- SHA-256 校验会自动进行;一旦对不上就会报出来,该文件被标记为失败。
- 它覆盖的是这一次真正传输的内容。tar 兜底路径不做任何哈希;而 sync 的 size+mtime 跳过意味着看起来没变的文件根本不会被读取,也就不会被哈希。
- push 和 pull 在两条协议下都不续传。预计会被中断的目录,请用 sync。
用 cron 让这份副本保持最新
要放进 cron 的是 sync,不是 push。push 会拒绝已存在的目标,所以每晚往同一个目录 push,只有第一晚会成功,之后每晚都被拒。sync 才是为反复运行设计的:它跳过大小与修改时间都没变的文件,只发变化的部分,并接着传上一次中断留下的半截文件。
它是一条用你自己 SSH 密钥的非交互式命令,所以可以原样放进 cron。给它指定一个没有口令的密钥(或者用 agent),并把输出记下来,好让失败能被看见:
# 每晚 2 点备份——加到你的 crontab 里(crontab -e)
0 2 * * * relayium sync -i ~/.ssh/backup_key ~/documents user@your-server:backups/ >> ~/relayium-backup.log 2>&1
- 一个被中断的夜间 sync,下一晚会接着来:已经匹配的会被跳过,半截的文件会接着传而不是重头来。
- sync 没有 tar 兜底,所以服务器上必须装有 relayium。那是一次响亮的失败,而不是悄悄降级。
- 只要有文件没通过完整性校验,命令就会以非零状态退出,cron 的失败邮件通知就能发现问题。
- 它保持的是副本的最新状态,不保存历史。只有当你确实希望源端的删除也在服务器上生效时才加 --delete——那就是镜像,而如果你可能误删东西,这恰恰是你不想要的。
定时副本没落地的时候
定时任务天生就是悄无声息地失败的——没人盯着终端。下面四种是真正会发生的,而且每一种都能用一条你现在就能跑的命令定性。它们并不是全部:目标端也可能磁盘满了,或者那个 SSH 用户没有写权限。
现象、检查、修复
- cron 任务卡住,或者日志停在一个输入密码的提示上。
ssh -i ~/.ssh/backup_key -o BatchMode=yes user@your-server true # Permission denied (publickey).BatchMode=yes 会拒绝弹出提示,于是把静默的卡死变成了这一行。把这把密钥的公钥加到服务器的 ~/.ssh/authorized_keys 里,或者让任务改用 agent 已经持有的那把密钥。
- crontab 那行跑了,日志却始终是空的。
command -v relayium # /usr/local/bin/relayiumcron 用的是一份极简 PATH,通常不含 /usr/local/bin,所以那行在 relayium 启动之前就失败了。把刚才查出来的绝对路径写进 crontab 条目里,并保留 >> ~/relayium-backup.log 2>&1 重定向,好让下一次失败看得见。
- 任务每晚都报成功,但其实什么都没有被校验过。
ssh user@your-server command -v relayium # (什么都不打印)远端没有 relayium,就意味着 push 走了 tar 流兜底:它逐文件不做任何哈希,而且在解压中途遇到重名时可能让一批文件只装了一半。在服务器上装好 CLI,就能把发送前的冲突预检和逐文件 SHA-256 拿回来。装好之后你还可以把这个任务改成 relayium sync——它根本没有兜底路径,会响亮地失败而不是悄悄降级。
- 出现 “N file(s) could not be verified or saved”,并以非 0 退出。
relayium push ./photos user@your-server:backups/ # 1 file(s) could not be verified or saved: [photos/IMG_0413.jpg] # exit status 1 echo $? # 1要么落地时算出的 SHA-256 与发送时的不一致,要么服务器上的 relayium 没能保存或安装这个文件(磁盘空间不足、没有权限,或目标路径无法写入);这条消息不区分是哪一种。第一行由服务器上的 relayium 打印、经 SSH 转发过来,后面的 exit status 1 是那个远程进程的退出码。无论哪种,原生协议都会先把每个文件写到暂存区,只有校验一致并且保存成功才安装,所以这次传输没有安装那个路径。但这并不能证明目标位置什么都没有——期间可能有别的程序创建了它——所以不要仅仅因为这条消息就删除接收端已有的文件。如果同一批里有其他文件已经落地,整批重跑会被冲突检查拒绝,所以单独 push 那一个路径,目标仍是原来打算的位置。如果它反复失败,就不是一次偶发的链路错误:检查服务器上的剩余空间、权限和目标路径,并查源文件(读取时是否正被写入)。
常见问题
文件会经过 Relayium 的服务器吗?
不会。push 和 pull 完全跑在你自己的 SSH 连接上。Relayium 的服务器全程不参与,也不需要账号。
服务器需要装 relayium 吗?
要看方向。对 push 来说是可选的:远端装了 relayium 就能走原生协议——发送前对整批做冲突预检,并对它传输的每个文件做 SHA-256 校验;没装的话,push 会退回到通过 SSH 传输 tar 流,依然可用,只是逐文件什么都不校验。对 pull 来说则是必须的:pull 始终需要远端装有 relayium(它没有 tar 兜底方案),请先在远端装好。sync 同理,也必须装。
它怎么决定用哪个 SSH 密钥和端口?
它会像 ssh 一样读取你的 ~/.ssh/config,所以主机别名、密钥和端口都会被自动识别。你也可以在单条命令里用 -i 指定身份文件、用 -p 指定端口来覆盖它们。
这比 rsync 快吗?
在推送到自己服务器这件事上,速度和走 SSH 的 rsync 差不多。重点不是跑赢 rsync,而是让你只用一个工具,就能顺带做跨网络传输和服务器之间的传输,并且沿用同一套逐文件完整性校验。在历史这件事上两者也一样:rsync 和 relayium sync 都不保留文件的旧版本,所以都是副本,而不是备份。
这算备份吗?
它是一份异地副本——那是备份的一部分,但不是全部。push 写下的是文件此刻的样子,而定时 sync 让这份副本保持最新,这也意味着它会在下一次运行时把源端的删除或原地损坏一起带过去,加上 --delete 更是把删除这一半明确打开。这里没有任何东西会保留旧版本,所以如果你需要恢复到上周的样子,请在目标端保留快照,或者改用会做版本管理的工具。
把你的下一个目录放一份异地副本到自己的服务器上——走你自己的 SSH,逐文件校验,而且免费。
获取 CLI