我需要将数据从主机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。
答案 0 :(得分:2)
foo | bar
表示"从foo
获取所有正常输出并将其作为输入传递给bar
" ("正常"因为还有"错误"输出)。
只要第一个将输出写入foo
(又名"文件句柄1&#34),bar
或stdout
是什么并不重要。 ;),第二个可以从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} }}
所以我们有:
stdout
在tar
上收集数据并通过A
A
上的SSH服务器通过Unix套接字将输出发送到第一个A
命令ssh
(管道)命令选择它的所有stdout
。|
的输出传递给第二个。ssh
通过Unix套接字将数据发送到ssh
上的SSH服务器B
上的远程SSH服务器将数据传输到第二个B
命令tar
或者作为图形:
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以便解压缩文件。