遇到这类问题,通常不是密钥算法有问题,也不是权限设置有问题,而是你在处理一个被忽略的“环境编码”问题。我也是在一台 Windows 机器上折腾 SSH Keygen 时才发现,问题根源是 Git、Windows 和 SSH 三方对中文路径的认知完全不在一个频道上。账户目录叫 C:\Users\张伟,命令行里显示得很正常,但执行 ssh-keygen -t ed25519 就是会在创建 .ssh 目录时报错。如果你也恰好在中文用户名下生成密钥,并且卡在路径创建上,这篇文章能帮你把来龙去脉和解决办法一次理清。
1. 从一条报错开始:症状、误判与真正的定位线索
1.1 报错现场和直观猜测
先说现象。我在 Git Bash 里执行的是这条命令:
bash复制ssh-keygen -t ed25519 -C "dev@example.com"
正常情况下,它会提示你输入保存路径,回车即可使用默认位置。但在我这台系统用户名是中文的机器上,敲完回车后出现了下面这种输出:
code复制Generating public/private ed25519 key pair.
Enter file in which to save the key (/c/Users/张伟/.ssh/id_ed25519):
Could not create directory '/c/Users/张伟/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/张伟/.ssh/id_ed25519
注意,日志里有两处很矛盾:前面说 Could not create directory,但后面又说密钥文件“已经保存”。这是因为 ssh-keygen 在尝试创建 .ssh 目录失败后,并没有直接退出,而是继续尝试写入文件,最后可能写到了错误的位置,或者在某些更严格的版本里直接返回 Saving key failed: No such file or directory。
如果你和我一样看到 Could not create directory,第一反应大概率是怀疑目录权限、杀毒软件拦截或者 Git 安装的问题。于是我开始检查 C:\Users\张伟 的权限,看是不是当前用户没有写权限,又去关闭了实时防护软件,甚至重装了一次 Git for Windows,问题依旧。
1.2 第一轮排查:我最初的错误方向
我一开始做了一套“标准操作”:
- 检查
C:\Users\张伟是否可写,确认当前用户拥有完全控制权限。 - 手动创建
.ssh文件夹,排除目录不存在的问题。 - 在 Windows 凭据管理器里翻了一遍,确认没有缓存导致的问题。
- 重新以管理员身份运行 Git Bash,结果仍然一样。
这套操作基本是在瞎忙。因为报错的关键并不是 Windows 权限,而是 Git Bash 环境里 ssh-keygen 拿到的默认路径本身就有问题。
真正让我把头绪理清楚的是下面这一步。
1.3 把问题剥离到最小命令
我先在 Git Bash 里确认当前用户主目录:
bash复制echo $HOME
输出是:
code复制/c/Users/张伟
看起来正常,终端能正常显示中文。于是我又试着手动创建目录:
bash复制mkdir -p "$HOME/.ssh"
echo $?
mkdir 返回 0,也就是说这个命令成功了。那为什么 ssh-keygen 创建目录会失败?到这里,直觉告诉我,问题很可能不在目录权限上,而在 ssh-keygen 这个程序自己处理路径的方式上。
为了验证,我换了一个纯英文路径去生成密钥:
bash复制mkdir -p /c/Users/testssh
ssh-keygen -t ed25519 -C "dev@example.com" -f /c/Users/testssh/testkey
结果一次成功,没有任何报错。
到这里基本可以锁定:只要路径里没有中文,ssh-keygen 就会正常工作;一旦路径中含有中文,它就会在创建目录这个环节失败。接下来要搞清楚的问题只有一个——为什么中文路径对 ssh-keygen 这么不友好。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么偏偏是中文目录在捣乱:Git、Windows 与 SSH 的路径认知差异
2.1 中文用户名是怎么进入路径的
如果你在安装 Windows 或创建本地账户时直接使用了中文用户名,系统会把这个名字直接用作用户主目录名的一部分,常见结果就是:
code复制C:\Users\张伟
C:\Users\李雷
C:\Users\王芳
有些微软账户即使显示名称是中文,实际生成的用户目录可能是拼音或邮箱前缀,比如 C:\Users\zhangsan,那就没有问题。但只要你的用户目录中出现了非 ASCII 字符,Git 相关工具就有概率踩坑。
从设计上看,NTFS 文件系统本身对文件名使用 UTF-16 编码,中文路径对它而言没有任何障碍。你会在资源管理器里自由查看和访问这些目录,Windows 自带的应用也基本没问题。问题往往出现在那些从 Unix/Linux 世界“移植”过来的工具链上,Git Bash 恰好
