我如何进行多跳SCP转移?


85

我想将文件从机器A复制到服务器C,但是只能通过服务器B访问服务器C。

登录而不是先传输到服务器B,然后再传输到服务器C,是否可以使用SCP或类似程序直接传输文件?

(Emacs流失模式具有此功能,可以远程编辑文件)。

Answers:


48

您可以添加代替的-o选项。scp.ssh/config

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host 在这种情况下是您的“服务器B”。


这是我这样做的首选方式。如果您从网关直接访问同一主机,则搞混.ssh / config进行多跳并不是最佳解决方案。
GabrieleV

不同/自定义用户名和端口的情况如何?
Pablo A

我尝试此操作,必须输入密码。我怎样才能解决这个问题。谢谢。
hqt

44

假设使用OpenSSH,请在.ssh / config中添加到您的SSH配置中

Host distant
ProxyCommand ssh near nc distant 22

这将导致SSH能够通过通过名为near的计算机进行代理来“直接”连接至名为distant的计算机。然后,它可以使用诸如scp和sftp之类的应用程序到远程计算机。

为此,您需要在名为near的计算机上安装“ nc” aka netcat。但是许多现代系统已经拥有了它。

假设您已经记住了tar的语法和操作规则,则towo的tar解决方案对于单发问题更有效。


这与我使用的方法相同...在此示例中,“ distant”将是服务器C,而“ near”将是服务器B以进行澄清...
Jeremy Bouse 09年

许多现代计算机没有'nc':通常仅对Linux计算机可用,并且只能通过请求获得(不属于标准安装)。
梅,

1
ssh现在具有-W选项,它可以自动执行此操作而无需'nc',但我想知道为什么没有scp -W
kubanczyk

3
如果我不是唯一的一个,这不是很明显:如果on上的用户名near不同于on上的用户名distant,则近端用户进入ProxyCommand ssh nearuser@near...,而远端用户进入另一User distantuser行。
Mu Mind

只需输入ssh multi hope并按Google即可,我感到很幸运
chandank

19

在(B)机附近的服务器上使用ssh的较新版本时,以下情况将在没有netcat的情况下起作用:

Host distant
    ProxyCommand ssh near -W distant:22

但是,这将要求在附近(B)的计算机上,AllowTcpForwarding为yes(默认设置)

编辑:在B上需要OpenSSH 5.4+


像魅力一样工作:)
gongzhitaao 2013年

1
至少从OpenSSH 7.4p1开始,有一个“ ProxyJump”命令,其中仅需列出每个用逗号分隔的user @ host:port。真好!
hmijail '17

ProxyJump很不错,但是它没有从配置文件中获取User和IdentityFile。ProxyCommand -W可以执行此操作,并且还可以与scp一起使用。
rickfoosusa

18

您可以使用类似的方法SSH到服务器B

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

然后您可以使用以下命令SSH到服务器C

ssh -p 5022 <user_serverC>@localhost 

同样的scp可以使用

scp -P 5022 foo.txt <user_serverc>@localhost:

记住要在scp和ssh中使用正确的p大小写


5

即使您需要使用证书进行身份验证(通常在AWS环境中),这也是可能且相对容易的。

下面的命令会将文件从remotePathserver2直接复制到您的计算机上,位于localPath。内部的scp请求通过代理server1

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

另一种方法也可行(上传文件):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

如果您改用密码验证,请尝试

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

如果在两个服务器中使用相同的用户凭据:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

3

如果您想成为真正的邪恶分子,可以将ssh和tar链接起来,例如tar c mydir | ssh server "ssh otherserver | tar x",但这会遇到很多问题。

更简单的方法是使用SSH的内置方法建立SSH隧道。查看手册页中的-D开关,然后将一些端口转发到另一台服务器的ssh端口。


2

您也可以反向执行此操作,可能会更容易。

假设您已经打开了与要将文件发送到的机器的ssh会话。这是跳得最远的PC,我们将其称为hop2。您的“代理”主机将是hop1。起源文件的PC,我们称其为起源。

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

您可以建立隧道,使本地端口在远程PC上可用。因此,我们正在定义要在远程PC上打开的端口,它将重定向到在构建隧道时随身携带的端口。

在跃点2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

现在,在打开的隧道会话中,您可以从hop1到file_origin执行相同的操作。

在跃点1:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

现在,您从hop2到hop1到原始隧道。巧合的是,现在端口5555和6666都在原始位置打开了,它们都重定向到hop2的端口22。在此会话中,以下两个都是到hop2的有效scp路由:

原产地:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

这样,您可以在它们之间具有任意数量的跃点,并且在链接两个以上跃点时更容易使用。


1

尝试使以下示例openssh config适用于可用于多个主机的设置:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

这假定了一组以“ uat-”开头的服务器,这些服务器只能通过跳转框/网关服务器“ bastion-uat”进行访问。ForwardAgent yes如果您使用密钥登录,则可能还需要添加。


不要ForwardAgent yes为此使用。在这种情况下,不需要代理转发,因为没有ssh客户端将在该堡垒上运行,并且在不需要代理时转发代理只是为了降低安全性。而且我认为ssh您的命令中缺少此内容。如果ssh您使用的是最新版本,则nc可以输入ssh -W %h:%p bastion-uat
kasperd 2014年

@kasperd编辑为包含ssh。重新转发代理;ssh客户端将运行以运行nc命令本身。也许您指的是外壳?
Benjamin Goodacre 2014年

1

这不是scp(OP请求),但是我发现使用以下rsync命令通过单跳从本地复制到远程非常简单:

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

来源:http//mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

我尝试了上面的-o ProxyPass建议,但不想更改配置以满足我不断变化的需求。正如作者在上面的链接中所述,冒号(:)之前的目标文件对于指示指定的路径在目标服务器上很重要。另外,使用rsync,您可以选择日期比较,文件夹同步等。希望对您有所帮助!


-2

scp -o'ProxyJump jumpboxname'somefilename.txt finaldestinationhost:/ tmp /。


3
不要在这里转储一些无法解释的代码。这个问题有很多不错的答案,您需要为现有的答案增加价值-事实并非如此。
斯文
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.