关键在于建立可读、可维护、不冲突的结构:主配置定通用策略,子配置按场景(如work/cloud/homelab)隔离;必须用绝对路径、chmod 600权限,且按顺序加载确保优先级。

用 Include 指令管理 OpenSSH 客户端配置,关键不是“拆文件”,而是建立可读、可维护、不冲突的结构——主配置定基调,子配置按用途隔离,路径和权限必须严格合规。
必须用绝对路径,不能偷懒写相对路径
OpenSSH 的 Include 不识别 config.d/*.conf 这类裸路径,也不会自动补全 ~/.ssh/。它只认完整、明确的绝对路径:
-
✅ 正确写法(推荐):
Include ~/.ssh/config.d/work.conf -
✅ 正确写法(跨平台兼容):
Include /home/you/.ssh/config.d/cloud.conf(Linux)、Include /Users/you/.ssh/config.d/homelab.conf(macOS)、Include C:/Users/you/.ssh/config.d/github.conf(Windows,正斜杠可用) -
❌ 错误写法:
Include config.d/*.conf(解析失败)、Include ./config.d/aliyun.conf(相对路径被忽略)、Include ${HOME}/.ssh/config.d/temp.conf(变量不展开)
按场景分组子配置,避免混杂
把不同用途的主机配置分开存放,既方便协作,也便于临时启用或禁用某类连接:
-
config.d/work.conf:公司跳板机、内网数据库、生产 API 服务器 -
config.d/cloud.conf:阿里云 ECS、腾讯云 CVM、AWS EC2 实例(按厂商或区域再细分也可) -
config.d/homelab.conf:树莓派、群晖 NAS、本地 K3s 节点 -
config.d/git.conf:仅用于 GitHub/GitLab 的专用密钥连接,IdentityFile ~/.ssh/keys/github_ed25519不影响其他 Host
每个子文件只包含相关 Host 块,彼此无依赖、无覆盖风险。
加载顺序决定行为优先级
Include 是从上到下顺序执行的,匹配逻辑遵循“先到先得”——第一个完全匹配的 Host 块生效,后续同名或更宽泛的块会被跳过:
- 在主
~/.ssh/config顶部写通用策略:Host *<br> IdentitiesOnly yes<br> ServerAliveInterval 60<br> ConnectTimeout 10
- 再按需引入具体配置:
Include ~/.ssh/config.d/work.conf<br>Include ~/.ssh/config.d/cloud.conf<br>Include ~/.ssh/config.d/discard/*.conf
(调试时快速开关) - 如果
work.conf和cloud.conf都定义了Host github.com,只有work.conf中的生效
权限不对,配置就静默失效
OpenSSH 对所有参与加载的文件都做安全校验:任意一个 Include 文件权限过宽(比如 644),就会被直接跳过,且不报错——这是最容易踩的坑:
- 主配置文件必须:
chmod 600 ~/.ssh/config - 每个子配置文件也必须:
chmod 600 ~/.ssh/config.d/*.conf -
~/.ssh目录权限应为700,否则整个目录可能被 SSH 忽略 - 验证是否生效?运行
ssh -F ~/.ssh/config -G target-host | grep identityfile,看输出是否含你预期的密钥路径

















