基于SSH的Windows远程开发——PowerShell双跳身份验证问题
解决SSH远程PowerShell会话中的"双跳"问题
首先得明确一点:虽然你用的是SSH而非WinRM,但PowerShell的远程会话(不管是通过哪种协议承载的)依然受Windows身份验证系统(尤其是Kerberos)的约束,这就是为什么你还是遇到了双跳问题——这不是VS Code或PowerShell特意把SSH识别为第一跳,而是Windows安全模型的默认限制,目的是防止凭据被无限制转发导致的安全风险。
下面给你几个可行的解决方案,适配PowerShell 7和SSH场景:
1. 启用Kerberos凭据转发(域环境首选)
要让你的SSH会话支持凭据转发,需要同时配置客户端和服务器:
- 客户端(Windows 10):编辑你的SSH配置文件(通常在
C:\Users\<你的用户名>\.ssh\config),添加以下内容:Host <你的服务器名/IP> GSSAPIDelegateCredentials yes - 服务器端(Windows 2022):打开SSH服务配置文件
C:\ProgramData\ssh\sshd_config,确保以下配置项未被注释且设置正确:
然后重启SSH服务:GSSAPIAuthentication yes GSSAPICleanupCredentials yesRestart-Service sshd - 额外配置:在Active Directory中,给你用来远程的账号设置允许委派(具体是在账号属性的"委派"选项卡,勾选"信任此用户作为委派到任何服务"或指定具体服务,根据安全需求选择)。
2. 在VS Code中强制启用凭据转发
如果你是通过VS Code的Remote-SSH扩展连接的,可以直接在VS Code的设置里添加SSH参数,确保会话启用凭据转发:
- 打开VS Code设置(快捷键
Ctrl+,) - 搜索
remote.SSH.args - 添加以下配置:
这样所有SSH远程会话都会自动启用凭据转发。"remote.SSH.args": ["-o", "GSSAPIDelegateCredentials=yes"]
3. 绕过双跳的替代方案(非域或转发受限场景)
如果Kerberos转发配置起来有困难,你可以直接在脚本中使用目标资源的凭据访问,避免依赖会话凭据转发:
- 比如访问文件共享:
$shareCred = Get-Credential -Message "输入文件共享的凭据" Invoke-Command -ComputerName <文件服务器名> -Credential $shareCred -ScriptBlock { Get-ChildItem "\\<文件服务器>\<共享路径>" } - 访问SQL数据库时,在连接字符串中直接指定SQL凭据,或者使用
Invoke-SqlCmd的-Credential参数(如果支持)。
关于你的核心疑问
能不能强制VS Code/PowerShell不把SSH连接识别为第一跳?答案是不行。因为PowerShell的远程会话(无论承载协议是WinRM还是SSH)都会被视为一个"远程登录会话",Windows的身份验证系统默认会限制凭据跨会话转发——这是微软出于安全考虑的强制限制,目的是防止你的凭据被意外转发到不可信的第三方资源。
内容的提问来源于stack exchange,提问作者Tony Goetheyn
相关产品推荐
相关产品推荐

