远程jupyter内核连不上需依次检查:1. 远程jupyter-server是否运行且监听0.0.0.0;2. 防火墙是否放行端口;3. vscode中填写的连接地址格式是否正确(含token和/api路径);4. ssh隧道配置与kernel环境是否匹配。

远程Jupyter内核连不上,先确认jupyter-server是否在运行
VSCode里点“选择内核”搜不到远程地址,大概率不是VSCode配置问题,而是远程服务根本没起来。Jupyter Lab 3.0+ 默认用 jupyter-server 而非旧版 jupyter-notebook,命令不兼容。
- 远程服务器上必须运行
jupyter-server --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''(生产环境务必配 token 或密码,此处空值仅用于调试) -
--ip=0.0.0.0不可省略,localhost或127.0.0.1会导致 VSCode 从本地无法访问 - 检查端口是否被防火墙拦住:
ss -tuln | grep 8888或netstat -an | grep 8888,确认 LISTEN 状态存在 - 如果用 conda 环境,确保启动前已
conda activate myenv,否则内核路径和包都错位
VSCode里填的远程内核地址格式很关键
不是随便写个 http://xxx:8888 就行——VSCode 的 Jupyter 扩展要求的是 serverRoot + token 组合的完整连接串,且必须带 /api 路径前缀。
- 正确格式是:
http://<your-ip>:8888/?token=<your-token></your-token></your-ip>(注意问号,不是斜杠) - 如果启用了自定义 base URL(比如
--base-url=/jupyter),就得写成http://<your-ip>:8888/jupyter/?token=...</your-ip> - VSCode 设置里不要动
jupyter.jupyterServerType,保持默认remoteserver即可;改了反而会跳过手动输入地址流程 - 填完地址后,VSCode 会发一个
GET /api/sessions请求校验,返回 404 或 403 说明路径或 token 错,返回连接拒绝说明网络不通
SSH 隧道转发时,本地端口别和远程冲突
很多人用 ssh -L 8888:localhost:8888 user@host 做端口转发,结果 VSCode 连的是本地 8888,但提示“内核未响应”,其实是隧道没打通或目标服务监听错了地址。
- 远程
jupyter-server必须监听--ip=0.0.0.0,如果只监听127.0.0.1,SSH 隧道进来后仍无法代理到服务 - 本地
-L端口建议换一个(比如8889),避免和本机其他 jupyter 冲突;VSCode 中就填http://localhost:8889/?token=... - Windows 上用 OpenSSH 时,
localhost在隧道里可能解析失败,换成127.0.0.1更稳:ssh -L 8889:127.0.0.1:8888 user@host - 别在 VSCode 里同时开多个远程内核连接——Jupyter Server 对并发 session 有默认限制,容易卡在“connecting”状态不动
Python 环境和内核注册不一致导致 import 失败
VSCode 显示连接成功、能跑代码,但一 import torch 就报 ModuleNotFoundError,问题往往出在:远程 Jupyter Server 启动时的 Python 解释器 ≠ 实际 kernel.json 注册的解释器。
- 运行
jupyter kernelspec list查看远程有哪些 kernel,进对应目录(如~/.local/share/jupyter/kernels/python3/kernel.json),确认argv里指定的 Python 路径是否指向你期望的环境(例如/path/to/conda/envs/myenv/bin/python) - 如果用 pip 安装的 jupyter,kernel 默认注册到用户级目录;conda 环境需在激活后运行
python -m ipykernel install --user --name myenv --display-name "Python (myenv)" - VSCode 左下角显示的 kernel 名称,必须和
jupyter kernelspec list输出的 name 完全一致(区分大小写),否则它会 fallback 到默认 kernel,路径完全对不上 - 修改 kernel.json 后不用重启 jupyter-server,但 VSCode 需要重新“选择内核”并选中对应项,不能靠刷新
真正麻烦的从来不是填个地址,而是远程服务监听在哪、token 怎么传、kernel 路径指哪、SSH 隧道穿哪一层——四个地方任意一个偏一点,VSCode 就只会安静地转圈。











