我有一个大的服务器上的文件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
您需要-3
scp 选项:
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
,它将被转发两次并最终作为two
到localhost
端口的连接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 地址或名称。以上所有内容都将在主机上二顺便一提。