AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 560970
Accepted
Barry Chapman
Barry Chapman
Asked: 2013-12-13 08:56:00 +0800 CST2013-12-13 08:56:00 +0800 CST 2013-12-13 08:56:00 +0800 CST

通过 SSH 隧道在多个跃点上复制数据

  • 772

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

开发和质量保证

每个环境有两台服务器:

  • 跳箱
  • 应用服务器

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

防火墙提供了一些规则:

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

我们的问题

我们在 上有很多内容(670 GB)DEVELOPMENT APPLICATION SERVER,我们需要将这些内容放到QA APPLICATION SERVER.

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

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

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

linux
  • 4 4 个回答
  • 16818 Views

4 个回答

  • Voted
  1. Best Answer
    appx
    2013-12-13T13:32:55+08:002013-12-13T13:32:55+08:00

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

    您无法轻松击败这种语法。它允许您递归地复制、rsync 或任何您想要的东西,而无需考虑潜在的复杂管道。这种语法直观清晰,更容易被跟随您的系统管理员支持,并且不会无用地使用 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 区域
    • QA Jump Box 被命名为 qajumpserver
    • QA 应用服务器被命名为 qaapplicationserver
      • 位于名为 .local 的 LAN DNZ 区域
    • 我们将执行 670GB /etc/hosts 文件的测试副本;-)
    • 假设您已配置 SSH 公钥身份验证。



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

    MacBook-Pro:~ barrychapman$ cat ~/.ssh/config
    主持人 *
      ServerAliveInterval 60
    主机 devapplicationsever
      主机名 devapplicationserver.local
      ProxyCommand ssh -i ~/.ssh/id_rsa [email protected] -W %h:%p
      用户 barrychapman
    主机 qaapplicationserver
      主机名 qaapplicationserver.local
      ProxyCommand ssh -i ~/.ssh/id_rsa [email protected] -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$
    



    现在让我们检查 QA Application Server 上是否存在复制的文件。这次会在那里。

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

    笔记

    关闭 ProxyCommand 连接时,您将看到警告消息“被信号 1 杀死”。这是 SSH 断开 ProxyCommand 连接,无需担心。LogLevel Quiet您可以通过添加到堡垒主机配置节来摆脱它。

    • 18
  2. voretaq7
    2013-12-13T10:05:29+08:002013-12-13T10:05:29+08:00

    管道!

    如果互联网是一系列管道,那么 Unix 就是一系列管道——类似于:

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

    应该管用。

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

    • 7
  3. MadHatter
    2013-12-13T09:04:24+08:002013-12-13T09:04:24+08:00

    如果我理解正确,您有两个跳转服务器(jump-qa 和 jump-dev)保护两个应用服务器(app-qa 和 app-dev);跳转服务器可以互相ssh;除了相关的跳转服务器之外,没有任何盒子可以ssh到相应的应用服务器。应用程序服务器可以 ssh 到 noone。一个文件将从 app-dev 传输到 app-qa。两个跳转服务器都没有空间来存储数据的临时副本。

    您可以使用 ssh 隧道解决此问题。我们建立了到一个远程应用服务器的连接,带有一个远程隧道,该隧道连接回其跳转服务器上未使用的端口。我们建立了从一个跳转服务器到另一个跳转服务器的第二个连接,带有一个隧道,该隧道从隧道一中拾取远程转发端口的悬空端并将其发送到另一个应用程序服务器的 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
    
    • 1
  4. Pablo A
    2020-09-19T13:01:07+08:002020-09-19T13:01:07+08:00

    OpenSSH v7.3 及更高版本支持-J.

    -J [user@]host[:port]
    通过首先与跳转主机建立 ssh 连接,然后从那里建立到最终目的地的 TCP 转发来连接到目标主机。可以指定多个跳转跃点,用逗号分隔。这是指定 ProxyJump 配置指令的快捷方式。

    对于 A → B → C,在 A 上,只需:

    tar -cf - file1 file_n | pv | ssh -C -J userB@B:portB userB@C -p portC 'tar -C destDir -xvf -'
    
    • -J使用 ssh 的选项可以使用尽可能多的跃点。
    • 省略 tar 的遥控器-C 以将文件保留在主文件夹中。
    • 一次发送任何文件(文本或二进制文件)。
    • -C通过使用 ssh (或 tar )压缩流来提高速度-z。如果数据是纯文本(未压缩),则特别有用。
    • pv通过管道监控数据的进度。另一种可能是progress.

    灵感来自Florian Fida和Dan Garthwaite 的回答。

    • 1

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve