我们有两个主要的环境:
开发和QA
每个环境都有两台服务器:
为了连接到应用程序服务器,您必须首先连接到跳转框,然后再连接到应用程序服务器。
防火墙有一些规则:
我们的问题
我们在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
这里是一个〜/ .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 -3两台远程主机之间的拷贝通过本地主机传输。 没有这个选项,数据直接在两个远程主机之间复制。 请注意,此选项禁用进度表。
当closures一个ProxyCommand连接时,你会看到警告信息“Kill by signal 1”。 这是SSH撕毁ProxyCommand连接,没有什么可惊吓的。 您可以通过将LogLevel Quiet添加到您的堡垒主机configuration节来摆脱它。
如果互联网是一系列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