#有现成命令可以使用🥲
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"
使用说明
- 保存脚本为
convert-sources.sh
- 添加执行权限:
chmod +x convert-sources.sh
- 基本用法:
./convert-sources.sh 输入文件 输出文件
- 当源条目缺少signed-by时使用默认签名:
./convert-sources.sh --default-signed-by /path/to/default.key 输入文件 输出文件
功能特点
-
自动处理传统格式的以下元素:
deb
和deb-src
类型- 方括号中的选项(包括多个选项)
- URI地址
- 套件名称
- 组件列表
-
强制包含Signed-By字段:
- 优先使用源条目中的signed-by选项
- 支持通过命令行参数指定默认签名
- 完全验证签名存在性
-
错误处理:
- 自动跳过空行和注释
- 严格的参数验证
- 详细的错误提示
-
格式转换:
- 自动生成正确的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格式文件,同时强制包含必要的安全签名信息。