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

ws_*_*421 3 ssh

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

我试图sshProxyCommand不转发到第二跳的情况下调用内部。现在,我的.ssh/config文件中有:

Host test
    ProxyCommand ssh user@address
Run Code Online (Sandbox Code Playgroud)

当我这样做时ssh test,它似乎连接正常,但连接后有一个不响应输入的空白​​提示,所以似乎 stdin/stdout 不能正确定向。

相关问题:

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

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

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

Gil*_*il' 5

由于您没有将命令传递给ssh,它会运行一个外壳程序,该外壳程序在其标准输入上接收命令。但是您不是向它传递 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
Run Code Online (Sandbox Code Playgroud)

代理是另一种选择。要连接到在连接时确定的主机名和端口,您可以使用netcat来设置 TCP 连接。

Host foo
ProxyCommand nc $(determine-target-host-name) 22
Run Code Online (Sandbox Code Playgroud)

如果您想要一个完全动态的.ssh/config,您可以将其设为命名管道并确保进程始终写入其中。或者把它放在scriptfs 上