想象一下,我们有动态数量的模式主机
test-1.mydomain.com
test-2.mydomain.com
test-3.mydomain.com
...
test-n.mydomain.com
我想通过不使用全名在每台机器上进行 ssh
ex. ssh test-7.mydomain.com
但只是通过做
ssh test-7
有没有办法使用 ssh 配置来做类似这样的别名的模式?
想象一下,我们有动态数量的模式主机
test-1.mydomain.com
test-2.mydomain.com
test-3.mydomain.com
...
test-n.mydomain.com
我想通过不使用全名在每台机器上进行 ssh
ex. ssh test-7.mydomain.com
但只是通过做
ssh test-7
有没有办法使用 ssh 配置来做类似这样的别名的模式?
如果您可以选择,您可以在resolv.conf
文件中添加一个搜索域(我假设您使用的是 Linux)。
您需要添加这样的一行:
search mydomain.com
它将让 SSH(和大多数其他应用程序)查找test-n
, 然后test-n.mydomain.com
.
如果您不是resolv.conf
自己管理文件(例如,如果您使用 systemd-networkd 或 NetworkManager),则必须在其配置文件中调整搜索域)。
是的,有一种方法可以直接在您的 ssh 配置中执行此操作。
将此代码段添加到您的 ssh 配置中~/.ssh/config
:
# all test-* hosts should match to test-*.mydomain.example.com
host test-*
hostname %h.mydomain.example.com
-G
您可以使用ssh 的标志来验证这一点。如果您的 ssh 较旧且不支持-G
,您可以尝试解析详细的 ssh 输出。
# if your ssh supports -G
% ssh test-17 -G | grep hostname
hostname test-17.mydomain.example.com
# if your ssh does not support -G
% ssh -v -v test-n blarg >/dev/null 2>&1 | grep resolv
debug2: resolving "test-n.mydomain.example.com" port 22
ssh: Could not resolve hostname test-n.mydomain.example.com: Name or service not known
SSH 使用匹配的第一个主机行。最好在配置文件的底部添加 PATTERN 主机行。
如果您的test-n
名称模式仅包含单个字符后缀,那么您可以使用?
模式来进行不那么贪婪的匹配。 test-?
将匹配test-1
test-a
test-z
但不匹配test-10
您可以创建一个 ssh 配置文件并预先设置您的服务器。
看这个教程,希望对你有帮助!
您还可以在 bash 文件中创建一个用于 ssh 访问的函数。
像这样:
function ssh_test () {
[[ $1 =~ ^('test-1'|'test-2'|'test-3')$ ]] || { echo 'Not a valid value !!' && return ;}
domain=$1.mydomain.com
ssh my_user@"$domain"
}