reg*_*tre 8 linux boot rsync tar
这是连接:
[Server1] <---> [my desktop] <---> [Server2]
Server1 和 server2 不允许直接互相交谈(不要问)。但是,我的桌面能够通过 ssh 访问两台服务器。
我需要将文件从 server1 复制到 server2。
传统上,我一直在使用 ssh+tar hack,例如:
ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'
这很好用,但我想更进一步,通过我的桌面在两台服务器之间进行 rsync 工作。
现在我知道我可以在一个终端中启动一个 ssh 端口转发隧道,然后在另一个窗口中通过该隧道进行 rsync,但我不想在第二个终端上大惊小怪,或者创建和断开一个单独的端口转发隧道。我想要的是:
有人有这样做的技巧吗?
编辑:这是工作命令!大家辛苦了: 1. 对于 rsa 关键路径,不能使用 tildae,必须使用“/root/”。2. 这是最终的命令行:
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
Run Code Online (Sandbox Code Playgroud)
炸药爆炸了。
如果您愿意在中间机器上保留数据的副本,那么您可以简单地编写一个脚本,使用 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
Run Code Online (Sandbox Code Playgroud)
使用简单的脚本意味着您需要一个命令来完成所有事情。如果数据是敏感的(您或您公司的其他人可能不希望在您的笔记本电脑上四处飘动),这当然可能是一个安全禁忌。如果 server1 对您来说是本地的,那么您可以在之后删除本地副本(因为下次通过本地 LAN 重建会很快)。
构建隧道以便服务器可以更直接地有效地相互交谈应该是可能的,如下所示:
在服务器 2 上创建一个脚本,它只循环睡眠几秒钟然后回显少量文本,并使用现在的 sh 的“副本”:
#!/usr/local/bin/shforkeepalive
while [ "1" != "0" ]; do
echo Beep!
sleep 5
done
Run Code Online (Sandbox Code Playgroud)
(echo
可能不需要,因为即使 SSHd 配置为忽略来自 ssh 客户端的保持活动数据包,会话也不会空闲足够长的时间以超时)
现在您可以在您的笔记本电脑上编写一个脚本,在后台启动您的反向隧道,告诉 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
Run Code Online (Sandbox Code Playgroud)这是工作的方式:
这感觉不是特别干净,但它应该可以工作。我没有测试上述内容,因此您可能需要对其进行调整。使 rsync 命令成为 server1 上的单行脚本可能有助于减少对调用 ssh 命令中的 ' 等字符进行转义的需要。
顺便说一句:你说“不要问”为什么两台服务器不能直接看到对方,但这通常有很好的理由。我的家庭服务器和其在线备份所在的服务器无法相互登录(并且所有用户都有不同的密码+密钥) - 这意味着如果两者之一被黑客入侵,它不能用作简单的途径hack 另一个所以我的在线备份更安全(恶意删除我的数据的人无法使用其更新备份的能力来删除所述备份,因为它没有直接接触主备份站点的能力)。两台服务器都可以连接到其他地方的中间服务器 - 实时服务器设置为在清晨将其备份(通过 rsync)推送到中间机器,并设置备份服务器(稍后允许第一步完成)连接并收集更新(再次通过 rsyc 和快照步骤以保持备份的多个年龄)。这种技术也可能适用于您的情况,如果是这样,我会推荐它作为一种更清洁的做事方式。
编辑:将我的 hack 与 Aaron 的合并以避免与 /bin/sh 的副本和 server2 上的单独保持活动脚本有关的所有麻烦,您笔记本电脑上的这个脚本应该可以完成整个工作:
#!/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'
Run Code Online (Sandbox Code Playgroud)
与上面一样,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'
Run Code Online (Sandbox Code Playgroud)
其中 123.123.123.123 是 server2 的公共地址,它可以用作复制+粘贴单行而不是脚本。
归档时间: |
|
查看次数: |
8563 次 |
最近记录: |