我需要从主机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
”(“正常”因为还有“错误”输出)。
foo
或 bar
是什么并不重要,只要第一个将它输出到 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
命令的计算机的套接字连接,该命令已设置其管道以将数据重定向到它的 标准输出
。
所以我们有:
tar
收集数据并将其通过管道传输到A
上的 SSH 服务器
A
上的 SSH 服务器通过 Unix 套接字将输出发送到第一个ssh
命令- 第一个 ssh 命令通过管道(或流)将所有内容传输到它的
stdout
,|
(管道)命令在其中获取它。 - 管道命令将第一个
ssh
的输出传递给第二个。 - 第二个
ssh
通过Unix套接字将数据发送到B
上的SSH服务器 B
上的远程 SSH 服务器将数据通过管道传输到第二个tar
命令作为stdin
A
上的 或者作为图形:
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/