VSCode Remote SSH 一直转圈连不上服务器?踩坑全记录

VSCode Remote SSH 一直转圈连不上服务器?踩坑全记录

环境:Ubuntu 服务器 / VSCode Remote SSH / Miniconda


问题描述

VSCode 通过 Remote SSH 连接服务器时,一直显示"正在连接",转圈转个没完,既不报错也不成功。

奇怪的是:

  • 用 XShell 可以正常登录同一个账号
  • 用 VSCode 连别人的账号也能成功
  • 去掉免密登录、改用密码登录,依然没用

排查过程

第一步:排除 vscode-server 安装问题

VSCode Remote SSH 连上服务器后,会在服务器的 ~/.vscode-server/ 目录下自动安装 vscode-server。如果这个目录不存在或文件残缺,就会一直卡在下载阶段。

bash 复制代码
ls ~/.vscode-server/

我的目录存在且有内容,排除此原因。


第二步:排除网络问题

bash 复制代码
curl -I https://update.code.visualstudio.com

服务器可以正常访问外网,排除。


第三步:对比两个账号的 .bashrc

把自己账号和能正常连接的账号的 .bashrc 对比,发现两处差异:

差异一: 自己的 .bashrc 最后多了一行:

bash 复制代码
. "$HOME/.local/bin/env"

差异二: conda 初始化块的位置和保护方式不同。

能正常连接的账号,.bashrc 开头有:

bash 复制代码
case $- in
    *i*) ;;
      *) return;;   # 非交互式直接退出
esac

这个判断会让非交互式 shell 直接 return,后面的 conda 块碰不到。

而自己账号的 .bashrc 虽然也有这个判断,但 VSCode 使用的是 login shell ,走的是 .bash_profile → source .bashrc 这条路,$- 里没有 i 标志,导致 conda 初始化块仍然被执行,有可能在此处卡住。


第四步:模拟 VSCode 的连接方式验证

bash 复制代码
bash -li -c 'echo ok'

这条命令完全模拟了 VSCode 启动 shell 的方式。执行后立刻输出 ok,说明修改 .bashrc 之后 shell 本身没问题了。


第五步:发现真正的问题------vscode-server 残留进程

.bashrc 修复后,VSCode 依然连不上。

最终原因:服务器上有残留的旧 vscode-server 进程和缓存文件,导致新连接无法正常初始化。

bash 复制代码
pkill -f vscode-server
rm -rf ~/.vscode-server

清理完毕,重启 VSCode,重新连接,成功进入。


根本原因总结

原因 说明
.bashrc 中 conda 初始化块缺少交互式判断 VSCode 用 login shell 连接,conda 初始化被执行,可能导致卡住
vscode-server 残留进程/缓存 旧进程占用导致新连接无法初始化

两个问题叠加,导致一直转圈。


解决方案

修复 .bashrc:给 conda 初始化加上交互式判断

找到 .bashrc 中的 conda 初始化块,用 if [[ $- == *i* ]] 包裹:

bash 复制代码
# >>> conda initialize >>>
if [[ $- == *i* ]]; then
    __conda_setup="$('/home/yourname/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
    if [ $? -eq 0 ]; then
        eval "$__conda_setup"
    else
        if [ -f "/home/yourname/miniconda3/etc/profile.d/conda.sh" ]; then
            . "/home/yourname/miniconda3/etc/profile.d/conda.sh"
        else
            export PATH="/home/yourname/miniconda3/bin:$PATH"
        fi
    fi
    unset __conda_setup
fi
# <<< conda initialize <<<

# 同样保护其他可能卡住的初始化
if [[ $- == *i* ]]; then
    . "$HOME/.local/bin/env"
fi

效果:

  • XShell 正常登录(交互式)→ conda 正常激活,(base) 照常显示
  • VSCode 连接(非交互式)→ 跳过 conda,连接不再卡住

清理 vscode-server 残留

bash 复制代码
pkill -f vscode-server
rm -rf ~/.vscode-server

然后重启 VSCode 重新连接即可。


附:重新配置免密登录

排查过程中删掉了免密登录配置,连接成功后按以下步骤恢复。

在本地电脑的 PowerShell 中执行:

powershell 复制代码
# 如果本地没有密钥,先生成
ssh-keygen -t rsa -b 4096

# 把公钥推到服务器(替换端口和用户名)
type ~/.ssh/id_rsa.pub | ssh -p 314 yourname@your.server.ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

输入一次密码后,之后 VSCode 和 XShell 都无需再输密码。


经验总结

  1. VSCode Remote SSH 连接卡住不报错,大概率是服务器端 shell 初始化问题,而不是网络或密码问题。
  2. VSCode 用的是 login shell ,和 XShell 的交互式 shell 执行路径不完全一样,.bashrc 里的 return 保护不一定能拦住 conda 初始化。
  3. 遇到莫名其妙连不上 ,先清理 ~/.vscode-server 再试,往往能解决一半问题。
  4. 排查时用 bash -li -c 'echo ok' 模拟 VSCode 的连接方式,能快速定位是否是 shell 初始化的问题。
相关推荐
上海云盾-小余8 分钟前
动态 IP 隐匿技术:手游服务器规避端口扫描与溯源攻击实战
服务器·网络协议·tcp/ip
2501_915106328 分钟前
在Mac上搭建iOS开发环境的详细步骤与注意事项
ide·vscode·macos·ios·个人开发·swift·敏捷流程
a2591748032-随心所记12 分钟前
android拆解super.img内容
android·linux·运维·服务器
实心儿儿21 分钟前
Linux —— 文件系统_路径解析_软硬连接
linux·运维·服务器
云达闲人27 分钟前
搭建DevOps企业级仿真实验环境:004Proxmox 内核调优与虚拟化优化
linux·服务器·devops·硬件加速·linux内核调优·虚拟化优化·内存气球
鸿_H40 分钟前
杂记11---ubuntu2204环境vscode/cursor切换中文输入法
vscode·cursor·ubuntu2204
黄同学real1 小时前
踩坑实录:离线内网服务器 Docker 部署 PaddleOCR-VL 1.5 完全指南
运维·服务器·docker
SilentSamsara1 小时前
Python 并发基础:threading/GIL 与 multiprocessing 的选型逻辑
服务器·开发语言·数据库·vscode·python·pycharm
shmily麻瓜小菜鸡1 小时前
在 VSCode 里遇到报红是因为 Angular 编译器无法识别
ide·vscode·angular.js
东北甜妹1 小时前
K8s -Daemonset,kube-proxy,service,statefulset
linux·运维·服务器