VS Code devcontainer 与外部终端:SSH agent 使用指南

发布: (2026年1月31日 GMT+8 22:52)
2 分钟阅读
原文: Dev.to

Source: Dev.to

为什么使用外部终端

我并不是 VS Code 内置终端的忠实粉丝。它经常出现各种 bug,比如字符消失、Cmd‑V 粘贴到错误的窗口,或者在切换分支时终端关闭(开启 scm.workingSets 时)。
不过,我们在工作中确实使用 VS Code 和 devcontainer,有时需要在外部终端里运行命令。

在外部终端中对容器执行命令

下面的方式可以在容器内部打开一个 shell,效果很好:

CONTAINER_ID=$(docker ps --format "table {{.ID}}\t{{.Names}}" \
               | grep "my-container-name" \
               | awk '{print $1}')

docker exec -ti -w /workspaces/my-project "$CONTAINER_ID" /bin/zsh

SSH‑agent 问题

使用外部终端时,SSH agent 并不会自动可用,这会导致 git pull 等操作失败。VS Code 会把宿主机的 SSH‑agent 套接字挂载到容器中,并设置 SSH_AUTH_SOCK 环境变量,但 仅对内部终端有效

vscode /workspaces/my-project (main) $ echo $SSH_AUTH_SOCK
/tmp/vscode-ssh-auth-e85d0936-746e-465d-8382-cbf0bb69b476.sock

解决办法:手动暴露 SSH‑agent 套接字

该套接字位于 /tmp 目录。通过定位它并在 docker exec 命令内部导出 SSH_AUTH_SOCK,外部终端即可使用同一个 SSH agent:

CONTAINER_ID=$(docker ps --format "table {{.ID}}\t{{.Names}}" \
               | grep "my-container-name" \
               | awk '{print $1}')

docker exec -ti \
  -w /workspaces/my-project \
  "$CONTAINER_ID" \
  sh -lc '
    SOCK=$(ls /tmp/vscode-ssh-auth-*.sock 2>/dev/null | head -n1)
    if [ -n "$SOCK" ]; then
      export SSH_AUTH_SOCK="$SOCK"
      echo "Using SSH_AUTH_SOCK=$SSH_AUTH_SOCK"
    else
      echo "No VS Code SSH socket found"
    fi
    exec /bin/zsh
  '

这有点投机取巧,但能完成任务。祝你在喜欢的终端中使用愉快!

Back to Blog

相关文章

阅读更多 »

Git 2.53.0 有哪些新特性?

Git 项目最近发布了 Git 2.53.0。让我们看看此版本的一些值得注意的亮点,其中包括来自 GitLab 的 Git 团队的贡献……

Git和GitHub初学者指南

Definition of Git and GitHub 这两个术语对新手可能看起来很熟悉,但它们并不相同。- Git – 一个免费、开源的工具,用于跟踪 ch...