diff --git a/patch-code-server.sh b/patch-code-server.sh index 9daca23..bbd7ab5 100644 --- a/patch-code-server.sh +++ b/patch-code-server.sh @@ -11,98 +11,27 @@ 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补丁环境变量" -echo "-- 补丁工具目录:$VSCODE_PATCH_DIR" -echo "-- VSCode Server 目录:$VSCODE_SERVER_DIR" +cat >> ~/.profile << EOF -# 2. 查找所有 code-{id} 可执行程序 -echo "-- 正在搜索 VSCode Remote Server 可执行程序..." +# VSCode 远程服务补丁库 +export VSCODE_SERVER_PATCHELF_PATH="$HOME/.vscode-patch/lib" +export VSCODE_SERVER_CUSTOM_GLIBC_LINKER="$HOME/.vscode-patch/lib/ld-linux-x86-64.so.2" +export VSCODE_SERVER_CUSTOM_GLIBC_PATH="$HOME/.vscode-patch/lib" -CODE_EXECUTABLES=($(find "$VSCODE_SERVER_DIR" -name "code-*" -type f -executable 2>/dev/null)) +EOF -if [ ${#CODE_EXECUTABLES[@]} -eq 0 ]; then - echo "错误:未找到任何 code-{id} 可执行程序" - echo "请确保已通过 VSCode Remote 连接过远程服务器" - exit 1 -fi +cat >> ~/.zprofile << EOF -echo "-- 找到 ${#CODE_EXECUTABLES[@]} 个 VSCode Remote Server 可执行程序" +# VSCode 远程服务补丁库 +export VSCODE_SERVER_PATCHELF_PATH="$HOME/.vscode-patch/lib" +export VSCODE_SERVER_CUSTOM_GLIBC_LINKER="$HOME/.vscode-patch/lib/ld-linux-x86-64.so.2" +export VSCODE_SERVER_CUSTOM_GLIBC_PATH="$HOME/.vscode-patch/lib" -# 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 +EOF -echo "" -echo "=== 补丁完成 ===" -echo "所有找到的 VSCode Remote Server 程序已处理完成" -echo "如需恢复原始程序,请将 .bak 文件重命名回原文件名" +echo "-- 设置完毕" \ No newline at end of file