ubuntu18-cursor-remote-ssh-tutorial

Ubuntu 18.04 远程连接 Cursor 教程(GLIBC 2.27 / ARM64)

适用于 Ubuntu 18.04JetPack 4.xJetson NanoGLIBC 2.27 环境,通过 Remote SSH 使用 Cursor。核心问题是 Cursor Server 自带的 Node 需要 GLIBC ≥ 2.28 ,而系统为 2.27


目录

  1. 背景与现象
  2. 方案概述
  3. 远程机操作步骤
  4. [Cursor 连接](#Cursor 连接)
  5. 常见问题
  6. 检查清单
  7. 更稳妥的长期方案

1. 背景与现象

项目 说明
典型系统 Ubuntu 18.04、L4T / JetPack 4.x
GLIBC 多为 2.27
Cursor 行为 ~/.cursor-server 安装服务,自带 linux-arm64Node
冲突 自带 Node 链接 GLIBC_2.28+,在 2.27 上无法运行

常见日志:

text 复制代码
.../node: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by .../node)
The bundled NodeJS failed to run, and no system NodeJS executable was found.
Please manually install NodeJS 20 or higher on your remote system

若已安装「系统 Node」但 Cursor 仍报找不到,多半是 SSH 非交互环境未加载 PATH(见第 3.5 节)。


2. 方案概述

不要 通过网上流传的「替换 /lib/.../libc.so.6」等方式升级系统 glibc,极易导致 SSH 不可用或系统损坏

推荐在 不改动系统默认 libc 的前提下:

  1. glibc 2.28 安装到独立前缀(如 /opt/glibc-2.28)。
  2. 安装 官方 Node 20 linux-arm64/usr/local/node20
  3. glibc 2.28 自带的动态加载器 + --library-path 启动 Node(脚本包装)。
  4. 将包装脚本暴露为 node ,并写入 ~/.profile 的 PATH ,保证 ssh user@host "node -v" 可用(与 Cursor 安装脚本一致)。

3. 远程机操作步骤

以下以用户 jetbot 为例,请按实际用户名替换路径。

3.1 并行安装 glibc 2.28

在单独文档或可靠来源指导下,将 glibc 安装到前缀目录 (示例:/opt/glibc-2.28),不要 替换系统默认的 libc.so.6

安装完成后应存在(路径以实际为准):

  • /opt/glibc-2.28/lib/libc-2.28.so
  • /opt/glibc-2.28/lib/ld-linux-aarch64.so.1

3.2 安装 Node 20(官方 linux-arm64)

