From ba403f2ff6e7e3a42f6f36732de0be5292a24320 Mon Sep 17 00:00:00 2001 From: Even Bell <130771607+2000e@users.noreply.github.com> Date: Fri, 27 Jun 2025 08:53:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +++++++- patch-code-server.sh | 108 +++++++++++++++++++++++++++++++++++++++++++ patch-code.sh | 72 +++++++++++++++++++++++------ 3 files changed, 184 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index e7d7e7e..83a23b9 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,21 @@ 2. 添加执行权限 `chmod -R +751 ~/.vscode-patch` -3. 补丁VSCode `~/.vscode-patch/patch-code.sh [VSCode App安装路径]` +3. 补丁VSCode应用程序 `~/.vscode-patch/patch-code.sh [VSCode App安装路径]` + +4. 补丁VSCode Remote Server `~/.vscode-patch/patch-code-server.sh` + +## 脚本说明 + +### patch-code.sh +用于补丁本地VSCode应用程序的可执行文件,修改动态链接器和库路径以兼容旧版本系统。 + +### patch-code-server.sh +用于补丁VSCode Remote Server的可执行文件。该脚本会: +- 检查 `~/.vscode-server` 目录下的所有 `code-{id}` 可执行程序 +- 自动提取每个程序的Server ID +- 为每个程序创建备份文件(.bak) +- 使用patchelf修改程序的动态链接器和库路径 +- 生成补丁说明文件记录操作详情 + +使用场景:当通过VSCode Remote连接到旧版本Linux系统时,远程服务器上的vscode-server程序可能因为glibc版本不兼容而无法运行,此脚本可以解决该问题。 diff --git a/patch-code-server.sh b/patch-code-server.sh index e69de29..9daca23 100644 --- a/patch-code-server.sh +++ b/patch-code-server.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# VSCode Remote Server 补丁脚本 +# 用于补丁 ~/.vscode-server 下的 code-{id} 可执行程序 + +VSCODE_PATCH_DIR="$HOME/.vscode-patch" +VSCODE_SERVER_DIR="$HOME/.vscode-server" + +echo "[VSCode Remote Server 补丁工具]" + +# 1. 检查补丁工具文件夹 +if [ ! -d "$VSCODE_PATCH_DIR/lib" ]; then + echo "错误:补丁文件夹应放在这儿:$HOME/.vscode-patch/" + echo "请先运行以下命令安装补丁工具:" + echo "git clone --depth 1 https://git.unvec.site/stevenhobs/vscode-patch ~/.vscode-patch" + echo "chmod -R +751 ~/.vscode-patch" + exit 1 +fi + +# 检查 .vscode-server 目录是否存在 +if [ ! -d "$VSCODE_SERVER_DIR" ]; then + echo "错误:未找到 .vscode-server 目录:$VSCODE_SERVER_DIR" + echo "请先使用 VSCode Remote 连接到远程服务器以创建此目录" + exit 1 +fi + +echo "-- 补丁工具目录:$VSCODE_PATCH_DIR" +echo "-- VSCode Server 目录:$VSCODE_SERVER_DIR" + +# 2. 查找所有 code-{id} 可执行程序 +echo "-- 正在搜索 VSCode Remote Server 可执行程序..." + +CODE_EXECUTABLES=($(find "$VSCODE_SERVER_DIR" -name "code-*" -type f -executable 2>/dev/null)) + +if [ ${#CODE_EXECUTABLES[@]} -eq 0 ]; then + echo "错误:未找到任何 code-{id} 可执行程序" + echo "请确保已通过 VSCode Remote 连接过远程服务器" + exit 1 +fi + +echo "-- 找到 ${#CODE_EXECUTABLES[@]} 个 VSCode Remote Server 可执行程序" + +# 3. 遍历每个可执行程序进行补丁 +for CODE_EXECUTABLE in "${CODE_EXECUTABLES[@]}"; do + echo "" + echo "=== 处理:$CODE_EXECUTABLE ===" + + # 提取 ID + BASENAME=$(basename "$CODE_EXECUTABLE") + if [[ "$BASENAME" =~ ^code-(.+)$ ]]; then + VSCODE_REMOTE_SERVER_ID="${BASH_REMATCH[1]}" + echo "-- 提取到 Server ID:$VSCODE_REMOTE_SERVER_ID" + else + echo "-- 警告:无法从文件名提取 ID,跳过:$BASENAME" + continue + fi + + # 检查是否已经备份 + BACKUP_FILE="${CODE_EXECUTABLE}.bak" + if [ ! -f "$BACKUP_FILE" ]; then + echo "-- 备份原始程序:$BASENAME -> $BASENAME.bak" + cp "$CODE_EXECUTABLE" "$BACKUP_FILE" + if [ $? -ne 0 ]; then + echo "-- 错误:备份失败,跳过此程序" + continue + fi + else + echo "-- 已存在备份文件:$BASENAME.bak" + fi + + # 检查程序是否已经被补丁过 + if strings "$CODE_EXECUTABLE" | grep -q "$VSCODE_PATCH_DIR/lib" 2>/dev/null; then + echo "-- 程序已被补丁过,跳过" + continue + fi + + echo "-- 开始补丁程序:$BASENAME" + + # 使用 patchelf 进行补丁 + "$VSCODE_PATCH_DIR/tools/patchelf" \ + --set-interpreter "$VSCODE_PATCH_DIR/lib/ld-linux-x86-64.so.2" \ + --set-rpath "\$ORIGIN:$HOME/.vscode-patch/lib" \ + "$CODE_EXECUTABLE" + + if [ $? -eq 0 ]; then + echo "-- 补丁成功:$BASENAME" + + # 创建补丁说明文件 + PATCH_INFO_FILE="$(dirname "$CODE_EXECUTABLE")/Patch说明-$VSCODE_REMOTE_SERVER_ID.md" + echo "VSCode Remote Server ($VSCODE_REMOTE_SERVER_ID) 已做旧版本兼容动态库补丁" > "$PATCH_INFO_FILE" + echo "补丁时间:$(date)" >> "$PATCH_INFO_FILE" + echo "原始文件备份:$BASENAME.bak" >> "$PATCH_INFO_FILE" + echo "补丁数据路径:$VSCODE_PATCH_DIR" >> "$PATCH_INFO_FILE" + + else + echo "-- 错误:补丁失败:$BASENAME" + # 恢复原始文件 + if [ -f "$BACKUP_FILE" ]; then + echo "-- 恢复原始文件" + cp "$BACKUP_FILE" "$CODE_EXECUTABLE" + fi + fi +done + +echo "" +echo "=== 补丁完成 ===" +echo "所有找到的 VSCode Remote Server 程序已处理完成" +echo "如需恢复原始程序,请将 .bak 文件重命名回原文件名" diff --git a/patch-code.sh b/patch-code.sh index e3bed77..a14d922 100644 --- a/patch-code.sh +++ b/patch-code.sh @@ -1,10 +1,19 @@ #!/bin/bash VSCODE_PATCH_DIR="$HOME/.vscode-patch" +VSCODE_APP_PATH="" + +echo "[VSCode 应用程序补丁工具]" + +# 1. 检查补丁工具文件夹 if [ ! -d "$VSCODE_PATCH_DIR/lib" ]; then echo "错误:补丁文件夹应放在这儿:$HOME/.vscode-patch/" + echo "请先运行以下命令安装补丁工具:" + echo "git clone --depth 1 https://git.unvec.site/stevenhobs/vscode-patch ~/.vscode-patch" + echo "chmod -R +751 ~/.vscode-patch" exit 1 fi -VSCODE_APP_PATH="" + +# 2. 获取VSCode安装路径 if [ -n "$1" ]; then if [[ "$1" != /* ]]; then VSCODE_APP_PATH="$(realpath "$1")" @@ -14,24 +23,59 @@ if [ -n "$1" ]; then else read -p "指定VSCode App路径: " VSCODE_APP_PATH fi -echo "[VSCode应用-补丁]" -echo "-- VSCode Path: $VSCODE_APP_PATH" + +echo "-- VSCode安装路径:$VSCODE_APP_PATH" + +# 3. 验证路径有效性 if [ ! -f "$VSCODE_APP_PATH/code" ]; then - echo "错误:指定App路径下不存在VSCode可执行文件" + echo "错误:指定路径下不存在VSCode可执行文件" exit 1 fi -echo "-- 找到code程序,即将补丁code程序..." -if [ ! -f "$VSCODE_APP_PATH/code.bak" ]; then - echo "-- 备份原始code程序..." - cp "$VSCODE_APP_PATH/code" "$VSCODE_APP_PATH/code.bak" -else - echo "-- 已存在code.bak原始备份" + +echo "-- 找到VSCode可执行文件:$VSCODE_APP_PATH/code" + +# 4. 检查是否已补丁过 +if strings "$VSCODE_APP_PATH/code" | grep -q "$VSCODE_PATCH_DIR/lib" 2>/dev/null; then + echo "-- 程序已被补丁过,无需重复操作" + exit 0 fi -echo "-- 开始打补丁..." -$VSCODE_PATCH_DIR/tools/patchelf \ + +# 5. 备份原始文件 +BACKUP_FILE="$VSCODE_APP_PATH/code.bak" +if [ ! -f "$BACKUP_FILE" ]; then + echo "-- 备份原始程序..." + cp "$VSCODE_APP_PATH/code" "$BACKUP_FILE" + if [ $? -ne 0 ]; then + echo "-- 错误:备份失败" + exit 1 + fi +else + echo "-- 已存在备份文件:$BACKUP_FILE" +fi + +# 6. 执行补丁 +echo "-- 开始补丁..." +"$VSCODE_PATCH_DIR/tools/patchelf" \ --set-interpreter "$VSCODE_PATCH_DIR/lib/ld-linux-x86-64.so.2" \ --set-rpath "\$ORIGIN:$HOME/.vscode-patch/lib" \ "$VSCODE_APP_PATH/code" -echo "-- 补丁完成!" -echo "VSCode App 已做旧版本兼容动态库补丁(修改code文件,原文件为code.bak)\n补丁数据路径$HOME/.vscode-patch" >>$VSCODE_APP_PATH/Patch说明.md +# 7. 检查补丁结果 +if [ $? -eq 0 ]; then + echo "-- 补丁成功!" + + # 创建补丁说明文件 + PATCH_INFO_FILE="$VSCODE_APP_PATH/Patch说明.md" + echo "VSCode App 已做旧版本兼容动态库补丁" > "$PATCH_INFO_FILE" + echo "补丁时间:$(date)" >> "$PATCH_INFO_FILE" + echo "原始文件备份:code.bak" >> "$PATCH_INFO_FILE" + echo "补丁数据路径:$VSCODE_PATCH_DIR" >> "$PATCH_INFO_FILE" + echo "补丁操作:修改动态链接器和库路径" >> "$PATCH_INFO_FILE" +else + echo "-- 错误:补丁失败,恢复原始文件" + if [ -f "$BACKUP_FILE" ]; then + cp "$BACKUP_FILE" "$VSCODE_APP_PATH/code" + echo "-- 已恢复原始程序" + fi + exit 1 +fi