我必须通过 sftp 连接到中间服务器吗?

我必须通过 sftp 连接到中间服务器吗?

我无法直接通过 sftp 进入特定主机。要将文件从我的家用计算机移动到主机,我必须通过 sftp 将文件传输到中间主机;通过 ssh 进入中间主机;然后将文件通过 sftp 传输到最终目的地。是否有可能避免这种疯狂的情况?

答案1

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

ssh user@intermediate -L 2000:final:22 -N

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

sftp -P 2000 user@localhost

似乎这属于超级用户网或者服务器故障尽管。

答案2

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

sftp -J user@intermediatehost user@finalhost

如果你的主主机和中间主机上都有至少 7.3 版本,那么你可以对ProxyJump选项在你的 ~/.ssh/config 文件中:

Host finalhost
    ProxyJump user@intermediatehost

有了该条目,您可以使用 sftp、scp 和 ssh 连接到 finalhost,它会自动调用隧道。唯一不透明的部分是它会提示输入两个密码(intermediatehost 和 finalhost),但如果您愿意,也可以使用 SSH 密钥对来消除这一点。

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

sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost

(这是假设中间主机已经安装了 netcat——/usr/bin/nc如果没有,您可能必须找到/安装某种等效的方法将 stdin 和 stdout 网关到 TCP 会话中。)

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

Host finalhost
    ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null

Wikibooks 上的 OpenSSH Cookbook了解更多信息。

答案3

您可以将数据传送到您机器上运行的 ssh 进程,然后在中间机器上运行一个命令,该命令读取 stdin 并在适当的情况下将其发送到 sftp。

这可以在本地机器上用一行代码完成,不过引用 ssh 的参数需要小心。我现在正在使用手机,所以很遗憾无法输入详细信息。也许其他人可以完成这个答案作为练习!

答案4

假设 A 和 B 分别是第一和第二台主机。要复制的文件是 foo

除了 sftp,您还可以使用以下命令

cat foo | ssh “cat->foo”

现在,你可以将其中两个连接在一起

cat foo| ssh A "cat - | ssh B \"cat - > foo\" "

相关内容