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

时间:2014-09-09 09:02:33

标签: 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。

2 个答案:

答案 0 :(得分:2)

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

只要第一个将输出写入foo(又名"文件句柄1&#34),barstdout是什么并不重要。 ;),第二个可以从stdin(或文件句柄0)读取。

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

因此,如果您执行ssh user@host echo Hello,则SSH会将命令echo Hello发送到远程SSH服务器,该服务器将在本地执行#34;" (即在运行SSH 服务器的同一台计算机上)。结果(Hello)将通过SSH服务器传送到运行ssh命令的计算机的套接字连接,该命令已设置其管道以将数据重定向到{{1} {{1} }}

所以我们有:

  1. stdouttar上收集数据并通过A
  2. 连接到SSH服务器
  3. A上的SSH服务器通过Unix套接字将输出发送到第一个A命令
  4. 第一个ssh命令将所有内容传送(或流)ssh(管道)命令选择它的所有stdout
  5. pipe命令将第一个|的输出传递给第二个。
  6. 第二个ssh通过Unix套接字将数据发送到ssh上的SSH服务器
  7. B上的远程SSH服务器将数据传输到第二个B命令tar
  8. 或者作为图形:

    stdin

    其中tar cf --pipe>> SSH(A) --socket>> ssh hostA --pipe>> ssh hostB --socket>> SSH(b) --pipe>> tar xf 是同一台计算机上进程之间的管道,--pipe>>是两台不同计算机之间的Unix套接字连接。

答案 1 :(得分:1)

他们没有被管道分开,而是与管道连接在一起。它基本上是B连接到A并且将文件转换为文件并将文件流传输到主机C,在那里它执行tar xf以便解压缩文件。