我们有两个主要的环境问题:
开发和质量保证
每个环境有两台服务器:
- 跳箱
- 应用服务器
为了连接到应用服务器,您必须先连接到跳转框,然后通过 SSH 连接到应用服务器。
防火墙提供了一些规则:
- 您必须通过跳转框连接到应用程序服务器
- 应用服务器无法连接到任一跳转框
- 跳转盒在同一个子网上,并且可以相互通信。
我们的问题
我们在 上有很多内容(670 GB)DEVELOPMENT APPLICATION SERVER
,我们需要将这些内容放到QA APPLICATION SERVER
.
将此数据复制到跳转框不是一种选择,因为它们缺少所需的空间量。
我做了一些研究,了解到我们可以通过这些服务器建立一系列隧道,这样我们就可以通过隧道将数据从一个应用服务器直接流式传输到另一个。但是,我们无法从应用服务器连接到跳转框的问题。
我们有什么选择吗?这是一个绝望的情况,时间至关重要。我们没有时间下载数据并重新上传。在服务器上通过网络进行复制会很快,因为它是千兆连接。
到目前为止,最简单的方法是通过 scp 复制它。另外,这种语法实际上与其他一些建议不同。
您无法轻松击败这种语法。它允许您递归地复制、rsync 或任何您想要的东西,而无需考虑潜在的复杂管道。这种语法直观清晰,更容易被跟随您的系统管理员支持,并且不会无用地使用 cat。
从scp 手册页:
-3
两个远程主机之间的副本通过本地主机传输。如果没有此选项,数据将直接在两个远程主机之间复制。请注意,此选项会禁用进度表。在下面的例子中
这是一个 ~/.ssh/config 文件,它通过适当的跳转(又名堡垒服务器)设置从工作站到应用程序服务器的直接访问。
测试目标服务器上是否存在文件,它不会存在。
现在让我们通过您的工作站将文件从 Dev Application 服务器复制到 QA Application。
现在让我们检查 QA Application Server 上是否存在复制的文件。这次会在那里。
笔记
关闭 ProxyCommand 连接时,您将看到警告消息“被信号 1 杀死”。这是 SSH 断开 ProxyCommand 连接,无需担心。
LogLevel Quiet
您可以通过添加到堡垒主机配置节来摆脱它。管道!
如果互联网是一系列管道,那么 Unix 就是一系列管道——类似于:
应该管用。
如果需要遍历更多的主机,根据需要添加更多的管道(以及更多嵌套的
\
-escaped 引号层)。(但是请注意,如果管道/转义变得如此复杂,以至于您必须绘制图表或依靠手指来确定您必须加倍转义的次数,那么可能是时候承认失败并设置适当的 VPN !)如果我理解正确,您有两个跳转服务器(jump-qa 和 jump-dev)保护两个应用服务器(app-qa 和 app-dev);跳转服务器可以互相ssh;除了相关的跳转服务器之外,没有任何盒子可以ssh到相应的应用服务器。应用程序服务器可以 ssh 到 noone。一个文件将从 app-dev 传输到 app-qa。两个跳转服务器都没有空间来存储数据的临时副本。
您可以使用 ssh 隧道解决此问题。我们建立了到一个远程应用服务器的连接,带有一个远程隧道,该隧道连接回其跳转服务器上未使用的端口。我们建立了从一个跳转服务器到另一个跳转服务器的第二个连接,带有一个隧道,该隧道从隧道一中拾取远程转发端口的悬空端并将其发送到另一个应用程序服务器的 ssh 端口。
设置隧道(这些命令中的每一个都需要在单独的窗口中运行
jump-qa
):您现在应该在 app-qa 上发现,您可以执行
telnet localhost 2345
并获取 app-dev 的 ssh 横幅。然后,您可以复制数据文件:OpenSSH v7.3 及更高版本支持
-J
.对于 A → B → C,在 A 上,只需:
-J
使用 ssh 的选项可以使用尽可能多的跃点。-C
以将文件保留在主文件夹中。-C
通过使用 ssh (或 tar )压缩流来提高速度-z
。如果数据是纯文本(未压缩),则特别有用。pv
通过管道监控数据的进度。另一种可能是progress
.灵感来自Florian Fida和Dan Garthwaite 的回答。