Loading... # Ubuntu `apt`命令使用详解 在**Ubuntu**等基于Debian的Linux发行版中,**`apt`**(Advanced Package Tool)是最常用的包管理工具之一。它简化了软件包的安装、更新、升级和管理过程,为用户和系统管理员提供了强大的功能和灵活性。本文将深入探讨 `apt`命令的使用方法,涵盖从基本操作到高级配置,帮助用户高效地管理Ubuntu系统中的软件包。 ## 目录 1. [引言](#引言) 2. [`apt`概述](#apt概述) - [`apt`与 `apt-get`的区别](#apt与apt-get的区别) - [`apt`的工作原理](#apt的工作原理) 3. [基础命令](#基础命令) - [`apt update`](#apt-update) - [`apt upgrade`](#apt-upgrade) - [`apt install`](#apt-install) - [`apt remove`](#apt-remove) - [`apt purge`](#apt-purge) - [`apt autoremove`](#apt-autoremove) 4. [高级命令](#高级命令) - [`apt search`](#apt-search) - [`apt show`](#apt-show) - [`apt list`](#apt-list) - [`apt clean`](#apt-clean) - [`apt autoclean`](#apt-autoclean) - [`apt policy`](#apt-policy) - [`apt full-upgrade`](#apt-full-upgrade) 5. [管理软件源](#管理软件源) - [添加软件源](#添加软件源) - [移除软件源](#移除软件源) - [更新软件源列表](#更新软件源列表) 6. [处理依赖关系](#处理依赖关系) - [安装依赖包](#安装依赖包) - [修复破损的依赖](#修复破损的依赖) 7. [使用 `apt`与 `sudo`](#使用apt与sudo) 8. [最佳实践](#最佳实践) 9. [常见问题与解决方法](#常见问题与解决方法) - [问题1:软件包无法安装](#问题1软件包无法安装) - [问题2:依赖关系错误](#问题2依赖关系错误) - [问题3:软件包版本冲突](#问题3软件包版本冲突) 10. [总结](#总结) 11. [附录](#附录) - [常用 `apt`命令汇总表](#常用apt命令汇总表) - [`apt`命令示例解释表](#apt命令示例解释表) ## 引言 在Ubuntu系统中,**软件包管理**是系统维护的重要组成部分。`apt`作为Ubuntu的核心包管理工具,提供了简单而强大的命令行接口,帮助用户轻松安装、更新和管理系统软件。无论是日常使用还是系统维护,掌握 `apt`命令都是每位Ubuntu用户的必备技能。 ## `apt`概述 ### `apt`与 `apt-get`的区别 `apt`和 `apt-get`都是用于管理Debian及其衍生系统(如Ubuntu)的包管理工具。尽管功能上有很多重叠,但 `apt`是较新的命令,旨在整合和简化 `apt-get`和 `apt-cache`的功能,提供更友好的用户体验。 **主要区别如下:** | **特性** | **`apt-get`** | **`apt`** | | ---------------------- | ------------------------------------ | ------------------------------ | | **引入时间** | 较早 | 较新(从Ubuntu 16.04开始) | | **命令集** | 分散在 `apt-get`和 `apt-cache`中 | 集成多种功能于单一命令中 | | **用户界面** | 主要面向脚本和高级用户 | 提供更友好的输出,适合日常使用 | | **功能覆盖** | 专注于包管理 | 包括包管理和更多便捷功能 | | **建议使用场景** | 脚本自动化和高级操作 | 日常软件安装和系统维护 | ### `apt`的工作原理 `apt`通过与软件源(repositories)交互,管理软件包的下载和安装。软件源是存储软件包的服务器,包含各种软件的二进制包和源代码包。`apt`利用这些软件源的信息,解决依赖关系,确保软件包的正确安装和更新。 **基本工作流程:** 1. **更新包列表**:从软件源获取最新的软件包信息。 2. **搜索和选择软件包**:根据用户需求查找和选择软件包。 3. **下载和安装**:从软件源下载软件包及其依赖,并进行安装。 4. **升级和维护**:定期检查和更新已安装的软件包,保持系统最新。 ## 基础命令 掌握 `apt`的基础命令,是有效管理Ubuntu系统的关键。以下详细介绍常用的基础命令及其使用方法。 ### `apt update` ```bash sudo apt update ``` **解释**: - **功能**:更新本地的软件包索引,使系统了解最新的软件包版本和可用更新。 - **作用**:确保后续的安装和升级操作基于最新的软件包信息,避免版本冲突和依赖问题。 - **示例输出**: ``` Hit:1 http://archive.ubuntu.com/ubuntu focal InRelease Get:2 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB] Get:3 http://archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB] ... Reading package lists... Done ``` ### `apt upgrade` ```bash sudo apt upgrade ``` **解释**: - **功能**:升级所有已安装的软件包到最新版本,基于当前的软件包索引。 - **作用**:保持系统软件的最新状态,获取最新的功能和安全修复。 - **注意事项**:此命令不会删除任何已安装的软件包,也不会安装新的依赖包。如有需要安装新的包或删除现有包,请使用 `apt full-upgrade`。 - **示例输出**: ``` Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done The following packages will be upgraded: libexample1 libexample2 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 1,234 kB of archives. After this operation, 12.3 kB of additional disk space will be used. Do you want to continue? [Y/n] ``` ### `apt install` ```bash sudo apt install <package_name> ``` **解释**: - **功能**:安装指定的软件包及其依赖。 - **作用**:将新软件添加到系统中,供用户使用。 - **示例**: ```bash sudo apt install vim ``` **解释**:安装文本编辑器 `vim`。 - **选项**: - `-y`:自动回答“yes”以确认安装。 ```bash sudo apt install -y vim ``` - `--no-install-recommends`:仅安装必要的依赖,不包括推荐的包。 ```bash sudo apt install --no-install-recommends vim ``` ### `apt remove` ```bash sudo apt remove <package_name> ``` **解释**: - **功能**:卸载指定的软件包,但保留其配置文件。 - **作用**:从系统中移除不再需要的软件包,释放磁盘空间。 - **示例**: ```bash sudo apt remove vim ``` **解释**:卸载文本编辑器 `vim`,但保留其配置文件。 - **选项**: - `-y`:自动确认卸载。 ```bash sudo apt remove -y vim ``` ### `apt purge` ```bash sudo apt purge <package_name> ``` **解释**: - **功能**:卸载指定的软件包,并删除其所有配置文件。 - **作用**:完全移除软件包,确保系统中不留任何相关文件。 - **示例**: ```bash sudo apt purge vim ``` **解释**:卸载文本编辑器 `vim`及其所有配置文件。 - **选项**: - `-y`:自动确认卸载。 ```bash sudo apt purge -y vim ``` ### `apt autoremove` ```bash sudo apt autoremove ``` **解释**: - **功能**:自动移除系统中不再需要的包,通常是由于已卸载的软件包所依赖的其他包。 - **作用**:清理系统中冗余的依赖包,优化系统性能。 - **示例输出**: ``` Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be REMOVED: libexample1 libexample2 2 to remove and 0 not upgraded. After this operation, 1,234 kB of disk space will be freed. Do you want to continue? [Y/n] ``` ## 高级命令 除了基础命令,`apt`还提供了一系列高级命令,满足更复杂的软件包管理需求。 ### `apt search` ```bash apt search <keyword> ``` **解释**: - **功能**:在软件包索引中搜索与关键词匹配的软件包。 - **作用**:帮助用户查找需要的软件包名称和相关信息。 - **示例**: ```bash apt search nginx ``` **解释**:搜索与 `nginx`相关的软件包。 - **输出示例**: ``` Sorting... Done Full Text Search... Done nginx/bionic 1.14.0-0ubuntu1.7 amd64 high performance web server ``` ### `apt show` ```bash apt show <package_name> ``` **解释**: - **功能**:显示指定软件包的详细信息,包括版本、依赖、描述等。 - **作用**:获取软件包的详细信息,辅助决策是否安装或升级。 - **示例**: ```bash apt show nginx ``` **解释**:显示 `nginx`软件包的详细信息。 - **输出示例**: ``` Package: nginx Version: 1.14.0-0ubuntu1.7 Priority: optional Section: httpd Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Installed-Size: 1,234 kB Depends: libc6 (>= 2.14), libpcre3 (>= 2:8.39), zlib1g (>= 1:1.1.4) Description: high performance web server NGINX is a high performance web server, HTTP load balancer, and reverse proxy. ``` ### `apt list` ```bash apt list [options] [pattern] ``` **解释**: - **功能**:列出系统中可用或已安装的软件包。 - **作用**:查看软件包的安装状态和版本信息。 - **示例**: ```bash apt list --installed ``` **解释**:列出所有已安装的软件包。 - **选项**: - `--installed`:仅显示已安装的软件包。 - `--upgradable`:显示可升级的软件包。 ```bash apt list --upgradable ``` - **输出示例**: ``` Listing... nginx/bionic-updates,bionic-security 1.14.0-0ubuntu1.7 amd64 [upgradable from: 1.14.0-0ubuntu1.6] ``` ### `apt clean` ```bash sudo apt clean ``` **解释**: - **功能**:清除本地存储的所有已下载的软件包文件(位于 `/var/cache/apt/archives/`)。 - **作用**:释放磁盘空间,尤其在长期使用系统后,缓存可能占用较多空间。 - **示例输出**: ``` Removed all cached package files. ``` ### `apt autoclean` ```bash sudo apt autoclean ``` **解释**: - **功能**:清除本地存储中已下载的软件包文件,但仅限于已过期或无法再下载的软件包。 - **作用**:释放磁盘空间,同时保留最新的软件包缓存,便于快速重装。 - **示例输出**: ``` Removed 5 packages. ``` ### `apt policy` ```bash apt policy <package_name> ``` **解释**: - **功能**:显示指定软件包的版本信息及其来源。 - **作用**:了解软件包的安装状态、可用版本及其所属的软件源。 - **示例**: ```bash apt policy nginx ``` **解释**:查看 `nginx`软件包的版本信息和来源。 - **输出示例**: ``` nginx: Installed: 1.14.0-0ubuntu1.6 Candidate: 1.14.0-0ubuntu1.7 Version table: 1.14.0-0ubuntu1.7 500 500 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages 500 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages 1.14.0-0ubuntu1.6 500 500 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages ``` ### `apt full-upgrade` ```bash sudo apt full-upgrade ``` **解释**: - **功能**:升级所有已安装的软件包,同时处理依赖关系变化,包括安装新的依赖包和移除冲突的软件包。 - **作用**:确保系统软件的完整升级,适用于重大版本升级或依赖变化较大的场景。 - **注意事项**:此命令可能会删除某些软件包,建议在执行前查看即将执行的操作列表。 - **示例输出**: ``` Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done The following packages will be upgraded: libexample1 libexample2 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 1,234 kB of archives. After this operation, 12.3 kB of additional disk space will be used. Do you want to continue? [Y/n] ``` ## 管理软件源 软件源是存储软件包的服务器列表,`apt`通过这些源获取和管理软件包。合理配置软件源,确保获取到最新和最适合的软件包版本。 ### 添加软件源 ```bash sudo add-apt-repository <repository> ``` **解释**: - **功能**:添加新的软件源到系统的软件源列表中。 - **作用**:扩展可用软件包的来源,获取更多软件包或更新版本。 - **示例**: ```bash sudo add-apt-repository ppa:nginx/stable ``` **解释**:添加Nginx稳定版的Personal Package Archive(PPA)软件源。 - **选项**: - `-y`:自动确认添加软件源。 ```bash sudo add-apt-repository -y ppa:nginx/stable ``` ### 移除软件源 ```bash sudo add-apt-repository --remove <repository> ``` **解释**: - **功能**:从系统的软件源列表中移除指定的软件源。 - **作用**:清理不再需要或有问题的软件源,避免软件包冲突或获取不必要的软件包。 - **示例**: ```bash sudo add-apt-repository --remove ppa:nginx/stable ``` **解释**:移除Nginx稳定版的PPA软件源。 ### 更新软件源列表 ```bash sudo apt update ``` **解释**: - **功能**:更新本地的软件包索引,包含所有已添加软件源中的最新软件包信息。 - **作用**:确保系统能够识别和获取新增软件源中的软件包。 - **示例输出**: ``` Hit:1 http://archive.ubuntu.com/ubuntu focal InRelease Get:2 http://ppa.launchpad.net/nginx/stable/ubuntu focal InRelease [14.8 kB] Get:3 http://ppa.launchpad.net/nginx/stable/ubuntu focal/main amd64 Packages [12.3 kB] ... Reading package lists... Done ``` ## 处理依赖关系 在安装或升级软件包时,`apt`会自动处理依赖关系,确保所有必要的软件包被正确安装或更新。 ### 安装依赖包 ```bash sudo apt install <package_name> ``` **解释**: - **功能**:安装指定的软件包及其所有依赖。 - **作用**:确保软件包的正常运行所需的所有依赖都已安装。 - **示例**: ```bash sudo apt install build-essential ``` **解释**:安装 `build-essential`软件包,包含编译软件所需的基本工具和库。 ### 修复破损的依赖 ```bash sudo apt install -f ``` **解释**: - **功能**:尝试修复系统中破损的依赖关系,自动安装缺失的依赖包或修复冲突。 - **作用**:解决由于软件包安装中断或错误配置导致的依赖问题。 - **示例输出**: ``` Reading package lists... Done Building dependency tree Reading state information... Done Correcting dependencies... Done The following packages will be installed: libexample1 libexample2 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 1,234 kB of archives. After this operation, 12.3 kB of additional disk space will be used. Do you want to continue? [Y/n] ``` ## 使用 `apt`与 `sudo` 大多数 `apt`命令需要超级用户权限,因为它们涉及系统级的更改。使用 `sudo`可以临时提升权限,确保命令的顺利执行。 **示例**: ```bash sudo apt update ``` **解释**: - `sudo`:以超级用户权限执行后续命令。 - `apt update`:更新软件包索引。 **注意事项**: - **安全性**:仅对可信的命令和软件源使用 `sudo`,避免潜在的安全风险。 - **密码输入**:执行 `sudo`命令时,系统会提示输入当前用户的密码,以验证权限。 ## 最佳实践 为了高效、安全地使用 `apt`管理Ubuntu系统中的软件包,遵循以下最佳实践至关重要。 ### 定期更新软件包 **建议**: - 定期运行 `sudo apt update`和 `sudo apt upgrade`,保持系统软件的最新状态,获取最新的功能和安全修复。 - 可设置自动更新策略,确保系统始终保持最新。 **示例**: ```bash sudo apt update sudo apt upgrade -y ``` ### 使用官方和可信的软件源 **建议**: - 优先使用Ubuntu官方的软件源,确保软件包的稳定性和安全性。 - 添加第三方软件源(如PPA)时,确保其来源可信,以避免引入潜在的安全风险。 ### 管理未使用的软件包 **建议**: - 定期使用 `sudo apt autoremove`清理系统中不再需要的依赖包,释放磁盘空间。 - 对于不再需要的软件包,使用 `sudo apt purge <package_name>`彻底移除,确保配置文件也被删除。 **示例**: ```bash sudo apt purge vim sudo apt autoremove -y ``` ### 备份和记录配置 **建议**: - 在添加或移除软件源前,备份当前的配置文件(如 `/etc/apt/sources.list`)。 - 使用版本控制系统(如Git)管理配置文件的更改,便于追踪和回滚。 **示例**: ```bash sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup ``` ### 使用虚拟环境和容器 **建议**: - 对于需要特定软件包版本或配置的项目,使用虚拟环境(如Docker容器)隔离系统环境,避免版本冲突和依赖问题。 **示例**: ```bash docker run -it ubuntu:20.04 bash ``` ## 常见问题与解决方法 在使用 `apt`管理软件包过程中,可能会遇到各种问题。以下总结了一些常见问题及其解决方法,帮助用户快速排查和解决问题。 ### 问题1:软件包无法安装 **可能原因**: - 软件包名称拼写错误。 - 软件包在当前软件源中不存在。 - 网络连接问题,无法访问软件源。 **解决方法**: 1. **检查软件包名称**: ```bash apt search <package_name> ``` **解释**:确保软件包名称正确,使用 `apt search`查找准确的软件包名称。 2. **更新软件源**: ```bash sudo apt update ``` **解释**:确保软件源列表是最新的,避免因索引过期导致的软件包无法找到。 3. **检查网络连接**: ```bash ping archive.ubuntu.com ``` **解释**:确认网络连接正常,能够访问软件源服务器。 4. **添加必要的软件源**: ```bash sudo add-apt-repository ppa:<ppa_name> sudo apt update sudo apt install <package_name> ``` **解释**:如果软件包在默认软件源中不存在,添加相应的PPA或第三方软件源后重新尝试安装。 ### 问题2:依赖关系错误 **可能原因**: - 软件包依赖的其他包未安装或版本不兼容。 - 软件源中的软件包版本冲突。 **解决方法**: 1. **修复依赖关系**: ```bash sudo apt install -f ``` **解释**:使用 `-f`选项自动修复破损的依赖关系,安装缺失的依赖包。 2. **清理和重新安装**: ```bash sudo apt clean sudo apt update sudo apt install <package_name> ``` **解释**:清理缓存,更新软件源,重新安装有问题的软件包。 3. **查看详细错误信息**: ```bash sudo apt install <package_name> ``` **解释**:通过观察终端输出的错误信息,了解具体的依赖问题,手动安装缺失的依赖包。 ### 问题3:软件包版本冲突 **可能原因**: - 系统中存在多个版本的软件包,导致依赖关系不明确。 - 软件源中不同版本的软件包混用,导致冲突。 **解决方法**: 1. **查看软件包版本**: ```bash apt policy <package_name> ``` **解释**:使用 `apt policy`查看软件包的可用版本及其来源,确定需要安装的版本。 2. **指定软件包版本**: ```bash sudo apt install <package_name>=<version> ``` **解释**:明确指定要安装的软件包版本,避免自动选择导致的冲突。 3. **移除冲突的软件包**: ```bash sudo apt remove <conflicting_package> sudo apt install <package_name> ``` **解释**:卸载与目标软件包冲突的软件包后,重新安装目标软件包。 4. **使用 `aptitude`解决复杂冲突**: ```bash sudo apt install aptitude sudo aptitude install <package_name> ``` **解释**:`aptitude`提供更智能的依赖解决策略,适用于复杂的版本冲突问题。 ## 总结 Ubuntu的 `apt`命令为用户提供了强大且灵活的软件包管理功能。通过掌握基础和高级命令,合理配置软件源,处理依赖关系,并遵循最佳实践,用户可以高效地管理系统中的软件包,确保系统的稳定性和安全性。遇到问题时,结合常见问题的解决方法,可以快速排查并解决软件包管理中的各种挑战。 **关键要点回顾**: - **基础命令**:`apt update`、`apt upgrade`、`apt install`、`apt remove`、`apt purge`、`apt autoremove`。 - **高级命令**:`apt search`、`apt show`、`apt list`、`apt clean`、`apt autoclean`、`apt policy`、`apt full-upgrade`。 - **管理软件源**:添加、移除和更新软件源,确保获取所需的软件包。 - **处理依赖关系**:使用 `apt install -f`修复依赖问题,手动管理复杂的依赖关系。 - **最佳实践**:定期更新软件包,使用官方软件源,管理未使用的软件包,备份配置,利用虚拟环境和容器。 - **问题解决**:通过命令行工具和日志信息,快速识别和解决软件包管理中的常见问题。 通过系统性地应用本文介绍的方法和策略,用户能够充分利用 `apt`命令的功能,构建高效、稳定和安全的Ubuntu系统环境,满足多样化的软件管理需求。 ## 附录 ### 常用 `apt`命令汇总表 | **命令** | **功能** | | ----------------------------------------------- | -------------------------------------------------------- | | `sudo apt update` | 更新本地的软件包索引列表,获取最新的软件包信息。 | | `sudo apt upgrade` | 升级所有已安装的软件包到最新版本,不安装新的依赖包。 | | `sudo apt full-upgrade` | 升级所有已安装的软件包,处理依赖关系变化,安装新依赖包。 | | `sudo apt install <package_name>` | 安装指定的软件包及其所有依赖。 | | `sudo apt remove <package_name>` | 卸载指定的软件包,保留配置文件。 | | `sudo apt purge <package_name>` | 完全卸载指定的软件包及其配置文件。 | | `sudo apt autoremove` | 自动移除系统中不再需要的依赖包。 | | `apt search <keyword>` | 搜索与关键词匹配的软件包。 | | `apt show <package_name>` | 显示指定软件包的详细信息。 | | `apt list --installed` | 列出所有已安装的软件包。 | | `apt list --upgradable` | 列出所有可升级的软件包。 | | `sudo apt clean` | 清除所有已下载的软件包文件,释放磁盘空间。 | | `sudo apt autoclean` | 清除已下载的过时软件包文件,仅保留最新的缓存。 | | `apt policy <package_name>` | 显示指定软件包的版本信息及其来源。 | | `sudo apt add-apt-repository <repo>` | 添加新的软件源到系统中。 | | `sudo apt add-apt-repository --remove <repo>` | 移除指定的软件源。 | ### `apt`命令示例解释表 | **命令示例** | **说明** | | --------------------------------------------------------- | ---------------------------------------------------------------------------- | | `sudo apt update` | 更新本地软件包索引列表,确保获取最新的软件包信息。 | | `sudo apt upgrade` | 升级所有已安装的软件包到最新版本,但不安装新的依赖包。 | | `sudo apt full-upgrade` | 升级所有已安装的软件包,处理依赖关系变化,包括安装新依赖包。 | | `sudo apt install nginx` | 安装Nginx web服务器及其所有依赖包。 | | `sudo apt install -y nginx` | 安装Nginx,并自动确认安装,无需用户交互。 | | `sudo apt remove nginx` | 卸载Nginx软件包,但保留其配置文件。 | | `sudo apt purge nginx` | 完全卸载Nginx软件包及其所有配置文件。 | | `sudo apt autoremove` | 自动移除系统中不再需要的依赖包,释放磁盘空间。 | | `apt search python3` | 搜索与 `python3`相关的软件包,列出匹配的包名称和简要描述。 | | `apt show python3` | 显示 `python3`软件包的详细信息,包括版本、依赖、描述等。 | | `apt list --installed` | 列出系统中所有已安装的软件包。 | | `apt list --upgradable` | 列出所有可以升级的软件包,显示当前版本和可升级到的版本。 | | `sudo apt clean` | 清除所有已下载的软件包缓存文件,释放磁盘空间。 | | `sudo apt autoclean` | 清除已下载的过时软件包文件,仅保留最新的缓存。 | | `apt policy vim` | 显示 `vim`软件包的版本信息及其来源,帮助选择合适的版本进行安装。 | | `sudo apt add-apt-repository ppa:nginx/stable` | 添加Nginx稳定版的PPA软件源,扩展Nginx的安装选项。 | | `sudo apt add-apt-repository --remove ppa:nginx/stable` | 移除Nginx稳定版的PPA软件源,恢复默认的软件包来源。 | | `sudo apt install --no-install-recommends curl` | 安装 `curl`软件包,但不安装推荐的软件包,减少不必要的依赖。 | | `sudo apt install libexample1=1.2.3-4` | 安装 `libexample1`软件包的指定版本 `1.2.3-4`,避免自动选择其他版本。 | | `sudo apt remove --purge libexample2` | 完全卸载 `libexample2`软件包及其所有配置文件。 | | `sudo apt install -f` | 修复破损的依赖关系,自动安装缺失的依赖包。 | | `docker run -d --name mycontainer -p 8080:80 ubuntu` | 启动一个后台运行的Ubuntu容器,映射宿主机的8080端口到容器的80端口。 | | `sudo apt-get install software-properties-common` | 安装 `software-properties-common`软件包,提供 `add-apt-repository`命令。 | 通过以上附录中的常用命令和示例解释表,用户可以快速查找和理解 `apt`命令的使用方法,提升软件包管理的效率和准确性。 最后修改:2024 年 09 月 25 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