Windows 下 SSH config 权限错误:原因与解决方案

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

原因分析

  1. OpenSSH 的权限检查
    Windows 版 OpenSSH 会校验 ~/.ssh/config 的 ACL,要求该文件只能被当前用户(以及 SYSTEM、Administrators 等系统账户)访问。若存在其他用户或未知账户的权限,会直接报错。

  2. “UNKNOWN\UNKNOWN” 与 SID
    错误中的 S-1-5-21-906514677-3100084438-2507395604-3740986366 是一个安全标识符(SID)。当该 SID 对应的本地账户已被删除或来自另一台机器(例如从旧电脑迁移了用户配置),系统无法解析出用户名,就会显示为 UNKNOWN\UNKNOWN

  3. 典型来源

    • 用户配置文件从旧机器迁移或复制
    • 重装系统后沿用旧的 .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\SYSTEMBUILTIN\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/configssh -G 与日常连接即可恢复使用。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×