【脚本 完全参数化的通用 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习日记-day20-6.1

完成目标&#xff1a; 知识点&#xff1a; 1.集合_Collections集合工具类 方法:static <T> boolean addAll(Collection<? super T> c, T... elements)->批量添加元素 static void shuffle(List<?> list) ->将集合中的元素顺序打乱static <T>…

个人总结八股文之-基础篇(持续更新)

一、集合的分类有哪些&#xff1f; Java集合框架主要分为两大类&#xff1a;Collection和Map Collection主要分为以下三类&#xff1a; List&#xff1a;有序集合&#xff0c;允许重复元素。常见的实现类有ArrayList、LinkedList和Vector。 Set&#xff1a;无序集合&#xf…

leetcode hot100刷题日记——35.子集

解答&#xff1a; 方法一&#xff1a;选or不选的dfs&#xff08;输入视角&#xff09; 思路&#xff1a;[1,2,3]的全部子集可以看成是对数组的每一位数字做选择。 eg.空集就是一个数字都不选&#xff0c;[1,2]就是1&#xff0c;2选&#xff0c;3不选。 class Solution { pub…

华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《生成…

房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块

房屋租赁系统 JavaVue.jsSpringBoot&#xff0c;包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块 百度云盘链接&#xff1a;https://pan.baidu.com/s/1KmwOFzN9qogyaLQei3b6qw 密码&#xff1a;l2yn 摘 要 社会的发展和科学技术的进步&#xf…

Unity 中 Update、FixedUpdate 和 LateUpdate 的区别及使用场景

在Unity开发中,Update、FixedUpdate 和 LateUpdate 是生命周期函数中最常见也最容易混淆的一组。 一、调用时机 方法名调用频率调用时机说明Update()每帧调用一次跟随帧率(帧率高则调用频率高)FixedUpdate()固定时间间隔调用默认每 0.02 秒执行一次LateUpdate()每帧调用一次…

Docker镜像之windows系统

https://github.com/dockur/windows 在 Docker 容器中运行 Windows 功能 ISO 下载器KVM 加速基于网页的查看器 使用方法 启动容器并通过浏览器连接到端口 8006。整个安装过程将全自动完成&#xff0c;无需手动干预。当桌面界面出现时&#xff0c;表示 Windows 安装已完成&a…

C# 用户控件(User Control)详解:创建、使用与最佳实践

在C#应用程序开发中&#xff0c;用户控件&#xff08;User Control&#xff09;是一种强大的工具&#xff0c;它允许开发者将多个标准控件组合成一个可复用的自定义组件。无论是Windows Forms还是WPF&#xff0c;用户控件都能显著提高UI开发的效率&#xff0c;减少重复代码&…

pikachu靶场通关笔记09 XSS关卡05-DOM型XSS-X

