简单的管道

简单的管道

我有一个大的服务器上的文件one,我想two使用scp.我已正确设置密钥,并且可以从桌面通过 ssh/scp 连接到两台服务器。

我需要复制的文件比我的工作站硬盘上的可用空间大,所以我想做:

scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

但我得到了:

ssh: Could not resolve hostname one: Name or service not known

我们这里没有 DNS(不要问我为什么),所以我的 ~/.ssh/config 中有这个:

Host one
    Hostname        <IP address of server one>
    User            jspurny

Host two
    Hostname        <IP address of server two>
    User            jspurny

如果我尝试使用较小的文件并将其从 传输one到我的工作站,然后再传输到two,它可以正常工作:

scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/

当按照评论中的建议直接使用 IP 地址时,我得到:

$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection

没什么大不了:

大小在这里不是问题 - 它只是这个问题的“触发因素”,因为无法bigfile.tar.gz在我的工作站上存储。无论文件大小如何,都会出现此问题。

问题:

为什么命令:

scp oneremote:file secondremote:file

无论使用.ssh/config别名还是直接使用 IP 地址都会引发错误?

已解决 - 有点 - 仍在寻找解释- 我已将大文件分割成较小的文件,并通过我的工作站将它们一一传输。我仍然想知道为什么它不起作用。所以我仍然希望对问题进行一些解释..

找到了失败的原因:看来我是犯傻了。我想法该命令

scp one:file two:file

正在创建到每个服务器的两个连接,然后从并立即将它们发送至从而起到继电器的作用。

显然情况并非如此,因为一个简单的-v选项表明它实际上只是连接到和来自它尝试连接到。这显然是不可能的,因为服务器不应该连接到

答案1

这个答案的全部功劳在于https://superuser.com/a/602436/142948

您需要-3scp 选项:

scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

-3:两个远程主机之间的副本是通过本地主机传输的。如果没有此选项,数据将直接在两个远程主机之间复制。

http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

否则第二个别名“two”正在被解析在主机“一”上,这可能不存在。

答案2

简单的管道

尝试这个:

ssh one 'cat file' | ssh two 'cat > file'

第一个应该将文件内容发送到您的计算机,而第二个应该将其发送到第二台计算机。我会在传输后计算两端的校验和,以确保传输过程中没有丢失或乱码。

精心设计的隧道

对于更复杂的应用程序,您可以使用 ssh 隧道。例如,您可以尝试这样的事情:

ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two

one然后您可以打开到机器localhost端口的连接5001,它将被转发两次并最终作为twolocalhost端口的连接22。这是 ssh 端口,因此您可以将其用于另一个 scp、rsync 或其他。您还可以rsync在 上启动服务器two,并转发端口 873 而不是 22。或者您可以nc在两侧使用任意端口号来传输原始数据。

上述方法的主要好处是两台机器之间有双向 TCP 连接,而不是单向管道。这样,双方就可以交换信息,这在rsync本案中尤为重要。

答案3

既然您拥有源服务器的用户访问权限(一),为什么不直接登录并在该服务器上运行您的 scp 命令...如果您担心这会花费太长时间,请在 a 中启动该命令,然后使用和screen与屏幕分离Ctrl+a d让它运行。

但是,如果您必须从您的工作站执行此操作,并且从源服务器到目标服务器的 SSH 密钥工作正常,然后将命令scp作为命令的参数发送ssh,例如:

ssh user@source 'scp /path/to/file user@destination:/path/to/file'

答案4

搜索错误消息:“主机密钥验证失败。”似乎是这里最简单的事情。我在 askubuntu 上发现了这个问答,标题为:SSH 连接问题并出现“主机密钥验证失败...”错误

中的一个答案该问答表明问题出在~/.ssh/known_hosts文件中的冲突条目上。您可以使用任何文本编辑器从该文件中删除有问题的条目,也可以使用此命令删除条目:

$ ssh-keygen -R hostname

其中hostname可能是您​​尝试连接的服务器的 IP 地址或名称。以上所有内容都将在主机上顺便一提。

相关内容