现象
使用Cursor或VS Code的SSH Remote功能连接到远程服务器(尤其是WSL2环境),终端输出长时间卡在 Downloading VS Code Server
,日志停滞在类似 wget
或下载相关的步骤。
日志示例(已脱敏):
[17:37:06.722] > Installing to /home/user/.cursor-server...
[17:37:06.731] > Downloading with wget
... (无后续输出)
本文旨在分析并解决此问题。
1. 问题分析
1.1. 连接成功,下载失败
日志显示SSH认证已通过,并成功登录到远程Shell。问题不在于SSH连接本身,而在于远程服务器无法完成下载任务。
此场景通常与网络代理有关。本地测试 ping
或 curl
成功,不代表自动化脚本也能成功。
1.2. 交互式 Shell vs. 非交互式 Shell
这是问题的核心。
- 交互式Shell (Interactive Shell): 你手动执行
ssh user@host
登录后得到的环境。它会完整加载/etc/profile
和~/.bashrc
等配置文件。你在这些文件中设置的代理export http_proxy=...
会生效。 - 非交互式Shell (Non-interactive Shell): Cursor/VS Code为了执行自动化任务(如
wget
)而创建的后台Shell。为保证环境纯净,这种Shell在执行时,会跳过.bashrc
中的大部分配置。
你的 .bashrc
文件中,很可能存在类似下面的“守卫代码”:
# Ubuntu/Debian .bashrc 默认配置
# 如果不是交互式模式,则直接退出
case $- in
*i*) ;;
*) return;;
esac
当非交互式Shell执行到 return
时,会立刻退出,导致写在这段代码之后的任何配置(包括代理)都不会被加载。
1.3. 错误的代理地址 (WSL2特定问题)
若你的远程环境是WSL2,代理配置 export http_proxy="http://127.0.0.1:7890"
是错误的。
- 在WSL2内部,
127.0.0.1
(localhost) 指向的是WSL2这个Linux系统本身。 - 而你的代理软件运行在Windows宿主机上。
- WSL2必须使用Windows宿主机的IP地址才能访问到代理服务。
2. 解决方案
解决思路分为两步:
- 修正代理目标地址,使其能动态指向Windows宿主机。
- 将代理配置移动到
.bashrc
文件的最顶端,确保任何类型的Shell都能加载。
2.1. 动态获取宿主机IP
WSL2会自动将宿主机的IP作为DNS服务器地址写入 /etc/resolv.conf
。我们可以利用这一点来动态获取IP,避免硬编码。
执行以下命令可提取该IP:
cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
2.2. 修改 .bashrc
- 登录并备份
通过SSH登录你的远程服务器,并备份现有配置文件。ssh user@your-server-ip -p port cp ~/.bashrc ~/.bashrc.bak
- 编辑文件
使用nano
或vim
打开.bashrc
。nano ~/.bashrc
- 添加正确配置
删除或注释掉文件中原有的export http_proxy
和export https_proxy
行。然后,将以下完整代码块复制并粘贴到文件的最顶部。# --- START: Proxy Configuration for All Shells --- # 动态获取Windows宿主机的IP地址 host_ip=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}') # 设置代理,使用上面获取到的IP # 将7890替换为你的代理软件的实际端口 proxy_port=7890 export http_proxy="http://${host_ip}:${proxy_port}" export https_proxy="http://${host_ip}:${proxy_port}" # (可选) 设置不走代理的地址 export no_proxy="localhost,127.0.0.1,*.lan" # --- END: Proxy Configuration ---
- 保存并退出
在nano
中,按Ctrl+X
,然后按Y
和Enter
。
修改后的 .bashrc
文件结构应如下:
# --- START: Proxy Configuration for All Shells ---
... (你刚粘贴的代码)
# --- END: Proxy Configuration ---
# ~/.bashrc: executed by bash(1) for non-login shells.
...
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
... (文件剩余部分)
3. 验证
配置修改后立即生效,无需重启。
- 在本地终端(不要登录服务器)执行以下非交互式命令进行测试:
ssh user@your-server-ip -p port 'curl -v https://www.google.com'
- 观察输出
如果配置成功,curl
的输出中会包含类似Connected to <你的宿主机IP> ... port 7890
的信息,并能成功获取网页内容。 - 重新连接
验证成功后,关闭Cursor/VS Code中失败的连接,重新发起SSH连接。此时应可顺利完成VS Code Server的下载和安装。
注意:请确保你的Windows代理软件已开启“允许来自局域网的连接(Allow LAN)”或类似选项,且Windows防火墙没有阻止来自WSL2的访问。
发表回复