![ssh `ClearAllForwardings=yes` 导致命令行上的 -L 被忽略](https://linux22.com/image/227122/ssh%20%60ClearAllForwardings%3Dyes%60%20%E5%AF%BC%E8%87%B4%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8A%E7%9A%84%20-L%20%E8%A2%AB%E5%BF%BD%E7%95%A5.png)
考虑以下命令(这是我正在编写的脚本的一部分):
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 foo
是foo
您现在需要的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
.