如何使用多跳 SSH 远程写入文件

如何使用多跳 SSH 远程写入文件

类似这样的问题如何使用 SSH 远程写入文件是关于直接 SSH。

但是我到达了反向隧道的末端,该隧道以中间服务器为终点。也就是说,我通过另一台机器 ssh 到一台机器。我想写入远程机器上的文件。以下操作失败;它最终写入中间服务器!

ssh -A -t  intermediateserver ssh -A -t -p 666 localhost  "echo 30 > tmp"

事实上,其中有一个反向 ssh 隧道可能不会使事情变得更加复杂,所以更一般地说,我坐在家庭服务器上,通过中间服务器到达远程服务器。

(在我的例子中,由于预先存在的反向隧道,远程服务器在其端口 666 上内部出现在中间服务器中)。

答案1

对于每一跳,您都需要一层引用。本质上,ssh server some command foo bar最终$SHELL使用参数-c 和运行some command foo bar,因此:

  1. 第一层引号被你运行 ssh 命令的本地 shell 剥离,并且
  2. 每次后续跳跃都会调用一个 shell,以剥离另一层引用。

这反过来意味着 shell 操作(比如变量扩展、重定向、通配符扩展)都需要额外的引用,以防止中间 shell 对它们进行操作。

例如,如果我的主目录中有文件foo-a和:foo-?

$ touch foo-a foo-\?
$ echo foo-*
foo-? foo-a
$ ssh Server1 echo foo-*
foo-? foo-a foo-a # foo-* expanded locally to foo-? foo-a, foo-? expanded again remotely
$ ssh Server1 'echo foo-*'
foo-? foo-a       # foo-* expanded remotely to foo-? foo-a
$ ssh Server2 ssh Server1 'echo foo-*'
foo-? foo-a foo-a # foo-* expanded remotely to foo-? foo-a, foo-? expanded again remotely in the next hop
$ ssh Server2 "ssh Server1 'echo foo-*'"
foo-? foo-a       # foo-* expanded in the last hop

ProxyCommand如果你使用或会更简单ProxyHost。这将在两个系统之间建立隧道,而不是创建执行命令的 shell 的 baklava:

~ ssh -o ProxyCommand='ssh Server2 nc %h %p' Server1 'echo foo-*'
foo-? foo-a

~ ssh -J Server2 Server1 'echo foo-*'
foo-? foo-a

相关内容