bash 复制代码
cd /tmp
wget https://nodejs.org/dist/v20.18.0/node-v20.18.0-linux-arm64.tar.xz
tar xf node-v20.18.0-linux-arm64.tar.xz
sudo rm -rf /usr/local/node20
sudo mkdir -p /usr/local/node20
sudo cp -a node-v20.18.0-linux-arm64/* /usr/local/node20/

确认:

bash 复制代码
test -f /usr/local/node20/bin/node && echo OK

版本号可按需调整,须为 Node 20+

3.3 启动脚本(含 libgcc 搜索路径)

创建 ~/node20-glibc-run.sh

bash 复制代码
#!/bin/bash

GLIBC_PATH=/opt/glibc-2.28/lib
SYS_LIB=/usr/lib/aarch64-linux-gnu
NODE_BIN=/usr/local/node20/bin/node

"$GLIBC_PATH/ld-linux-aarch64.so.1" \
  --library-path "$GLIBC_PATH:$SYS_LIB:/lib/aarch64-linux-gnu" \
  "$NODE_BIN" "$@"

说明:

  • /lib/aarch64-linux-gnu :提供 libgcc_s.so.1 。若 --library-path 缺少该目录,可能出现:
    libgcc_s.so.1: cannot open shared object file
  • 若仍缺其它库,使用 find /lib /usr/lib -name 'lib*.so*' 查找后追加到 --library-path(冒号分隔)。
bash 复制代码
chmod +x ~/node20-glibc-run.sh
~/node20-glibc-run.sh -v

期望输出:v20.18.0(或与所装版本一致)。

3.4 用 fake-node 提供 node 命令

bash 复制代码
mkdir -p ~/fake-node
ln -sf ~/node20-glibc-run.sh ~/fake-node/node

确认软链完整:

bash 复制代码
ls -la ~/fake-node/node
readlink -f ~/fake-node/node

3.5 将 PATH 写入 ~/.profile(关键)

仅修改 ~/.bashrc 且文件开头有「非交互即 return」时ssh user@host "node -v" 不会 加载你在后面的 export PATH,Cursor 会报找不到 Node。

~/.profile 靠前位置 (建议在 source ~/.bashrc 相关块之前)增加:

bash 复制代码
export PATH="$HOME/fake-node:$PATH"

若存在 ~/.bash_profile 且不加载 .profile,需在 ~/.bash_profile 中同样加入上述一行,或先 source ~/.profile

登录 shell 自测:

bash 复制代码
hash -r
which node
node -v

期望:which node 指向 ~/fake-node/nodenode -v 为 v20.x。

3.6 从本机验证非交互 SSH(与 Cursor 一致)

Windows 或另一台机器上:

bash 复制代码
ssh jetbot@<板子IP> "which node; node -v"

期望:

text 复制代码
/home/jetbot/fake-node/node
v20.18.0

若此处失败,Cursor 仍可能失败;请先修好 .profile / .bash_profile 再连 Cursor。


4. Cursor 连接

  1. 在 Cursor 中安装并启用 Remote SSH(以当前 Cursor 版本为准)。
  2. 使用 jetbot@192.168.x.x 等形式连接目标主机。
  3. 连接过程中日志大致为:
    • 自带 ~/.cursor-server/.../node 因 GLIBC 失败;
    • 检测到 System node 版本 ≥ 20;
    • 可能将安装目录下的 node 符号链接 到你的 fake-node/node

只要 第 3.6 节 通过,系统 Node 检测通常可通过。


5. 常见问题

5.1 package.json: Unexpected end of JSON input

含义~/.cursor-server 下文件不完整 (下载中断、磁盘满、历史失败残留等)。此时 Node 已能运行,但服务端文件损坏。

处理

bash 复制代码
df -h $HOME
rm -rf ~/.cursor-server

然后在 Cursor 中 重新连接,触发完整重装。

5.2 libgcc_s.so.1: cannot open shared object file

在脚本的 --library-path 中加入 /lib/aarch64-linux-gnu(见第 3.3 节)。

5.3 NODE_BIN 指向的 node 不存在

确认 /usr/local/node20/bin/node 存在,或与 NODE_BIN= 路径一致。

5.4 which node 指向错误脚本或旧路径

检查 PATH 顺序、hash -r,以及 ~/fake-node/node 是否指向正确的 node20-glibc-run.sh


6. 检查清单

  • /opt/glibc-2.28/lib/ld-linux-aarch64.so.1libc-2.28.so 存在
  • /usr/local/node20/bin/node 存在
  • ~/node20-glibc-run.sh -v 输出 v20+
  • ~/fake-node/node~/node20-glibc-run.sh
  • ~/.profile(必要时 ~/.bash_profile)含 export PATH="$HOME/fake-node:$PATH"
  • ssh user@host "which node; node -v"本机测试通过
  • 出现 JSON 解析错误时:检查磁盘空间并 rm -rf ~/.cursor-server
  • 用危险方式替换系统 libc.so.6

7. 更稳妥的长期方案

方案 说明
升级系统 / JetPack 使用 Ubuntu 20.04+ 等自带 GLIBC ≥ 2.28 的镜像,Cursor 一般无需旁路 glibc。
源码编译 Node 20+ 在板子上编译,链接本机 2.27 ,可不依赖 /opt/glibc-2.28,但编译耗时、占资源。

旁路 glibc + 官方预编译 Node 属于 在旧系统上的折中方案,维护成本高于系统升级。


附录:参考命令速查

bash 复制代码
# 系统 glibc 版本
ldd --version | head -1
strings /lib/aarch64-linux-gnu/libc.so.6 | grep '^GLIBC_' | tail -8

# 查找 libgcc
find /lib /usr/lib -name 'libgcc_s.so.1' 2>/dev/null

# 检查 cursor-server 安装大小与 package.json
du -sh ~/.cursor-server 2>/dev/null
wc -c ~/.cursor-server/bin/linux-arm64/*/package.json 2>/dev/null

文档整理自 Ubuntu 18.04 / Jetson Nano + Cursor Remote SSH 实机排查流程。

相关推荐
m0_631529821 小时前
Golang数组和切片有什么区别_Golang数组切片对比教程【通俗】
jvm·数据库·python
身如柳絮随风扬1 小时前
MySQL 中优雅统计“只算周一到周五”的到访数据
数据库·mysql
2401_880071401 小时前
CSS如何利用Sass实现透明度动态化_通过函数计算CSS颜色值
jvm·数据库·python
iuvtsrt1 小时前
如何进行SQL安全基线评估_定期核对数据库安全配置
jvm·数据库·python
Jetev1 小时前
Python Tkinter自定义对话框怎么写_Toplevel创建子窗口并结合wait_window()实现阻塞
jvm·数据库·python
m0_591364731 小时前
mysql如何配置缓存大小_mysql key_buffer_size基础设置
jvm·数据库·python
YuanDaima20481 小时前
WSL2 核心中间件部署实战:MySQL、Redis 与 RocketMQ
java·数据库·人工智能·redis·python·mysql·rocketmq
m0_733565461 小时前
c++如何在内存极小的单片机上读写SD卡文件_FatFs库裁剪与移植【实战】
jvm·数据库·python
攻城狮7号1 小时前
时序数据库怎么选:从业务需求到 IoTDB 的一条线
数据库·时序数据库·iotdb·ai数据库