在 SSH 配置中使用 Bash 变量

Dan*_*rin 4 linux ssh bash shell

.bash_profile在 shell 初始化中设置了服务器的主机名。如何使用该变量作为 sshconfig文件的一部分,如下所示:

.bash_profile

...

MY_SERVER='xxx.xxx.xxx.xxx'

...
Run Code Online (Sandbox Code Playgroud)

~/.ssh/config

Host my-host
    User uname
    HostName <MY_SERVER var here>
    IdentityFile ~/.ssh/my-pem.pem
Run Code Online (Sandbox Code Playgroud)

我都试过了

HostName $MY_SERVER
Run Code Online (Sandbox Code Playgroud)

HostName ${MY_SERVER}
Run Code Online (Sandbox Code Playgroud)

但两者都会导致错误: ssh: Could not resolve hostname $MY_SERVER: nodename nor servname provided, or not known

有没有办法在不运行 shell 初始化脚本以将主机名注入配置文件的情况下执行此操作?

Tod*_*obs 6

TL; 博士

您不能直接执行此操作,因为 Bash 不会解析 SSH 配置文件。但是,您当然可以从 shell 的交互式登录资源文件(例如~/.bashrc)运行脚本或函数,该文件使用m4sed创建~/.ssh/config文件。


注意:保持理智。如果您动态修改~/.ssh/config,最好从~/.ssh/config.orig或类似文件创建一个副本,而不是就地修改配置文件。


在运行时创建别名或函数来为您执行此操作更容易(也更安全),而不是尝试动态修改配置文件。列出和调试别名也应该容易得多,但您的里程可能会有所不同。以下各节中的别名示例。

简单别名,每个主机一个

最简单的方法是为每个唯一的主机名创建简单的别名。例如:

# ~/.bashrc
alias foo='ssh foo.example.com'
alias bar='ssh bar.example.com'
Run Code Online (Sandbox Code Playgroud)

-o如果愿意,您也可以使用 ssh标志为每个别名添加自定义选项。ssh(1)手册页中列出了用法和可用标志选项。

带参数扩展的别名

更复杂的解决方案利用了 Bash 的:+ shell 参数扩展。如果已设置MY_SERVER变量,此方法将创建一个覆盖 HostName 选项的别名。例如:

alias ssh='ssh ${MY_SERVER:+-o HostName="$MY_SERVER"}'
Run Code Online (Sandbox Code Playgroud)

仅当设置了MY_SERVER时才会覆盖 SSH HostName 选项。例如,给定一个 Hostfoo和一个 HostName foo.example.com

$ MY_SERVER=foo.example.com
$ ssh foo
Run Code Online (Sandbox Code Playgroud)

将扩展到:

ssh -o 主机名=foo.example.com foo

只需使用\sshcommand ssh在必要时直接运行 SSH 而无需扩展别名。