You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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,确保以下配置项未被注释且设置正确:
    GSSAPIAuthentication yes
    GSSAPICleanupCredentials yes
    
    然后重启SSH服务:Restart-Service sshd
  • 额外配置:在Active Directory中,给你用来远程的账号设置允许委派(具体是在账号属性的"委派"选项卡,勾选"信任此用户作为委派到任何服务"或指定具体服务,根据安全需求选择)。

2. 在VS Code中强制启用凭据转发

如果你是通过VS Code的Remote-SSH扩展连接的,可以直接在VS Code的设置里添加SSH参数,确保会话启用凭据转发:

  1. 打开VS Code设置(快捷键Ctrl+,)
  2. 搜索remote.SSH.args
  3. 添加以下配置:
    "remote.SSH.args": ["-o", "GSSAPIDelegateCredentials=yes"]
    
    这样所有SSH远程会话都会自动启用凭据转发。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 20:47:48