Debian的传统sources.list格式转换为Deb822格式【deepseek🐂🍺】

#有现成命令可以使用🥲
sudo apt modernize-sources 

以下是一个实现所需功能的Shell脚本,用于将Debian的传统sources.list格式转换为Deb822格式,并确保包含Signed-By字段:

#!/bin/bash

set -euo pipefail

DEFAULT_SIGNED_BY=""
INPUT_FILE=""
OUTPUT_FILE=""

# 解析命令行参数
while [[ $# -gt 0 ]]; do
case "$1" in
--default-signed-by)
DEFAULT_SIGNED_BY="$2"
shift 2
;;
*)
if [[ -z "$INPUT_FILE" ]]; then
INPUT_FILE="$1"
elif [[ -z "$OUTPUT_FILE" ]]; then
OUTPUT_FILE="$1"
else
echo "错误:未知参数 '$1'" >&2
exit 1
fi
shift
;;
esac
done

# 验证输入参数
if [[ -z "$INPUT_FILE" || -z "$OUTPUT_FILE" ]]; then
echo "用法:$0 [--default-signed-by KEYFILE] 输入文件 输出文件" >&2
exit 1
fi

if [[ ! -f "$INPUT_FILE" ]]; then
echo "错误:输入文件 '$INPUT_FILE' 不存在" >&2
exit 1
fi

: > "$OUTPUT_FILE" # 清空输出文件

# 主处理循环
while IFS= read -r line; do
# 清理输入行
cleaned=$(echo "$line" | sed -e 's/#.*//' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
[[ -z "$cleaned" ]] && continue

# 解析基本结构
if [[ $cleaned =~ ^(deb|deb-src)[[:space:]]+(.*)$ ]]; then
type=${BASH_REMATCH[1]}
rest=${BASH_REMATCH[2]}

# 提取选项部分
options=""
if [[ $rest =~ ^\[([^]]+)\][[:space:]]+(.*)$ ]]; then
options=${BASH_REMATCH[1]}
rest=${BASH_REMATCH[2]}
fi

# 解析URI、套件和组件
if [[ $rest =~ ^([^[:space:]]+)[[:space:]]+([^[:space:]]+)([[:space:]]+(.*))?$ ]]; then
uri=${BASH_REMATCH[1]}
suite=${BASH_REMATCH[2]}
components=${BASH_REMATCH[4]}
else
echo "解析失败:$cleaned" >&2
exit 1
fi

# 处理signed-by选项
signed_by=""
if [[ -n "$options" ]]; then
IFS=' ' read -ra opts <<< "$options"
for opt in "${opts[@]}"; do
[[ $opt == signed-by=* ]] && signed_by="${opt#signed-by=}"
done
fi

# 处理未找到签名的情况
if [[ -z "$signed_by" ]]; then
if [[ -n "$DEFAULT_SIGNED_BY" ]]; then
signed_by="$DEFAULT_SIGNED_BY"
else
echo "错误:缺少signed-by信息(行:$cleaned)" >&2
exit 1
fi
fi

# 写入Deb822格式
{
echo "Types: $type"
echo "URIs: $uri"
echo "Suites: $suite"
[[ -n "$components" ]] && echo "Components: $components"
echo "Signed-By: $signed_by"
echo ""
} >> "$OUTPUT_FILE"

else
echo "警告:跳过无效行 - $cleaned" >&2
fi
done < "$INPUT_FILE"

echo "转换成功完成!结果保存在:$OUTPUT_FILE"

使用说明

  1. 保存脚本为convert-sources.sh
  2. 添加执行权限:chmod +x convert-sources.sh
  3. 基本用法:
    ./convert-sources.sh 输入文件 输出文件
  4. 当源条目缺少signed-by时使用默认签名:
    ./convert-sources.sh --default-signed-by /path/to/default.key 输入文件 输出文件

功能特点

  1. 自动处理传统格式的以下元素:

    • debdeb-src 类型
    • 方括号中的选项(包括多个选项)
    • URI地址
    • 套件名称
    • 组件列表
  2. 强制包含Signed-By字段:

    • 优先使用源条目中的signed-by选项
    • 支持通过命令行参数指定默认签名
    • 完全验证签名存在性
  3. 错误处理:

    • 自动跳过空行和注释
    • 严格的参数验证
    • 详细的错误提示
  4. 格式转换:

    • 自动生成正确的Deb822格式
    • 保留所有原始信息
    • 确保正确的字段顺序和格式

转换示例

输入 (传统格式):

deb [arch=amd64 signed-by=/usr/key.gpg] https://deb.debian.org/debian bookworm main contrib
deb-src http://security.debian.org bookworm-security main

使用默认签名转换:

./convert-sources.sh --default-signed-by /etc/apt/key.gpg sources.list deb822.sources

输出 (Deb822格式):

Types: deb
URIs: https://deb.debian.org/debian
Suites: bookworm
Components: main contrib
Signed-By: /usr/key.gpg

Types: deb-src
URIs: http://security.debian.org
Suites: bookworm-security
Components: main
Signed-By: /etc/apt/key.gpg

该脚本能够正确处理各种复杂的源格式,并确保生成符合Debian要求的Deb822格式文件,同时强制包含必要的安全签名信息。

发表评论

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理