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