如果您乐于将数据的副本保留在中间计算机上,则可以简单地编写一个脚本,该脚本使用server1作为参考来更新本地副本,然后使用本地副本作为参考来更新server2上的备份:
#!/bin/sh
rsync user@server1:/path/to/stuff /path/to/loca/copy -a --delete --compress
rsync /path/to/loca/copy user@server2:/path/to/where/stuff/should/go -a --delete --compress
使用简单的脚本意味着您只需要一个命令即可完成所有操作。如果数据很敏感(您或公司中的其他人可能不希望副本在您的笔记本电脑上浮动),那么这当然可能是安全性。如果server1对您而言是本地的,则您可以随后删除本地副本(因为下次可以通过本地LAN快速重建)。
构造隧道以便服务器可以更直接有效地相互通信,如下所示:
- 在服务器2上,将/ bin / sh的副本复制为/ usr / local / bin / shforkeepalive。使用符号链接而不是副本,然后不必在修补/ bin / sh的安全更新后对其进行更新。
在服务器2上,创建一个脚本,该脚本除了循环睡眠几秒钟外不执行任何操作,然后回显少量文本,然后使用sh的现在“副本”:
#!/usr/local/bin/shforkeepalive
while [ "1" != "0" ]; do
echo Beep!
sleep 5
done
(echo
可能不需要,因为即使SSHd配置为忽略来自ssh客户端的keep-alive数据包,会话也不会空闲足够长的时间以至于超时)
现在,您可以在笔记本电脑上编写一个脚本,该脚本在后台启动反向隧道,告诉server1使用rsync来执行复制操作,然后通过取消循环脚本来终止反向隧道(这将关闭SSH会话):
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 /usr/local/bin/keepalivesctipt &
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
ssh user@server2 killall shforkeepalive
工作方式:
- 第1行:标准的“用于解释此脚本的命令”标记
- 第2行:使用反向隧道启动SSH连接,并通过它运行keepalive脚本以使其保持打开状态。尾部的&告诉bash在后台运行此命令,因此下一行可以运行而无需等待它完成
- 第3行:启动一个隧道,该隧道将连接到上面的隧道,以便server1可以看到server2,然后运行rsync来执行此安排的复制/更新
- 第4行:rsync操作完成(因此第二个SSH调用返回)后,杀死keep-alive脚本,这将与第一个ssh会话一起执行。
感觉不是特别干净,但是应该可以。我尚未测试上述内容,因此您可能需要对其进行调整。通过减少对调用ssh命令上的'等转义字符的需求,可以使server1上的rsync命令成为单行脚本可能会有所帮助。
顺便说一句:您说“不要问”为什么两台服务器不能直接看到对方,但是通常有很好的理由。我的家庭服务器和保留其在线备份的服务器无法彼此登录(并且所有用户的密码和密钥都不同)-这意味着,如果这两者之一被黑客入侵,则不能用作轻松访问的途径修改其他文件,使我的在线备份更加安全(有人恶意从实时状态删除我的数据无法使用其更新备份的能力来删除所述备份,因为它没有直接接触主要备份站点的能力)。两台服务器都可以连接到其他位置的中间服务器-实时服务器设置为在清晨将其备份(通过rsync)推送到中间计算机,并且设置备份服务器(稍后再允许第一步完成)进行连接并收集更新(再次通过rsyc,然后执行快照步骤,以保持多个备份时间)。这项技术也可能在您的情况下可用,如果可以的话,我建议它是一种更清洁的处理方式。
编辑:将我的黑客与Aaron合并,以避免与/ bin / sh副本和server2上单独的keep-alive脚本混为一谈,您笔记本电脑上的此脚本应完成全部工作:
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 sleep 60 &
pid=$!
trap "kill $pid" EXIT
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
和上面一样,rsync连接到localhost:2222,它将沿着隧道向下转发到笔记本电脑的localhost:2222,后者通过另一个隧道转发到server2的localhost:22。
编辑2:如果您不介意server1具有允许其直接通过server2进行身份验证的密钥(即使没有通道也无法看到server2),则可以使用以下方法进一步简化操作:
#!/bin/sh
ssh user@server1 -R2222:123.123.123:22 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
其中123.123.123.123是server2的公共地址,可以用作复制+粘贴式单行而不是脚本。