macOS+Fish环境下如何迁移SSH密钥文件并移除~/.ssh目录?
问题背景
我想清理根目录里的零散点文件,把SSH的所有配置都迁移到$XDG_CONFIG_HOME/ssh目录,但遇到了known_hosts不被识别的问题。已经完成了密钥生成:
mkdir -p $XDG_CONFIG_HOME/ssh ssh-keygen -t ed25519 -C "my@email.com" -f $XDG_CONFIG_HOME/ssh/id_ed25519
尝试在Fish Shell里设置全局环境变量指定SSH配置文件路径,但没生效:
set -Ux SSH_CONFIG ~/.config/ssh/config
当前$XDG_CONFIG_HOME/ssh的目录结构:
config id_ed25519 id_ed25519.pub known_hosts # SSH依然默认去~/.ssh/目录查找这个文件
我的$XDG_CONFIG_HOME/ssh/config内容如下:
GlobalKnownHostsFile $XDG_CONFIG_HOME/ssh/known_hosts Host github.com AddKeysToAgent yes UseKeychain yes IdentityFile $XDG_CONFIG_HOME/ssh/id_ed25519
目前只有在~/.ssh/config里添加一行配置才能让known_hosts生效,但这样就失去了迁移的意义:
UserKnownHostsFile $XDG_CONFIG_HOME/ssh/known_hosts
想问:是不是遗漏了什么配置?怎么彻底解决这个问题?有没有更好的根目录整理方式?
解决方法
1. 先确认SSH版本的XDG支持
SSH 8.2及以上版本才原生支持XDG规范,先检查你的SSH版本:
ssh -V
如果版本低于8.2,要么升级SSH,要么用下面的兼容方案。
2. 补充设置SSH_KNOWN_HOSTS环境变量
你之前只设置了SSH_CONFIG,但SSH默认的用户级known_hosts路径还需要通过SSH_KNOWN_HOSTS指定。在Fish Shell里执行:
set -Ux SSH_CONFIG $HOME/.config/ssh/config set -Ux SSH_KNOWN_HOSTS $HOME/.config/ssh/known_hosts
设置完成后重启Shell,确保环境变量生效。
3. 修正config文件的配置项
在$XDG_CONFIG_HOME/ssh/config里,把GlobalKnownHostsFile换成UserKnownHostsFile(前者是系统级配置,后者才是用户自己的known_hosts),同时尽量用绝对路径避免变量解析问题:
UserKnownHostsFile ~/.config/ssh/known_hosts Host github.com AddKeysToAgent yes UseKeychain yes IdentityFile ~/.config/ssh/id_ed25519
4. 验证配置是否生效
执行以下命令查看SSH的调试输出,确认配置文件和known_hosts的路径正确:
ssh -v github.com
在输出里找类似这样的行,确保路径指向~/.config/ssh:
debug1: Reading configuration data /home/xxx/.config/ssh/config
debug1: UserKnownHostsFile /home/xxx/.config/ssh/known_hosts
5. 彻底移除~/.ssh目录
确认所有配置都正常工作后,先备份原~/.ssh目录以防万一,再删除:
mv ~/.ssh ~/.ssh.bak rm -rf ~/.ssh
其他根目录整理技巧
- 对于不支持XDG规范的工具,可以用软链接把根目录的点文件指向
~/.config下的对应文件/目录,比如:ln -s ~/.config/gitconfig ~/.gitconfig - 用
stow工具管理配置文件:把所有工具的配置集中放在一个Git仓库里,通过stow自动创建软链接到对应位置,适合批量整理根目录的配置文件。
内容的提问来源于stack exchange,提问作者Lanny

