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
'
这有点投机取巧,但能完成任务。祝你在喜欢的终端中使用愉快!