与使用 Docker 的 WSL2 后端运行的 VS Code Devcontainer 共享 SSH 密钥

Tom*_*han 9 visual-studio-code vscode-devcontainer

我正在阅读这些有关与开发容器共享 SSH 密钥的文档,但我无法让它工作。

\n

我的设置如下:

\n
    \n
  • 使用 WSL2 后端的 Windows 10 和 Docker Desktop 4.2.0

    \n
  • \n
  • 运行 Ubuntu 20.04 的 WSL2 发行版

    \n
  • \n
  • 在 WSL2 中,我已经ssh-agent运行并知道我的密钥:

    \n
    \xce\xbb ssh-add -l\n4096 SHA256:wDqVYQshQBCG/Sri/bsgjEaUFboQDUO/9FJqhFMncdk /home/taschan/.ssh/id_rsa (RSA)\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

文档说

\n
\n

如果本地 SSH 代理正在运行,该扩展将自动转发

\n
\n

但如果我ssh-add -l在 devcontainer 中这样做,它会响应Could not open a connection to your authentication agent.; 当然,启动一个(使用eval "$(ssh-agent -s)")只会启动一个不知道我的私钥的启动。

\n

我缺少什么?

\n

小智 8

我基本上有同样的问题。使用 WSL2 运行 Windows 11 和我的 VSCode Devcontainer 不会显示任何 ssh 密钥(ssh-add -l在容器内运行显示空列表),尽管在我的主机上使用有效的 ssh 密钥配置了 Git。

ssh-agent对我来说,我的机器上有 3 个独立的实例:

  • WSL2
  • git 重击
  • Windows 主机 这是 VSCode 转发到 devcontainer 的主机

我现有的 ssh 密钥是在 Git Bash 内部设置的(按照 Github 的说明),因此运行时ssh-add -l只会从 Git Bash 终端内部显示我的 ssh 密钥,而不会在其他地方显示。

然而,正如前面的答案中所解释的,深入研究 Devcontainer 启动日志表明 VSCode 仅转发主机的ssh-agent,它不会查看 WSL2 或 Git Bash 的。

解决方案:我建议遵循以下 Microsoft 文档页面。您需要在 Windows 中启用“可选功能”,然后在 PowerShell 中(以管理员身份)运行一些命令来激活该ssh-agent服务。通过此设置,ssh-agent/ssh-add命令也可以在常规 CMD 终端上运行。您可以将它们与常用的 keygen 命令等一起使用,以在主机上生成和添加新密钥(我刚刚ssh-add编辑了最初由 Git Bash 生成的相同密钥)。添加的密钥应立即被ssh-add -l容器内部检测到。

https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement


Emp*_*pus 8

共享凭据的另一种方法是除了devcontainer.json主代码目录之外,还将 SSH 目录安装在 中。就像这样:

  "mounts": [
    "type=bind,source=${localWorkspaceFolder},target=/work",
    "type=bind,source=/home/${localEnv:USER}/.ssh,target=/root/.ssh,readonly"
  ]
Run Code Online (Sandbox Code Playgroud)

请注意,那么您也不需要workspaceMount字段。

更多信息:
https://code.visualstudio.com/remote/advancedcontainers/add-local-file-mount
https://docs.docker.com/storage/bind-mounts/


小智 1

为了让它发挥作用,我也遇到了很多麻烦。以下步骤可能有助于故障排除:

  1. 检查它ssh-agent正在您的主机上运行并且密钥已添加

    在 Windows 上运行ssh-agent -l并期望看到您的密钥的名称

  2. 检查 VSCode 是否转发套接字

    ssh-agent在启动日志中搜索。我收到了消息

    ssh-agent: SSH_AUTH_SOCK in container (/tmp/vscode-ssh-auth-a56c4b60c939c778f2998dee2a6bbe12285db2ad.sock) forwarded to local host (\\.\pipe\openssh-ssh-agent).
    
    Run Code Online (Sandbox Code Playgroud)

因此,VSCode 似乎在这里直接转发 Windows SSH 代理(而不是在 WSL 中运行的 SSH 代理)。