Answers:
假设使用OpenSSH,请在.ssh / config中添加到您的SSH配置中
Host distant
ProxyCommand ssh near nc distant 22
这将导致SSH能够通过通过名为near的计算机进行代理来“直接”连接至名为distant的计算机。然后,它可以使用诸如scp和sftp之类的应用程序到远程计算机。
为此,您需要在名为near的计算机上安装“ nc” aka netcat。但是许多现代系统已经拥有了它。
假设您已经记住了tar的语法和操作规则,则towo的tar解决方案对于单发问题更有效。
near
不同于on上的用户名distant
,则近端用户进入ProxyCommand ssh nearuser@near...
,而远端用户进入另一User distantuser
行。
在(B)机附近的服务器上使用ssh的较新版本时,以下情况将在没有netcat的情况下起作用:
Host distant
ProxyCommand ssh near -W distant:22
但是,这将要求在附近(B)的计算机上,AllowTcpForwarding为yes(默认设置)
编辑:在B上需要OpenSSH 5.4+
您可以使用类似的方法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大小写
即使您需要使用证书进行身份验证(通常在AWS环境中),这也是可能且相对容易的。
下面的命令会将文件从remotePath
上server2
直接复制到您的计算机上,位于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>
您也可以反向执行此操作,可能会更容易。
假设您已经打开了与要将文件发送到的机器的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
这样,您可以在它们之间具有任意数量的跃点,并且在链接两个以上跃点时更容易使用。
尝试使以下示例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
。
这不是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,您可以选择日期比较,文件夹同步等。希望对您有所帮助!