<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>鸿辰个人分享站</title><link>https://www.sunyonghong.com/</link><description>努力是为了有资格选择生活</description><item><title>mysql5.7在docker环境中运行内存异常修复</title><link>https://www.sunyonghong.com/post/20260410118.html</link><description>&lt;h2 id=&quot;h2-u5173u4E8Eu5185u5B58u5F02u5E38u7684u8BA8u8BBA&quot;&gt;&lt;a name=&quot;关于内存异常的讨论&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;关于内存异常的讨论&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/docker-library/mysql/issues/579#issuecomment-1074069882&quot; title=&quot;mysql 5.7 中出现的BUG&quot;&gt;mysql 5.7 中出现的BUG&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/containerd/containerd/issues/6707&quot; title=&quot;docker 容器中的BUG&quot;&gt;docker 容器中的BUG&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;简单来说，这是一个发生在 MySQL 5.7 及其之前版本，在新版 Linux 内核（如 openEuler）上的已知 Bug。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bug 编号与版本&lt;/strong&gt;：这是一个在 MySQL 官方 Bug 系统有记录的已知问题 &lt;a href=&quot;https://bugs.mysql.com/bug.php?id=96525&quot; title=&quot;Bug&quot;&gt;Bug#96525&lt;/a&gt;。它影响了 MySQL 5.7 及更早的版本，而在 MySQL 8.0.19/8.0.20 及之后版本中已被修复。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;触发机制&lt;/strong&gt;：新版的 Linux 内核（以及 Docker）会给进程分配一个异常大的文件描述符限制值（例如 1073741816）。MySQL 5.7 在处理这个巨大的数值时存在逻辑缺陷，它会错误地根据这个数值来申请一块巨大的内存空间，从而导致内存瞬间飙升到数 GB 甚至数十 GB。&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-u89E3u51B3u65B9u6848&quot;&gt;&lt;a name=&quot;解决方案&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;解决方案&lt;/h2&gt;&lt;p&gt;社区给的解决办法（在 Docker 启动时加 –ulimit nofile=…）是合理且常用的临时/部署层解决方案；长期方案可以是升级到包含修补的 MySQL 版本（8.0.19+ 的修补）。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件中 添加 &lt;code&gt;ulimits&lt;/code&gt;配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &amp;#39;3.4&amp;#39;
services:
  mysql:
    image: mysql:5.7.31-arm64
    container_name: test-mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    # 加入配置
    ulimits:
      nofile:
        soft: 1048576 # 软限制，进程可以超过，但最大不能超过硬限制
        hard: 1048576 # 硬限制，进程无论如何都不能超过的上限
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    networks:
      - test_net
    ports:
      - &amp;quot;3306:3306&amp;quot;
    volumes:
      - ./volumes/mysql/data:/var/lib/mysql
      - ./volumes/mysql/conf.d/my_custom.cnf:/etc/mysql/conf.d/my_custom.cnf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;也有相关资料显示，可以设置 Docker 守护进程的 &lt;code&gt;LimitNOFILE&lt;/code&gt;，但我测试并未生效，可以自行尝试，设置过程如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;找到 Docker 服务配置文件：Docker 守护进程的配置文件通常位于&lt;pre&gt;&lt;code&gt;/etc/systemd/system/docker.service
