通过SSH隧道在多跳上复制数据


14

我们有两个主要的问题环境:

开发和质量保证

每个环境都有两个服务器:

  • 跳箱
  • 应用服务器

为了连接到应用程序服务器,必须先连接到跳转框,然后再通过SSH到应用程序服务器。

防火墙提供了一些规则:

  • 您必须通过跳转框连接到应用程序服务器
  • 应用程序服务器无法连接到任一跳转框
  • 跳转框位于同一子网中,并且可以相互通信。

我们的问题

上有很多内容(670 GB)DEVELOPMENT APPLICATION SERVER,我们需要将此内容带到QA APPLICATION SERVER。

不能将这些数据复制到跳转框,因为它们缺少所需的空间量。

我进行了一些研究,了解到我们可以通过这些服务器建立一系列隧道,以便我们可以通过隧道将数据从一个应用程序服务器直接流到另一个服务器。但是,我们无法从应用程序服务器连接到跳转框的问题。

我们有什么选择吗?这将成为一个绝望的局面,而时间至关重要。我们没有时间下载数据并重新上传。通过服务器上的网络进行复制将很快进行,因为它是千兆连接。


2
建立连接后,您可以采用以下任一方式复制:$ devel_host $ tar -cf-| ssh -t jumbox'ssh app_serv“ tar -xf-”'或以其他方式绕过tar。
— Alex_www

这样我们就可以从开发跳转框连接到开发应用服务器,但不能以其他方式连接。如果建立了该连接,我们可以采用任何一种方式复制吗?在不先将其保存到跳转框中的情况下,将该内容移至其他应用服务器的最佳方法是什么?
— 巴里·查普曼

确切地说,“管道”“ tar”是最简单的解决方案。
— Alex_www

Answers:


15

到目前为止,最简单的方法是仅通过scp复制它。另外,此语法实际上与其他一些建议不同。

您不能轻易击败这种语法。它使您可以递归复制,rsync或任何您想要的内容,而不必考虑潜在的复杂管道的麻烦。此语法直观清晰,将由紧随您的Sys Admins轻松支持,并且不会无用的使用cat。

scp -3 devappserver:/path/to/copy/from qaappserver:/path/to/copy/to

从scp手册页:-3两个远程主机之间的副本通过本地主机传输。如果没有此选项,数据将直接在两个远程主机之间复制。请注意,此选项禁用进度条。

在下面的示例中

  • 您的工作站名为MacBook-Pro。
  • Dev Jump Box被命名为devjumpserver
  • 开发应用程序服务器被命名为devapplicationserver
    • 在名为.local的LAN DNS区域中
  • 质量检查跳转框命名为qajumpserver
  • QA应用程序服务器被命名为qaapplicationserver
    • 在名为.local的LAN DNZ区域中
  • 我们将对670GB / etc / hosts文件进行测试;-)
  • 假设您已配置SSH公钥身份验证。



这是一个〜/ .ssh / config文件,该文件设置了通过适当的跳转(也称为堡垒服务器)从工作站到应用程序服务器的直接访问。

MacBook-Pro:〜barrychapman $ cat〜/ .ssh / config
主持人*
  ServerAliveInterval 60
托管开发应用程序
  主机名devapplicationserver.local
  ProxyCommand ssh -i〜/ .ssh / id_rsa barrychapman@devjumpserver.example.com -W%h:%p
  用户barrychapman
主机qaapplicationserver
  主机名qaapplicationserver.local
  ProxyCommand ssh -i〜/ .ssh / id_rsa barrychapman@qajumpserver.example.com -W%h:%p
  用户barrychapman

MacBook-Pro:〜barrychapman $



测试目标服务器上是否存在文件,该文件将不存在。

MacBook Pro:〜barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls:无法访问/ tmp / hosts:没有此类文件或目录
被信号1.杀死。
MacBook-Pro:〜barrychapman $



现在,让您通过工作站将文件从Dev Application服务器复制到QA Application。

MacBook Pro:〜barrychapman $ scp -3 devapplicationserver:/ etc / hosts qaapplicationserver:/ tmp /
被信号1.杀死。
被信号1.杀死。
MacBook-Pro:〜barrychapman $



