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

Dav*_*ave 20 ssh scp ssh-tunnel

我在 WinXP 上使用 Ccygwin(使用 bash shell)。我想将一个文件从我的本地主机 SCP 到远程机器——host2。但是,我只能通过 SSH 连接到中间机器——host1,然后从那里通过 SSH 连接到 host2。(注意,我无法从本地主机访问 host2)。

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

ssh -L 9999:localhost:9998 dalvarado@host1 'ssh -L 9998:localhost:1234 -N dalvarado@host2'
Run Code Online (Sandbox Code Playgroud)

但是在输入这个命令并按回车后,系统就挂了。设置隧道然后SCP文件的正确方法是什么?

谢谢, -

jme*_*etz 20

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

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

Host target.machine
User          targetuser
HostName      target.machine
ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

然后只要scp您想通过 proxy.machine 代理就可以随时访问 target.machine!

也适用于ssh,因此也可以节省您通过 ssh 连接到目标机器的时间。

应该归功于在 2011 年回答这个问题的 user24925。


小智 18

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

ssh -J you@node1 you@node2
Run Code Online (Sandbox Code Playgroud)

SCP 没有-J参数,但它确实允许-o,所以这是有效的:

scp -o ProxyJump=you@node1 file.txt you@node2:~
Run Code Online (Sandbox Code Playgroud)

  • 在 [OpenSSH 8.0](https://www.openssh.com/txt/release-8.0) 中,`-J` 被添加到 `scp` (和 `sftp`)中。 (3认同)

Rai*_*ain 14

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

ssh -L 9999:host2:22 user@host1
Run Code Online (Sandbox Code Playgroud)

此命令将连接到host1作为user和隧道端口9999的计算机发出的命令到端口22上host2-N是可选的,或者如果需要,您可以使用类似topwatch保持会话活动。

然后,只需scp到 localhost:9999 上的 host2。

  • 当你运行这个命令时,你将连接到host1,是的。不过,您的 `scp` 命令语法不正确。试试这个 `scp -P 9999 hello.txt user@localhost:/path/to/destination/file` 其中 `user` 是你想要登录的 `host2` 上的用户。 (3认同)

Fra*_*ran 3

您可以首先将文件 scp 到 host1,如下所示:

scp file dalvarado@host1:.
Run Code Online (Sandbox Code Playgroud)

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

ssh -t dalvarado@host1 'scp file dalvarado@host2:.'
Run Code Online (Sandbox Code Playgroud)

-t强制ssh它分配伪终端的选项,这可能会使 host1 更容易提示scp您输入密码。如果您在任何地方都运行并配置了 ssh-agent,则不应提示您输入密码。

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