![如何使用多跳 SSH 远程写入文件](https://linux22.com/image/1574011/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%A4%9A%E8%B7%B3%20SSH%20%E8%BF%9C%E7%A8%8B%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6.png)
类似这样的问题如何使用 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
,因此:
- 第一层引号被你运行 ssh 命令的本地 shell 剥离,并且
- 每次后续跳跃都会调用一个 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