从一台远程服务器到另一台远程服务器的scp


15

我有一个大的服务器上的文件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地址?

解决-有点-还在寻找解释 -我已将bigfile拆分为较小的文件,并通过我的工作站逐一传输。我仍然想知道为什么它不起作用。因此,我仍然希望对什么地方有问题做一些解释。

找到了失败的原因:似乎我很愚蠢。我以为命令

scp one:file two:file

在每个服务器上创建两个连接,然后从一个服务器接收数据,然后立即将它们发送到两个服务器,因此就像一个中继。

这显然并非如此,因为一个简单-v的选择表明,它实际上只是连接到一个一个它会尝试连接到2。这显然是不可能的,因为不应将服务器连接到两个服务器。


您是否尝试过仅更改scp命令以使用IP地址,例如“ scp jspurny @ ip_address_server_one:/opt/bigfile.tar.gz jspurny @ ip_address_server_two:/opt/bigfile.tar.gz”。

@tchester:我现在做了,但是它给出了一个不同的错误(请参阅编辑后的问题)
Jan Spurny


@slm不,我没有尺寸问题。
2013年

当我找到错误的解释时,我想添加/接受它作为我自己的答案,但是对我来说似乎有点不公平,因为它实际上并不能解决问题。您认为我应该将问题改写为:如何使用工作站作为中继将文件从服务器复制到服务器吗?还是应该添加我对无法使用--verbose选项作为答案并接受它的解释?
2013年

Answers:


6

简单管

尝试这个:

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情况下尤其重要。


1
谢谢!这并不能完全满足我的需求,但是可以满足我的实际需求,这很棒。
2013年

16

此答案的全部功劳归于/superuser//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”将在主机“ one”上解析,该主机可能不存在。


不幸的是,这个选项似乎还很新,并且已经传播到所有发行版中。
whereswalden 2014年

2

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

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

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

谢谢,那肯定可以用,除了那些服务器都禁用了PasswordAuthentication,而且我不能将密钥从另一个添加到另一个-它们不应该能够相互连接。
2013年

0

搜索错误消息:“主机密钥验证失败。” 这似乎是这里最直接的事情。我在askubuntu上找到了标题为:“主机密钥验证失败...”错误的SSH连接问题的常见问题解答

问答的答案之一表明,该问题与~/.ssh/known_hosts文件中的条目冲突有关。您可以使用任何文本编辑器从该文件中删除麻烦的条目,也可以使用以下命令删除条目:

$ ssh-keygen -R hostname

hostname您尝试连接的服务器的IP地址或名称在哪里。上述所有将是对主机2的方式。


我不确定我是否理解。我可以从我的工作站ssh到服务器onetwo服务器,没有任何问题..从我的工作站运行时,问题开始scp one:file two:file了。而且有没有known_hosts文件,或者在一个2。我只是想在我的工作站上删除两个键(甚至可以确定一个键),但没有做任何更改(除了确定y / n propt以外)。
2013年

@JanSpurny-您对工作站的指称在这个问题上有些困惑,至少对我而言。当您说的是笔记本电脑/台式机时。因此,当您说它“有效”时,您正在执行以下操作:scp workstation:file one:fileworkstation:file two:file?显然,不必为了对话而直接说“ workstation:file”。
slm

好吧,我想是我从工作站上运行了所有命令。所以它更像是:workstation$ scp one:file fileworkstation$ scp file two:file。无论如何,我想我已经解决了。我将其添加为我自己的答案。
2013年

@JanSpurny-好的,很高兴您知道了。谢谢你的问题顺便说一句!
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.