通过SSH隧道多次复制数据

我们有两个主要的环境:

开发和QA

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

  • 跳箱
  • 应用服务器

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

防火墙有一些规则:

  • 您必须通过跳转框连接到应用程序服务器
  • 应用程序服务器无法连接到任一跳转框
  • 跳转框在同一个子网上,CAN可以相互通信。

我们的问题

我们在DEVELOPMENT APPLICATION SERVER上有很多内容(670 GB),我们需要把它交给QA APPLICATION SERVER

将此数据复制到跳转框不是一个选项,因为它们缺less所需的空间量。

我做了一些调查,并了解到我们可能会通过这些服务器做一系列的隧道,以便我们可以通过隧道将数据直接从一台应用服务器stream式传输到另一台。 但是,我们无法从应用程序服务器连接到跳转框的问题。

我们有什么select吗? 这是一个绝望的情况,时间是至关重要的。 我们没有时间下载数据并重新上传。 在服务器上通过networking复制将会很快,因为它是千兆连接。

到目前为止,最简单的方法就是通过scp复制它。

另外,这个语法实际上不像一些其他的build议。

你不能轻易打败这个语法。 它允许你recursion地复制,rsync或者任何你想要的而没有考虑潜在的复杂pipe道的麻烦。 这个语法直观清晰,可以被系统pipe理员更好地支持,并且不会使得猫无用 。

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

在下面的例子中。

  • 您的工作站被命名为MacBook-Pro。
  • Dev Jump Box被命名为devjumpserver
  • Dev Application Server被命名为devapplicationserver
    • 位于名为.local的LAN DNS区域
  • QA Jump Box被命名为qajumpserver
  • QA应用程序服务器名为qaapplicationserver
    • 在LAN DNZ区域名为.local
  • 我们将执行一个670GB / etc / hosts文件的testing副本;-)
  • 假设您已经configuration了SSH公钥authentication。

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

 MacBook Pro:〜barrychapman $ cat〜 / .ssh / config
主机*
   ServerAliveInterval 60
主机devapplicationsever
   HostName devapplicationserver.local
   ProxyCommand ssh -i〜/ .ssh / id_rsa [email protected] -W%h:%p
  用户barrychapman
主机qaapplicationserver
   HostName qaapplicationserver.local
   ProxyCommand ssh -i〜/ .ssh / id_rsa [email protected] -W%h:%p
  用户barrychapman

 MacBook Pro:〜barrychapman $

testing目标服务器上文件的存在,它不会在那里。

 MacBook-Pro:〜barrychapman $ ssh qaapplicationserver ls / tmp / hosts
 ls:不能访问/ tmp / hosts:没有这样的文件或目录
被信号1杀死
 MacBook Pro:〜barrychapman $

现在,让我们通过工作站将Dev Application Server中的文件复制到QA Application。


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

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

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

从scp手册页。

scp -3两台远程主机之间的拷贝通过本地主机传输。 没有这个选项,数据直接在两个远程主机之间复制。 请注意,此选项禁用进度表。

注意:

当closures一个ProxyCommand连接时,你会看到警告信息“Kill by signal 1”。 这是SSH撕毁ProxyCommand连接,没有什么可惊吓的。 您可以通过将LogLevel Quiet添加到您的堡垒主机configuration节来摆脱它。

PIPES!

如果互联网是一系列pipe道 ,Unix就是一系列pipe道,如:

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

应该工作。

如果需要遍历更多的主机,则根据需要添加更多的pipe道(以及更多嵌套的\ -escaped引用层)。 (但是请注意,如果stream水线/转义变得如此复杂,以至于您必须绘制图表或手段来计算您的手指, 以确定您需要多less倍才能逃脱,那么可能需要承认失败并设置适当的VPN !)

如果我理解正确,你有两个跳转服务器(jump-qa和jump-dev)保护两个应用服务器(app-qa和app-dev)。 跳转服务器可以相互ssh; 除了相关的跳转服务器之外,没有其他的服务器可以访问相应的应用服务器。 应用程序服务器可以ssh到没有人。 文件将从app-dev传输到app-qa。 这两个跳转服务器都缺less临时数据副本的空间。

你可以用ssh tunneling来解决这个问题。 我们build立到一个远程应用程序服务器的连接,携带一个连接到其跳转服务器上未使用端口的远程通道。 我们build立了从一个跳转服务器到另一个跳转服务器的第二个连接,它携带了一个通道,从通道1接收远程转发端口的悬挂端,并将其发送到另一个应用服务器的ssh端口。

设置隧道(这些命令中的每一个都需要在一个单独的窗口中运行):

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

现在你应该可以在app-qa上findtelnet localhost 2345并获取app-dev的ssh标题。 然后您可以复制数据文件:

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