ssh `ClearAllForwardings=yes` 导致命令行上的 -L 被忽略

ssh `ClearAllForwardings=yes` 导致命令行上的 -L 被忽略

考虑以下命令(这是我正在编写的脚本的一部分):

ssh -oClearAllForwardings=yes -NL 5555:localhost:5555 foo

我想要,ClearAllForwardings=yes因为我的 ssh 配置中可能有LocalForward选项,并且我不希望这些选项在此命令中发生(如果它们已经被转发到其他地方,并且它会警告正在使用的端口,这在运行此脚本时会令人困惑)。

但似乎ClearAllForwardings=yes导致 ssh 完全忽略全部转发,即使稍后在命令行中给出。

我不能告诉 ssh 完全忽略,~/.ssh/config因为它包含有关如何到达foo.

那么如何让 ssh 忽略LocalForward~/.ssh/config仍然允许在命令行上转发特定端口呢?

答案1

~/.ssh/config是您的私人文件,由您控制。利用这一事实并按如下方式排列文件:

Host foo bar
   Hostname …
   # common options here

Host foo
   # forwardings here

ssh foo将匹配两个部分。你的脚本应该ssh -L … bar;该命令将匹配具有常用选项的部分,但它将不会将该部分与转发相匹配。

注意你需要的Hostname。如果您之前的配置没有为 指定主机名foo,则隐式主机名曾经ssh foofoo您现在需要的Hostname foo(因此ssh bar连接到foo,而不是连接到bar)。


如果出于任何原因您不想编辑~/.ssh/config(例如您想要一个完全位于脚本“内部”的解决方案),请考虑以下事项:

您的脚本可以运行ssh -oClearAllForwardings=yes -fNMS … foo,然后它可以通过ssh调用与主进程通信来添加/删除端口转发ssh -S … -O …。看我的另一个答案以添加远程转发为例(-R);添加本地转发类似,您将需要像ssh -S … -O forward -L 5555:localhost:5555 placeholder.

相关内容