Cursor生成,我负责校对。
错误现象
执行 ssh -G <Host> 或正常 SSH 连接时出现:
Bad permissions. Try removing permissions for user: UNKNOWN\UNKNOWN (S-1-5-21-906514677-3100084438-2507395604-3740986366) on file C:/Users/xxx/.ssh/config.
Bad owner or permissions on C:\Users\xxx/.ssh/config
原因分析
-
OpenSSH 的权限检查
Windows 版 OpenSSH 会校验~/.ssh/config的 ACL,要求该文件只能被当前用户(以及 SYSTEM、Administrators 等系统账户)访问。若存在其他用户或未知账户的权限,会直接报错。 -
“UNKNOWN\UNKNOWN” 与 SID
错误中的S-1-5-21-906514677-3100084438-2507395604-3740986366是一个安全标识符(SID)。当该 SID 对应的本地账户已被删除或来自另一台机器(例如从旧电脑迁移了用户配置),系统无法解析出用户名,就会显示为UNKNOWN\UNKNOWN。 -
典型来源
- 用户配置文件从旧机器迁移或复制
- 重装系统后沿用旧的
.ssh目录 - 域/本地账户变更导致旧 SID 残留在 ACL 中
只要该 SID 仍在
config的 ACL 里且具有读/写等权限,OpenSSH 就会认为“其他用户可访问”,从而拒绝使用该配置。
解决思路
从 ~/.ssh/config 的 ACL 中移除该未知/孤儿 SID 的访问项,只保留当前用户(及必要的系统账户),并保证当前用户至少对 config 有读权限。
解决步骤
1. 确认问题
查看当前 ACL 和错误信息:
# 查看 config 的 ACL
icacls "$env:USERPROFILE\.ssh\config"
# 触发错误(会提示具体 SID)
ssh -G CPU2
若输出中存在错误里提示的 SID(如 S-1-5-21-906514677-...)且对应 UNKNOWN,则按下面步骤处理。
2. 导出当前 ACL
在 PowerShell 中执行:
icacls "$env:USERPROFILE\.ssh\config" /save "$env:USERPROFILE\.ssh\config_acl.txt"
3. 编辑 ACL 文件,去掉问题 SID
config_acl.txt 为 UTF-16 编码,用脚本去掉对应 SID 的 ACE(将下面 S-1-5-21-... 换成你错误信息里的 SID):
$path = "$env:USERPROFILE\.ssh\config_acl.txt"
$text = [System.IO.File]::ReadAllText($path, [Text.Encoding]::Unicode)
$badSid = "(A;;0x1301ff;;;S-1-5-21-906514677-3100084438-2507395604-3740986366)" # 改为你的 SID
$text = $text.Replace($badSid, "")
[System.IO.File]::WriteAllText($path, $text, [Text.Encoding]::Unicode)
若不确定 SDDL 格式,可先打开 config_acl.txt,搜索该 SID 所在整段 (A;;...;;;S-1-5-21-...) 并整段删除后保存为 UTF-16。
4. 以管理员权限恢复 ACL
必须以管理员身份打开 PowerShell,然后执行:
Set-Location "$env:USERPROFILE\.ssh"
icacls . /restore "$env:USERPROFILE\.ssh\config_acl.txt"
/restore 会按 ACL 文件中的条目重新应用权限,因此需提升权限。
5. 验证
# 再次查看 ACL,确认问题 SID 已消失
icacls "$env:USERPROFILE\.ssh\config"
# 应能正常输出配置,不再报错
ssh -G CPU2
正常时,config 上应只剩例如 NT AUTHORITY\SYSTEM、BUILTIN\Administrators 和你的用户名(如 DESKTOP-xxx\你的用户名),且你的用户至少有读权限。
可选:若本机有管理员权限且熟悉 icacls
也可在管理员 PowerShell 中直接尝试移除该 SID(将 S-1-5-21-... 换成实际 SID):
icacls "$env:USERPROFILE\.ssh\config" /remove "S-1-5-21-906514677-3100084438-2507395604-3740986366"
若提示“无法解析/找不到主体”,说明系统已不认识该账户,此时用上面的“导出 → 编辑 → 恢复”方式更可靠。
小结
| 项目 | 说明 |
|---|---|
| 现象 | Bad owner or permissions on .../.ssh/config,并提示 UNKNOWN\UNKNOWN 及一长串 SID |
| 原因 | config 的 ACL 中存在已失效/跨机器的 SID,OpenSSH 认为存在“其他用户”权限 |
| 本质 | 清理该 SID 在 ~/.ssh/config 上的访问项,只保留当前用户和系统必要账户 |
| 要点 | 修改 ACL 需管理员权限;编辑导出文件时注意 UTF-16 与 SDDL 格式 |
按上述步骤操作后,SSH 会正常读取 ~/.ssh/config,ssh -G 与日常连接即可恢复使用。
