在工作中,我经常需要登录遵循通用命名方案的主机,例如qc01
- qc12
、hc01
-hc10
等。所有这些都需要在我的笔记本电脑的.ssh/config
.当然,我可以使用主机qc*
和的条目hc*
,但我想知道是否可以使用正则表达式?
答案1
作为盖尔伦声明的默认值ssh_config
不支持正则表达式,但您可以尝试不同的方法,例如:
- Github 上的高级 ssh-config- 据说有更好的正则表达式引擎,但你必须自己测试
- 一些解决方法:关于 unix.stackexchange 的另一个问题
答案2
您可以在您的ssh_config
.
IMO 相关文档很难阅读和理解。我之所以理解它,是因为我有 13 年以上的 Linux 经验,并且使用ssh
.这是我对文档的总结:
man ssh_config
描述了一个称为Match
- 然后有一个名为 的功能
exec
,让您可以使用任意 shell 命令来确定匹配项 - 将输入参数传递给任意 shell 命令是可能的,并在标记为的部分中进行了描述
TOKENS
就我而言,我最终在我的~/.ssh/config
:
Match exec "echo %h | grep -q 'NAME[0-9]\+$'"
User USER
IdentityFile /path/to/identity/file
Hostname %h.fully.qualified.domain.name
测试必须通过像这样棘手的事情来完成。要进行该测试,请致电ssh -vvv HOSTNAME
.这将准确显示正在发生的情况,以及您的新内容是否Match
正确实施。
答案3
请参阅PATTERNS
中的部分man ssh_config
。
长答案是:不,你不能,除非你修补你的ssh
以支持这一点。
答案4
扩展特雷弗的答案:
更复杂的主机也是可能的,例如匹配foo123.123
和foo10.10
在一条规则中没有具有所用主机名的 DNS 条目:
Match exec "echo %h | grep -q 'foo[0-9]\+.[0-9]\+$'"
Port 1234 # just to show it can be paired with non-default ports too,
# see %p in man ssh_config
ProxyCommand /usr/bin/nc 10.10.$(echo %h | sed -e 's/foo//') %p
使用 ProxyCommand 来操纵%h 的内容与 shell 并通过 netcat 连接到正确的端口。这样你就可以创建预设对于主机类别,无需创建单独的条目。