或
/lib/systemd/system/docker.service。&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;li&gt;&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;修改配置：使用 &lt;code&gt;sudo&lt;/code&gt; 权限编辑该文件。在 &lt;code&gt;[Service]&lt;/code&gt; 部分下，找到或以添加 &lt;code&gt;LimitNOFILE&lt;/code&gt; 行，将文件描述符限制设置为一个合理值，比如 &lt;code&gt;1048576&lt;/code&gt;：&lt;pre&gt;&lt;code&gt;[Service]
... (其他配置)
LimitNOFILE=1048576
... (其他配置)&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;li&gt;&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;重启 Docker 服务：保存文件后，需要重新加载配置并重启 Docker 服务，使修改生效。&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl restart docker&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-u6D4Bu8BD5&quot;&gt;&lt;a name=&quot;测试&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;测试&lt;/h2&gt;&lt;p&gt;重新构建容器之后，进入MySQL容器，输入下面的命令查看限制是否生效&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ulimit -n&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果显示值与配置的值相同，则表示已经生效，此时再查看内存情况，不会出现内存异常的问题。&lt;/p&gt;
</description><pubDate>Fri, 10 Apr 2026 11:11:16 +0800</pubDate></item><item><title>在Windows上使用WSL构建适用于arm64的docker镜像</title><link>https://www.sunyonghong.com/post/20260410398.html</link><description>&lt;blockquote&gt;
&lt;p&gt;本文以mysql 5.7为例，讲解如何在windows上构建适用于arm64架构系统的docker镜像。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2-u524Du63D0u6761u4EF6&quot;&gt;&lt;a name=&quot;前提条件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;前提条件&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;windows上 已经安装docker&lt;/li&gt;&lt;li&gt;Docker 已启用 buildx（新版默认开启）&lt;/li&gt;&lt;li&gt;准备好Dockerfile文件，本案例使用 &lt;a href=&quot;/zb_users/upload/2026/04/202604101158134162028.zip&quot; title=&quot;docker-mysql-5.7-aarch64&quot;&gt;docker-mysql-5.7-aarch64&lt;/a&gt; 为例&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-u6784u5EFAu6B65u9AA4&quot;&gt;&lt;a name=&quot;构建步骤&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;构建步骤&lt;/h2&gt;&lt;h3 id=&quot;h3-1-mybuilder-&quot;&gt;&lt;a name=&quot;1. 创建一个名为 mybuilder 的新构建器&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 创建一个名为 mybuilder 的新构建器&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;docker buildx create --name mybuilder --driver docker-container --driver-opt network=host --use&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--driver docker-container&lt;/code&gt;：这是支持多平台构建所必需的。&lt;/li&gt;&lt;li&gt;&lt;code&gt;--driver-opt network=host&lt;/code&gt;：使构建器容器直接使用宿主机的网络栈，这样它就能直接访问你配置的网络代理。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-2-&quot;&gt;&lt;a name=&quot;2. 启动并检查构建器&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 启动并检查构建器&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;docker buildx inspect --bootstrap&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;等待命令执行完成。如果看到 Platforms: linux/amd64, linux/arm64 等信息，说明构建器已准备就绪。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/04/202604101056329453600.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-3-arm64-&quot;&gt;&lt;a name=&quot;3. 执行 ARM64 镜像构建&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3. 执行 ARM64 镜像构建&lt;/h3&gt;&lt;p&gt;在Dockerfile文件所在同级目录下执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker buildx build --platform linux/arm64 -t mysql:5.7.31-arm64 --load .&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;h4--strong-strong-&quot;&gt;&lt;a name=&quot;&lt;strong&gt;注意&lt;/strong&gt;：末尾有个点不能省略&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;strong&gt;注意&lt;/strong&gt;：末尾有个点不能省略&lt;/h4&gt;&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/04/202604101058499866351.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;构建过程能够顺利拉取适用于 ARM64 基础镜像，并完成构建。&lt;/p&gt;
&lt;h2 id=&quot;h2-u67E5u770Bu955Cu50CF&quot;&gt;&lt;a name=&quot;查看镜像&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;查看镜像&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以看到刚刚编译的  &lt;code&gt;mysql:5.7.31-arm64&lt;/code&gt; 镜像。&lt;/p&gt;
&lt;h2 id=&quot;h2-u540Eu7EEDu64CDu4F5C&quot;&gt;&lt;a name=&quot;后续操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;后续操作&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;推送镜像到阿里云镜像仓库，查看文章末尾的相关文章&lt;/li&gt;&lt;li&gt;将镜像导出，然后在服务器上加载镜像，查看文章末尾的相关文章&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Fri, 10 Apr 2026 10:28:31 +0800</pubDate></item><item><title>如何安装claude code 并支持切换使用模型？</title><link>https://www.sunyonghong.com/post/20260122457.html</link><description>&lt;blockquote&gt;
&lt;p&gt;本文将详细介绍在Windows系统上安装配置Claude Code，并连接国内优质大模型的全过程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2--nodejs-18-&quot;&gt;&lt;a name=&quot;一、安装 nodejs 18+&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;一、安装 nodejs 18+&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;要求node版本必须是18+，下载地址 &lt;a href=&quot;https://nodejs.org/zh-cn/download&quot; title=&quot;nodejs 18+&quot;&gt;nodejs 18+&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;检测安装结果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/01/202601221105127406552.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2--claude-code&quot;&gt;&lt;a name=&quot;二、安装 claude code&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;二、安装 claude code&lt;/h2&gt;&lt;p&gt;使用 npm 安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;安装时如果报错类似 “无法加载文件 D:\Nodejs\node_global\npm.ps1，因为在此系统上禁止运行脚本”，你可以通过修改PowerShell的执行策略来允许运行脚本。打开PowerShell（以管理员身份），然后输入以下命令：&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy RemoteSigned&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;然后再次安装即可&lt;/p&gt;
&lt;h2 id=&quot;h2--cc-swtich&quot;&gt;&lt;a name=&quot;三、安装 CC-swtich&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;三、安装 CC-swtich&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;h3-u4E0Bu8F7Du5B89u88C5u5305&quot;&gt;&lt;a name=&quot;下载安装包&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;下载安装包&lt;/h3&gt;&lt;a href=&quot;https://github.com/farion1231/cc-switch&quot; title=&quot;cc-switch&quot;&gt;cc-switch&lt;/a&gt; 是一款可以无缝切换国内大模型的工具，你可以在 &lt;a href=&quot;https://github.com/farion1231/cc-switch/releases&quot; title=&quot;GitHub releases&quot;&gt;GitHub releases&lt;/a&gt; 下载安装并按照安装指引安装即可&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/01/202601221127069224936.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;h3-u914Du7F6Eu6A21u578B&quot;&gt;&lt;a name=&quot;配置模型&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;配置模型&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;点击添加按钮&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2026/01/202601221141534603028.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;&lt;li&gt;选择对应的模型供应商 api key&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2026/01/202601221143158797671.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;&lt;li&gt;回到主页面，选择模型启用即可，配置会自动同步到当前使用的 claude 配置&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2026/01/202601221143551179699.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2--claude&quot;&gt;&lt;a name=&quot;四、使用 claude&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;四、使用 claude&lt;/h2&gt;&lt;p&gt;在项目根目录打开 PowerShell 或 cmd 运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;claude&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;首次运行可能会出现如下提示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/01/202601221149463421059.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是因为claude限制了使用的国家&lt;/p&gt;
&lt;p&gt;修改配置可以解除该限制。&lt;br&gt;在你的用户主目录下(C:\Users\用户名)，找到 &lt;code&gt;.claude.json&lt;/code&gt; 文件，在内容末尾（注意json格式配置），添加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;hasCompletedOnboarding&amp;quot;: true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/01/202601221149245223895.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后再次运行&lt;code&gt;claude&lt;/code&gt;命令即可开始使用，同时可以看到如下图所示当前使用的模型，如果使用其他模型，可以使用&lt;code&gt;cc-switch&lt;/code&gt; 切换即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2026/01/202601221155587444171.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description><pubDate>Thu, 22 Jan 2026 10:31:57 +0800</pubDate></item><item><title>Linux实战：用Python打造专属命令（含Tab自动补全保姆级教程）</title><link>https://www.sunyonghong.com/post/20250925940.html</link><description>&lt;p&gt;在Linux环境下工作时，你是否经常被一串又一串重复的命令搞得眼花缭乱？比如每次查看项目日志都要输入&lt;code&gt;cd /var/log/project &amp;amp;&amp;amp; tail -f app.log&lt;/code&gt;，或者备份文件时总要敲一堆路径参数。其实，我们完全可以把这些高频操作封装成&lt;strong&gt;自定义命令&lt;/strong&gt;，再配上Tab自动补全功能，效率直接拉满！今天就以&lt;code&gt;mycmd&lt;/code&gt;为例，手把手教你用Python实现从命令架构到补全脚本的全套方案。&lt;/p&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;一、需求拆解与整体架构&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;一、需求拆解与整体架构&lt;/h2&gt;&lt;p&gt;我们要做的&lt;code&gt;mycmd&lt;/code&gt;不是单一命令，而是一个「主命令+子命令」的轻量级工具集，核心设计思路如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主命令入口&lt;/strong&gt;：&lt;code&gt;mycmd&lt;/code&gt;放在系统全局路径&lt;code&gt;/usr/local/bin&lt;/code&gt;，负责接收用户输入并分发到对应子命令；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;子命令模块化&lt;/strong&gt;：所有功能子命令（如问候、列目录、执行系统命令）统一存放在&lt;code&gt;/usr/local/mycmd_bin&lt;/code&gt;，每个子命令是独立Python脚本，方便后续扩展；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;智能Tab补全&lt;/strong&gt;：输入&lt;code&gt;mycmd&lt;/code&gt;按Tab能列出所有子命令，输入子命令参数后按Tab能补全目录、系统命令等，跟原生命令体验一致。&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;二、 实现过程&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;二、 实现过程&lt;/h2&gt;&lt;p&gt;整个过程只需4步，从环境准备到功能验证，新手也能跟着做！&lt;/p&gt;
&lt;h3 id=&quot;h3-1-&quot;&gt;&lt;a name=&quot;1. 环境检查：确保基础依赖就绪&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 环境检查：确保基础依赖就绪&lt;/h3&gt;&lt;p&gt;首先确认系统安装了Python3（大多数Linux发行版默认自带），打开终端输入以下命令验证：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python3 --version  # 输出Python 3.x.x即正常&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2-code-mycmd-code-&quot;&gt;&lt;a name=&quot;2. 编写主命令：&lt;code&gt;mycmd&lt;/code&gt;核心分发逻辑&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 编写主命令：&lt;code&gt;mycmd&lt;/code&gt;核心分发逻辑&lt;/h3&gt;&lt;p&gt;主命令就像“指挥官”，负责解析用户输入的子命令，并调用对应的脚本。创建文件&lt;code&gt;/usr/local/bin/mycmd&lt;/code&gt;，写入以下代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
&amp;quot;&amp;quot;&amp;quot;自定义命令mycmd主入口：负责子命令识别与调用&amp;quot;&amp;quot;&amp;quot;
import sys
import os
import subprocess

# 子命令存放目录（固定路径，后续会创建）
MYCMD_BIN = &amp;quot;/usr/local/mycmd_bin&amp;quot;

def show_help():
    &amp;quot;&amp;quot;&amp;quot;显示帮助信息，自动列出所有可用子命令&amp;quot;&amp;quot;&amp;quot;
    print(&amp;quot;=&amp;quot;*40)
    print(&amp;quot;mycmd - 自定义Python命令工具集&amp;quot;)
    print(&amp;quot;=&amp;quot;*40)
    print(&amp;quot;Usage: mycmd &amp;lt;subcommand&amp;gt; [options]&amp;quot;)
    print(&amp;quot;\nAvailable subcommands:&amp;quot;)

    if os.path.exists(MYCMD_BIN):
        # 遍历目录，提取.py脚本作为子命令名（去掉后缀）
        subcommands = [
            os.path.splitext(f)[0] 
            for f in os.listdir(MYCMD_BIN) 
            if f.endswith(&amp;quot;.py&amp;quot;) and os.path.isfile(os.path.join(MYCMD_BIN, f))
        ]
        for cmd in sorted(subcommands):
            print(f&amp;quot;{cmd:8} - 运行{cmd}功能（mycmd {cmd} -h查看详情）&amp;quot;)
    else:
        print(f&amp;quot;子命令目录 {MYCMD_BIN} 不存在，请先创建&amp;quot;)