目录 一、XSS 二、DOM型XSS 三、源码分析 1、打开DOM-X型XSS关卡 2、XSS探测 3、源码分析 四、渗透实战 1、Payload1 2、Payload2 3、Payload3 五、DOM型XSS与DOM-X型XSS区别 本系列为通过《pikachu靶场通关笔记》的XSS攻击关卡(共10关&#xff09;渗透集合&#xf…

湖北理元理律所:企业债务重组中的“法律缓冲带”设计

一、担保链危机的法律拆解技术 中小企业债务困局多源于担保链蔓延。本所处理某制造企业案例时&#xff0c;运用三层法律工具阻断风险传导&#xff1a; 1. 主合同审查 → 发现银行擅自变更借款用途 → 援引《民法典》第695条解除担保 2. 股东责任切割 → 证明企业财产独立 …

调整数据集的方法

我们对worldquant中的数据&#xff0c; 对数据频率怎么算 在 WorldQuant 平台中&#xff0c;数据更新频率是影响量化策略有效性、回测准确性和实盘交易表现的核心因素之一。它决定了数据的时效性和连续性&#xff0c;直接关系到策略能否捕捉市场动态、应对突发事件或适应不同…

[Linux] Linux 系统从启动到驱动加载

Linux 系统从启动到驱动加载 文章目录 Linux 系统从启动到驱动加载一、硬件上电与 BIOS/UEFI 阶段1. 1 硬件上电初始化1.2 BIOS/UEFI执行过程1.3 Bootloader加载细节 二、Bootloader 阶段三、Linux 内核初始化3.1 架构相关初始化&#xff08;setup_arch&#xff09;3.2 核心子系…

Spring Boot DevTools 热部署

在Spring Boot项目中加入 spring-boot-devtools 热部署依赖启动器后&#xff0c;通常不需要手动重启项目即可让更改生效。spring-boot-devtools 的核心特性之一就是自动重启或热加载。 Spring Boot DevTools 热部署关键知识点 &#x1f525; 目的&#xff1a;spring-boot-devt…

uni-app学习笔记十五-vue3页面生命周期(二)

onShow&#xff1a;用于监听页面显示&#xff0c;页面每次出现在屏幕上都触发&#xff0c;包括从下级页面点返回露出当前页面&#xff1b; onHide:监听页面隐藏&#xff0c;当离开当前页面时触发。 示例代码&#xff1a; <template><view>姓名&#xff1a;{{nam…

LIKE ‘%xxx%‘ 和 LIKE ‘xxx%‘ 的索引影响分析

LIKE ‘%xxx%’ 和 LIKE ‘xxx%’ 的索引影响分析 一、基础概念解析 1.1 LIKE操作符的工作原理 LIKE是SQL中用于模式匹配的操作符,支持两种通配符: %:匹配任意数量字符(包括零个字符)_:匹配单个字符go专栏:https://duoke360.com/tutorial/path/golang 1.2 数据库索引…

【软件测试】测试框架(unittest/pytest)

本文介绍了Python 中最常用的两个测试框架&#xff1a;unittest 和 pytest&#xff0c;帮助你编写更规范、可维护的自动化测试用例。 一、unittest 框架 unittest 是 Python 内置的标准库&#xff0c;无需额外安装&#xff0c;适合初学者入门。它借鉴了 JUnit 的设计理念&…

麒麟信安安装谷歌浏览器

参考文档 麒麟信安系统Chrome离线安装包&#xff1a;高效便捷的浏览器解决方案-CSDN博客 项目文件预览 - 麒麟信安系统Chrome离线安装包:本仓库提供了一个适用于麒麟信安系统的Chrome浏览器离线安装包。该安装包包含了所有必要的依赖文件&#xff0c;并且已经对系统中已有的依…

Wireshark 使用教程:让抓包不再神秘

一、什么是 tshark&#xff1f; tshark 是 Wireshark 的命令行版本&#xff0c;支持几乎所有 Wireshark 的核心功能。它可以用来&#xff1a; 抓包并保存为 pcap 文件 实时显示数据包信息 提取指定字段进行分析 配合 shell 脚本完成自动化任务 二、安装与验证 Kali Linux…

从0到1:多医院陪诊小程序开发笔记(上)

概要设计 医院陪诊预约小程序&#xff1a;随着移动互联网的普及&#xff0c;越来越多的医院陪诊服务开始向线上转型, 传统的预约方式往往效率低下&#xff0c;用户需耗费大量时间进行电话预约或现场排队&#xff0c;陪诊服务预约小程序集多种服务于一体&#xff0c;可以提高服…

定时任务:springboot集成xxl-job-core(二)

定时任务实现方式&#xff1a; 存在的问题&#xff1a; xxl-job的原理&#xff1a; 可以根据服务器的个数进行动态分片&#xff0c;每台服务器分到的处理数据是不一样的。 1. 多台机器动态注册 多台机器同时配置了调度器xxl-job-admin之后&#xff0c;执行器那里会有多个注…