如何在SSH配置文件中动态更改主机?

3

我正在尝试连接到一个GCP实例,每次重新启动时都会更改其公共IP。为了动态获取IP,我使用以下gcloud命令:

gcloud compute instances describe <vm-name> --zone europe-west --format='get(networkInterfaces[0].accessConfigs[0].natIP)'

然后我有这个ssh config文件:

Host MyHost
    ProxyCommand ~/.ssh/vm-connect

这指向一个名为vm-connect的脚本,其内容如下:

#!/bin/bash
get_host() {
    gcloud compute instances describe <vm-name> --zone europe-west1-b --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
}

ssh minikf@$(get_host)

如果我只运行脚本,它可以成功连接到虚拟机。但是,如果我运行 ssh MyHost,它会给我以下提示:

Pseudo-terminal will not be allocated because stdin is not a terminal.
-bash: line 1: SSH-2.0-OpenSSH_8.2p1: command not found
1个回答

5

我刚刚从另一个答案中解决了这个确切的问题。

这是链接:https://superuser.com/questions/1633430/ssh-config-with-dynamic-ip

相关部分:

ProxyCommand可以作为原始TCP连接的替代方案。它并不会取代整个SSH连接。

%p将替换ssh的端口,您可以添加IdentityFile和所有其他ssh_config文件选项。

以下是可能适用于您的内容,您可以在~/.ssh/config中添加这些行:

Host MyHost
    User minikf
    CheckHostIP no
    ProxyCommand bash -c "nc $(~/.ssh/vm-connect) %p"

然后,在位于~/.ssh/vm-connect的脚本中,只需从您的脚本中输出主机地址即可。

#!/bin/bash
get_host() {
    gcloud compute instances describe <vm-name> --zone europe-west1-b --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
}

echo get_host

我已添加了 CheckHostIP no,这样当IP地址与known_hosts中存储的地址不同时,ssh就不会抛出警告。这是可选的。

1
回显不正确。此外,不需要该函数 - 只需原始的gcloud命令即可。 请注意,在我的系统上,我需要提供gcloud二进制文件的路径。另外,“StrictHostKeyChecking no”有助于避免在每次重新启动GCP实例时出现密钥已更改的警告。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接