现在,让我们检查质量检查应用程序服务器上复制的文件是否存在。这次会在那里。

MacBook Pro:〜barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ tmp /主机
被信号1.杀死。
MacBook-Pro:〜barrychapman $ 

注意

关闭ProxyCommand连接时,您将看到警告消息“信号1杀死”。这是SSH断开的ProxyCommand连接,没有什么好警告的。您可以通过将其添加LogLevel Quiet到堡垒主机配置节中来摆脱它。


干杯,这解决了我们的问题。圣诞节快乐!
— 巴里·查普曼

“堡垒主机配置节”是什么意思?@BraveNewCurrency?
— Andrew Wolfe 2015年

我认为每个“主机”行及其下的配置都是一个节(就像在诗歌中一样。)如果在堡垒“主机”行下添加“ LogLevel Quiet”,它将仅适用于该主机。
— BraveNewCurrency

8

管道!

如果互联网是一系列管道,则Unix是一系列管道-类似于:

cat ginormous-file | ssh user@host1 "cat | ssh user@host2 \"cat >out\" "

应该管用。

如果需要遍历更多的主机,请根据需要添加更多的管道(和更多的\-escaped引号嵌套层)。(但是请注意,如果管道/转义变得如此复杂,以至于您必须画图或依靠手指来确定必须在转义中加倍的次数,那么可能是时候承认失败并建立了正确的VPN !)


1
作为Alex_www在他的评论中指出,如果你不需要中间文件的任何东西,你也可以直接管的输出tar左右。(另外,在你没有需要的cat在管道的中间阶段- ssh很高兴地吃了标准输入和继电器它的。cat只是让我感觉更好,是其他有用的命令,你可能想使用,就像一个占位符tee。)
— voretaq7 2013年

我认为OP的问题在于,没有一台既具有数据又可以进行连接的机器,也没有一台可以看到所有事物的人(充当所有管道的连接器)。
— MadHatter

1
@MadHatter如果是这种情况,我们的两个答案可以结合使用(连接到开发服务器,将端口转发回跳转服务器的SSH端口,然后在该端口上运行SSH管道)。当然,这使解决方案越来越令人恶心,以至于人们开始在办公室外面抗议时,上面写着大招牌VPN! NOW!……
— voretaq7 2013年

为什么是。是的,他们会的。希望!
— MadHatter

这样做是否意味着中间服务器(在这种情况下user@host1)将cat ginormous-file在任何时候都具有完整的存储空间?还是将数据直接发送到user@host2?还是以某种方式流式传输?如何是tar有关呢?我想这与我提出的倒数第二个问题有关。这些问题都不是夸夸其谈……
— hello_there_andy

1

如果我理解正确,则您有两个跳转服务器(jump-qa和jump-dev)保护两个应用程序服务器(app-qa和app-dev);跳转服务器可以相互SSH;除了相关的跳转服务器外,没有其他框可以SSH到相应的应用服务器。应用服务器无法通过SSH加密。文件将从app-dev传输到app-qa。两个跳转服务器都缺少用于临时复制数据的空间。

您可以使用ssh隧道解决此问题。我们建立了与一台远程应用程序服务器的连接,并带有一条远程隧道,该隧道重新连接到其跳转服务器上未使用的端口。我们建立了从一个跳转服务器到另一个跳转服务器的第二个连接,并承载了一条隧道,该隧道从隧道1中拾取远程转发端口的悬空端,并将其发送到另一台应用程序服务器的ssh端口。

设置隧道(每个命令都需要在上的单独窗口中运行jump-qa):

jump-qa% ssh app-qa -R 2345:localhost:2346
jump-qa% ssh jump-dev -L 2346:app-dev:22

现在,您应该在app-qa上发现它可以执行telnet localhost 2345并获取app-dev的ssh标语。然后,您可以复制数据文件:

app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat

有两个跳转框-一个在质量检查应用服务器的前面,另一个在DEV应用服务器的前面。跳箱可以彼此通信
— Barry Chapman

客户是否有临时副本的空间?
— MadHatter

不,空间不足
— Barry Chapman

当您说客户时,您指的是什么服务器?
— 巴里·查普曼

我误会了。我目前的理解是没有客户。有两个跳转服务器和两个应用程序服务器。
— MadHatter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.