我在服务器上有一个大文件one,我想two使用scp. 我的密钥设置正确,我可以从我的桌面 ssh/scp 到两台服务器。
我需要复制的文件比我工作站硬盘上的可用空间大,所以我想做:
scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz
Run Code Online (Sandbox Code Playgroud)
但我得到了:
ssh: Could not resolve hostname one: Name or service not known
Run Code Online (Sandbox Code Playgroud)
我们这里没有 DNS(不要问我为什么),所以我在 ~/.ssh/config 中有这个:
Host one
Hostname <IP address of server one>
User jspurny
Host two
Hostname <IP address of server two>
User jspurny
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用较小的文件并将其从one我的工作站传输到two,则它工作正常:
scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/
Run Code Online (Sandbox Code Playgroud)
当按照评论中的建议直接使用 IP 地址时,我得到:
$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection
Run Code Online (Sandbox Code Playgroud)
这不是问题:
大小在这里不是问题 - 它只是这个问题的“触发器”,因为无法bigfile.tar.gz在我的工作站上存储。无论文件大小如何,都会出现此问题。
题:
为什么命令:
scp oneremote:file secondremote:file
Run Code Online (Sandbox Code Playgroud)
无论是使用.ssh/config别名还是直接使用 IP 地址都会引发错误?
解决了 - 有点 - 仍在寻找解释- 我已将大文件拆分为较小的文件,并通过我的工作站一个一个地传输它们。我仍然想知道为什么它不起作用。所以我仍然会感谢对错误的一些解释..
找到失败的原因:看来我是愚蠢的。我以为命令
scp one:file two:file
Run Code Online (Sandbox Code Playgroud)
正在为每个服务器创建两个连接,然后从一个服务器接收数据并立即将它们发送到两个服务器,从而起到中继作用。
显然情况并非如此,因为一个简单的-v选项表明它实际上只是连接到一个,并且试图从一个连接到两个。这显然是不可能的,因为 server one不应该连接到two。
art*_*bot 25
此答案的全部功劳转到https://superuser.com/a/602436/142948
您需要-3scp 选项:
scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz
Run Code Online (Sandbox Code Playgroud)
-3: 两个远程主机之间的副本通过本地主机传输。如果没有此选项,数据将直接在两个远程主机之间复制。
http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1
否则,第二个别名 "two" 正在主机 "one"上解析,这可能不存在。
尝试这个:
ssh one 'cat file' | ssh two 'cat > file'
Run Code Online (Sandbox Code Playgroud)
第一个应该将文件内容发送到您的机器,而第二个应该将其发送到第二台机器。我会在传输后计算两端的校验和,以确保在传输过程中没有任何丢失或乱码。
对于更复杂的应用程序,您可以使用 ssh 隧道。例如,你可以尝试这样的事情:
ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two
Run Code Online (Sandbox Code Playgroud)
然后您可以打开one到机器localhost端口的连接,5001它将被转发两次并最终作为two到localhost端口的连接22。这是 ssh 端口,因此您可以将其用于另一个 scp,或用于 rsync,或其他任何内容。您还可以rsync在 上启动服务器two,并转发端口 873 而不是 22。或者您可以使用nc任意端口号在两端传输原始数据。
上述方法之间的主要好处是你在两台机器之间有一个双向的 tcp 连接,而不是只有一个单向的管道。这样,双方就可以交换信息,这在rsync本案中尤为重要。
| 归档时间: |
|
| 查看次数: |
23093 次 |
| 最近记录: |