Linux通过SCP向Windows 11传输SSH公钥后无文件(Windows 10可正常工作)
我之前帮朋友排查过几乎一模一样的问题,Windows 11的OpenSSH服务在权限和路径处理上确实和Windows 10有不少细节差异,咱们一步步来解决:
1. 先排查文件是不是被“藏”到了虚拟存储
Windows 11对系统目录(比如ProgramData)的权限管控更严格,如果你的普通用户账号没有写入C:\ProgramData\ssh的权限,系统会偷偷把文件重定向到虚拟存储目录,而不是实际的目标路径。你可以去这个路径找找看:C:\Users\win11usr\AppData\Local\VirtualStore\ProgramData\ssh
如果在这里找到了你的id_rsa.pub,那就是权限拦截导致的。
2. 路径解析的坑:避免用环境变量,改用绝对路径
你原来的命令里用了%programdata%,这个环境变量在Windows的不同shell里解析逻辑不一样,而且Linux端的scp命令可能会把%符号当成特殊字符处理,导致Win11的SSH服务没有正确识别目标路径。
直接改用绝对路径试试,在Linux上执行这个命令(注意用单引号包裹Windows路径,避免Linux shell解析转义符):
scp id_rsa.pub win11usr@192.168.33.80:'C:\ProgramData\ssh\id_rsa.pub'
加上文件名id_rsa.pub也能避免目标目录里有重名文件被覆盖(或者系统默认不显示的情况)。
3. 给目标目录添加写入权限
如果虚拟存储里也找不到文件,那大概率是权限问题。在Windows 11上:
- 打开文件管理器,找到
C:\ProgramData\ssh目录 - 右键→属性→安全选项卡
- 点击编辑,添加你的
win11usr账号,给它写入权限 - 保存设置后,重新执行scp命令试试
4. 检查OpenSSH版本差异
Windows 11自带的OpenSSH版本通常比Windows 10的更新,新版本可能对路径校验更严格。你可以在Win11的PowerShell里执行ssh -V查看版本,如果版本较旧,建议通过PowerShell更新OpenSSH:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
一般来说,前两个方法就能解决你的问题,先试试用绝对路径传输,再检查虚拟存储目录,基本就能找到文件或者解决传输问题了。
备注:内容来源于stack exchange,提问作者slyroad

