我如何通过中间服务器SCP文件?


15

我在WinXP(带有bash shell)上使用Ccygwin。我想将文件从本地主机SCP传输到远程计算机host2。但是,我只能SSH到中间计算机host1,然后再从那里SSH到host2。(请注意,我无法从本地主机访问host2)。

我以为隧道是我的答案,但是当我尝试建立隧道时

ssh -L 9999:localhost:9998 dalvarado@host1 'ssh -L 9998:localhost:1234 -N dalvarado@host2'

但是在键入此命令并按Enter键后,系统只是挂起。什么是建立隧道然后再向SCP归档的正确方法?

谢谢, -


2
superuser.com/questions/174160/…的副本-请参阅下面的摘要。
2012年


Answers:


17

这已经在这里得到了最好的回答。

总结:将以下内容放入 ~/.ssh/config

Host target.machine
User          targetuser
HostName      target.machine
ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

然后只要scp您想通过proxy.machine进行代理,就可以简单地定位到target.machine!

也适用于ssh,因此也将节省您到目标计算机的时间。

应归功于在2011年回答此问题的user24925。


13

要设置SSH隧道,请使用以下格式:

ssh -L 9999:host2:22 user@host1

此命令连接到host1as user并在向该端口上的端口22发出命令的计算机上建立9999端口host2-N是可选的,或者如果需要,您可以使用类似top或的方式watch来保持会话的活动状态。

然后,只需scp在localhost:9999上访问host2。


1
当我运行此命令时,我是否应该最终登录到host1?另外,运行此命令后,我打开了另一个bash shell,并运行“ scp hello.txt localhost:9999”,但收到“ ssh:连接到主机localhost端口22:连接被拒绝”错误。我在这里做错了什么?
戴夫

3
运行此命令时,您将连接到host1,是的。但是,您的scp命令语法不正确。尝试此操作,您要登录的用户在scp -P 9999 hello.txt user@localhost:/path/to/destination/file哪里。userhost2

1
@Rain,您可以将此示例放在主要答案中;)
dmeu

5

以来 OpenSSH 7.3开始,您可以使用-J-o ProxyJump指定堡垒/跳跃主机。因此,要以SSH node2通过node1

ssh -J you@node1 you@node2

SCP没有 -J论点,但确实允许-o,所以这可行:

scp -o ProxyJump=you@node1 file.txt you@node2:~

3

您可以先将文件压缩到host1,如下所示:

scp file dalvarado@host1:.

然后执行以下操作将其发送到host2:

ssh -t dalvarado@host1 'scp file dalvarado@host2:.'

强制其分配伪终端的-t选项ssh,这可能使scphost1上更容易提示您输入密码/密码。如果您到处都在运行和配置了ssh-agent,则不会提示您输入密码/密码。

我提供了这种替代方法,因为如果您使用隧道,则仍然需要两个命令:一个用于设置隧道,另一个用于通过它复制文件。这似乎更简单。


很棒的解决方案!!!
Riccardo
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.