it-swarm.cn

我如何进行多跳SCP转移?

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

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

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

87
sverrejoh

您可以将-o选项添加到scp而不是.ssh/config

scp -o ProxyCommand="ssh $jump_Host nc $Host 22" $local_path $Host:$destination_path

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

48
John Tantalo

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

Host distant
ProxyCommand ssh near nc distant 22

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

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

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

44
tialaramex

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

Host distant
    ProxyCommand ssh near -W distant:22

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

编辑:在B上需要OpenSSH 5.4+

19
danblack

您可以使用类似的方法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大小写

18
Saurabh Barjatiya

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

下面的命令将从server2上的remotePath复制文件到localPath的计算机中。内部的scp请求通过server1代理。

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

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

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" <localpath> [email protected]:/<remotePath>

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

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

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

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>
5
donhector

如果您想变得真正邪恶,可以将ssh和tar链接起来,例如tar c mydir | ssh server "ssh otherserver | tar x",但这会遇到所有问题。

更简单的方法是使用SSH的内置方法建立SSH隧道。看着那(这 -D切换联机帮助页,然后将某些端口转发到另一台服务器的ssh端口。

3
towo

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

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

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都在Origin上打开了,它们都重定向到hop2的端口22。在此会话中,以下两个都是到hop2的有效scp路由:

原点:

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

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

2
SYANiDE

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

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

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

1
Benjamin Goodacre

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

rsync -v -e 'ssh -A -t [email protected] ssh -A -t [email protected]' /path/to/sourcefile :/path/to/destination

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

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

1
texas-bronius