def main():
    # 无参数时直接显示帮助
    if len(sys.argv) &amp;lt; 2:
        show_help()
        sys.exit(0)

    # 提取子命令（第一个参数）
    subcommand = sys.argv[1]
    subcmd_path = os.path.join(MYCMD_BIN, f&amp;quot;{subcommand}.py&amp;quot;)

    # 检查子命令是否存在
    if not os.path.exists(subcmd_path):
        print(f&amp;quot;错误：子命令 &amp;#39;{subcommand}&amp;#39; 不存在！&amp;quot;)
        show_help()
        sys.exit(1)

    # 自动赋予执行权限（避免用户忘记chmod）
    if not os.access(subcmd_path, os.X_OK):
        print(f&amp;quot;正在为子命令 &amp;#39;{subcommand}&amp;#39; 添加执行权限...&amp;quot;)
        os.chmod(subcmd_path, 0o755)

    # 调用子命令并传递后续参数
    try:
        subprocess.run(
            [sys.executable, subcmd_path] + sys.argv[2:],
            check=True,
            stdout=sys.stdout,
            stderr=sys.stderr
        )
    except subprocess.CalledProcessError as e:
        print(f&amp;quot;子命令执行失败（返回码：{e.returncode}）&amp;quot;)
        sys.exit(1)
    except Exception as e:
        print(f&amp;quot;调用出错：{str(e)}&amp;quot;)
        sys.exit(1)

if __name__ == &amp;quot;__main__&amp;quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写完后给主命令加执行权限，否则系统无法识别为可执行文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod +x /usr/local/bin/mycmd&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-&quot;&gt;&lt;a name=&quot;3. 开发子命令：实现具体功能模块&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3. 开发子命令：实现具体功能模块&lt;/h3&gt;&lt;p&gt;子命令是真正干活的“小兵”，我们先创建存放子命令的目录，再写几个实用示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mkdir -p /usr/local/mycmd_bin  # 创建子命令目录&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--1-code-hello-code-&quot;&gt;&lt;a name=&quot;子命令1：&lt;code&gt;hello&lt;/code&gt; - 个性化问候&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;子命令1：&lt;code&gt;hello&lt;/code&gt; - 个性化问候&lt;/h4&gt;&lt;p&gt;创建&lt;code&gt;/usr/local/mycmd_bin/hello.py&lt;/code&gt;，支持自定义问候对象：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
&amp;quot;&amp;quot;&amp;quot;子命令：输出个性化问候语&amp;quot;&amp;quot;&amp;quot;
import argparse

def main():
    parser = argparse.ArgumentParser(description=&amp;quot;个性化问候工具&amp;quot;)
    parser.add_argument(
        &amp;quot;--name&amp;quot;, 
        type=str, 
        default=&amp;quot;Linux爱好者&amp;quot;, 
        help=&amp;quot;指定问候对象（默认：Linux爱好者）&amp;quot;
    )
    args = parser.parse_args()
    print(f&amp;quot;Hello, {args.name}! 很高兴使用mycmd工具~&amp;quot;)

if __name__ == &amp;quot;__main__&amp;quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--2-code-list-code-&quot;&gt;&lt;a name=&quot;子命令2：&lt;code&gt;list&lt;/code&gt; - 简洁列目录&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;子命令2：&lt;code&gt;list&lt;/code&gt; - 简洁列目录&lt;/h4&gt;&lt;p&gt;创建&lt;code&gt;/usr/local/mycmd_bin/list.py&lt;/code&gt;，过滤隐藏文件，区分目录和文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
&amp;quot;&amp;quot;&amp;quot;子命令：列出目录下非隐藏文件（带类型标识）&amp;quot;&amp;quot;&amp;quot;
import argparse
import os

def main():
    parser = argparse.ArgumentParser(description=&amp;quot;简洁列目录工具&amp;quot;)
    parser.add_argument(
        &amp;quot;--dir&amp;quot;, 
        type=str, 
        default=&amp;quot;.&amp;quot;, 
        help=&amp;quot;指定目录（默认：当前目录）&amp;quot;
    )
    args = parser.parse_args()

    if not os.path.isdir(args.dir):
        print(f&amp;quot;目录 &amp;#39;{args.dir}&amp;#39; 不存在或不是目录&amp;quot;)
        exit(1)

    print(f&amp;quot;目录 &amp;#39;{args.dir}&amp;#39; 内容：&amp;quot;)
    for f in sorted(os.listdir(args.dir)):
        if f.startswith(&amp;quot;.&amp;quot;):
            continue  # 跳过隐藏文件
        f_path = os.path.join(args.dir, f)
        if os.path.isdir(f_path):
            print(f&amp;quot;目录{f}&amp;quot;)
        else:
            print(f&amp;quot;文件{f}&amp;quot;)

if __name__ == &amp;quot;__main__&amp;quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--3-code-exec-code-&quot;&gt;&lt;a name=&quot;子命令3：&lt;code&gt;exec&lt;/code&gt; - 快速执行系统命令&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;子命令3：&lt;code&gt;exec&lt;/code&gt; - 快速执行系统命令&lt;/h4&gt;&lt;p&gt;创建&lt;code&gt;/usr/local/mycmd_bin/exec.py&lt;/code&gt;，简化系统命令调用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
&amp;quot;&amp;quot;&amp;quot;子命令：快速执行系统命令（支持简单参数）&amp;quot;&amp;quot;&amp;quot;
import argparse
import subprocess

def main():
    parser = argparse.ArgumentParser(description=&amp;quot;系统命令执行工具&amp;quot;)
    parser.add_argument(
        &amp;quot;--cmd&amp;quot;, 
        type=str, 
        required=True, 
        help=&amp;quot;要执行的命令（如：ls -l、pwd）&amp;quot;
    )
    args = parser.parse_args()

    print(f&amp;quot;正在执行：{args.cmd}&amp;quot;)
    try:
        result = subprocess.run(
            args.cmd.split(),
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            encoding=&amp;quot;utf-8&amp;quot;
        )
        print(&amp;quot;执行结果：&amp;quot;)
        print(result.stdout)
    except subprocess.CalledProcessError as e:
        print(f&amp;quot;执行失败：{e.stderr}&amp;quot;)
        exit(1)

if __name__ == &amp;quot;__main__&amp;quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后给所有子命令加执行权限：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod +x /usr/local/mycmd_bin/*.py&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-4-tab-&quot;&gt;&lt;a name=&quot;4. 配置Tab补全：让命令输入更智能&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4. 配置Tab补全：让命令输入更智能&lt;/h3&gt;&lt;p&gt;没有Tab补全的命令是没有灵魂的！创建bash补全脚本&lt;code&gt;mycmd-completion.bash&lt;/code&gt;，实现三级补全逻辑：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash
# mycmd命令Tab自动补全脚本
MYCMD_BIN=&amp;quot;/usr/local/mycmd_bin&amp;quot;

# 函数1：获取所有子命令
_get_subcommands() {
    if [[ -d &amp;quot;$MYCMD_BIN&amp;quot; ]]; then
        find &amp;quot;$MYCMD_BIN&amp;quot; -maxdepth 1 -name &amp;quot;*.py&amp;quot; -exec basename {} .py \; 2&amp;gt;/dev/null
    fi
}

# 核心补全函数
_mycmd_completion() {
    local cur prev
    COMPREPLY=()
    cur=&amp;quot;${COMP_WORDS[COMP_CWORD]}&amp;quot;
    prev=&amp;quot;${COMP_WORDS[COMP_CWORD-1]}&amp;quot;

    # 场景1：主命令后补全子命令（如mycmd [Tab]）
    if [[ $COMP_CWORD -eq 1 ]]; then
        local cmds=$(_get_subcommands)
        COMPREPLY=( $(compgen -W &amp;quot;$cmds&amp;quot; -- &amp;quot;$cur&amp;quot;) )

    # 场景2：list子命令--dir参数后补全目录（如mycmd list --dir [Tab]）
    elif [[ $COMP_CWORD -eq 3 &amp;amp;&amp;amp; $prev == &amp;quot;--dir&amp;quot; &amp;amp;&amp;amp; &amp;quot;${COMP_WORDS[1]}&amp;quot; == &amp;quot;list&amp;quot; ]]; then
        COMPREPLY=( $(compgen -d -- &amp;quot;$cur&amp;quot;) )

    # 场景3：exec子命令--cmd参数后补全系统命令（如mycmd exec --cmd [Tab]）
    elif [[ $COMP_CWORD -eq 3 &amp;amp;&amp;amp; $prev == &amp;quot;--cmd&amp;quot; &amp;amp;&amp;amp; &amp;quot;${COMP_WORDS[1]}&amp;quot; == &amp;quot;exec&amp;quot; ]]; then
        COMPREPLY=( $(compgen -c -- &amp;quot;$cur&amp;quot;) )
    fi
    return 0
}

# 注册补全函数到mycmd命令
complete -F _mycmd_completion mycmd

# 提示信息（source时显示）
#echo &amp;quot;mycmd补全脚本已加载！&amp;quot;
#echo &amp;quot;试试：mycmd [Tab] / mycmd list --dir [Tab] / mycmd exec --cmd [Tab]&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u8865u5168u811Au672Cu751Fu6548u65B9u6CD5&quot;&gt;&lt;a name=&quot;补全脚本生效方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;补全脚本生效方法&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;临时生效&lt;/strong&gt;（当前终端）：保存脚本后执行&lt;code&gt;source ~/mycmd-completion.bash&lt;/code&gt;；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;永久生效&lt;/strong&gt;（所有终端）：将脚本复制到系统补全目录，执行&lt;code&gt;sudo cp ~/mycmd-completion.bash /etc/bash_completion.d/&lt;/code&gt;，重启终端(重连)即可。&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;三、功能验证：看看成果如何&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;三、功能验证：看看成果如何&lt;/h2&gt;&lt;p&gt;所有配置完成后，我们来实测一下&lt;code&gt;mycmd&lt;/code&gt;的各项功能：&lt;/p&gt;
&lt;h3 id=&quot;h3-1-&quot;&gt;&lt;a name=&quot;1. 基础功能测试&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 基础功能测试&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 查看帮助
mycmd

# 测试hello子命令
mycmd hello --name &amp;quot;技术控&amp;quot;  # 输出：Hello, 技术控！...

# 测试list子命令（列出/home目录）
mycmd list --dir /home

# 测试exec子命令（执行pwd）
mycmd exec --cmd &amp;quot;pwd&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2-tab-&quot;&gt;&lt;a name=&quot;2. Tab补全测试&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. Tab补全测试&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 补全子命令：输入mycmd 后按Tab，会显示hello/list/exec
mycmd h[Tab]  # 自动补全为mycmd hello

# 补全目录：输入后按Tab，显示当前目录下的子目录
mycmd list --dir ~/[Tab]

# 补全系统命令：输入后按Tab，显示ls/pwd等命令
mycmd exec --cmd l[Tab]  # 补全为mycmd exec --cmd ls&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2--&quot;&gt;&lt;a name=&quot;四、踩坑指南与扩展思路&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;四、踩坑指南与扩展思路&lt;/h2&gt;&lt;h3 id=&quot;h3-u5E38u89C1u95EEu9898u89E3u51B3&quot;&gt;&lt;a name=&quot;常见问题解决&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;常见问题解决&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;子命令找不到&lt;/strong&gt;：检查&lt;code&gt;MYCMD_BIN&lt;/code&gt;路径是否与主命令一致，子命令是否以&lt;code&gt;.py&lt;/code&gt;结尾；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;补全不生效&lt;/strong&gt;：确认补全脚本已&lt;code&gt;source&lt;/code&gt;，或重启终端刷新配置；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;权限报错&lt;/strong&gt;：确保主命令和子命令的权限是&lt;code&gt;755&lt;/code&gt;（&lt;code&gt;chmod 755 文件名&lt;/code&gt;）。&lt;/li&gt;&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;用Python实现自定义Linux命令，本质是「主命令分发+子命令模块化」的设计思路。这种方式不仅能把重复操作“一键封装”，还能随着需求增长不断扩展子命令，性价比超高！&lt;/p&gt;
&lt;p&gt;现在你已经掌握了全套方法，不妨动手把自己常用的操作封装成子命令吧～&lt;/p&gt;
</description><pubDate>Thu, 25 Sep 2025 10:29:28 +0800</pubDate></item><item><title>dos2unix工具全面介绍与使用指南</title><link>https://www.sunyonghong.com/post/20250925560.html</link><description>&lt;p&gt;dos2unix是一款经典的文本格式转换工具，主要用于将DOS/Windows格式的文本文件转换为UNIX/Linux格式。在计算机系统中，文本文件的换行符存在差异：DOS/Windows系统使用“回车符（CR）+换行符（LF）”（\r\n）作为换行标志，而UNIX/Linux系统仅使用“换行符（LF）”（\n）。这种差异可能导致文本文件在不同系统间传输后出现格式错乱，例如在UNIX系统中打开Windows文本时，每行末尾会显示多余的^M符号，或在Windows中打开UNIX文本时所有内容挤在同一行。dos2unix工具正是为解决这一问题而生，通过自动识别并转换换行符，确保文本文件在跨平台使用时保持正常的格式显示。&lt;/p&gt;
&lt;p&gt;除了核心的格式转换功能，dos2unix工具通常还附带unix2dos命令，用于实现UNIX格式到DOS格式的反向转换，形成完整的双向转换解决方案。该工具轻量、高效，支持批量处理多个文件，且在各类操作系统中均有对应的版本，是程序员、系统管理员及经常处理跨平台文本文件用户的必备工具之一。&lt;/p&gt;
&lt;h3 id=&quot;h3-u4F7Fu7528u573Au666F&quot;&gt;&lt;a name=&quot;使用场景&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;使用场景&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. 跨平台软件开发&lt;/strong&gt;：程序员在Windows系统编写代码后，若需部署到Linux服务器，代码文件中的换行符差异可能导致编译错误或脚本无法执行。使用dos2unix转换后，可确保代码在UNIX环境中正常运行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 服务器配置文件处理&lt;/strong&gt;：Linux服务器的配置文件（如Nginx、Apache的配置文件）要求使用UNIX格式，若通过Windows编辑后直接上传，可能导致服务启动失败。此时需用dos2unix对配置文件进行转换。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 文本文件跨平台共享&lt;/strong&gt;：当从Windows下载或接收文本文件（如文档、日志、脚本等）到UNIX/Linux系统时，使用dos2unix可消除换行符带来的格式错乱，保证文件可读性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 数据处理与分析&lt;/strong&gt;：在数据处理场景中，若数据源来自Windows系统，文本格式的差异可能导致数据分析工具（如Python、Shell脚本）读取数据时出现异常，转换格式后可确保数据处理流程正常进行。&lt;/p&gt;
&lt;h3 id=&quot;h3-u5B89u88C5u6B65u9AA4&quot;&gt;&lt;a name=&quot;安装步骤&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;安装步骤&lt;/h3&gt;&lt;h4 id=&quot;h4-windows-&quot;&gt;&lt;a name=&quot;Windows系统安装&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Windows系统安装&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;访问dos2unix官方网站（&lt;a href=&quot;https://waterlan.home.xs4all.nl/dos2unix.html），在“Download”&quot;&gt;https://waterlan.home.xs4all.nl/dos2unix.html），在“Download”&lt;/a&gt; section找到Windows版本的压缩包（通常为zip格式）。&lt;/li&gt;&lt;li&gt;下载后解压压缩包，将解压得到的文件夹（如dos2unix-7.4.4-win32）移动到合适的位置（如C:\Program Files）。&lt;/li&gt;&lt;li&gt;配置环境变量：右键“此电脑”→“属性”→“高级系统设置”→“环境变量”，在“系统变量”的“Path”中添加dos2unix的解压路径（如C:\Program Files\dos2unix-7.4.4-win32）。&lt;/li&gt;&lt;li&gt;打开新的命令提示符，输入&lt;code&gt;dos2unix --version&lt;/code&gt;验证安装是否成功。&lt;/li&gt;&lt;/ol&gt;
&lt;h4 id=&quot;h4-linux-&quot;&gt;&lt;a name=&quot;Linux系统安装&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Linux系统安装&lt;/h4&gt;&lt;p&gt;大多数Linux发行版（如Ubuntu、CentOS、Debian等）默认已预装dos2unix，若未安装，可通过系统自带的包管理器安装：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Debian/Ubuntu系列&lt;/strong&gt;：打开终端，输入以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install dos2unix&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;RHEL/CentOS系列&lt;/strong&gt;：打开终端，输入以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# CentOS 7及以下
sudo yum install dos2unix

# CentOS 8及以上/RHEL 8+
sudo dnf install dos2unix&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装完成后，输入&lt;code&gt;dos2unix --version&lt;/code&gt;验证。&lt;/p&gt;
&lt;h4 id=&quot;h4-macos-&quot;&gt;&lt;a name=&quot;macOS系统安装&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;macOS系统安装&lt;/h4&gt;&lt;p&gt;macOS系统默认未安装dos2unix，可通过Homebrew包管理器安装：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先安装Homebrew（若未安装）：打开终端，输入以下命令并回车：&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;/bin/bash -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;安装完成后，输入以下命令安装dos2unix：&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;brew install dos2unix&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;验证安装：输入&lt;code&gt;dos2unix --version&lt;/code&gt;，显示版本信息即安装成功。&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-u7528u6CD5u793Au4F8B&quot;&gt;&lt;a name=&quot;用法示例&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;用法示例&lt;/h3&gt;&lt;p&gt;dos2unix的命令语法简洁，常用用法如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 基本格式转换&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;转换单个文件：将DOS格式的file.txt转换为UNIX格式，直接覆盖原文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dos2unix file.txt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;转换多个文件：同时转换file1.txt、file2.txt、file3.txt，覆盖原文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dos2unix file1.txt file2.txt file3.txt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;2. 保留原文件（生成新文件）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用-n参数，转换后生成新文件，原文件不变。例如将file.txt转换为file_unix.txt：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dos2unix -n file.txt file_unix.txt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;3. 反向转换（UNIX to DOS）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用unix2dos命令，将UNIX格式的file.txt转换为DOS格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unix2dos file.txt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;同样支持-n参数保留原文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unix2dos -n file.txt file_dos.txt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;4. 查看帮助信息&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;输入以下命令查看dos2unix的详细参数和用法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dos2unix --help&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-u4F7Fu7528u63D0u793A&quot;&gt;&lt;a name=&quot;使用提示&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;使用提示&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;备份原文件&lt;/strong&gt;：默认情况下，dos2unix会直接覆盖原文件。若对文件内容重要性较高，建议在转换前备份原文件，或使用-n参数生成新文件，避免误操作导致数据丢失。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;区分文本文件与二进制文件&lt;/strong&gt;：dos2unix仅适用于文本文件，切勿用于二进制文件（如图片、可执行文件、压缩包等）。若误转换二进制文件，可能导致文件损坏无法使用。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;权限问题&lt;/strong&gt;：在Linux/macOS系统中，若转换系统配置文件或其他受保护文件，需确保当前用户拥有读写权限，必要时使用sudo命令提升权限。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;批量处理时确认文件列表&lt;/strong&gt;：批量转换多个文件时，需仔细确认文件路径和名称，避免误转换无关文件。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;版本兼容性&lt;/strong&gt;：不同版本的dos2unix参数可能略有差异，若遇到命令无法执行的情况，可通过–help查看当前版本支持的参数。&lt;/li&gt;&lt;/ol&gt;
</description><pubDate>Thu, 25 Sep 2025 09:46:18 +0800</pubDate></item><item><title>还在找靠谱的 Windows 原版系统？这几个宝藏下载站我私藏好久了！</title><link>https://www.sunyonghong.com/post/20250823188.html</link><description>&lt;p&gt;各位小伙伴是不是也遇到过这种糟心事儿：想装个 Windows 系统，网上一搜全是乱七八糟的修改版，要么预装了一堆删不掉的软件，要么用着用着就弹窗不断，甚至还可能藏着安全隐患。其实找对地方，下载原版系统一点都不难！今天就把我压箱底的几个靠谱下载站分享给大家，全是亲测好用的，放心码住～&lt;/p&gt;
&lt;p&gt;为啥推荐原版系统？&lt;code&gt;Ghost&lt;/code&gt; 系统或很多博主修改的极简版虽然轻巧装得快，有的还自带激活，但都上经过个人或小团队修改过的，稳定性没保障不说，万一遇到带后门、改浏览器主页的，那真是哭都来不及。而原版系统是微软官方出品，纯净又安全，就是装完得自己找正版密钥激活，不过换个安心，值！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;h3-itellyou-&quot;&gt;&lt;a name=&quot;itellyou 点击直达   (首选)&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://next.itellyou.cn/&quot;&gt;itellyou 点击直达&lt;/a&gt;  (首选)&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;这可是个老熟人了！从 2007 年就开始做原版软件服务，口碑特别稳。他们家只给原版软件的获取方法和使用指导，不搞那些夹私货的操作，这点特别让人放心。不过要提醒大家，这里不提供密钥和正版授权，下载完系统得自己搞定激活哈。网站界面也很清爽，想找原版 Windows 或者其他微软软件，来这儿准没错，老站就是靠谱！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508231110078143836.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;提示：下载需要登录，直接使用第三方账号登录即可。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;h3-msdn-sjjzm-com-&quot;&gt;&lt;a name=&quot;msdn.sjjzm.com 点击直达&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://msdn.sjjzm.com/&quot;&gt;msdn.sjjzm.com 点击直达&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;这个站特别懂咱们英文不好的用户！大家知道，Windows 镜像文件通常是英文命名，里面还藏着好几个版本，选起来特别费劲。但这个站会把镜像里的所有版本都列得明明白白，连文件名都翻译成中文了，一眼就能找到自己要的。更让人放心的是，他们会把所有资源下载到本地，做版本识别和 SHA-1、MD5 校验，基本不会出错，怕踩坑的小伙伴优先看这个！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508231116187668429.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;h3-uupdump-&quot;&gt;&lt;a name=&quot;uupdump 点击直达&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://uupdump.net/&quot;&gt;uupdump 点击直达&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;这个站适合喜欢尝鲜或者有特定需求的朋友。它能直接从微软 Windows Update 服务器下载 UUP 文件，选择特别丰富。不管你要最新的公开正式版，还是想体验预览版，比如 Release Preview（适合提前试下代系统）、Beta Channel（能玩到大部分新功能），甚至是给技术大佬准备的 Dev、Canary Channel 版本，这里都能找到。而且支持 x64、arm64、x86 多种架构，不管是常用的 64 位电脑，还是 ARM 架构的设备都能适配。最近更新也很勤快，8 月 22 号还上新了 Windows 11 Insider Preview 的新版本，追更党别错过～&lt;br&gt;&lt;img src=&quot;https://www.sunyonghong.com/zb_users/upload/2025/08/202508231124483292106.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508231117404125592.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;h3 id=&quot;h3-imsdn-&quot;&gt;&lt;a name=&quot;imsdn 点击直达&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://www.imsdn.cn/&quot;&gt;imsdn 点击直达&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;这是个个人网站，但纯净度拉满！主打的就是 MSDN 原版系统和详细的安装教程，拒绝集成任何第三方捆绑软件。不管你要经典的 Windows 7、8，还是现在常用的 Windows 10、11，甚至是服务器系统 Windows Server 系列，还有 Office、SQL Server 这些办公和数据库软件，点对应的图标就能直达下载页面，操作特别简单。追求系统纯净、想跟着教程一步步安装的小伙伴，这个站一定要收藏！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508231118312622718.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;以上就是我亲测好用的 Windows 原版系统下载站，每个站都有自己的特色，大家可以根据自己的需求选：信老站口碑选第一个，想省心看中文列表选第二个，想尝鲜下预览版选第三个，要纯净教程选第四个。最后还是要唠叨一句，原版系统装完记得用正版密钥激活，保护知识产权的同时，也能获得更完整的服务～&lt;/p&gt;
</description><pubDate>Sat, 23 Aug 2025 11:25:07 +0800</pubDate></item><item><title>亲测有效！谷歌插件离线安装教程 + 亚马逊卖家必备工具推荐</title><link>https://www.sunyonghong.com/post/20250813267.html</link><description>&lt;p&gt;用谷歌浏览器的小伙伴肯定都离不开各种插件吧？安装插件必须使用科学上网，否则在线安装老是失败，别提多让人着急了。其实离线安装插件超简单，我自己试了好几次都成功了，今天就把方法分享给大家。另外，作为一个做亚马逊的老司机，也顺便推荐几个平时离不开的插件，有需要的可以参考～&lt;/p&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;谷歌浏览器插件离线安装，四步搞定&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;谷歌浏览器插件离线安装，四步搞定&lt;/h3&gt;&lt;h4 id=&quot;h4--&quot;&gt;&lt;a name=&quot;第一步：下载插件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第一步：下载插件&lt;/h4&gt;&lt;p&gt;我平时都是在CrxDL.COM这个网站下插件（网址是 &lt;a href=&quot;https://crxdl.com&quot;&gt;https://crxdl.com&lt;/a&gt; ），上面插件还挺全的。打开网站后，直接搜你想要的插件名字或则插件ID，找到对应的点&lt;code&gt;下载&lt;/code&gt;，记得存哪儿了，等会儿要用&lt;/p&gt;
&lt;p&gt;例如 我需要下载 &lt;code&gt;卖家精灵&lt;/code&gt; 这个插件，直接输入 &lt;code&gt;卖家精灵&lt;/code&gt; 或则对应的ID号，ID号在下文中可以获取到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508131000484009907.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4--&quot;&gt;&lt;a name=&quot;第二步：打开浏览器的扩展页面&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第二步：打开浏览器的扩展页面&lt;/h4&gt;&lt;p&gt;打开谷歌浏览器，在最上面的地址栏里输 “chrome://extensions/”，敲个回车，就能看到所有已安装的插件了，这就是扩展程序页面。&lt;/p&gt;
&lt;p&gt;注意，因为是离线安装，需要在这个页面的&lt;code&gt;右上角&lt;/code&gt;开启&lt;code&gt;开发者模式&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508131002129938208.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4--&quot;&gt;&lt;a name=&quot;第三步：解压插件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第三步：解压插件&lt;/h4&gt;&lt;p&gt;找到刚才下载的插件包，一般是一个zip文件，需要解压，我一般选择解压到目录，解压后如下图所示&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508131003114582988.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;进入目录，你会看到一个&lt;code&gt;.crx&lt;/code&gt;的文件，这个就是插件文件&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508131006373084725.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4--&quot;&gt;&lt;a name=&quot;第四步：安装插件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;第四步：安装插件&lt;/h4&gt;&lt;p&gt;用鼠标拖着插件文件（&lt;code&gt;.crx&lt;/code&gt;文件），直接扔到刚才打开的扩展程序页面里。松手之后会弹出个提示，问你要不要添加，点 “添加扩展程序”，搞定！插件就装上了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508131008037961154.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;安装好之后，你可以点击地址栏后的 &lt;code&gt;插件&lt;/code&gt; 按钮，就会显示已经启用的插件了，点击该插件即可使用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508131009216432131.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;做亚马逊必备的几个插件，真心好用&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;做亚马逊必备的几个插件，真心好用&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;卖家精灵（ID：lnbmbgocenenhhhdojdielgnmeflbnfb）：这个是我每天都用的，挖关键词、分析竞品数据特别方便。能看到对手的销量、排名变化，还能优化自己的 Listing，对提升产品排名帮助挺大的，做亚马逊的基本人手一个。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;AMZ123 亚马逊卖家网址导航（ID：dffffilplfidogfffeidkccdkjfamhoj）：刚开始做亚马逊的时候，总记不住各种要用的网址，这个插件直接把常用的都整合到一起了，从亚马逊各站点入口到物流查询、收款平台，点一下就能进，省了不少事。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;沉浸式翻译（ID：bpoadfkcbjbfhfodiogcnhhhpibjhbnh）：看外文网站头大的朋友一定要试试这个！它能双语对照翻译，看 PDF、油管视频的时候都能用，连电子书翻译都支持，还能选不同的 AI 翻译模型，读海外市场报告、跟客户沟通都方便多了。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;鸥鹭 - 亚马逊大数据选品 &amp;amp; 流量运营工具（ID：fphfjnoofajmjegmgdonaedncbgmbcpm）：想找潜力产品的话，这个插件挺靠谱的。它能通过大数据分析给你推荐合适的选品，还能分析流量来源，帮你搞清楚怎么提升店铺访客量，对新手选品特别友好。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;AliPrice 亚马逊购物助手（ID：nhfmioilpglanakdpomfobcmbkbjedha）：进货的时候用这个查价格特别方便，能看产品历史价格走势，还能对比不同卖家的报价，帮你拿到更划算的进货价，省点成本不好吗？&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Wed, 13 Aug 2025 10:11:46 +0800</pubDate></item><item><title>5分钟搞定！用Docker快速部署AI应用开发平台Dify</title><link>https://www.sunyonghong.com/post/20250808066.html</link><description>&lt;h3 id=&quot;h3-u6982u8FF0&quot;&gt;&lt;a name=&quot;概述&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;概述&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Dify是一个非常火的AI智能体开发平台，且支持windows、linux、mac系统的本地私有化部署，本篇文章详细讲解如何在linux系统上实现Dify本地化部署。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;h3-u524Du7F6Eu6761u4EF6&quot;&gt;&lt;a name=&quot;前置条件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;前置条件&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;服务器配置：2核4G 及以上（如果是自己测试玩，可以适当降低配置）&lt;/li&gt;&lt;li&gt;已经安装 &lt;code&gt;docker&lt;/code&gt; 以及 &lt;code&gt;docker compose&lt;/code&gt; 工具，未安装可以参考 &lt;a href=&quot;https://www.sunyonghong.com/post/20240723385.html&quot; target=&quot;_blank&quot;&gt;如何正确安装docker并进行相关配置&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3--dify-&quot;&gt;&lt;a name=&quot;获取dify安装包&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;获取dify安装包&lt;/h3&gt;&lt;p&gt;获取方式有两种&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 克隆仓库代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/langgenius/dify.git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. 下载压缩包&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开 &lt;a href=&quot;https://github.com/langgenius/dify&quot; target=&quot;_blank&quot;&gt;GitHub langgenius/dify 仓库&lt;/a&gt;&lt;/li&gt;&lt;li&gt;下载压缩包&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508081559061457446.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;下载压缩包后，上传到Linux服务器即可，你也可以复制下载地址，使用 &lt;code&gt;wget&lt;/code&gt; 命令或 &lt;code&gt;curl&lt;/code&gt; 命令下载&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;h3-u90E8u7F72u4E0Eu914Du7F6E&quot;&gt;&lt;a name=&quot;部署与配置&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;部署与配置&lt;/h3&gt;&lt;p&gt;下载好压缩包后，使用命令解压&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;unzip dify-main.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开始部署&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 进入docker目录&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd dify-main/docker/&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;2. 复制配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp .env.example .env&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;3. 构建服务&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose -p dify up -d&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;上方构建参数中，添加了 &lt;code&gt;-p dify&lt;/code&gt; 这是为了防止项目冲突，给项目指定了一个名字&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果执行命令后，你出现了如下错误&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508081609458929707.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;别慌！你可以参考这里 &lt;a href=&quot;https://www.sunyonghong.com/post/20250808569.html&quot; target=&quot;_blank&quot;&gt;彻底解决Docker镜像拉取失败：国内镜像源配置与深度排错指南&lt;/a&gt; 即可解决，解决后重新执行构建服务命令即可。&lt;/p&gt;
&lt;p&gt;若构建后，你再次遇到了类似下面的错误&lt;br&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508081614055945400.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;提取到关键信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;listen tcp4 0.0.0.0:80: bind: address already in use&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这说明dify的服务端口与你的宿主机端口存在冲突，简单说就是端口占用了，此时你需要修改dify配置的端口，比如上图的是nginx端口冲突，则在.env文件中修改&lt;/p&gt;
&lt;p&gt;打开.env文件，找到&lt;code&gt;EXPOSE_NGINX_PORT&lt;/code&gt; 和 &lt;code&gt;EXPOSE_NGINX_SSL_PORT&lt;/code&gt; 修改成其他端口号即可（注意端口号需要未被其他程序使用），如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508081616198739215.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;修改完成后，重新构建服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 先执行这个命令停掉构建的服务，防止出现其他错误
docker compose -p dify down
# 再次执行构建命令
docker compose -p dify up -d&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;全部构建完成未出现错误信息即表示部署完成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508081619421312620.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--dify&quot;&gt;&lt;a name=&quot;访问dify&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;访问dify&lt;/h3&gt;&lt;p&gt;在你的浏览器上输入 &lt;code&gt;http://服务器ip&lt;/code&gt;，如果你的端口不是默认的，则需要在访问的地址后加上端口，如 &lt;code&gt;http://127.0.0.1::4080&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;随后根据页面提示，设置管理员账户后登录即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2025/08/202508081623223693934.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description><pubDate>Fri, 08 Aug 2025 16:26:09 +0800</pubDate></item><item><title>彻底解决Docker镜像拉取失败：国内镜像源配置与深度排错指南</title><link>https://www.sunyonghong.com/post/20250808569.html</link><description>&lt;h3 id=&quot;h3-u5F15u8A00&quot;&gt;&lt;a name=&quot;引言&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;引言&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Error response from daemon: pull access denied&lt;/code&gt;”、“&lt;code&gt;Connection timed out&lt;/code&gt;”… Docker镜像拉取失败是开发者高频痛点。本文系统整理&lt;strong&gt;6类常见问题&lt;/strong&gt;的解决方案，重点解决国内网络环境下的拉取瓶颈。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;一、高频问题分类与速查表&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;一、高频问题分类与速查表&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;问题类型&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;典型错误信息&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;解决方案方向&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;1. 网络连接超时&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;Failed to connect to registry...timeout&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;配置镜像加速器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;2. 认证失败&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;pull access denied... requires authentication&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;私有仓库登录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;3. 镜像不存在&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;manifest unknown: manifest unknown&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;检查镜像名/标签&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;4. 速率限制&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;You have reached your pull rate limit&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;镜像源切换/账户升级&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;5. TLS证书问题&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;x509: certificate signed by unknown authority&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;关闭证书验证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;6. 磁盘空间不足&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;no space left on device&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;清理镜像缓存&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;二、核心解决方案详解&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;二、核心解决方案详解&lt;/h3&gt;&lt;h4 id=&quot;h4--1-&quot;&gt;&lt;a name=&quot;方案1：配置国内镜像加速器（国内用户必选）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案1：配置国内镜像加速器（国内用户必选）&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：拉取&lt;code&gt;docker.io&lt;/code&gt;官方镜像缓慢或超时&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;操作步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 创建或修改配置文件
sudo tee /etc/docker/daemon.json &amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
{
  &amp;quot;registry-mirrors&amp;quot;: [
    &amp;quot;http://mirrors.aliyun.com/pypi/simple/&amp;quot;,
    &amp;quot;https://docker.m.daocloud.io&amp;quot;,
    &amp;quot;https://docker.mirrors.tuna.tsinghua.edu.cn&amp;quot;,
    &amp;quot;http://hub-mirror.c.163.com&amp;quot;,
    &amp;quot;https://mirror.ccs.tencentyun.com&amp;quot;
  ]
}
EOF

# 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep -A 5 &amp;quot;Registry Mirrors&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--2-&quot;&gt;&lt;a name=&quot;方案2：私有仓库认证处理&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案2：私有仓库认证处理&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：拉取私有镜像（如GitLab Container Registry）&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;# 登录私有仓库
docker login registry.example.com -u &amp;lt;用户名&amp;gt; -p &amp;lt;密码&amp;gt;

# 拉取时指定完整路径
docker pull registry.example.com/group/project:tag&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--3-docker-hub-&quot;&gt;&lt;a name=&quot;方案3：绕过Docker Hub限速&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案3：绕过Docker Hub限速&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;策略选择&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;免费账户：改用第三方源（如中科大镜像）&lt;/li&gt;&lt;li&gt;企业用户：购买Docker订阅或自建镜像仓库&lt;/li&gt;&lt;li&gt;临时方案：通过&lt;code&gt;docker pull --platform linux/amd64&lt;/code&gt;限定架构减少数据量&lt;/li&gt;&lt;/ul&gt;
&lt;h4 id=&quot;h4--4-&quot;&gt;&lt;a name=&quot;方案4：强制拉取策略调整&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;方案4：强制拉取策略调整&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 忽略证书错误（测试环境用）
{ &amp;quot;insecure-registries&amp;quot;: [&amp;quot;myregistry:5000&amp;quot;] }

# 使用HTTP替代HTTPS
{ &amp;quot;registry-mirrors&amp;quot;: [&amp;quot;http://hub-mirror.c.163.com&amp;quot;] }&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;三、深度排错技巧&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;三、深度排错技巧&lt;/h3&gt;&lt;h4 id=&quot;h4--1-&quot;&gt;&lt;a name=&quot;技巧1：诊断网络链路&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;技巧1：诊断网络链路&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 测试镜像仓库连通性
curl -v https://registry-1.docker.io/v2/

# 查看DNS解析
dig registry-1.docker.io&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--2-&quot;&gt;&lt;a name=&quot;技巧2：清理缓存释放空间&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;技巧2：清理缓存释放空间&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 删除所有停止的容器
docker container prune

# 删除未被使用的镜像
docker image prune -a

# 查看磁盘占用
docker system df&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--3-&quot;&gt;&lt;a name=&quot;技巧3：拉取过程调试&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;技巧3：拉取过程调试&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 显示详细拉取日志
docker pull --verbose nginx:latest

# 查看镜像分层信息
docker manifest inspect nginx:latest&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;四、企业级方案推荐&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;四、企业级方案推荐&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;自建镜像仓库&lt;/strong&gt;：部署Harbor提供私有仓库服务&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全局代理配置&lt;/strong&gt;：在Docker守护进程设置HTTP_PROXY&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{ &amp;quot;proxies&amp;quot;: { &amp;quot;default&amp;quot;: { &amp;quot;httpProxy&amp;quot;: &amp;quot;http://proxy:port&amp;quot; } } }&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;离线镜像分发&lt;/strong&gt;：使用&lt;code&gt;docker save&lt;/code&gt;/&lt;code&gt;docker load&lt;/code&gt;传输镜像包&lt;/li&gt;&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;五、总结清单&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;五、总结清单&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;✅ &lt;strong&gt;国内用户必配镜像加速器&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;✅ 私有镜像使用完整URL+登录认证&lt;/li&gt;&lt;li&gt;✅ 定期清理磁盘缓存（尤其CI/CD环境）&lt;/li&gt;&lt;li&gt;✅ 企业场景优先自建仓库+代理&lt;/li&gt;&lt;li&gt;❌ 避免生产环境使用&lt;code&gt;insecure-registries&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;终极建议&lt;/strong&gt;：将稳定镜像源配置固化到基础镜像或运维脚本中，一劳永逸解决拉取问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;附录：常用镜像源地址&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;附录：常用镜像源地址&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;网易      : &lt;a href=&quot;https://hub-mirror.c.163.com&quot;&gt;https://hub-mirror.c.163.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;中科大    : &lt;a href=&quot;https://docker.mirrors.ustc.edu.cn&quot;&gt;https://docker.mirrors.ustc.edu.cn&lt;/a&gt;&lt;/li&gt;&lt;li&gt;阿里云    : https://&lt;ID&gt;.mirror.aliyuncs.com&lt;/li&gt;&lt;li&gt;腾讯云    : &lt;a href=&quot;https://mirror.ccs.tencentyun.com&quot;&gt;https://mirror.ccs.tencentyun.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;DockerCN : &lt;a href=&quot;https://registry.docker-cn.com&quot;&gt;https://registry.docker-cn.com&lt;/a&gt; (官方中国源)&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Fri, 08 Aug 2025 14:27:24 +0800</pubDate></item><item><title>阿里云域名自动签发泛域名证书配置（最新篇）</title><link>https://www.sunyonghong.com/post/20241119383.html</link><description>&lt;h2 id=&quot;h2-u6982u8FF0&quot;&gt;&lt;a name=&quot;概述&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;概述&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;本文适用于域名服务商是阿里云的用户参考，如果你想要的是单域名证书签发，可以参考 &lt;a target=&quot;_blank&quot; href=&quot;https://www.sunyonghong.com/post/20241011514.html&quot;&gt;在CentOS 7上配置Certbot以自动签发Nginx的HTTPS证书&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2-1-certbot-2-&quot;&gt;&lt;a name=&quot;1. 安装Certbot (如果已经安装过，可直接参考第2部分)&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1. 安装Certbot (如果已经安装过，可直接参考第2部分)&lt;/h2&gt;&lt;p&gt;首先，您需要安装Certbot。由于CentOS 7默认的软件源可能不包含最新版本的Certbot，因此推荐使用Snap或直接从源代码安装。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-1-snapd&quot;&gt;&lt;a name=&quot;1.1 安装Snapd&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1 安装Snapd&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sudo yum install epel-release
sudo yum install snapd
sudo systemctl enable --now snapd.socket&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-1-2-snap-certbot&quot;&gt;&lt;a name=&quot;1.2 通过Snap安装Certbot&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2 通过Snap安装Certbot&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;如果这里报错 &lt;code&gt;error: too early for operation, device not yet seeded or device model not acknowledged&lt;/code&gt; ,只需要执行下面的命令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /var/lib/snapd/snap /snap&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装完成后再次执行命令通过Snap安装Certbot即可。&lt;/p&gt;
&lt;h2 id=&quot;h2-2-&quot;&gt;&lt;a name=&quot;2. 使用插件实现阿里云的域名自动解析&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2. 使用插件实现阿里云的域名自动解析&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;说明：如果你之前已经已经使用snap方式安装了 &lt;code&gt;certbot-dns-aliyun&lt;/code&gt;插件， 请使用下面的命令先移除&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo snap remove certbot-dns-aliyun&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-2-1-&quot;&gt;&lt;a name=&quot;2.1 登录你的阿里云管理平台给账号赋权以及创建凭证&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.1 登录你的阿里云管理平台给账号赋权以及创建凭证&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;登录地址: &lt;a target=&quot;_blank&quot; href=&quot;https://ram.console.aliyun.com/&quot;&gt;https://ram.console.aliyun.com/&lt;/a&gt;，详细文档参见 &lt;a target=&quot;_blank&quot; href=&quot;https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair&quot;&gt;创建RAM用户的AccessKey&lt;/a&gt;&lt;/li&gt;&lt;li&gt;给你要使用的账号赋予 &lt;code&gt;AliyunDNSFullAccess&lt;/code&gt; 权限&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-2-2-aliyun-cli-&quot;&gt;&lt;a name=&quot;2.2 安装 aliyun cli 工具&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2 安装 aliyun cli 工具&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
tar xzvf aliyun-cli-linux-latest-amd64.tgz
sudo cp aliyun /usr/local/bin
rm aliyun&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-2-3-&quot;&gt;&lt;a name=&quot;2.3 配置阿里云凭证信息&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.3 配置阿里云凭证信息&lt;/h3&gt;&lt;p&gt;可以查看阿里云的官方文档 &lt;a target=&quot;_blank&quot; href=&quot;https://help.aliyun.com/zh/cli/configure-credentials&quot;&gt;配置凭证&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;aliyun configure --profile AkProfile(可任意命名)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行后依次输入：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AccessKey Id：指定您的AccessKey ID。获取方式请参见 &lt;a target=&quot;_blank&quot; href=&quot;https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair&quot;&gt;创建RAM用户的AccessKey&lt;/a&gt;。&lt;/li&gt;&lt;li&gt;AccessKey Secret：指定您的AccessKey Secret。获取方式请参见&lt;a target=&quot;_blank&quot; href=&quot;https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair&quot;&gt;创建RAM用户的AccessKey&lt;/a&gt;。&lt;/li&gt;&lt;li&gt;Region Id：指定默认区域的Region Id。阿里云支持的Region Id，请参见&lt;a target=&quot;_blank&quot; href=&quot;https://help.aliyun.com/zh/ecs/regions-and-zones&quot;&gt;地域和可用区&lt;/a&gt;。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;其他参数默认即可，配置完成后如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/zb_users/upload/2024/11/202411191157381950616.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-2-4-certbot-dns-aliyun-&quot;&gt;&lt;a name=&quot;2.4 安装 certbot-dns-aliyun 插件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.4 安装 certbot-dns-aliyun 插件&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;该插件的开源地址是 &lt;a href=&quot;https://github.com/justjavac/certbot-dns-aliyun&quot;&gt;https://github.com/justjavac/certbot-dns-aliyun&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;# 若该地址无法下载，请下载 https://www.sunyonghong.com/zb_users/upload/2024/11/20241120104615173207077547696.zip文件，将zip解压后，将获得 alidns.sh 文件
wget https://cdn.jsdelivr.net/gh/justjavac/certbot-dns-aliyun@main/alidns.sh
sudo cp alidns.sh /usr/local/bin
sudo chmod +x /usr/local/bin/alidns.sh
sudo ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns
rm alidns.sh&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2-3-&quot;&gt;&lt;a name=&quot;3. 测试申请证书&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3. 测试申请证书&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;sudo certbot certonly -d *.example.com --manual --preferred-challenges dns --manual-auth-hook &amp;quot;alidns&amp;quot; --manual-cleanup-hook &amp;quot;alidns clean&amp;quot; --dry-run&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2-4-&quot;&gt;&lt;a name=&quot;4. 颁发证书&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4. 颁发证书&lt;/h2&gt;&lt;h3 id=&quot;h3-4-1-&quot;&gt;&lt;a name=&quot;4.1 使用命令申请颁发证书&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4.1 使用命令申请颁发证书&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sudo certbot certonly -d *.example.com --manual --preferred-challenges dns --manual-auth-hook &amp;quot;alidns&amp;quot; --manual-cleanup-hook &amp;quot;alidns clean&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt;: 需要颁发的域名，支持泛域名，多个域名使用英文逗号分割&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;后续按提示输入邮箱和同意协议即可完成颁发&lt;/p&gt;
&lt;h3 id=&quot;h3-4-2-&quot;&gt;&lt;a name=&quot;4.2 查看已颁发的证书&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4.2 查看已颁发的证书&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sudo certbot certificates&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2-5-nginx-&quot;&gt;&lt;a name=&quot;5. 生成nginx配置需要用的文件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5. 生成nginx配置需要用的文件&lt;/h2&gt;&lt;p&gt;因为在上方生成时，泛域名容易干扰原有的nginx配置文件，故而在生成时，不指定nginx插件&lt;/p&gt;
&lt;h3 id=&quot;h3-5-1-code-options-ssl-nginx-conf-code-&quot;&gt;&lt;a name=&quot;5.1 生成 &lt;code&gt;options-ssl-nginx.conf&lt;/code&gt; 文件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.1 生成 &lt;code&gt;options-ssl-nginx.conf&lt;/code&gt; 文件&lt;/h3&gt;&lt;p&gt;该文件是 &lt;code&gt;ssl&lt;/code&gt; 证书的参数配置文件，建议在 &lt;code&gt;/etc/letsencrypt/&lt;/code&gt; 目录下创建 名为 &lt;code&gt;options-ssl-nginx.conf&lt;/code&gt; 的文件，并加入以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file. Contents are based on https://ssl-config.mozilla.org

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

ssl_ciphers &amp;quot;ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384&amp;quot;;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-5-2-code-diffie-hellman-code-&quot;&gt;&lt;a name=&quot;5.2 生成 &lt;code&gt;Diffie-Hellman&lt;/code&gt; 参数文件 (可忽略)&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.2 生成 &lt;code&gt;Diffie-Hellman&lt;/code&gt; 参数文件 (可忽略)&lt;/h3&gt;&lt;p&gt;在配置nginx时,有可能需要配置 &lt;code&gt;ssl_dhparam&lt;/code&gt;, &lt;code&gt;ssl_dhparam&lt;/code&gt; 的值是 &lt;code&gt;Diffie-Hellman&lt;/code&gt; 参数文件地址，它在 SSL/TLS 握手过程中使用 &lt;code&gt;Diffie-Hellman&lt;/code&gt; 密钥交换算法时起到关键作用。&lt;code&gt;Diffie-Hellman&lt;/code&gt; 算法允许服务器和客户端在不直接传输密钥的情况下，共同生成一个共享的秘密密钥，这个密钥随后可以用于加密和解密通信。&lt;/p&gt;
&lt;p&gt;执行以下命令生成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl dhparam -out /etc/letsencrypt/ssl-dhparams.pem 2048&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2-6-nginx&quot;&gt;&lt;a name=&quot;6. 配置nginx&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6. 配置nginx&lt;/h2&gt;&lt;p&gt;在你的nginx配置文件中，修改 &lt;code&gt;server&lt;/code&gt; 配置下的监听端口、引入证书配置即可，如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;# 这行可以不配置&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改完成后可使用 &lt;code&gt;nginx -t&lt;/code&gt; 测试，无误后重启即可生效&lt;/p&gt;
&lt;h2 id=&quot;h2-7-&quot;&gt;&lt;a name=&quot;7. 续签证书&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;7. 续签证书&lt;/h2&gt;&lt;h3 id=&quot;h3-7-1-certbot-&quot;&gt;&lt;a name=&quot;7.1 检查Certbot的续签配置&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;7.1 检查Certbot的续签配置&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sudo certbot renew --manual --preferred-challenges dns --manual-auth-hook &amp;quot;alidns&amp;quot; --manual-cleanup-hook &amp;quot;alidns clean&amp;quot; --dry-run&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-7-2-&quot;&gt;&lt;a name=&quot;7.2 手动续签&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;7.2 手动续签&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;sudo certbot renew --manual --preferred-challenges dns --manual-auth-hook &amp;quot;alidns&amp;quot; --manual-cleanup-hook &amp;quot;alidns clean&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;h3-7-3-&quot;&gt;&lt;a name=&quot;7.3 使用计划任务自动续签&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;7.3 使用计划任务自动续签&lt;/h3&gt;&lt;p&gt;如每天的凌晨2点运行，自动续签证书&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 平滑重启(建议)
sudo tee /etc/cron.d/certbot &amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
0 2 * * * root certbot renew --manual --preferred-challenges dns --manual-auth-hook &amp;quot;alidns&amp;quot; --manual-cleanup-hook &amp;quot;alidns clean&amp;quot; --deploy-hook &amp;quot;nginx -s reload&amp;quot;
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;# 强制重启
sudo tee /etc/cron.d/certbot &amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
0 2  * *  *  root certbot renew --manual --preferred-challenges dns --manual-auth-hook &amp;quot;alidns&amp;quot; --manual-cleanup-hook &amp;quot;alidns clean&amp;quot; --deploy-hook &amp;quot;systemctl restart nginx&amp;quot;
EOF&lt;/code&gt;&lt;/pre&gt;</description><pubDate>Thu, 07 Aug 2025 16:52:57 +0800</pubDate></item></channel></rss>