当前位置: 首页 > article >正文

【脚本 完全参数化的通用 APT 源配置方案-Debian/Ubuntu】

通过脚本在 Debian/Ubuntu 系统上一键切换 APT 源

如Dockerfile中 使用某个源(比如 aliyun)

假设你的目录结构是:

.
├── Dockerfile
└── switch-apt-source.sh
FROM ubuntu:22.04# 把脚本拷贝到镜像中
COPY switch-apt-source.sh /usr/local/bin/switch-apt-source.sh# 赋可执行权限并执行脚本,切换为 aliyun 源,然后更新并安装示例软件
RUN chmod +x /usr/local/bin/switch-apt-source.sh \&& /usr/local/bin/switch-apt-source.sh -s aliyun  --clean-cache --remove-extra-sources -y  \&& apt-get install -y curl vim  \&& rm -rf /var/lib/apt/lists/*

使用指南

脚本版本: switch-apt-source.sh v1.0.7
可用镜像源:

  • huawei (HTTP)-华为(默认)

  • aliyun (HTTP)-阿里

  • ustc (HTTPS)-中科大

  • tsinghua (HTTPS)-清华

  • official (HTTP)-官方

Usage: ./apt.sh [ -s <source_name> ] [ -r ] [ --dry-run ] [ --clean-cache ] [ --remove-extra-sources ] [-y]

-h 帮助
-s|–source 指定要切换的镜像源(默认为 huawei)
-r|–with-src 额外写入 deb-src 源行(源码包)
–dry-run 仅打印最终会写入的内容,不实际覆盖源文件
–clean-cache 切换完源后自动执行 apt-get update && apt-get autoclean
–remove-extra-sources 移除 /etc/apt/sources.list.d/ 目录下的所有额外源
-y|–assume-yes 自动回答所有提示为 yes(适用于自动化场景)

示例:
./apt.sh -h
./apt.sh -s aliyun
./apt.sh --source tsinghua --with-src -y
./apt.sh -s ustc --dry-run
./apt.sh -s official --clean-cache --remove-extra-sources -y

#!/usr/bin/env bash
#
# switch-apt-source.sh
# 用于在 Debian/Ubuntu 系统上一键切换 APT 源
#
# Usage:
#   ./switch-apt-source.sh -s <source_name> [-r] [--dry-run] [--clean-cache] [--remove-extra-sources] [-y]
#
# 可选 source_name:
#   huawei      -> 华为云镜像 (HTTP)
#   aliyun      -> 阿里云镜像 (HTTP)
#   tsinghua    -> 清华大学 TUNA 镜像 (HTTPS)
#   ustc        -> 中国科学技术大学镜像 (HTTPS)
#   official    -> 官方默认镜像 (HTTP)
#   (默认使用 huawei)
#
# 主要优化:
# 1. 智能处理 HTTPS 源依赖问题
# 2. 减少不必要的包安装
# 3. 提高切换速度
# 4. 增强最小化系统兼容性set -euo pipefail#################################
# 0. 常量与全局变量            #
#################################
SCRIPT_VERSION="1.0.7"
BACKUP_DIR="/var/backups/apt-sources"
SRC_FILE="/etc/apt/sources.list"
SRC_DIR="/etc/apt/sources.list.d"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)# 颜色定义
RED='\033[1;31m'
GREEN='\033[1;32m'
BLUE='\033[1;34m'
YELLOW='\033[1;33m'
NC='\033[0m'  # No Color#################################
# 1. 镜像源配置                #
#################################
declare -A MIRROR_CONFIG=(# 名称  Debian基础URL                           Debian安全URL                        Ubuntu基础URL                           Ubuntu安全URL[huawei]="http://repo.huaweicloud.com/debian         http://repo.huaweicloud.com/debian-security    http://repo.huaweicloud.com/ubuntu         http://repo.huaweicloud.com/ubuntu"[aliyun]="http://mirrors.aliyun.com/debian           http://mirrors.aliyun.com/debian-security      http://mirrors.aliyun.com/ubuntu           http://mirrors.aliyun.com/ubuntu"[tsinghua]="https://mirrors.tuna.tsinghua.edu.cn/debian     https://mirrors.tuna.tsinghua.edu.cn/debian-security    https://mirrors.tuna.tsinghua.edu.cn/ubuntu     https://mirrors.tuna.tsinghua.edu.cn/ubuntu"[ustc]="https://mirrors.ustc.edu.cn/debian           https://mirrors.ustc.edu.cn/debian-security    https://mirrors.ustc.edu.cn/ubuntu         https://mirrors.ustc.edu.cn/ubuntu"[official]="http://deb.debian.org/debian             http://security.debian.org/debian-security      http://archive.ubuntu.com/ubuntu           http://security.ubuntu.com/ubuntu"
)# HTTP 回退源(当 HTTPS 失败时使用)
declare -A HTTP_FALLBACKS=([tsinghua]="http://mirrors.tuna.tsinghua.edu.cn"[ustc]="http://mirrors.ustc.edu.cn"
)# 定义 HTTP 源列表
HTTP_SOURCES=("huawei" "aliyun" "official")#################################
# 2. 函数:打印使用说明         #
#################################
print_usage() {echo -e "${BLUE}脚本版本: switch-apt-source.sh v${SCRIPT_VERSION}${NC}"echo -e "${BLUE}可用镜像源:${NC}"for source in "${!MIRROR_CONFIG[@]}"; doif [[ " ${HTTP_SOURCES[*]} " =~ " ${source} " ]]; thenecho "  - $source (HTTP)"elseecho "  - $source (HTTPS)"fidonecat << EOFUsage: $0 [ -s <source_name> ] [ -r ] [ --dry-run ] [ --clean-cache ] [ --remove-extra-sources ] [-y]-s|--source           指定要切换的镜像源(默认为 huawei)-r|--with-src         额外写入 deb-src 源行(源码包)--dry-run             仅打印最终会写入的内容,不实际覆盖源文件--clean-cache         切换完源后自动执行 apt-get update && apt-get autoclean--remove-extra-sources 移除 /etc/apt/sources.list.d/ 目录下的所有额外源-y|--assume-yes       自动回答所有提示为 yes(适用于自动化场景)示例:$0 -s aliyun$0 --source tsinghua --with-src -y$0 -s ustc --dry-run$0 -s official --clean-cache --remove-extra-sources -y
EOFexit 0
}#################################
# 3. 函数:列出可选镜像源       #
#################################
list_sources() {echo -e "${BLUE}支持的镜像源列表:${NC}"for source in "${!MIRROR_CONFIG[@]}"; doif [[ " ${HTTP_SOURCES[*]} " =~ " ${source} " ]]; thenecho "  - $source (HTTP)"elseecho "  - $source (HTTPS)"fidoneexit 0
}#################################
# 4. 函数:检查 HTTPS 依赖     #
#################################
check_https_dependencies() {# 仅对 HTTPS 源检查依赖if [[ " ${HTTP_SOURCES[*]} " =~ " ${SOURCE_NAME} " ]]; thenreturn 0  # HTTP 源不需要额外依赖fi# 检查是否已安装 ca-certificatesif ! dpkg -s ca-certificates &>/dev/null; thenecho -e "${RED}错误:系统缺少 ca-certificates 包,无法访问 HTTPS 源${NC}"echo -e "${YELLOW}请先安装 ca-certificates:apt-get install -y ca-certificates${NC}"# 检查是否有 HTTP 回退源if [[ -n "${HTTP_FALLBACKS[$SOURCE_NAME]:-}" ]]; thenif [[ "$ASSUME_YES" == true ]]; thenecho -e "${YELLOW}自动回退到 HTTP 源...${NC}"BASE_URL="http://${BASE_URL#*://}"SECURITY_URL="http://${SECURITY_URL#*://}"return 0elseecho -e "${YELLOW}是否回退到 HTTP 源?(y/N)${NC}"read -rp " " ynif [[ "$yn" =~ ^[Yy]$ ]]; thenecho -e "${YELLOW}正在回退到 HTTP 源...${NC}"BASE_URL="http://${BASE_URL#*://}"SECURITY_URL="http://${SECURITY_URL#*://}"return 0fififiexit 1fireturn 0
}
#################################
# 5. 参数解析                  #
#################################
SOURCE_NAME="huawei"   # 默认华为源
ADD_DEBSRC=false       # 是否写入 deb-src
DRY_RUN=false          # 是否仅打印,不实际覆盖
CLEAN_CACHE=false      # 是否切换完后自动清理缓存
REMOVE_EXTRA_SOURCES=false # 是否移除额外源
ASSUME_YES=false       # 是否自动回答 yeswhile [[ $# -gt 0 ]]; docase "$1" in-s|--source)if [[ -n "${2-}" && ! "$2" =~ ^- ]]; thenSOURCE_NAME="$2"shiftelseecho -e "${RED}错误:-s/--source 选项缺少参数${NC}"exit 1fi;;--source=*)SOURCE_NAME="${1#*=}";;-r|--with-src)ADD_DEBSRC=true;;--dry-run)DRY_RUN=true;;--clean-cache)CLEAN_CACHE=true;;--remove-extra-sources)REMOVE_EXTRA_SOURCES=true;;-y|--assume-yes)ASSUME_YES=true;;-l|--list)list_sources;;-h|--help)print_usage;;*)echo -e "${RED}错误:未知选项 '$1'${NC}"print_usageexit 1;;esacshift
done#################################
# 6. 验证镜像源名称是否有效     #
#################################
if [[ -z "${MIRROR_CONFIG[$SOURCE_NAME]-}" ]]; thenecho -e "${RED}错误:不支持的镜像源 '${SOURCE_NAME}'${NC}"echo -e "${BLUE}可用源:${NC}"for source in "${!MIRROR_CONFIG[@]}"; doecho "  - $source"doneexit 1
fi#################################
# 7. 检查是否以 root 执行       #
#################################
if [[ $EUID -ne 0 ]]; thenecho -e "${RED}错误:请使用 root 权限运行此脚本${NC}"exit 1
fi#################################
# 8. 获取操作系统信息          #
#################################
if [[ ! -f /etc/os-release ]]; thenecho -e "${RED}错误:无法识别操作系统,请确保是 Debian/Ubuntu 系统。${NC}"exit 1
fi# 加载系统信息
. /etc/os-release
DIST_ID=$(echo "${ID:-unknown}" | tr '[:upper:]' '[:lower:]')
DIST_CODENAME=$(echo "${VERSION_CODENAME:-}" | tr '[:upper:]' '[:lower:]')if [[ -z "$DIST_CODENAME" ]]; then# 尝试使用 lsb_release 获取版本代号if command -v lsb_release &>/dev/null; thenDIST_CODENAME=$(lsb_release -cs)elseecho -e "${YELLOW}警告:无法获取系统版本代号,使用默认值 bookworm${NC}"DIST_CODENAME="bookworm"fi
fi# 获取 Debian 主版本号
DEB_MAJOR_VERSION=""
if [[ "$DIST_ID" == "debian" ]]; thenDEB_MAJOR_VERSION=$(echo "${VERSION_ID:-}" | cut -d. -f1)
fi# 系统架构
DIST_ARCH=$(dpkg --print-architecture)#################################
# 9. 解析镜像配置              #
#################################
read -r -a URLS <<< "${MIRROR_CONFIG[$SOURCE_NAME]}"
if [[ ${#URLS[@]} -lt 4 ]]; thenecho -e "${RED}错误:镜像源配置不完整,请检查脚本配置${NC}"exit 1
fi# 根据系统类型选择 URL
if [[ "$DIST_ID" == "debian" ]]; thenBASE_URL="${URLS[0]}"SECURITY_URL="${URLS[1]}"
elseBASE_URL="${URLS[2]}"SECURITY_URL="${URLS[3]}"
fi# 检查 HTTPS 依赖
HAS_CURL=false
if check_https_dependencies; thenHAS_CURL=true
fi#################################
# 10. 设置组件和安全源路径     #
#################################
if [[ "$DIST_ID" == "debian" ]]; thenCOMPONENTS="main contrib non-free"# Debian 12+ 默认再加 non-free-firmwareif [[ -n "$DEB_MAJOR_VERSION" && "$DEB_MAJOR_VERSION" -ge 12 ]]; thenCOMPONENTS="${COMPONENTS} non-free-firmware"fi# 安全源路径:Debian 9 及更早 "<codename>/updates",10+ "<codename>-security"if [[ -n "$DEB_MAJOR_VERSION" && "$DEB_MAJOR_VERSION" -lt 10 ]]; thenSECURITY_SUITE="${DIST_CODENAME}/updates"elseSECURITY_SUITE="${DIST_CODENAME}-security"fi
else# Ubuntu 系列COMPONENTS="main restricted universe multiverse"SECURITY_SUITE="${DIST_CODENAME}-security"
fi#################################
# 11. 备份与旧备份自动清理      #
#################################
mkdir -p "$BACKUP_DIR"# 自动清理旧备份
if [[ $(find "$BACKUP_DIR" -type f -name 'sources.list.bak.*' 2>/dev/null | wc -l) -gt 0 ]]; thenfind "$BACKUP_DIR" -type f -name 'sources.list.bak.*' -mtime +30 -delete 2>/dev/null || true
fiBACKUP_FILE="${BACKUP_DIR}/sources.list.bak.${TIMESTAMP}"# 检查源文件状态
if [[ ! -e "$SRC_FILE" ]]; then[[ "$ASSUME_YES" == false ]] && echo -e "${YELLOW}源文件不存在,自动创建新文件${NC}"touch "$SRC_FILE"chmod 644 "$SRC_FILE"
elif [[ ! -s "$SRC_FILE" ]]; then[[ "$ASSUME_YES" == false ]] && echo -e "${YELLOW}源文件为空,继续写入新配置${NC}"
fi# 文件权限检查
if [[ -e "$SRC_FILE" && ! -w "$SRC_FILE" ]]; thenchmod u+w "$SRC_FILE"
fiecho "正在备份原文件: ${SRC_FILE} -> ${BACKUP_FILE}"
cp -f "$SRC_FILE" "$BACKUP_FILE"#################################
# 12. 处理额外源 (可选)        #
#################################
if [[ "$REMOVE_EXTRA_SOURCES" == true ]]; then[[ "$ASSUME_YES" == false ]] && echo -e "${YELLOW}正在移除额外源...${NC}"if [[ -d "$SRC_DIR" ]]; thenBACKUP_EXTRA_DIR="${BACKUP_DIR}/sources.list.d.${TIMESTAMP}"mkdir -p "$BACKUP_EXTRA_DIR"if find "$SRC_DIR" -maxdepth 1 -type f | grep -q .; thenmv -f "${SRC_DIR}"/* "$BACKUP_EXTRA_DIR/" 2>/dev/null || true[[ "$ASSUME_YES" == false ]] && echo -e "${GREEN}已备份并移除额外源到: ${BACKUP_EXTRA_DIR}${NC}"fifi
fi#################################
# 13. 生成临时文件并写入新源   #
#################################
TMPFILE=$(mktemp "/tmp/sources.list.XXXXXX")
chmod 644 "$TMPFILE"{echo "# ${SOURCE_NAME} 镜像源 (自动生成) - ${PRETTY_NAME} [${DIST_ARCH}]"echo "# 生成时间: $(date '+%Y-%m-%d %H:%M:%S')"echo "# 脚本版本: switch-apt-source.sh v${SCRIPT_VERSION}"echo "# 协议: $(echo "$BASE_URL" | cut -d: -f1)"echoecho "deb [arch=${DIST_ARCH}] ${BASE_URL} ${DIST_CODENAME} ${COMPONENTS}"$ADD_DEBSRC && echo "deb-src [arch=${DIST_ARCH}] ${BASE_URL} ${DIST_CODENAME} ${COMPONENTS}"echoecho "deb [arch=${DIST_ARCH}] ${SECURITY_URL} ${SECURITY_SUITE} ${COMPONENTS}"$ADD_DEBSRC && echo "deb-src [arch=${DIST_ARCH}] ${SECURITY_URL} ${SECURITY_SUITE} ${COMPONENTS}"echoecho "deb [arch=${DIST_ARCH}] ${BASE_URL} ${DIST_CODENAME}-updates ${COMPONENTS}"$ADD_DEBSRC && echo "deb-src [arch=${DIST_ARCH}] ${BASE_URL} ${DIST_CODENAME}-updates ${COMPONENTS}"echoecho "deb [arch=${DIST_ARCH}] ${BASE_URL} ${DIST_CODENAME}-backports ${COMPONENTS}"$ADD_DEBSRC && echo "deb-src [arch=${DIST_ARCH}] ${BASE_URL} ${DIST_CODENAME}-backports ${COMPONENTS}"
} > "$TMPFILE"#################################
# 14. Dry-run 模式处理         #
#################################
if [[ "$DRY_RUN" == true ]]; thenecho -e "\n${BLUE}---- Dry-run 模式:以下内容将写入 ${SRC_FILE} ----${NC}"cat "$TMPFILE"rm -f "$TMPFILE"echo -e "\n${GREEN}✓ Dry-run 完成,未实际覆盖任何文件。${NC}"exit 0
fi#################################
# 15. 原子替换 sources.list    #
#################################
mv -f "$TMPFILE" "$SRC_FILE"echo -e "\n${GREEN}✓ 已成功将 APT 源切换为: ${SOURCE_NAME}${NC}"
echo "主仓库: ${BASE_URL}"
echo "安全更新: ${SECURITY_URL}"
echo "组件: ${COMPONENTS}"
$ADD_DEBSRC && echo "已额外写入 deb-src 行。"#################################
# 16. 后续操作提示             #
#################################
echo -e "\n${BLUE}▷ 下一步操作建议:${NC}"
echo "  1. 更新软件包列表: apt update"
echo "  2. 升级所有软件包: apt upgrade"echo -e "\n${BLUE}▷ 回滚方法:${NC}"
echo "  cp -v ${BACKUP_FILE} ${SRC_FILE}"
[[ "$REMOVE_EXTRA_SOURCES" == true ]] && echo "  mv ${BACKUP_EXTRA_DIR}/* ${SRC_DIR}/"#################################
# 17. 清理缓存(可选)         #
#################################
if [[ "$CLEAN_CACHE" == true ]]; thenecho -e "\n${BLUE}正在执行 apt-get update && apt-get autoclean ...${NC}"if apt-get update -y; thenapt-get autoclean -yecho -e "${GREEN}✓ 缓存清理完成。${NC}"elseecho -e "${YELLOW}警告:apt-get update 失败,跳过 autoclean${NC}"fi
fiexit 0

相关文章:

【脚本 完全参数化的通用 APT 源配置方案-Debian/Ubuntu】

通过脚本在 Debian/Ubuntu 系统上一键切换 APT 源 如Dockerfile中 使用某个源&#xff08;比如 aliyun&#xff09; 假设你的目录结构是&#xff1a; . ├── Dockerfile └── switch-apt-source.shFROM ubuntu:22.04# 把脚本拷贝到镜像中 COPY switch-apt-source.sh /us…...

数据集笔记:SeekWorld

提出了一项新任务&#xff1a;地理定位推理&#xff08;Geolocation Reasoning&#xff09; 该任务要求模型在感知视觉信息的同时&#xff0c;推理出图像中视觉语义所隐含的高级逻辑关系&#xff0c;从而确定图像的拍摄地点 TheEighthDay/SeekWorld at main 构建了一个基于规则…...

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表 第 一 题 - - - 移 除 链 表 元 素方 法 一 - - - 原 地 删 除方 法 二 - - - 双 指 针方 法 三 - - - 尾 插 第 二 题 - - - 反 转 链 表方 法 一 - - - 迭 代方 法 二 - - - 采 用 头 插 创 建 新 链 表 总 结 &a…...

Jenkins实践(10):pipeline构建历史展示包名和各阶段间传递参数

Jenkins实践(10):构建历史展示包名和pipeline各阶段间传递参数 1、构建历史展示包名 参考:https://blog.csdn.net/fen_fen/article/details/148167868 1.1、方法说明 Jenkins版本:Jenkins2.452 通过修改 currentBuild.displayName 和 currentBuild.description 实现: …...

从头认识AI-----循环神经网络(RNN)

前言 前面我们讲了传统的神经网络&#xff0c;如MLP、CNN&#xff0c;这些网络中的输入都被单独处理&#xff0c;没有上下文之间的信息传递机制&#xff0c;这在处理序列数据&#xff08;如语音、文本、时间序列&#xff09;时很鸡肋&#xff1a; 如何理解一句话中“前后文”的…...

配置远程无密登陆ubuntu服务器时无法连接问题排查

配置远程无密登陆ubuntu服务器时无法连接问题排查 登陆端排查服务器端登陆排查 登陆端排查 ssh -v 用户名Ubuntu服务器IP可能日志输出 debug1: Authentications that can continue: publickey,password服务器端登陆排查 sudo tail -f /var/log/auth.log可能日志输出 Authen…...

5.31 数学复习笔记 22

前面的笔记&#xff0c;全部写成一段&#xff0c;有点难以阅读。现在改进一下排版。另外&#xff0c;写笔记实际上就是图一个放松呢&#xff0c;关键还是在于练习。 目前的计划是&#xff0c;把讲义上面的高数例题搞清楚之后&#xff0c;大量刷练习册上面的题。感觉不做几本练…...

kafka学习笔记(三、消费者Consumer使用教程——使用实例及及核心流程源码讲解)

1.核心概念与架构 1.1.消费者与消费者组 Kafka消费者是订阅主题&#xff08;Topic&#xff09;并拉取消息的客户端实例&#xff0c;其核心逻辑通过KafkaConsumer类实现。消费者组&#xff08;Consumer Group&#xff09;是由多个逻辑关联的消费者组成的集合。 核心规则 同一…...

鸿蒙 Form Kit(卡片开发服务)

Form Kit&#xff08;卡片开发服务&#xff09; 鸿蒙应用中&#xff0c;Form / Card / Widget 都翻译为“卡片” Form Kit&#xff08;卡片开发服务&#xff09;提供一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到服务卡片&#xff0c;以达到服务直达、减少跳转…...

算力卡上部署OCR文本识别服务与测试

使用modelscope上的图像文本行检测和文本识别模型进行本地部署并转为API服务。 本地部署时把代码中的检测和识别模型路径改为本地模型的路径。 关于模型和代码原理可以参见modelscope上这两个模型相关的页面&#xff1a; iic/cv_resnet18_ocr-detection-db-line-level_damo iic…...

KWIC—Implicit Invocation

KWIC—Implicit Invocation ✏️ KWIC—Implicit Invocation 文章目录 KWIC—Implicit Invocation&#x1f4dd;KWIC—Implicit Invocation&#x1f9e9;KWIC&#x1f9e9;核心组件&#x1f9e9;ImplementationScheme⚖️ 隐式调用 vs 显式调用对比 &#x1f31f; 总结 &#x…...

Visual Studio 2022 发布独立的 exe 文件

我们在用 Visual Studio 2022 写好一个 exe 程序之后&#xff0c;如果想把这个拿到其他地方运行&#xff0c;需要把 exe 所在的文件夹一起拿过去。 编译出来的 exe 文件需要其他几个文件一同放在同一目录才能运行&#xff0c;原因在于默认情况下&#xff0c;Visual Studio 是把…...

11.4java语言执行浅析4

编译成字节码&#xff08;.class 文件&#xff09; 使用 javac 命令将源代码编译为 Java 字节码&#xff08;bytecode&#xff09; 它不是机器码&#xff0c;而是 JVM 能理解的中间语言&#xff08;字节码&#xff09;&#xff0c;具有平台无关性。 编译过程简要&#xff1…...

Excel 操作 转图片,转pdf等

方式一 spire.xls.free&#xff08;没找设置分辨率的方法&#xff09; macOs开发Java GUI程序提示缺少字体问题解决 Spire.XLS&#xff1a;一款Excel处理神器_spire.xls免费版和收费版的区别-CSDN博客 官方文档 Spire.XLS for Java 中文教程 <dependency><groupI…...

说说 Kotlin 中的 Any 与 Java 中的 Object 有何异同?

在 Kotlin 中 Any 类型和 Java 中的 Object 类都是所有类型的根类型。 1 基本定义 Kotlin 中的 Any 和 Any?&#xff1a; Any&#xff1a;是所有非空类型的根类型&#xff1b;Any?&#xff1a;是所有可空类型的根类型&#xff1b; Java 中的 Object&#xff1a; 是所有类…...

python分配方案数 2023年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析

python分配方案数 2023全国青少年信息素养大赛Python编程挑战赛复赛真题解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解...

《信号与系统》第 5 章 离散时间傅里叶变换

5.0 引言 这一章将介绍并研究离散时间傅里叶变换&#xff0c;这样就完整地建立了傅里叶分析方法。 5.1 非周期信号的表示&#xff1a;离散时间傅里叶变换 5.1.1 离散时间傅里叶变换的导出 在第4章看到&#xff1a;一个连续时间周期方波的傅里叶级数可以看成一个包络函数的采…...

动态IP与区块链:重构网络信任的底层革命

在数字经济蓬勃发展的今天&#xff0c;网络安全与数据隐私正面临前所未有的挑战。动态IP技术与区块链的深度融合&#xff0c;正在构建一个去中心化、高可信的网络基础设施&#xff0c;为Web3.0时代的到来奠定基础。 一、技术碰撞&#xff1a;动态IP与区块链的天然契合 动态I…...

目前主流图像分类模型的详细对比分析

以下是目前主流图像分类模型的详细对比分析&#xff0c;结合性能、架构特点及应用场景进行整理&#xff1a; 一、主流模型架构分类与定量对比 模型名称架构类型核心特点ImageNet Top-1准确率参数量&#xff08;百万&#xff09;计算效率典型应用场景ResNetCNN残差连接解决梯度…...

uniapp使用Canvas生成电子名片

uniapp使用Canvas生成电子名片 工作中有生成电子名片的一个需求&#xff0c;刚刚好弄了发一下分享分享 文章目录 uniapp使用Canvas生成电子名片前言一、上代码&#xff1f;总结 前言 先看效果 一、上代码&#xff1f; 不对不对应该是上才艺&#xff0c;哈哈哈 <template…...

世冠科技亮相中汽中心科技周MBDE会议,共探汽车研发数字化转型新路径

近日&#xff0c;中汽中心2025年科技周MBDE前沿应用主题会议在天津成功举办。本次会议以“智汇津门共探MBDE前沿应用新征程”为主题&#xff0c;聚焦基于模型的数字工程&#xff08;MBDE&#xff09;方法论在汽车复杂系统研发中的创新实践与跨领域协同&#xff0c;旨在推动行业…...

Linux笔记---线程

1. 线程的介绍 1.1 线程的概念 基本定义&#xff1a; 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程&#xff08;Process&#xff09;之中&#xff08;或者说是进程的一部分、对进程的划分&#xff09;&#xff0c;是进程中的实际…...

MCP架构深度解析:从基础原理到核心设计

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…...

【监控】pushgateway中间服务组件

Pushgateway 是 Prometheus 生态中的一个中间服务组件&#xff0c;以独立工具形式存在&#xff0c;主要用于解决 Prometheus 无法直接获取监控指标的场景&#xff0c;弥补其定时拉取&#xff08;pull&#xff09;模式的不足。 其用途如下&#xff1a; 突破网络限制&#xff1…...

数据库暴露--Get型注入攻击

1.背景知识 1.1Post、Get的对比 特性GET 方法POST 方法HTTP 方法类型GETPOST数据位置URL 查询字符串(?key=value)请求体(Request Body)数据可见性明文显示在 URL 和浏览器历史中不可见(除非开发者工具查看)数据长度限制受 URL 长度限制(通常约 2048 字符)无明确限制(…...

AI炼丹日志-26 - crawl4ai 专为 AI 打造的爬虫爬取库 上手指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇&#xff1a; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 大数据篇 300&#xff1a; Hadoop&…...

ESP32-idf学习(四)esp32C3驱动lcd

一、前言 屏幕是人机交互的重要媒介&#xff0c;而且现在我们产品升级的趋势越来越高大尚&#xff0c;不少产品都会用lcd来做界面&#xff0c;而esp32c3在一些项目上是可以替代主mcu&#xff0c;所以驱动lcd也是必须学会的啦 我新买的这块st7789&#xff0c;突然发现是带触摸…...

【python】uv管理器

uv是一个速度极快的 Python 包和项目管理器&#xff0c;用 Rust 编写。 安装 安装uv之前&#xff0c;确保你的电脑不需要安装了python 在Windows下&#xff0c;可以使用官方的脚本直接安装 powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.…...

关于Web安全:7. WebShell 管理与持久化后门

一、菜刀马 菜刀马&#xff08;ChinaZ WebShell&#xff09; 是一种与“中国菜刀&#xff08;ChinaZ&#xff09;”客户端配合使用的 WebShell 木马&#xff0c;广泛应用于 Web 渗透测试中&#xff0c;主要使用 PHP/ASP/JSP 等语言编写。 它的本质是一个一句话木马&#xff0…...

音视频中的复用器

&#x1f3ac; 什么是复用器&#xff08;Muxer&#xff09;&#xff1f; 复用器&#xff08;muxer&#xff09;是负责把音频、视频、字幕等多个媒体流打包&#xff08;封装&#xff09;成一个单一的文件格式的组件。 &#x1f4a1; 举个形象的例子&#xff1a; 假设你有两样东…...