vscode-patch/patch-code-server.sh
2025-06-27 08:53:44 +08:00

109 lines
3.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 文件重命名回原文件名"