在运行时确定 SSH 连接的目标

在运行时确定 SSH 连接的目标

我想通过生成要连接的地址的函数调用来确定 SSH 连接的目标地址。ProxyCommand我可以在网上找到的所有示例都使用该-W标志跳转到第二台机器。我在第二台机器上尝试过localhost,效果很好,但需要 SSH 身份验证两次,这是我不喜欢的。

我试图在不转发到第二跳的情况下拨打ssh内部电话。ProxyCommand现在,我的.ssh/config文件中有:

Host test
    ProxyCommand ssh user@address

当我这样做时ssh test,似乎连接正常,但连接后出现空白提示,不响应输入,因此似乎 stdin/stdout 不能正确定向。

相关问题:

将动态获取的主机名与 ssh 配置条目结合使用

如何从 SSH 配置文件中的可执行脚本获取主机名?

在 ~/.ssh/config 中动态生成 SSH 主机条目

答案1

由于您没有将命令传递给ssh,因此它会运行一个 shell,该 shell 需要在其标准输入上输入命令。但您传递的不是 shell 命令,而是 SSH 流量。欢闹随之而来。

隧道是ProxyCommand.此示例在 SSH 连接内建立 SSH 连接隧道。如果您不想隧道,ProxyCommand那不是您要找的。

从 OpenSSH 6.4 开始,您可以使用Match带有exec关键字的指令来根据运行时指令有条件地包含块。一个典型的用例是根据您的笔记本电脑所在的位置具有不同的实际主机名或代理命令。每个Match块都会替换一个Host块,并且您无法使用命令的输出来确定主机名,只能使用它以状态 0 退出的事实。

# Connection inside ACME network
Match host foo exec on-acme-network
HostName foo.acme.local

# Connection from outside ACME
Host foo
HostName foo.example.com

代理是另一种选择。要建立到连接时确定的主机名和端口的连接,您可以使用网猫建立 TCP 连接。

Host foo
ProxyCommand nc $(determine-target-host-name) 22

如果您想要一个完全动态的.ssh/config,您可以将其设为命名管道并确保进程始终向其写入。或者穿上它脚本文件系统

相关内容