linux - 在两个远程主机之间复制数据 - 它是如何工作的?

标签 linux shell aix

我需要从主机A复制数据到主机C,他们之间没有任何联系。唯一的办法是 A <-> B 然后 B <-> C。 为了以更快的方式完成此操作,我在 B(中间服务器)上使用以下命令:

    ania@hostname_B: /home/ania/
    ssh hostname_A 'cd /home/ania/lot_of_files; tar cf - .' | ssh hostname_B 'cd /home/ania/new_place; tar xf -'

它有效,但我不明白这里的某些东西,真的很想。 这条命令隐藏在什么地方是严格复制数据?

我看到正常的 ssh 连接,更改目录和打包/解包文件只在两个主机名上完成,一个接一个由管道分隔。 执行后没有文件存储在 hostname_B 上,这里也没有使用 scp。 在 AIX 上完成,但它也可以在 Linux 上运行。

最佳答案

foo | bar 表示“从 foo 获取所有正常输出并将其作为输入传递给 bar”(“正常”因为还有“错误”输出)。

foobar 是什么并不重要,只要第一个将它输出到 stdout(又名"file") handle 1"),第二个可以从 stdin(或文件句柄 0)中读取。

SSH 做一些类似的事情,但涉及套接字。因此它连接到另一台计算机上的 SSH 服务器(通过 Unix Sockets )并将远程计算机上运行的命令的 stdin/out/err 重定向到 stdin/out/err 您在本地执行的 ssh 命令。

因此,如果您执行 ssh user@host echo Hello,SSH 会将命令 echo Hello 发送到远程 SSH 服务器,该服务器将在“本地”执行它(即在运行 SSH 服务器 的同一台计算机上)。结果 (Hello) 将通过 SSH 服务器通过管道连接到运行 ssh 命令的计算机的套接字连接,该命令已设置其管道以将数据重定向到它的 标准输出

所以我们有:

    A 上的
  1. tar 收集数据并将其通过管道传输到 A
  2. 上的 SSH 服务器
  3. A 上的 SSH 服务器通过 Unix 套接字将输出发送到第一个 ssh 命令
  4. 第一个 ssh 命令通过管道(或流)将所有内容传输到它的 stdout|(管道)命令在其中获取它。
  5. 管道命令将第一个 ssh 的输出传递给第二个。
  6. 第二个ssh通过Unix套接字将数据发送到B上的SSH服务器
  7. B 上的远程 SSH 服务器将数据通过管道传输到第二个 tar 命令作为 stdin

或者作为图形:

tar cf --pipe>> SSH(A) --socket>> ssh hostA --pipe>> ssh hostB --socket>> SSH(b) --pipe>> tar xf

其中 --pipe>> 是同一台计算机上进程之间的管道,--socket>> 是两台不同计算机之间的 Unix 套接字连接。

关于linux - 在两个远程主机之间复制数据 - 它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25740566/

相关文章:

c++ - 使用 poppler 在 Qt5 中链接时出错

linux - 神经节监测

c++ - GLFW 无法创建窗口 : "GLX: Failed to create context: GLXBadFBConfig"

linux - 登录操作需要很长时间(Syslog 问题)

bash - shell 中的 float 比较

bash - 如何在 bash 中连接使用 printf 格式化的字符串

gcc - GCC 可以在 AIX 上交叉编译吗?

unix - 无法构建数组并在 AWK 中打印出来

go - Go的SSH客户端和AIX上的PTY

Python 无法正确运行 shell 命令