我必须 sftp 到中间服务器吗?

use*_*094 12 linux ssh unix bash sftp

我不能 sftp 直接进入特定主机。要将文件从我的家用机器移动到主机,我必须将文件通过 sftp 传输到中间主机;ssh 进入中间主机;和 sftp 文件到最终目的地。有没有可能避免这种疯狂?

小智 28

从您的本地机器,您可以创建通过中间主机到最终主机的 SSH 隧道:

ssh user@intermediate -L 2000:final:22 -N
Run Code Online (Sandbox Code Playgroud)

这将在您的本地主机上打开端口 2000,该端口将通过中间主机的隧道直接连接到端口 22 上的最终服务器。现在在另一个提示中,在端口 2000 上与 sftp 连接以通过隧道连接到最终服务器,注意此处指定的用户是针对最终主机的:

sftp -P 2000 user@localhost
Run Code Online (Sandbox Code Playgroud)

不过,这似乎属于superuser.comserverfault.com


Gor*_*son 17

由于我最初写了这个答案,OpenSSH 添加了一种更简单的方法来做到这一点。如果您的家用机器上至少有 OpenSSH 8.0,中间主机上至少有 7.3,则可以使用新的跳转主机 ( -J) 选项

sftp -J user@intermediatehost user@finalhost
Run Code Online (Sandbox Code Playgroud)

如果家庭和中间主机上至少有 7.3,你可以使用~/.ssh/config 文件中的ProxyJump选项做同样的事情:

Host finalhost
    ProxyJump user@intermediatehost
Run Code Online (Sandbox Code Playgroud)

使用该条目,您可以使用 sftp、scp 和 ssh 到 finalhost,它会自动调用隧道。唯一不透明的部分是它会提示输入两个密码(中间主机后跟最终主机),但如果您愿意,您也可以使用 SSH 密钥对来消除它。

如果您没有足够新的 OpenSSH 版本,您仍然可以使用该ProxyCommand选项来做基本相同的事情:

sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost
Run Code Online (Sandbox Code Playgroud)

(假设中间主机安装了 netcat /usr/bin/nc- 如果没有,您可能需要找到/安装一些将 stdin&stdout 网关连接到 TCP 会话的等效方法。)

和等效的 ~/.ssh/config 选项:

Host finalhost
    ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Wikibooks 上的 OpenSSH Cookbook


小智 0

我假设最终主机装有防火墙,我只能猜测您可以用来绕过它的方法。

例如 - 从本地计算机公开 ssh,然后 ssh 到第一台主机,然后 ssh 到第二台主机,并从最终主机 sftp 到您的计算机。