答案是直接修改~/.ssh/config即可生效,需确保文件存在、权限为600、格式正确:host顶格写,参数缩进,避免下划线或点号开头;hostname为真实地址,host为本地别名;通配符host *勿置首行;ssh alias必须严格使用别名,不可带@或端口参数。

直接改 ~/.ssh/config 就行,别碰 /etc/ssh/ssh_config —— 后者是系统级配置,普通用户没权限改,改了也只对 root 生效,还容易被包管理器覆盖。
怎么写 ~/.ssh/config 才生效
文件必须存在、权限得对、格式不能错,三者缺一不可:
-
~/.ssh/config文件不存在就手动创建,用touch ~/.ssh/config或nano ~/.ssh/config - 权限必须是
600(即-rw-------),否则 OpenSSH 会直接忽略它:chmod 600 ~/.ssh/config - 每组配置之间空一行;
Host行必须顶格写,后面不能有空格或注释;HostName、User等参数必须缩进(空格或 tab 都行,但别混用) - 别名里不能含下划线
_或点号.开头,推荐只用小写字母、数字、短横线-
示例(可直接复制粘贴):
Host prod
HostName 192.168.10.5
User deploy
Port 2222
IdentityFile ~/.ssh/id_rsa_prod
Host 和 HostName 容易搞混的点
Host 是你本地敲的命令里的名字,HostName 才是真实要连的地址(IP 或域名)—— 这俩完全独立,可以一样也可以完全不同:
- 想用
ssh mydb连数据库服务器?Host mydb写在前面,HostName db.internal.company写在下面 -
Host *是通配规则,匹配所有未显式定义的主机,常用来设默认User或IdentityFile,但别放最前,否则会覆盖后续具体配置 - 如果
HostName写错了(比如拼错域名、IP 不可达),ssh报错是ssh: Could not resolve hostname xxx,不是认证失败
为什么 ssh alias 没反应或报 Permission denied
常见原因不是配置写错了,而是连接时根本没走你的 config 文件:
- 命令里写了
@或:,比如ssh user@alias或ssh alias -p 22,OpenSSH 会跳过 config 解析,直接当原始地址处理 - 用了完整地址如
ssh alias.example.com,哪怕 config 里写了Host alias,也不会匹配 —— 必须严格用ssh alias -
IdentityFile路径不存在,或私钥权限不是600,会卡在认证环节,报Permission denied (publickey) - 配置里漏了
User,又没在命令里指定,OpenSSH 会用当前登录用户名,而非远程服务器期望的账户
要不要配全局别名(/etc/ssh/ssh_config)
一般不用。这个文件是系统级的,修改需要 sudo,且所有用户共享同一份配置,容易冲突。更麻烦的是:很多发行版(比如 Ubuntu 的 openssh-client 包)会在升级时自动覆盖 /etc/ssh/ssh_config,你加的 Host 段落会被清掉。
真有跨用户需求(比如 CI 机器上多个服务账号都要连同一套测试环境),不如用脚本生成用户级 ~/.ssh/config 并统一部署,可控性高得多。
真正容易被忽略的细节是:SSH 配置是「自上而下匹配,首次命中即停」。如果你写了两个 Host prod 块,只有第一个生效;通配符 Host * 放太靠前,后面的具体主机配置就全废了。











