大更新

This commit is contained in:
Even Bell 2025-06-27 08:53:44 +08:00
parent be1ca3db02
commit ba403f2ff6
3 changed files with 184 additions and 15 deletions

View File

@ -10,4 +10,21 @@
2. 添加执行权限 `chmod -R +751 ~/.vscode-patch` 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版本不兼容而无法运行此脚本可以解决该问题。

View File

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

View File

@ -1,10 +1,19 @@
#!/bin/bash #!/bin/bash
VSCODE_PATCH_DIR="$HOME/.vscode-patch" VSCODE_PATCH_DIR="$HOME/.vscode-patch"
VSCODE_APP_PATH=""
echo "[VSCode 应用程序补丁工具]"
# 1. 检查补丁工具文件夹
if [ ! -d "$VSCODE_PATCH_DIR/lib" ]; then if [ ! -d "$VSCODE_PATCH_DIR/lib" ]; then
echo "错误:补丁文件夹应放在这儿:$HOME/.vscode-patch/" 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 exit 1
fi fi
VSCODE_APP_PATH=""
# 2. 获取VSCode安装路径
if [ -n "$1" ]; then if [ -n "$1" ]; then
if [[ "$1" != /* ]]; then if [[ "$1" != /* ]]; then
VSCODE_APP_PATH="$(realpath "$1")" VSCODE_APP_PATH="$(realpath "$1")"
@ -14,24 +23,59 @@ if [ -n "$1" ]; then
else else
read -p "指定VSCode App路径: " VSCODE_APP_PATH read -p "指定VSCode App路径: " VSCODE_APP_PATH
fi fi
echo "[VSCode应用-补丁]"
echo "-- VSCode Path: $VSCODE_APP_PATH" echo "-- VSCode安装路径$VSCODE_APP_PATH"
# 3. 验证路径有效性
if [ ! -f "$VSCODE_APP_PATH/code" ]; then if [ ! -f "$VSCODE_APP_PATH/code" ]; then
echo "错误指定App路径下不存在VSCode可执行文件" echo "错误:指定路径下不存在VSCode可执行文件"
exit 1 exit 1
fi fi
echo "-- 找到code程序即将补丁code程序..."
if [ ! -f "$VSCODE_APP_PATH/code.bak" ]; then echo "-- 找到VSCode可执行文件$VSCODE_APP_PATH/code"
echo "-- 备份原始code程序..."
cp "$VSCODE_APP_PATH/code" "$VSCODE_APP_PATH/code.bak" # 4. 检查是否已补丁过
else if strings "$VSCODE_APP_PATH/code" | grep -q "$VSCODE_PATCH_DIR/lib" 2>/dev/null; then
echo "-- 已存在code.bak原始备份" echo "-- 程序已被补丁过,无需重复操作"
exit 0
fi 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-interpreter "$VSCODE_PATCH_DIR/lib/ld-linux-x86-64.so.2" \
--set-rpath "\$ORIGIN:$HOME/.vscode-patch/lib" \ --set-rpath "\$ORIGIN:$HOME/.vscode-patch/lib" \
"$VSCODE_APP_PATH/code" "$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