<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>教程笔记 on ttz.pw</title>
    <link>https://www.ttz.pw/categories/%E6%95%99%E7%A8%8B%E7%AC%94%E8%AE%B0/</link>
    <description>Recent content in 教程笔记 on ttz.pw</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 11 Feb 2026 09:16:40 +0800</lastBuildDate>
    
        <atom:link href="https://www.ttz.pw/categories/%E6%95%99%E7%A8%8B%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Windows端口未被占用，但是无法使用的问题解决方式</title>
      <link>https://www.ttz.pw/post/windows-port-nouse/</link>
      <pubDate>Wed, 11 Feb 2026 09:16:40 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/windows-port-nouse/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#1-%e9%97%ae%e9%a2%98%e6%8f%8f%e8%bf%b0&#34;&gt;1. 问题描述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#2-%e9%97%ae%e9%a2%98%e5%88%86%e6%9e%90&#34;&gt;2. 问题分析&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#21-%e5%b8%b8%e8%a7%84%e7%ab%af%e5%8f%a3%e5%8d%a0%e7%94%a8%e6%8e%92%e6%9f%a5&#34;&gt;2.1 常规端口占用排查&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#%e6%ad%a5%e9%aa%a41%e6%9f%a5%e7%9c%8b%e7%ab%af%e5%8f%a3%e5%8d%a0%e7%94%a8%e6%83%85%e5%86%b5&#34;&gt;步骤1：查看端口占用情况&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#%e6%ad%a5%e9%aa%a42%e7%bb%93%e6%9d%9f%e5%8d%a0%e7%94%a8%e7%ab%af%e5%8f%a3%e7%9a%84%e8%bf%9b%e7%a8%8b&#34;&gt;步骤2：结束占用端口的进程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#%e6%ad%a5%e9%aa%a43%e9%87%8d%e7%bd%ae%e7%bd%91%e7%bb%9c%e8%ae%be%e7%bd%ae&#34;&gt;步骤3：重置网络设置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#22-%e7%89%b9%e6%ae%8a%e6%83%85%e5%86%b5windows%e7%b3%bb%e7%bb%9f%e4%bf%9d%e7%95%99%e7%ab%af%e5%8f%a3&#34;&gt;2.2 特殊情况：Windows系统保留端口&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#%e6%a3%80%e6%9f%a5windows%e4%bf%9d%e7%95%99%e7%ab%af%e5%8f%a3%e8%8c%83%e5%9b%b4&#34;&gt;检查Windows保留端口范围&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#3-%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95&#34;&gt;3. 解决方法&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#31-%e4%b8%b4%e6%97%b6%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e6%97%a0%e9%9c%80%e9%87%8d%e5%90%af&#34;&gt;3.1 临时解决方案（无需重启）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/windows-port-nouse/#32-%e6%a0%b9%e6%9c%ac%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e6%8e%a8%e8%8d%90&#34;&gt;3.2 根本解决方案（推荐）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-问题描述&#34;&gt;1. 问题描述&lt;/h2&gt;
&lt;p&gt;最近发现Windows系统中存在一种特殊问题：明明端口未被任何应用程序占用，但却无法使用该端口。例如：Docker Desktop容器已经正常启动，但外部无法访问；通过Docker Desktop界面查看端口占用情况，发现容器端口未正常对外暴露；之前一直正常运行的程序，今天启动时突然报错&amp;quot;端口已被占用&amp;quot;。&lt;/p&gt;
&lt;h2 id=&#34;2-问题分析&#34;&gt;2. 问题分析&lt;/h2&gt;
&lt;p&gt;通常遇到端口占用问题，我们会选择结束占用该端口的应用程序。但在特殊情况下，当你确认没有应用程序占用该端口时，仍然会收到&amp;quot;端口已被占用&amp;quot;的错误提示。这种情况往往是&lt;strong&gt;系统级别的端口占用&lt;/strong&gt;所致。&lt;/p&gt;
&lt;h3 id=&#34;21-常规端口占用排查&#34;&gt;2.1 常规端口占用排查&lt;/h3&gt;
&lt;h4 id=&#34;步骤1查看端口占用情况&#34;&gt;步骤1：查看端口占用情况&lt;/h4&gt;
&lt;p&gt;使用以下命令查看特定端口的占用情况（以8080端口为例），若查询不到结果，尝试以管理员权限重新运行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;netstat -ano | findstr &lt;span style=&#34;color:#bd93f9&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;步骤2结束占用端口的进程&#34;&gt;步骤2：结束占用端口的进程&lt;/h4&gt;
&lt;p&gt;如果查询到占用端口的进程，可以通过以下命令强制结束该进程：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;taskkill /F /PID &lt;span style=&#34;color:#bd93f9&#34;&gt;1234&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中，1234 是占用端口的进程ID。&lt;/p&gt;
&lt;h4 id=&#34;步骤3重置网络设置&#34;&gt;步骤3：重置网络设置&lt;/h4&gt;
&lt;p&gt;如果查询不到占用端口的进程，可以尝试重启计算机，或者使用以下命令重置网络设置：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;netsh int ip reset
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;22-特殊情况windows系统保留端口&#34;&gt;2.2 特殊情况：Windows系统保留端口&lt;/h3&gt;
&lt;p&gt;如果以上常规方法都无法解决问题，可能是遇到了Windows系统保留端口的问题。Windows会自动保留一些端口范围用于系统服务，这些端口即使没有被任何应用程序占用，也无法被用户应用使用。&lt;/p&gt;
&lt;h4 id=&#34;检查windows保留端口范围&#34;&gt;检查Windows保留端口范围&lt;/h4&gt;
&lt;p&gt;使用以下命令查看Windows系统保留的端口范围：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# 以管理员身份运行PowerShell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;netsh int ipv4 show excludedportrange &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;protocol&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;tcp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;协议 tcp 端口排除范围
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;开始端口    结束端口
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;----------    --------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;4309&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;4408&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;5985&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;5985&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;7630&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;7729&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;7730&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;7829&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;7830&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;7929&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;7930&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;8029&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;8030&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;8129&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;8130&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;8229&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;8230&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;8329&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#bd93f9&#34;&gt;9081&lt;/span&gt;        &lt;span style=&#34;color:#bd93f9&#34;&gt;9180&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;     &lt;span style=&#34;color:#bd93f9&#34;&gt;10089&lt;/span&gt;       &lt;span style=&#34;color:#bd93f9&#34;&gt;10188&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&lt;/span&gt;&lt;span&gt;     &lt;span style=&#34;color:#bd93f9&#34;&gt;47001&lt;/span&gt;       &lt;span style=&#34;color:#bd93f9&#34;&gt;47001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&lt;/span&gt;&lt;span&gt;     &lt;span style=&#34;color:#bd93f9&#34;&gt;50000&lt;/span&gt;       &lt;span style=&#34;color:#bd93f9&#34;&gt;50059&lt;/span&gt;     *
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&lt;/span&gt;&lt;span&gt;* - 管理的端口排除。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# 查看动态端口范围&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&lt;/span&gt;&lt;span&gt;netsh int ipv4 show dynamicport tcp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&lt;/span&gt;&lt;span&gt;协议 tcp 动态端口范围
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&lt;/span&gt;&lt;span&gt;---------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28&lt;/span&gt;&lt;span&gt;启动端口        : &lt;span style=&#34;color:#bd93f9&#34;&gt;49152&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29&lt;/span&gt;&lt;span&gt;端口数          : &lt;span style=&#34;color:#bd93f9&#34;&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过以上命令可以查看：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Windows系统自动保留的TCP端口排除范围（即无法被用户应用使用的端口）&lt;/li&gt;
&lt;li&gt;Windows动态端口范围（系统用于临时分配的端口）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你的应用程序使用的端口正好在系统保留的端口范围内，即使没有任何应用程序占用该端口，也会收到&amp;quot;端口已被占用&amp;quot;的错误。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际案例&lt;/strong&gt;：我启动的应用程序使用端口8000，但一直报错&amp;quot;端口已被占用&amp;quot;。通过查看系统保留端口范围，发现8000端口正好位于7930-8029的保留范围内，因此无法使用。&lt;/p&gt;
&lt;h2 id=&#34;3-解决方法&#34;&gt;3. 解决方法&lt;/h2&gt;
&lt;h3 id=&#34;31-临时解决方案无需重启&#34;&gt;3.1 临时解决方案（无需重启）&lt;/h3&gt;
&lt;p&gt;如果急需启动服务，可以采用以下临时方法释放端口（无需重启电脑）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;net stop winnat
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# 立即启动你的应用服务（如Spring Boot、Redis、Docker容器等）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;net start winnat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;：此方法通过临时停止并重启Windows网络地址转换服务（WinNAT）来释放系统保留的端口。停止WinNAT服务后，请立即启动你的应用程序，以抢占该端口。&lt;/p&gt;
&lt;h3 id=&#34;32-根本解决方案推荐&#34;&gt;3.2 根本解决方案（推荐）&lt;/h3&gt;
&lt;p&gt;调整Windows动态端口范围，避免与常用开发端口冲突。将动态端口的起始点从默认值调整为标准的49152（IANA标准动态端口范围）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# 必须以管理员身份运行PowerShell或命令提示符&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;netsh int ipv4 &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;set&lt;/span&gt; dynamicport tcp &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;start&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;49152&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;netsh int ipv4 &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;set&lt;/span&gt; dynamicport udp &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;start&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;49152&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;num&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;执行上述命令后，需要&lt;strong&gt;重启电脑&lt;/strong&gt;使设置生效&lt;/li&gt;
&lt;li&gt;重启后，系统将仅在49152–65535范围内分配动态端口&lt;/li&gt;
&lt;li&gt;这将避免系统保留端口与常用开发端口（如8080、8000、3000等）产生冲突&lt;/li&gt;
&lt;li&gt;此方法是一劳永逸的解决方案&lt;/li&gt;
&lt;/ul&gt;</description>
      
    </item>
    
    <item>
      <title>加密与安全：动态令牌 OTP、HOTP、TOTP 原理解析</title>
      <link>https://www.ttz.pw/post/otp/</link>
      <pubDate>Mon, 17 Jun 2024 13:51:34 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/otp/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#1-otphotptotp-%e7%ae%80%e4%bb%8b&#34;&gt;1. OTP、HOTP、TOTP 简介&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#11-otp&#34;&gt;1.1. OTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#12-hotp&#34;&gt;1.2. HOTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#13-totp&#34;&gt;1.3. TOTP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#2-totp-%e5%bc%b1%e7%82%b9%e5%92%8c%e6%bc%8f%e6%b4%9e%e7%bc%96%e8%be%91&#34;&gt;2. TOTP 弱点和漏洞编辑&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#3-%e5%8e%9f%e7%90%86%e4%bb%8b%e7%bb%8d&#34;&gt;3. 原理介绍&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#31-otp-%e5%9f%ba%e6%9c%ac%e5%8e%9f%e7%90%86&#34;&gt;3.1. OTP 基本原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#32-hotp-%e5%9f%ba%e6%9c%ac%e5%8e%9f%e7%90%86&#34;&gt;3.2. HOTP 基本原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#33-totp-%e5%9f%ba%e6%9c%ac%e5%8e%9f%e7%90%86&#34;&gt;3.3. TOTP 基本原理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#4-%e5%8f%82%e8%80%83&#34;&gt;4. 参考&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#41-python-%e7%9a%84-otp-%e5%ae%9e%e7%8e%b0&#34;&gt;4.1. python 的 otp 实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#42-%e5%9f%ba%e4%ba%8e-pyotp-%e7%9a%84%e7%ae%80%e5%8d%95%e5%ba%94%e7%94%a8&#34;&gt;4.2. 基于 pyotp 的简单应用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#43-pyotp-%e7%9a%84-hotp-%e7%9a%84%e4%bd%bf%e7%94%a8%e8%af%b4%e6%98%8e&#34;&gt;4.3. pyotp 的 HOTP 的使用说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#44-%e4%bd%bf%e7%94%a8%e5%9c%ba%e6%99%af&#34;&gt;4.4. 使用场景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#45-%e5%b8%82%e9%9d%a2%e4%b8%8a%e5%9f%ba%e4%ba%8e-hotp-%e7%9a%84%e4%ba%a7%e5%93%81&#34;&gt;4.5. 市面上基于 HOTP 的产品&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#46-google-%e5%9f%ba%e4%ba%8e-totp-%e7%9a%84%e5%bc%80%e6%ba%90%e5%ae%9e%e7%8e%b0&#34;&gt;4.6. Google 基于 TOTP 的开源实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#47-golang-%e7%9a%84%e4%b8%80%e4%b8%aa-otp-%e5%ae%9e%e7%8e%b0&#34;&gt;4.7. golang 的一个 otp 实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#48-rfc-%e5%8f%82%e8%80%83&#34;&gt;4.8. RFC 参考&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/otp/#5-refer&#34;&gt;5. refer：&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-otphotptotp-简介&#34;&gt;1. OTP、HOTP、TOTP 简介&lt;/h2&gt;
&lt;h3 id=&#34;11-otp&#34;&gt;1.1. OTP&lt;/h3&gt;
&lt;p&gt;One-Time Password 简写，表示一次性密码。&lt;/p&gt;
&lt;h3 id=&#34;12-hotp&#34;&gt;1.2. HOTP&lt;/h3&gt;
&lt;p&gt;HMAC-based One-Time Password 简写，表示基于 HMAC 算法加密的一次性密码。是事件同步，通过某一特定的事件次序及相同的种子值作为输入，通过 HASH 算法运算出一致的密码。&lt;/p&gt;
&lt;h3 id=&#34;13-totp&#34;&gt;1.3. TOTP&lt;/h3&gt;
&lt;p&gt;Time-based One-Time Password 简写，表示基于时间戳算法的一次性密码。&lt;/p&gt;
&lt;p&gt;时间同步，基于客户端的动态口令和动态口令验证服务器的时间比对，一般每 60 秒产生一个新口令，要求客户端和服务器能够十分精确的保持正确的时钟，客户端和服务端基于时间计算的动态口令才能一致。　　&lt;/p&gt;
&lt;h2 id=&#34;2-totp-弱点和漏洞编辑&#34;&gt;2. TOTP 弱点和漏洞编辑&lt;/h2&gt;
&lt;p&gt;TOTP 代码可以像密码一样被钓鱼，但它们需要网络钓鱼者实时代理凭证，而不是及时收集它们，不限制登录尝试的实现容易受到强制执行代码的攻击。&lt;/p&gt;
&lt;p&gt;窃取共享密钥的攻击者可以随意生成新的有效 TOTP 代码。如果攻击者破坏了大型身份验证数据库，这可能是一个特殊问题。&lt;/p&gt;
&lt;p&gt;由于 TOTP 设备的电池电量不足，时钟可以解除同步，并且由于软件版本在用户可能丢失或被盗的手机上，因此所有实际实施都有绕过保护的方法（例如：打印的代码，电子邮件 - 重置等），这可能给大型用户群带来相当大的支持负担，并且还为欺诈用户提供额外的利用向量。&lt;/p&gt;
&lt;p&gt;TOTP 代码的有效期超过它们在屏幕上显示的时间（通常是两倍或更多倍）。这是一个让步，认证和认证方的时钟可以大幅度扭曲。
所有一次性基于密码的身份验证方案（包括 TOTP 和 HOTP 等）仍然容易受到会话劫持，即在用户登录后占用用户的会话。&lt;/p&gt;
&lt;h2 id=&#34;3-原理介绍&#34;&gt;3. 原理介绍&lt;/h2&gt;
&lt;h3 id=&#34;31-otp-基本原理&#34;&gt;3.1. OTP 基本原理&lt;/h3&gt;
&lt;p&gt;计算 OTP 串的公式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;OTP(K,C) &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; Truncate(HMAC&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;SHA&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;(K,C))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;K 表示秘钥串；&lt;/li&gt;
&lt;li&gt;C 是一个数字，表示随机数；&lt;/li&gt;
&lt;li&gt;HMAC-SHA-1 表示使用 SHA-1 做 HMAC；&lt;/li&gt;
&lt;li&gt;Truncate 是一个函数，就是怎么截取加密后的串，并取加密后串的哪些字段组成一个数字。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对 HMAC-SHA-1 方式加密来说，Truncate 实现如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HMAC-SHA-1 加密后的长度得到一个 20 字节的密串；&lt;/li&gt;
&lt;li&gt;取这个 20 字节的密串的最后一个字节，取这字节的低 4 位，作为截取加密串的下标偏移量；&lt;/li&gt;
&lt;li&gt;按照下标偏移量开始，获取4个字节，按照大端方式组成一个整数；&lt;/li&gt;
&lt;li&gt;截取这个整数的后 6 位或者 8 位转成字符串返回。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;static&lt;/span&gt; String &lt;span style=&#34;color:#50fa7b&#34;&gt;generateOTP&lt;/span&gt;(String K,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;                                     String C,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;                                     String returnDigits,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;                                     String crypto){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#8be9fd&#34;&gt;int&lt;/span&gt; codeDigits &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; Integer.&lt;span style=&#34;color:#50fa7b&#34;&gt;decode&lt;/span&gt;(returnDigits).&lt;span style=&#34;color:#50fa7b&#34;&gt;intValue&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;       String result &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// K是密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// C是产生的随机数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// crypto是加密算法 HMAC-SHA-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#8be9fd&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[]&lt;/span&gt; hash &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; hmac_sha(crypto, K, C);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// hash为20字节的字符串&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// put selected bytes into result int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// 获取hash最后一个字节的低4位，作为选择结果的开始下标偏移&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#8be9fd&#34;&gt;int&lt;/span&gt; offset &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; hash&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;hash.&lt;span style=&#34;color:#50fa7b&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt; 1&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&lt;/span&gt; 0xf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// 获取4个字节组成一个整数，其中第一个字节最高位为符号位，不获取，使用0x7f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#8be9fd&#34;&gt;int&lt;/span&gt; binary &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&lt;/span&gt;&lt;span&gt;               ((hash&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;offset&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&lt;/span&gt; 0x7f) &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; 24) &lt;span style=&#34;color:#ff79c6&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&lt;/span&gt;&lt;span&gt;               ((hash&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;offset &lt;span style=&#34;color:#ff79c6&#34;&gt;+&lt;/span&gt; 1&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&lt;/span&gt; 0xff) &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; 16) &lt;span style=&#34;color:#ff79c6&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&lt;/span&gt;&lt;span&gt;               ((hash&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;offset &lt;span style=&#34;color:#ff79c6&#34;&gt;+&lt;/span&gt; 2&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&lt;/span&gt; 0xff) &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; 8) &lt;span style=&#34;color:#ff79c6&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&lt;/span&gt;&lt;span&gt;               (hash&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;offset &lt;span style=&#34;color:#ff79c6&#34;&gt;+&lt;/span&gt; 3&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&lt;/span&gt; 0xff);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// 获取这个整数的后6位（可以根据需要取后8位）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#8be9fd&#34;&gt;int&lt;/span&gt; otp &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; binary &lt;span style=&#34;color:#ff79c6&#34;&gt;%&lt;/span&gt; 1000000;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#6272a4&#34;&gt;// 将数字转成字符串，不够6位前面补0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&lt;/span&gt;&lt;span&gt;       result &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; Integer.&lt;span style=&#34;color:#50fa7b&#34;&gt;toString&lt;/span&gt;(otp);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#ff79c6&#34;&gt;while&lt;/span&gt; (result.&lt;span style=&#34;color:#50fa7b&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;lt;&lt;/span&gt; codeDigits) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29&lt;/span&gt;&lt;span&gt;           result &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;+&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30&lt;/span&gt;&lt;span&gt;       }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31&lt;/span&gt;&lt;span&gt;       &lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32&lt;/span&gt;&lt;span&gt;   }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;返回的结果就是看到一个数字的动态密码。&lt;/p&gt;
&lt;h3 id=&#34;32-hotp-基本原理&#34;&gt;3.2. HOTP 基本原理&lt;/h3&gt;
&lt;p&gt;知道了 OTP 的基本原理，HOTP 只是将其中的参数 C 变成了随机数。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;HOTP(K,C) &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; Truncate(HMAC&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;SHA&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;(K,C))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HOTP：&lt;/p&gt;
&lt;p&gt;Generates the OTP for the given count&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C 作为一个参数，获取动态密码。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;p&gt;HOTP 的 python 代码片段：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;HOTP&lt;/span&gt;(OTP):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;at&lt;/span&gt;(&lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;, count):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        Generates the OTP for the given count
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        @param [Integer] count counter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        @returns [Integer] OTP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;generate_otp(count)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一般规定 HOTP 的散列函数使用 SHA2，即：基于 SHA-256 or SHA-512 [SHA2] 的散列函数做事件同步验证；&lt;/p&gt;
&lt;h3 id=&#34;33-totp-基本原理&#34;&gt;3.3. TOTP 基本原理&lt;/h3&gt;
&lt;p&gt;TOTP 只是将其中的参数 &lt;code&gt;C&lt;/code&gt; 变成了由时间戳产生的数字。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;TOTP(K,C) &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; HOTP(K,C) &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; Truncate(HMAC&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;SHA&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;(K,C))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不同点是 TOTP 中的 &lt;code&gt;C&lt;/code&gt;是时间戳计算得出。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;C &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; (T &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt; T0) &lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt; X;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;T 表示当前 Unix 时间戳：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://www.ttz.pw/post/images/2024-06-17-14-02-46.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;T0 一般取值为 0，也就是 1970 年 1 月 1 日。&lt;/p&gt;
&lt;p&gt;因此上式可以简化为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;C &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; T &lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt; X;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;X 表示时间步数，也就是说多长时间产生一个动态密码，这个时间间隔就是时间步数 X，系统默认是 30 秒；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;T0 &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;X &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;30&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;简化为：C = T / 30&lt;/p&gt;
&lt;p&gt;1）T = 30 ~ 59&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;C &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;表示 &lt;span style=&#34;color:#bd93f9&#34;&gt;30&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;~&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;59&lt;/span&gt; 这  &lt;span style=&#34;color:#bd93f9&#34;&gt;30&lt;/span&gt;  秒内的动态密码一致。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2）T = 60 ~ 89&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;C &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;表示 &lt;span style=&#34;color:#bd93f9&#34;&gt;30&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;~&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;59&lt;/span&gt; 这 &lt;span style=&#34;color:#bd93f9&#34;&gt;30&lt;/span&gt; 秒内的动态密码一致。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不同厂家使用的时间步数不同：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;阿里巴巴的身份宝使用的时间步数是 &lt;span style=&#34;color:#bd93f9&#34;&gt;60&lt;/span&gt; 秒；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;宁盾令牌使用的时间步数是 &lt;span style=&#34;color:#bd93f9&#34;&gt;60&lt;/span&gt; 秒；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;Google 的身份验证器的时间步数是 &lt;span style=&#34;color:#bd93f9&#34;&gt;30&lt;/span&gt; 秒；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;腾讯的 Token 时间步数是 &lt;span style=&#34;color:#bd93f9&#34;&gt;60&lt;/span&gt; 秒；
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;TOTP 的 python 代码片段：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;TOTP&lt;/span&gt;(OTP):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;, &lt;span style=&#34;color:#ff79c6&#34;&gt;*&lt;/span&gt;args, &lt;span style=&#34;color:#ff79c6&#34;&gt;**&lt;/span&gt;kwargs):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        @option options [Integer] interval (30) the time interval in seconds
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;            for OTP This defaults to 30 which is standard.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;interval &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; kwargs&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;pop(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;interval&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#bd93f9&#34;&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;super&lt;/span&gt;(TOTP, &lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;)&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#50fa7b&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#ff79c6&#34;&gt;*&lt;/span&gt;args, &lt;span style=&#34;color:#ff79c6&#34;&gt;**&lt;/span&gt;kwargs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;now&lt;/span&gt;(&lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        Generate the current time OTP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        @return [Integer] the OTP as an integer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;generate_otp(&lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;timecode(datetime&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;datetime&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;now()))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;timecode&lt;/span&gt;(&lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;, for_time):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;        i &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;mktime(for_time&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;timetuple())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;int&lt;/span&gt;(i &lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;font-style:italic&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;interval)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;self.interval 是时间步数 X；&lt;/li&gt;
&lt;li&gt;datetime.datetime.now() 为当前的 Unix 时间戳；&lt;/li&gt;
&lt;li&gt;timecode 表示 (T - T0) / X，即获取获取动态密码计算的随机数。&lt;/li&gt;
&lt;li&gt;TOTP 的实现可以使用 HMAC-SHA-256 或者 HMAC-SHA-512 散列函数；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;TOTP 的要求：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;客户端和服务器必须能够彼此知道或者推算出对方的 Unix Time；&lt;/li&gt;
&lt;li&gt;客户端和服务器端必须共享一个密钥；&lt;/li&gt;
&lt;li&gt;算法必须使用 HOTP 作为其关键实现环节；&lt;/li&gt;
&lt;li&gt;客户端和服务器端必须使用相同的步长 X；&lt;/li&gt;
&lt;li&gt;每一个客户端必须拥有不同的密钥；&lt;/li&gt;
&lt;li&gt;密钥的生成必须足够随机；&lt;/li&gt;
&lt;li&gt;密钥必须储存在防篡改的设备上，而且不能在不安全的情况下被访问或使用；&lt;/li&gt;
&lt;li&gt;对该算法中 &lt;code&gt;T&lt;/code&gt; 的实现必须大于 int32，因为它在 2038 年将超出上限；&lt;/li&gt;
&lt;li&gt;T0 和 X 的协商必须在之前的步骤中就已经做好了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;4-参考&#34;&gt;4. 参考&lt;/h2&gt;
&lt;h3 id=&#34;41-python-的-otp-实现&#34;&gt;4.1. python 的 otp 实现&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;https:&lt;span style=&#34;color:#ff79c6&#34;&gt;//&lt;/span&gt;pypi&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;python&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;org&lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt;pypi&lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt;pyotp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;https:&lt;span style=&#34;color:#ff79c6&#34;&gt;//&lt;/span&gt;github&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;com&lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt;pyotp&lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt;pyotp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;42-基于-pyotp-的简单应用&#34;&gt;4.2. 基于 pyotp 的简单应用&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; base64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; base64&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;b32encode(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;This is my secret key&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;KRUGS4ZANFZSA3LZEBZWKY3SMV2CA23FPE======&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; secretKey &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; base64&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;b32encode(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;This is my secret key&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; pyotp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; totp &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; pyotp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;TOTP(secretKey)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; totp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;now()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;423779&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;简单说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;加载base64的模块，将我的秘钥做一下base32的加密，加载pyotp模块，otp使用base32加密后的秘钥传作为种子，生成随机数字验证的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以使用pyotp和expect一起实现基于google authenticator的自动登录（免去每次双认证，输入密码和动态密码）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4.3、pyotp 的 TOTP 的使用说明&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;totp &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; pyotp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;TOTP(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;base32secret3232&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;totp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;now() &lt;span style=&#34;color:#6272a4&#34;&gt;# =&amp;gt; 492039&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# OTP verified for current time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;totp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;verify(&lt;span style=&#34;color:#bd93f9&#34;&gt;492039&lt;/span&gt;) &lt;span style=&#34;color:#6272a4&#34;&gt;# =&amp;gt; True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;time&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;sleep(&lt;span style=&#34;color:#bd93f9&#34;&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;totp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;verify(&lt;span style=&#34;color:#bd93f9&#34;&gt;492039&lt;/span&gt;) &lt;span style=&#34;color:#6272a4&#34;&gt;# =&amp;gt; False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;43-pyotp-的-hotp-的使用说明&#34;&gt;4.3. pyotp 的 HOTP 的使用说明&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;hotp &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; pyotp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;HOTP(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;base32secret3232&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;hotp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;at(&lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#6272a4&#34;&gt;# =&amp;gt; 260182&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;hotp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;at(&lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#6272a4&#34;&gt;# =&amp;gt; 55283&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;hotp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;at(&lt;span style=&#34;color:#bd93f9&#34;&gt;1401&lt;/span&gt;) &lt;span style=&#34;color:#6272a4&#34;&gt;# =&amp;gt; 316439&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# OTP verified with a counter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;hotp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;verify(&lt;span style=&#34;color:#bd93f9&#34;&gt;316439&lt;/span&gt;, &lt;span style=&#34;color:#bd93f9&#34;&gt;1401&lt;/span&gt;) &lt;span style=&#34;color:#6272a4&#34;&gt;# =&amp;gt; True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;hotp&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;verify(&lt;span style=&#34;color:#bd93f9&#34;&gt;316439&lt;/span&gt;, &lt;span style=&#34;color:#bd93f9&#34;&gt;1402&lt;/span&gt;) &lt;span style=&#34;color:#6272a4&#34;&gt;# =&amp;gt; False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;44-使用场景&#34;&gt;4.4. 使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;服务器登录动态密码验证（如阿里云ECS登录，腾讯机房服务器登录等）；&lt;/li&gt;
&lt;li&gt;公司VPN登录双因素验证；&lt;/li&gt;
&lt;li&gt;网络接入radius动态密码；&lt;/li&gt;
&lt;li&gt;银行转账动态密码；&lt;/li&gt;
&lt;li&gt;网银、网络游戏的实体动态口令牌；&lt;/li&gt;
&lt;li&gt;等动态密码验证的应用场景。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;45-市面上基于-hotp-的产品&#34;&gt;4.5. 市面上基于 HOTP 的产品&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;宁盾令牌&lt;/li&gt;
&lt;li&gt;阿里巴巴的身份宝&lt;/li&gt;
&lt;li&gt;Google 的身份验证器（google-authenticator）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;46-google-基于-totp-的开源实现&#34;&gt;4.6. Google 基于 TOTP 的开源实现&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/google/google-authenticator&#34;&gt;https://github.com/google/google-authenticator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;RFC6238中TOTP基于java代码的实现。&lt;/p&gt;
&lt;h3 id=&#34;47-golang-的一个-otp-实现&#34;&gt;4.7. golang 的一个 otp 实现&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/gitchs/gootp&#34;&gt;https://github.com/gitchs/gootp&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;48-rfc-参考&#34;&gt;4.8. RFC 参考&lt;/h3&gt;
&lt;p&gt;RFC 4226 One-Time Password and HMAC-based One-Time Password.&lt;/p&gt;
&lt;p&gt;RFC 6238 Time-based One-Time Password.&lt;/p&gt;
&lt;p&gt;RFC 2104 HMAC Keyed-Hashing for Message Authentication.&lt;/p&gt;
&lt;h2 id=&#34;5-refer&#34;&gt;5. refer：&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/voipman/p/6216328.html&#34;&gt;https://www.cnblogs.com/voipman/p/6216328.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.bubuko.com/infodetail-1884978.html&#34;&gt;http://www.bubuko.com/infodetail-1884978.html&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Docker部署Redis集群及集群伸缩</title>
      <link>https://www.ttz.pw/post/docker-redis/</link>
      <pubDate>Tue, 26 Sep 2023 21:15:34 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/docker-redis/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#1-docker%e9%83%a8%e7%bd%b2redis%e9%9b%86%e7%be%a4%e5%8f%8a%e9%9b%86%e7%be%a4%e4%bc%b8%e7%bc%a9&#34;&gt;1. Docker部署Redis集群及集群伸缩&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#11-%e5%88%9b%e5%bb%ba6%e4%b8%aadata%e7%9b%ae%e5%bd%95&#34;&gt;1.1. 创建6个data目录&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#12-%e5%ae%98%e7%bd%91%e4%b8%8b%e8%bd%bd%e6%9c%80%e6%96%b0%e7%9a%84redis%e5%8c%85&#34;&gt;1.2. 官网下载最新的redis包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#13-docker%e6%8b%89%e5%8f%96%e5%af%b9%e5%ba%94%e7%9a%84redis%e9%95%9c%e5%83%8f&#34;&gt;1.3. docker拉取对应的redis镜像&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#14-%e4%bf%ae%e6%94%b9%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6&#34;&gt;1.4. 修改配置文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#15-%e5%90%af%e5%8a%a86%e5%8f%b0redis%e5%ae%b9%e5%99%a8&#34;&gt;1.5. 启动6台redis容器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#16-%e6%9f%a5%e7%9c%8b%e5%90%84%e5%ae%b9%e5%99%a8ip&#34;&gt;1.6. 查看各容器IP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#17-%e8%bf%9b%e5%85%a5%e4%bb%bb%e4%b8%80%e5%ae%b9%e5%99%a8%e9%85%8d%e7%bd%ae%e9%9b%86%e7%be%a4%e9%81%87yes%e6%95%b2yes&#34;&gt;1.7. 进入任一容器配置集群(遇yes敲yes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#18-%e6%9f%a5%e7%9c%8b%e9%9b%86%e7%be%a4%e4%bf%a1%e6%81%af&#34;&gt;1.8. 查看集群信息&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#19-%e9%9b%86%e7%be%a4%e5%8f%96%e5%ad%98%e6%b5%8b%e8%af%95&#34;&gt;1.9. 集群取存测试&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#110-%e5%88%86%e7%89%87%e9%ab%98%e5%8f%af%e7%94%a8%e6%b5%8b%e8%af%95ha&#34;&gt;1.10. 分片高可用测试(HA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#111-%e6%80%9d%e8%80%83&#34;&gt;1.11. 思考&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#112-%e9%9b%86%e7%be%a4%e5%ad%98%e5%82%a8%e5%8e%9f%e7%90%86&#34;&gt;1.12. 集群存储原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#113-%e9%9b%86%e7%be%a4%e6%89%a9%e5%ae%b9&#34;&gt;1.13. 集群扩容&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-redis/#114-%e9%9b%86%e7%be%a4%e7%bc%a9%e5%ae%b9&#34;&gt;1.14. 集群缩容&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;1-docker部署redis集群及集群伸缩&#34;&gt;1. Docker部署Redis集群及集群伸缩&lt;/h1&gt;
&lt;h2 id=&#34;11-创建6个data目录&#34;&gt;1.1. 创建6个data目录&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;mkdir /mnt/data/6381
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;mkdir /mnt/data/6382
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;mkdir /mnt/data/6383
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;mkdir /mnt/data/6384
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;mkdir /mnt/data/6385
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;mkdir /mnt/data/6386
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;12-官网下载最新的redis包&#34;&gt;1.2. 官网下载最新的redis包&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;wget http://download.redis.io/releases/redis-6.0.6.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;13-docker拉取对应的redis镜像&#34;&gt;1.3. docker拉取对应的redis镜像&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;docker pull redis:6.0.6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;14-修改配置文件&#34;&gt;1.4. 修改配置文件&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# cp redis-6.0.6/redis.conf /mnt/redis.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# vim /mnt/redis.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# bind 127.0.0.1 &amp;#34;注释bind 127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;protected-mode no   &lt;span style=&#34;color:#6272a4&#34;&gt;#&amp;#34;将 protected-mode yes 改为 protected-mode no &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# daemonize yes  &amp;#34;注释daemonize yes, 或改为no&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;cluster-enabled yes &lt;span style=&#34;color:#6272a4&#34;&gt;#&amp;#34;启用集群配置&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;cluster-config-file nodes-6381.conf &lt;span style=&#34;color:#6272a4&#34;&gt;#&amp;#34;节点配置文件&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;cluster-node-timeout &lt;span style=&#34;color:#bd93f9&#34;&gt;5000&lt;/span&gt; &lt;span style=&#34;color:#6272a4&#34;&gt;# &amp;#34;节点通信超时时间5s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;15-启动6台redis容器&#34;&gt;1.5. 启动6台redis容器&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;docker run -p 6381:6379 --name redis01 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6381:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;docker run -p 6382:6379 --name redis02 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6382:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;docker run -p 6383:6379 --name redis03 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6383:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;docker run -p 6384:6379 --name redis04 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6384:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;docker run -p 6385:6379 --name redis05 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6385:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;docker run -p 6386:6379 --name redis06 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6386:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;16-查看各容器ip&#34;&gt;1.6. 查看各容器IP&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker inspect redis01 | grep &amp;#34;172.17&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;172.172.0.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker inspect redis02 | grep &amp;#34;172.17&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;172.172.0.3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker inspect redis03 | grep &amp;#34;172.17&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;172.172.0.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker inspect redis04 | grep &amp;#34;172.17&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;172.172.0.5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker inspect redis05 | grep &amp;#34;172.17&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;172.172.0.6
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker inspect redis06 | grep &amp;#34;172.17&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;172.172.0.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;17-进入任一容器配置集群遇yes敲yes&#34;&gt;1.7. 进入任一容器配置集群(遇yes敲yes)&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;redis-cli --cluster create 172.17.0.2:6379 172.17.0.3:6379 172.17.0.4:6379 172.17.0.5:6379 172.17.0.6:6379 172.17.0.7:6379  --cluster-replicas &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;18-查看集群信息&#34;&gt;1.8. 查看集群信息&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;root@d5fb8214a10a:/data# cat nodes-6379.conf 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;748eb947ae5ac0c721740870ad44cb356a4b0ca5 172.17.0.4:6379@16379 master - &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1598101846000&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;3&lt;/span&gt; connected 10923-16383
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;8e986c400c6b0d47064ee2fbf7a391574042dbc4 172.17.0.6:6379@16379 slave 092994cf7044995d41a876370af56c97894adea0 &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1598101846000&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt; connected
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;edf1c66d381237ed63a6a6045c84942b7a7f9df9 172.17.0.5:6379@16379 slave 748eb947ae5ac0c721740870ad44cb356a4b0ca5 &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1598101847085&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;3&lt;/span&gt; connected
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;092994cf7044995d41a876370af56c97894adea0 172.17.0.2:6379@16379 myself,master - &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1598101844000&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt; connected 0-5460
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;220fba07c2e345c8aa4578e8bb3b45451377d335 172.17.0.7:6379@16379 slave bb02a3720ff638ea7edb147580e9ffa1dce29726 &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1598101845000&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; connected
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;bb02a3720ff638ea7edb147580e9ffa1dce29726 172.17.0.3:6379@16379 master - &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1598101846077&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; connected 5461-10922
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;vars currentEpoch &lt;span style=&#34;color:#bd93f9&#34;&gt;6&lt;/span&gt; lastVoteEpoch &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;19-集群取存测试&#34;&gt;1.9. 集群取存测试&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;172.17.0.2:6379&amp;gt;cluster nodes      &lt;span style=&#34;color:#6272a4&#34;&gt;# 查看本机信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;172.17.0.2:6379&amp;gt;cluster info       &lt;span style=&#34;color:#6272a4&#34;&gt;# 查看集群信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;172.17.0.2:6379&amp;gt;set lan golang     &lt;span style=&#34;color:#6272a4&#34;&gt;# master插入数据(可能会报错,叫我们去别的实例存)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;172.17.0.3:6379&amp;gt;get lan            &lt;span style=&#34;color:#6272a4&#34;&gt;# node查询数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;error&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt; MOVED &lt;span style=&#34;color:#bd93f9&#34;&gt;5798&lt;/span&gt; 172.17.0.2:6379 &lt;span style=&#34;color:#6272a4&#34;&gt;# 告诉我们该数据在172.17.0.2上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;172.17.0.5:6386&amp;gt; keys *            &lt;span style=&#34;color:#6272a4&#34;&gt;# 查键          &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;1&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;lan&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;解决(error) MOVED问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;连接时使用-c参数来启动集群模式，命令如下：
redis-cli -c -p6381&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;110-分片高可用测试ha&#34;&gt;1.10. 分片高可用测试(HA)&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;docker stop redis03 &lt;span style=&#34;color:#6272a4&#34;&gt;#停止master3容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;172.17.0.2:6379&amp;gt;cluster nodes       &lt;span style=&#34;color:#6272a4&#34;&gt;# 查看集群信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://www.ttz.pw/post/images/20200822222849906.png&#34; alt=&#34;Alt text&#34;&gt;&lt;/p&gt;
&lt;p&gt;docker start redis03 #恢复节点&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.ttz.pw/post/images/20200922222324871.png&#34; alt=&#34;Alt text&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;111-思考&#34;&gt;1.11. 思考&lt;/h2&gt;
&lt;p&gt;如果6个容器分别在多台机上，使用172内网端如何解决该问题？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解决思路
&lt;ul&gt;
&lt;li&gt;方法1: 多态物理机配置成docker集群，etcd已确保了ip的唯一性。&lt;/li&gt;
&lt;li&gt;方法2: 集群中各个redis实例通过port+10000为集群通信端口，所有可以分别配置6个redis.conf的port端口分别为6381、6382、6383、6384、6385、6386，那么他们的集群通信端口为16382、16382、16383、16384、16385、16386；创建集群的时候使用真机ip+端口即可(如下)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;redis-cli --cluster create 192.168.1.1:6381 192.168.1.2:6382 192.168.1.3:6383 192.168.1.4:6384 192.168.1.5:6385 192.168.1.6:6386 --cluster-replicas &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;112-集群存储原理&#34;&gt;1.12. 集群存储原理&lt;/h2&gt;
&lt;p&gt;配置完集群后显示 hash slot的个数，每台机的slot范围=总数/主节点数，用户在任一台主节点上存储key值时，会将key值与CRC16进行相除，再与hash slot求余(%)，余数落在哪个范围就存在哪台机上。&lt;/p&gt;
&lt;h2 id=&#34;113-集群扩容&#34;&gt;1.13. 集群扩容&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;添加主节点&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;!创建存储卷
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# mkdir /mnt/data/6387&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;!启动redis实例
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker run -p 6387:6379 --name redis07 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6387:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;!进入redis01容器
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker exec -it redis01 /bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;!添加到集群
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;root@da8d8sew8486a# redis-cli --cluster add-node 172.17.0.8:6379 172.17.0.3:6379
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;!获取新节点ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;root@da8d8sew8486a# redis-cli --cluster check 172.17.0.8:6379 | grep 0.8:6379$ |awk &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;37becf5c7faca5986a313c95bc23f5ab8c547210 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;!重新分配哈希槽，一共16384/4&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;4096&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;4个主节点&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;root@da8d8sew8486a# redis-cli --cluster reshard 172.17.0.3:6379
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;第一个填4096
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;第二个填新节点ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;第三个填all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;第四个填yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;!检查集群
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&lt;/span&gt;&lt;span&gt;root@da8d8sew8486a# redis-cli --cluster check 172.17.0.8:6379 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;添加从节点&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;!创建存储卷
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# mkdir /mnt/data/6388&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;!启动redis实例
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker run -p 6388:6379 --name redis08 -v /mnt/redis.conf:/etc/redis/redis.conf -v /mnt/data/6388:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;!进入redis01容器
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;root@localhost ~&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# docker exec -it redis01 /bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;!添加到集群&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;两种方式，指定给谁添加&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;--master-id&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;或者自动为最少salve的主节点添加&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;root@da8d8sew8486a# redis-cli --cluster add-node --cluster-slave 172.17.0.9:6379 172.17.0.3:6379
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;114-集群缩容&#34;&gt;1.14. 集群缩容&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;删除从节点&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;redis-cli --cluster del-node IP:端口 ID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;删除主节点&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;!重新分片
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;redis-cli --cluster reshard 172.17.0.8:6379
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;第一个填4096&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;表示要迁移的哈希槽&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;第二个填任一master&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;表示把哈希槽给谁&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;第三个填要移除的master ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;第四个填要移除的master ID2,没有的话填done
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;第五个填yes&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;表示确认修改&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;!移除节点&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;跟移除从节点一样&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;9&lt;/span&gt;&lt;span&gt;redis-cli --cluster del-node 172.17.0.8:6379 8c18466f6ab920e459267f878ec71f0f19016015
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;市面上K8s部署redis集群都是通过第三台机来手动配置集群，每次扩缩容都需要人工操作。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Protainer安装</title>
      <link>https://www.ttz.pw/post/protainer-install/</link>
      <pubDate>Tue, 26 Sep 2023 08:29:35 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/protainer-install/</guid>
      
        <description>&lt;p&gt;Portainer是Docker容器管理可视化界面，主要是可以通过可视化界面创建，管理Dockert容器，并且支持多个节点管理（免费版支持五个节点）。&lt;/p&gt;
&lt;p&gt;Portainer官网地址：&lt;a href=&#34;https://www.portainer.io/&#34;&gt;Powerful container management software for Platform Teams, DevOps, Dev (portainer.io)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Portainer安装文档地址：&lt;a href=&#34;https://docs.portainer.io/start/install/server/docker/linux&#34;&gt;Install Portainer with Docker on Linux - Portainer Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Docker Hub 地址：&lt;a href=&#34;https://hub.docker.com/r/portainer/portainer-ce&#34;&gt;portainer/portainer-ce - Docker Image | Docker Hub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;docker拉取镜像&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;docker pull portainer/portainer-ce
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;部署：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;podman run -d -p 8000:8000 -p 9443:9443 --name portainer --restart&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;always -v /Users/xzeu/docker/run/docker.sock:/var/run/docker.sock -v /Users/xzeu/docker/portainer_data:/data portainer/portainer-ce:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查防火墙&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;systemctl status firewalld.service   &lt;span style=&#34;color:#6272a4&#34;&gt;#查看防火墙状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;systemctl stop firewalld.service     &lt;span style=&#34;color:#6272a4&#34;&gt;#暂停防火墙&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;systemctl disable firewalld.service  &lt;span style=&#34;color:#6272a4&#34;&gt;#永久关闭防火墙&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Portainer其实就是一个镜像，运行镜像就可以了，镜像运成成功之后检查防火墙是否关闭，如果需要开启防火墙那么就需要将9443端口加入规则中。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.ttz.pw/post/images/1695688814074.jpg&#34; alt=&#34;Alt text&#34;&gt;&lt;/p&gt;
&lt;p&gt;首次访问需要设置密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.ttz.pw/post/images/2014437-20221213162903449-2032090660.png&#34; alt=&#34;Alt text&#34;&gt;
增加Endpoints节点
&lt;img src=&#34;https://www.ttz.pw/post/images/2014437-20221213162910905-392229115.png&#34; alt=&#34;Alt text&#34;&gt;
默认情况下，Portainer管理本地docker节点
&lt;img src=&#34;https://www.ttz.pw/post/images/2014437-20221213163814699-260767053.png&#34; alt=&#34;Alt text&#34;&gt;
社区版支持五个节点免费，添加节点的步骤如下：
&lt;img src=&#34;https://www.ttz.pw/post/images/2014437-20221213164348277-1293631809.png&#34; alt=&#34;Alt text&#34;&gt;
&lt;img src=&#34;https://www.ttz.pw/post/images/2014437-20221213164452918-640498709.png&#34; alt=&#34;Alt text&#34;&gt;
这里仅介绍API连接方式，直接选择API连接是无法连通，需要配置远程docker节点，配置方式见结尾处。
&lt;img src=&#34;https://www.ttz.pw/post/images/2014437-20221213165323500-2132360820.png&#34; alt=&#34;Alt text&#34;&gt;
&lt;img src=&#34;https://www.ttz.pw/post/images/2014437-20221213165335608-15268264.png&#34; alt=&#34;Alt text&#34;&gt;
API 连接方式，需要配置远程dcoker节点，dcoker节点编辑配置文件&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;vi /usr/lib/systemd/system/docker.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在配置文件红色框架中入“-H tcp://0.0.0.0:2375” 代码
&lt;img src=&#34;https://www.ttz.pw/post/images/2014437-20221213165010763-1030045108.png&#34; alt=&#34;Alt text&#34;&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>安装Docker</title>
      <link>https://www.ttz.pw/post/docker-install/</link>
      <pubDate>Mon, 25 Sep 2023 16:50:25 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/docker-install/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-install/#1-%e5%ae%89%e8%a3%85docker%e5%bc%95%e6%93%8e&#34;&gt;1. 安装docker引擎&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-install/#2-%e5%90%af%e5%8a%a8docker&#34;&gt;2. 启动docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-install/#3-%e5%ae%88%e6%8a%a4%e8%bf%9b%e7%a8%8b&#34;&gt;3. 守护进程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-install/#4-%e5%ae%b9%e5%99%a8%e5%9f%ba%e6%9c%ac%e5%91%bd%e4%bb%a4&#34;&gt;4. 容器基本命令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-install/#5-%e6%97%a5%e5%bf%97%e9%85%8d%e7%bd%ae&#34;&gt;5. 日志配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/docker-install/#6-%e5%b8%b8%e8%a7%81%e5%8f%82%e6%95%b0&#34;&gt;6. 常见参数&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官方所有操作系统安装教程：&lt;a href=&#34;https://docs.docker.com/engine/install/centos/&#34;&gt;Install Docker Engine on CentOS | Docker Documentation&lt;/a&gt;，其中CentOS安装docker引擎的代码：&lt;/p&gt;
&lt;p&gt;安装yum-utils，配置库的地址&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;sudo yum install -y yum-utils
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;sudo yum-config-manager &lt;span style=&#34;color:#f1fa8c&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;    --add-repo &lt;span style=&#34;color:#f1fa8c&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;    https://download.docker.com/linux/centos/docker-ce.repo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;1-安装docker引擎&#34;&gt;1. 安装docker引擎&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;2-启动docker&#34;&gt;2. 启动docker&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;sudo systemctl start docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;3-守护进程&#34;&gt;3. 守护进程&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;systemctl start docker     &lt;span style=&#34;color:#6272a4&#34;&gt;#运行Docker守护进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;systemctl stop docker      &lt;span style=&#34;color:#6272a4&#34;&gt;#停止Docker守护进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;systemctl restart docker   &lt;span style=&#34;color:#6272a4&#34;&gt;#重启Docker守护进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;systemctl &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;enable&lt;/span&gt; docker    &lt;span style=&#34;color:#6272a4&#34;&gt;#设置Docker开机自启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;systemctl status docker    &lt;span style=&#34;color:#6272a4&#34;&gt;#查看Docker的运行状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;设置防火墙&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;systemctl status firewalld.service   &lt;span style=&#34;color:#6272a4&#34;&gt;#查看防火墙状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;systemctl stop firewalld.service     &lt;span style=&#34;color:#6272a4&#34;&gt;#暂停防火墙&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;systemctl disable firewalld.service  &lt;span style=&#34;color:#6272a4&#34;&gt;#永久关闭防火墙&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;镜像基本命令&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;docker images                                                       &lt;span style=&#34;color:#6272a4&#34;&gt;#查看所有镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;docker pull nginx:latest                                            &lt;span style=&#34;color:#6272a4&#34;&gt;#拉取nginx镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;docker rmi nginx                                                    &lt;span style=&#34;color:#6272a4&#34;&gt;#删除nginx镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;docker save -o ***.tar ImageName:latest                             &lt;span style=&#34;color:#6272a4&#34;&gt;#导出镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;docker load -i ***.tar                                              &lt;span style=&#34;color:#6272a4&#34;&gt;#导入镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;docker image tag ImageName:latest NewImageName:latest               &lt;span style=&#34;color:#6272a4&#34;&gt;#打标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;9&lt;/span&gt;&lt;span&gt;docker push ImageName:latest                                        &lt;span style=&#34;color:#6272a4&#34;&gt;#推送镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;4-容器基本命令&#34;&gt;4. 容器基本命令&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;docker ps                                                           &lt;span style=&#34;color:#6272a4&#34;&gt;#查看运行中容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;docker pa -a                                                        &lt;span style=&#34;color:#6272a4&#34;&gt;#查看所有容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;docker run ImageName:latest                                         &lt;span style=&#34;color:#6272a4&#34;&gt;#从镜像中运行容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;docker start ContainerId                                            &lt;span style=&#34;color:#6272a4&#34;&gt;#运行容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;docker stop ContainerId                                             &lt;span style=&#34;color:#6272a4&#34;&gt;#暂停容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;docker restart ContainerId                                          &lt;span style=&#34;color:#6272a4&#34;&gt;#重新运行容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;docker &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;kill&lt;/span&gt; ContainerId                                             &lt;span style=&#34;color:#6272a4&#34;&gt;#强制暂停容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;docker rm ContainerId                                               &lt;span style=&#34;color:#6272a4&#34;&gt;#删除容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;docker rm -f ContainerId                                            &lt;span style=&#34;color:#6272a4&#34;&gt;#强制删除容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;docker logs ContainerId                                             &lt;span style=&#34;color:#6272a4&#34;&gt;#查看容器日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;docker &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;exec&lt;/span&gt; -it ContainerId /bin/bash                               &lt;span style=&#34;color:#6272a4&#34;&gt;#进入容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;exit&lt;/span&gt;                                                                &lt;span style=&#34;color:#6272a4&#34;&gt;#退出容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;docker commit  -m &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;描述&amp;#34;&lt;/span&gt; ContainerId ImageName:latest               &lt;span style=&#34;color:#6272a4&#34;&gt;#从容器中生成新镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;5-日志配置&#34;&gt;5. 日志配置&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;--log-opt max-size&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;100m                                             &lt;span style=&#34;color:#6272a4&#34;&gt;#日志文件最大100M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;--log-opt max-file&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;5&lt;/span&gt;                                                &lt;span style=&#34;color:#6272a4&#34;&gt;#最多五个日志文件，默认值：1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;6-常见参数&#34;&gt;6. 常见参数&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;-p 5000:5000                                                        &lt;span style=&#34;color:#6272a4&#34;&gt;#端口映射&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;-d                                                                  &lt;span style=&#34;color:#6272a4&#34;&gt;#后台运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;-it /bin/bash                                                       &lt;span style=&#34;color:#6272a4&#34;&gt;#交互式容器，进入容器的/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;--restart&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;always                                                    &lt;span style=&#34;color:#6272a4&#34;&gt;#容器重启策略&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;--name ContainerName                                                &lt;span style=&#34;color:#6272a4&#34;&gt;#容器名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;-v /usr/local/auth:/auth                                            &lt;span style=&#34;color:#6272a4&#34;&gt;#挂载文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;-e &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;REGISTRY_AUTH&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;htpasswd                                           &lt;span style=&#34;color:#6272a4&#34;&gt;#配置容器的环境变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;示例：docker run --name my-custom-nginx-container -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      
    </item>
    
    <item>
      <title>Dockerfile操作指令</title>
      <link>https://www.ttz.pw/post/dockerfile/</link>
      <pubDate>Tue, 11 Apr 2023 12:14:29 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/dockerfile/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#1-dockerfile%e4%bb%8b%e7%bb%8d&#34;&gt;1. DockerFile介绍&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#2-dockerfile%e6%8c%87%e4%bb%a4&#34;&gt;2. DockerFile指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#21-from%e6%8c%87%e4%bb%a4&#34;&gt;2.1. FROM指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#211-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.1.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#212-%e7%94%a8%e6%b3%95&#34;&gt;2.1.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#213-%e5%85%b3%e4%ba%8efrom-scratch&#34;&gt;2.1.3. 关于FROM scratch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#22-run%e6%8c%87%e4%bb%a4&#34;&gt;2.2. RUN指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#221-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.2.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#222-%e7%94%a8%e6%b3%95&#34;&gt;2.2.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#23-env%e6%8c%87%e4%bb%a4&#34;&gt;2.3. ENV指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#231-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.3.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#232-%e7%94%a8%e6%b3%95&#34;&gt;2.3.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#24-copy%e6%8c%87%e4%bb%a4&#34;&gt;2.4. COPY指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#241-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.4.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#242-%e7%94%a8%e6%b3%95&#34;&gt;2.4.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#25-add%e6%8c%87%e4%bb%a4&#34;&gt;2.5. ADD指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#251-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.5.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#252-%e7%94%a8%e6%b3%95&#34;&gt;2.5.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#26-cmd%e6%8c%87%e4%bb%a4&#34;&gt;2.6. CMD指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#261-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.6.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#262-%e7%94%a8%e6%b3%95&#34;&gt;2.6.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#27-entrypoint%e6%8c%87%e4%bb%a4&#34;&gt;2.7. ENTRYPOINT指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#271-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.7.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#272-%e7%94%a8%e6%b3%95&#34;&gt;2.7.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#28-arg%e6%8c%87%e4%bb%a4&#34;&gt;2.8. ARG指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#281-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.8.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#282-%e7%94%a8%e6%b3%95&#34;&gt;2.8.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#29-volume%e6%8c%87%e4%bb%a4&#34;&gt;2.9. VOLUME指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#291-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.9.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#292-%e7%94%a8%e6%b3%95&#34;&gt;2.9.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#210-expose&#34;&gt;2.10. EXPOSE&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#2101-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.10.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#2102-%e7%94%a8%e6%b3%95&#34;&gt;2.10.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#211-workdir%e6%8c%87%e4%bb%a4&#34;&gt;2.11. WORKDIR指令&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#2111-%e5%9f%ba%e6%9c%ac%e6%a6%82%e8%bf%b0&#34;&gt;2.11.1. 基本概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#2112-%e7%94%a8%e6%b3%95&#34;&gt;2.11.2. 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#3-%e6%80%bb%e7%bb%93&#34;&gt;3. 总结&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#31-add%e5%92%8ccopy%e5%8c%ba%e5%88%ab&#34;&gt;3.1. ADD和copy区别&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dockerfile/#32-cmd%e5%92%8centrypoint%e5%8c%ba%e5%88%ab&#34;&gt;3.2. CMD和entrypoint区别&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;1-dockerfile介绍&#34;&gt;1. DockerFile介绍&lt;/h1&gt;
&lt;p&gt;dockerfile是用来构建dokcer镜像的文件!命令参数脚本!
通过以下脚本可以生成镜像，镜像是一层一层的，脚本一个个的命令，每个命令都是一层！&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# 创建一个dockerfile文件，名字可以自定义，建议Dockerfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# 文件中的内容 指令（大写） 参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;FROM centos
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;VOLUME &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;volume01&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;volume02&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;CMD &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;echo&lt;/span&gt; “----end----”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;CMD /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# 这里的每个命令，就是镜像一层！&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker build&lt;/code&gt; 令用于从Dockerfile构建镜像。可以在 &lt;code&gt;docker build&lt;/code&gt;命令中使用-f标志指向文件系统中任何位置的Dockerfile。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;构建步骤︰&lt;/strong&gt;
1、编写一个dockerfile 文件
2、docker build构建成为一个镜像
3、docker run运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库!)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基础知识∶&lt;/strong&gt;
1、每个保留关键字（指令）都是尽量是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层，并提交!
&lt;img src=&#34;https://www.ttz.pw/post/images/docker.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dockerfile&lt;/code&gt;是面向开发的，我们以后要发布项目，做镜像，就需要编写dockerfile文件，这个文件十分简单!&lt;/p&gt;
&lt;p&gt;Docker镜像逐渐成为企业交付的标准，必须要掌握!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DockerFile :构建文件，定义了一切的步骤，源代码&lt;/li&gt;
&lt;li&gt;Dockerlmages :通过DockerFile构建生成的镜像，最终发布和运行的产品&lt;/li&gt;
&lt;li&gt;Docker容器︰容器就是镜像运行起来提供服务器&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;2-dockerfile指令&#34;&gt;2. DockerFile指令&lt;/h1&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;序号&lt;/th&gt;
          &lt;th&gt;指令&lt;/th&gt;
          &lt;th&gt;含义&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;FROM&lt;/td&gt;
          &lt;td&gt;镜像 指定新镜像所基于的镜像，第 条指必须为from指令，每创建一个镜像就需要一条from指令&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;MAINTAINER&lt;/td&gt;
          &lt;td&gt;名字 说明新镜像的维护人信息&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;RUN&lt;/td&gt;
          &lt;td&gt;命令 在所基于的镜像上执行命令，并提交到新的镜像中；docker内每执行一条命令都是run开头&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;CMD[“要运行的程序”,“参数1”,“参数2”]&lt;/td&gt;
          &lt;td&gt;指令启动容器时要运行的命令或者脚本，Dockerfile只能有一条CMD命令， 如果指定多条则只能最后一条被执行&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;EXPOSE&lt;/td&gt;
          &lt;td&gt;端口号 指定新镜像加载到Docker时要开启的端口&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6&lt;/td&gt;
          &lt;td&gt;ENV&lt;/td&gt;
          &lt;td&gt;环境变量 变量值 设置一个环境变量的值，会被后面的run使用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;7&lt;/td&gt;
          &lt;td&gt;ADD&lt;/td&gt;
          &lt;td&gt;源文件、目录 目标文件/目录 具体识别压缩格式并且自动解压，将源文件复制到目标文件，源文件要与dockerfile位于相同目录中，或者一个URL&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;8&lt;/td&gt;
          &lt;td&gt;COPY&lt;/td&gt;
          &lt;td&gt;源文件/目录 目标文件/目录 将本地主机上的文件/目录复制到目标地点，源文件/目录要与Dockerfile在相同的目录中&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;9&lt;/td&gt;
          &lt;td&gt;VOLUME&lt;/td&gt;
          &lt;td&gt;[“目录”] 在容器中创建一个挂载点&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;10&lt;/td&gt;
          &lt;td&gt;USER&lt;/td&gt;
          &lt;td&gt;用户名/UID 指定运行容器时的用户&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;11&lt;/td&gt;
          &lt;td&gt;WORKDIR&lt;/td&gt;
          &lt;td&gt;路径 为后续的RUN、CMD、ENTRYPOINT指定工作目录&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;12&lt;/td&gt;
          &lt;td&gt;ONBUILD&lt;/td&gt;
          &lt;td&gt;命令 指定所生成的镜像作为一个基础镜像时所要运行的命令&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;13&lt;/td&gt;
          &lt;td&gt;HEALTHCHECK&lt;/td&gt;
          &lt;td&gt;健康检查&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;21-from指令&#34;&gt;2.1. FROM指令&lt;/h2&gt;
&lt;h3 id=&#34;211-基本概述&#34;&gt;2.1.1. 基本概述&lt;/h3&gt;
&lt;p&gt;指定基础镜像，在基础镜像上进行定制
FROM就是指定基础镜像，此指令通常必需放在 &lt;code&gt;Dockerfile&lt;/code&gt;文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的运行环境&lt;/p&gt;
&lt;p&gt;基础镜像可以是任何可用镜像文件，默认情况下，&lt;code&gt;docker build&lt;/code&gt;会在docker主机上查找指定的镜像文件，在其不存在时，则会从 &lt;code&gt;Docker Hub Registry&lt;/code&gt; 上拉取所需的镜像文件.如果找不到指定的镜像文件，&lt;code&gt;docker build&lt;/code&gt;会返回一个错误信息&lt;/p&gt;
&lt;h3 id=&#34;212-用法&#34;&gt;2.1.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;FROM &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;--platform&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;platform&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &amp;lt;image&amp;gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;AS &amp;lt;name&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;FROM &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;--platform&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;platform&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &amp;lt;image&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;:&amp;lt;tag&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;AS &amp;lt;name&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;FROM &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;--platform&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;platform&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &amp;lt;image&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;@&amp;lt;digest&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;AS &amp;lt;name&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;FROM scratch 		&lt;span style=&#34;color:#6272a4&#34;&gt;# 所有镜像的起源镜像，相当于Object类&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;FROM ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;FROM ubuntu:bionic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;FROM debian:buster-slim
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;details admonition info&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-info-circle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;说明&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;–platform 指定镜像的平台，比如: linux/amd64, linux/arm64, or windows/amd64
tag 和 digest是可选项，如果不指定，默认为latest&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h3 id=&#34;213-关于from-scratch&#34;&gt;2.1.3. 关于FROM scratch&lt;/h3&gt;
&lt;p&gt;scratch是祖宗镜像，所有的镜像都源于此创建，也是一个空镜像，一般要从零开始构建镜像时，用此方法&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考链接:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://hub.docker.com/_/scratch?tab=description&#34;&gt;https://hub.docker.com/_/scratch?tab=description&lt;/a&gt;
&lt;a href=&#34;https://docs.docker.com/develop/develop-images/baseimages/&#34;&gt;https://docs.docker.com/develop/develop-images/baseimages/&lt;/a&gt;
该镜像是一个空的镜像，可以用于构建busybox等超小镜像，可以说是真正的从零开始构建属于自己的镜像&lt;/p&gt;
&lt;p&gt;该镜像在构建基础镜像（如debian和busybox）或超最小镜像（仅包含一个二进制文件及其所需内容，如:hello-world）的上下文中最有用&lt;/p&gt;
&lt;h2 id=&#34;22-run指令&#34;&gt;2.2. RUN指令&lt;/h2&gt;
&lt;h3 id=&#34;221-基本概述&#34;&gt;2.2.1. 基本概述&lt;/h3&gt;
&lt;p&gt;在构建镜像阶段需要执行FROM，指定镜像所支持的shell命令，一般各种基础镜像都支持普通shell命令&lt;/p&gt;
&lt;p&gt;注意:&lt;/p&gt;
&lt;p&gt;RUN可以写多个，每一个RUN指令都会建立一个镜像层，所以尽可能合并成一条指令,比如将多个shell命令通过“&amp;amp;&amp;amp;”符号连接一起成为在一条指令
每个RUN都是独立运行的,和前一个RUN无关&lt;/p&gt;
&lt;h3 id=&#34;222-用法&#34;&gt;2.2.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#shell格式： 支持环境变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;RUN &amp;lt;命令&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#exec格式：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;RUN &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;可执行文件&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;参数1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;参数2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#exec格式指定其他shell：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;RUN &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;echo hello wang&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;RUN &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;lt;h1&amp;gt;web 123&amp;lt;/h1&amp;gt;&amp;#34;&lt;/span&gt; &amp;gt;/var/www/html/index.html
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;RUN &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;echo 123456&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;RUN yum install -y epel-release &lt;span style=&#34;color:#f1fa8c&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; yum install -y nginx &lt;span style=&#34;color:#f1fa8c&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;hj&amp;#39;s web page&amp;#34;&lt;/span&gt; &amp;gt; /usr/share/nginx/html/index.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;details admonition info&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-info-circle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;说明&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;shell格式中，通常是一个shell命令，且以 &amp;ldquo;/bin/sh -c” 来运行它，这意味着此进程在容器中的PID不为1，不能接收Unix信号，因此，当使用docker stop 命令停止容器时，此进程接收不到SIGTERM信号
exec格式中的参数是一个JSON格式的数组，其中为要运行的命令，后面的为传递给命令的选项或参数;然而，此种格式指定的命令不会以&amp;rdquo;/bin/sh -c&amp;quot;来发起，因此常见的shell操作如变量替换、通配符(?,*等)替换将不会进行;不过，如果要运行的命令依赖于此shell特性的话，可替换为类似下面的格式&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h2 id=&#34;23-env指令&#34;&gt;2.3. ENV指令&lt;/h2&gt;
&lt;h3 id=&#34;231-基本概述&#34;&gt;2.3.1. 基本概述&lt;/h3&gt;
&lt;p&gt;以定义环境变量和值，会被后续指令(如:ENV,ADD,COPY,RUN等)通过或KEY或{KEY}进行引用，并在容器运行时保持&lt;/p&gt;
&lt;h3 id=&#34;232-用法&#34;&gt;2.3.2. 用法&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;格式1：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此格式只能对一个key赋值,之后的所有内容均会被视作其的内容&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;ENV &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;env a1 &lt;span style=&#34;color:#bd93f9&#34;&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;ENV a2 qwe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;格式2：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此格式可以支持多个key赋值,定义多个变量建议使用,减少镜像层。还是 \ 位换行&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;ENV &amp;lt;key1&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;value1&amp;gt; &amp;lt;key2&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;value2&amp;gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt; &amp;lt;key3&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;value3&amp;gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;ENV &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;user&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;hj &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;pswd&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;123&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;xxx&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;24-copy指令&#34;&gt;2.4. COPY指令&lt;/h2&gt;
&lt;h3 id=&#34;241-基本概述&#34;&gt;2.4.1. 基本概述&lt;/h3&gt;
&lt;p&gt;复制本地宿主机的到容器中&lt;/p&gt;
&lt;h3 id=&#34;242-用法&#34;&gt;2.4.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;COPY &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;--chown&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &amp;lt;src&amp;gt;... &amp;lt;dest&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;COPY &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;--chown&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;lt;src&amp;gt;&amp;#34;&lt;/span&gt;,... &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;lt;dest&amp;gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;	适用于路径有空白字符的情况
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;COPY test.txt /root/		本地文件到容器root目录
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;details admonition info&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-info-circle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;说明&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;可以是多个,可以使用通配符，通配符规则满足Go语言的filepath.Match规则
只能复制在Dockerfile文件同级目录下的文件，也就是以Dockerfile存放目录为根目录
如果是目录，则其内部文件或子目录会被递归复制，但目录自身不会被复制
如果指定了多个,或在中使用了通配符，则dest必须是一个目录，且必须以 / 结尾
可以是绝对路径或者是 WORKDIR 指定的相对路径
使用COPY指令，源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。也就是说可以加速构建速度，一般可用此优化镜像构建
如果事先不存在，它将会被自动创建，这包括其父目录路径,即递归创建目录&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h2 id=&#34;25-add指令&#34;&gt;2.5. ADD指令&lt;/h2&gt;
&lt;h3 id=&#34;251-基本概述&#34;&gt;2.5.1. 基本概述&lt;/h3&gt;
&lt;p&gt;增强版的COPY，不仅支持COPY，还支持自动解缩。可以将复制指定的到容器中的&lt;/p&gt;
&lt;h3 id=&#34;252-用法&#34;&gt;2.5.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;ADD &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;--chown&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &amp;lt;src&amp;gt;... &amp;lt;dest&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;ADD &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;--chown&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;lt;src&amp;gt;&amp;#34;&lt;/span&gt;,... &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;lt;dest&amp;gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;ADD a.tgz /opt/ 		文件传到容器的/opt/目录后自动解压
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;details admonition info&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-info-circle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;说明&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;可以是Dockerfile所在目录的一个相对路径；也可是一个 URL；还可是一个 tar 文件（自动解压）
可以是绝对路径或者是 WORKDIR 指定的相对路径
如果是目录，只复制目录中的内容，而非目录本身
如果是一个 URL ，下载后的文件权限自动设置为 600
如果为URL且不以/结尾，则指定的文件将被下载并直接被创建为,如果以“\”结尾，则文件名URL指定的文件将被直接下载并保存为/
如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ，它将被解包 ，其行为类似于&amp;quot;tar -x&amp;quot;命令, 但是通过URL获取到的tar文件将不会自动展开
如果有多个，或其间接或直接使用了通配符，则必须是一个以/结尾的目录路径;如果不以/结尾，则其被视作一个普通文件，的内容将被直接写入到&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h2 id=&#34;26-cmd指令&#34;&gt;2.6. CMD指令&lt;/h2&gt;
&lt;h3 id=&#34;261-基本概述&#34;&gt;2.6.1. 基本概述&lt;/h3&gt;
&lt;p&gt;容器中需要持续运行的进程一般只有一个,CMD用来指定启动容器时默认执行的一个命令，且其运行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令&lt;/p&gt;
&lt;p&gt;RUN是构建时运行的指令，CMD是容器运行时运行的指令&lt;/p&gt;
&lt;h3 id=&#34;262-用法&#34;&gt;2.6.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#exec格式执行：推荐使用，且不支持环境变量  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;CMD &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;命令&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;param1&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;param2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#sh格式执行：交互式使用，支持环境变量  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;CMD &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;command&lt;/span&gt; param1 param2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#给entrypoint命令的传递参数：  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;CMD &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;param1&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;param2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;CMD &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;nginx&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;-g&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;daemon off;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;CMD &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;curl&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;-s&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;https://ip.cn&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;	同一文件中，只有此命令生效
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;details admonition info&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-info-circle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;说明&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;&lt;p&gt;如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT，那么开启容器时就会使用执行CMD指定的默认的命令&lt;/p&gt;
&lt;p&gt;每个Dockerfile只能有一条CMD命令。如指定了多条，只有最后一条被执行
如果启动容器时用 docker run xxx cmd 指定运行的命令，则会覆盖 CMD 指定的命令&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h2 id=&#34;27-entrypoint指令&#34;&gt;2.7. ENTRYPOINT指令&lt;/h2&gt;
&lt;h3 id=&#34;271-基本概述&#34;&gt;2.7.1. 基本概述&lt;/h3&gt;
&lt;p&gt;类似CMD，配置容器启动后执行的命令及参数
如果与cmd命令共存，则cmd的内容当做参数传递给entrypoint&lt;/p&gt;
&lt;h3 id=&#34;272-用法&#34;&gt;2.7.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#exc执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;ENTRYPOINT &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;executable&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;param1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;param2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#sh执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;ENTRYPOINT &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;command&lt;/span&gt; param1 param2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#CMD的内容做参数传给ENTRYPOINT的命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;CMD &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;-g&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;daemon off;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;ENTRYPOINT &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;nginx&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;details admonition info&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-info-circle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;说明&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;docker run -e/–env-file 不能覆盖ENTRYPOINT的参数，而是把传递的参数追加在ENTRYPOINT原有的参数后面
如果docker run 后面没有额外参数，但是dockerfile中的CMD里有（即上面CMD的第三种用法），即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数
如果docker run 后面有额外参数，同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run 后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数
可以通过docker run &amp;ndash;entrypoint string 参数在运行时替换,注意string不要加空格
使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数，ENTRYPOINT则可以运行时无需重写命令就可以直接接受新参数
每个Dockerfile中只能有一个ENTRYPOINT，当指定多个时，只有最后一个生效&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h2 id=&#34;28-arg指令&#34;&gt;2.8. ARG指令&lt;/h2&gt;
&lt;h3 id=&#34;281-基本概述&#34;&gt;2.8.1. 基本概述&lt;/h3&gt;
&lt;p&gt;在build阶段指定变量,和ENV不同的是，容器运行时不会存在这些环境变量，只在构建时生效&lt;/p&gt;
&lt;h3 id=&#34;282-用法&#34;&gt;2.8.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;ARG &amp;lt;name&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[=&lt;/span&gt;&amp;lt;default value&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;docker build --build-arg &amp;lt;参数名&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&amp;lt;值&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;vim xx/Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;ARG &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;version&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;FROM base:&lt;span style=&#34;color:#f1fa8c&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;version&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;details admonition info&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-info-circle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;说明&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;如果变量名与ENV同名，则ENV覆盖ARG
支持做最开始的变量定义，也就是写在FROM之前&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h2 id=&#34;29-volume指令&#34;&gt;2.9. VOLUME指令&lt;/h2&gt;
&lt;h3 id=&#34;291-基本概述&#34;&gt;2.9.1. 基本概述&lt;/h3&gt;
&lt;p&gt;VOLUME实现的是匿名数据卷,无法指定宿主机路径和容器目录的挂载关系&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;docker rm -fv &amp;lt;容器ID&amp;gt; &lt;/code&gt;可以删除容器的同时删除VOLUME指定的卷&lt;/p&gt;
&lt;p&gt;宿主机目录为：&lt;/p&gt;
&lt;p&gt;/var/lib/docker/volumes/&amp;lt;volume_id&amp;gt;/_data&lt;/p&gt;
&lt;p&gt;指定容器内的挂载目录后，物理机自动在该路径下创建目录，卷id是随机生成的，_data就是容器内挂载的目录名,卷id以后就是挂载点根目录&lt;/p&gt;
&lt;p&gt;当容器删除时，容器内在/data/下存的文件，还保留在物理机的/var/lib/docker/volumes/卷id/_data/&lt;/p&gt;
&lt;h3 id=&#34;292-用法&#34;&gt;2.9.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;VOLUME &amp;lt;容器内路径&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;VOLUME &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;lt;容器内路径1&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;lt;容器内路径2&amp;gt;&amp;#34;&lt;/span&gt;...&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;docker rm -v 容器 		删除容器时，删除对应的匿名卷
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;VOLUME &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/data&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/data2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;210-expose&#34;&gt;2.10. EXPOSE&lt;/h2&gt;
&lt;h3 id=&#34;2101-基本概述&#34;&gt;2.10.1. 基本概述&lt;/h3&gt;
&lt;p&gt;EXPOSE仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射
启动容器是还是需要-p/-P来指明与物理机映射的端口才能真正分配端口&lt;/p&gt;
&lt;p&gt;注意:&lt;/p&gt;
&lt;p&gt;即使 Dockerfile没有EXPOSE 端口指令,也可以通过docker run -p 临时暴露容器内程序真正监听的端口,所以EXPOSE 相当于指定默认的暴露端口,可以通过docker run -P 进行真正暴露&lt;/p&gt;
&lt;h3 id=&#34;2102-用法&#34;&gt;2.10.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;EXPOSE &amp;lt;port&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;/ &amp;lt;protocol&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;&amp;lt;port&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;/ &amp;lt;protocol&amp;gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt; ..&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;EXPOSE &lt;span style=&#34;color:#bd93f9&#34;&gt;80&lt;/span&gt; 443/tcp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;EXPOSE &lt;span style=&#34;color:#bd93f9&#34;&gt;3306&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;details admonition info&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-info-circle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;说明&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;可为tcp或udp二者之一，默认为TCP协议&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h2 id=&#34;211-workdir指令&#34;&gt;2.11. WORKDIR指令&lt;/h2&gt;
&lt;h3 id=&#34;2111-基本概述&#34;&gt;2.11.1. 基本概述&lt;/h3&gt;
&lt;p&gt;为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录，当容器运行后，进入容器内WORKDIR指定的默认目录
如果目录不存在，会自动创建&lt;/p&gt;
&lt;h3 id=&#34;2112-用法&#34;&gt;2.11.2. 用法&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;WORKDIR /path/to/workdir
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;WORKDIR /web
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;RUN &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;123456&lt;/span&gt; &amp;gt; ts.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;WORKDIR /a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;WORKDIR b		切换多级目录，/a/b 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;3-总结&#34;&gt;3. 总结&lt;/h1&gt;
&lt;h2 id=&#34;31-add和copy区别&#34;&gt;3.1. ADD和copy区别&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中，都是在构建镜像的过程中完成的&lt;/li&gt;
&lt;li&gt;copy只能用于复制（节省资源）&lt;/li&gt;
&lt;li&gt;ADD复制的同时，如果复制的对象时压缩包，ADD还可以解压（消耗资源）&lt;/li&gt;
&lt;li&gt;COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中&lt;/li&gt;
&lt;li&gt;满足同等功能的情况下，推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;32-cmd和entrypoint区别&#34;&gt;3.2. CMD和entrypoint区别&lt;/h2&gt;
&lt;p&gt;一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令，里面放的是不变的部分，可变部分比如命令参数可以使用cmd的形式提供默认版本，也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数，就直接run，否则想用其他参数，就run 里面加参数。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Mac OS X、Windows设置MTU方法图解教程</title>
      <link>https://www.ttz.pw/post/ping-mtu/</link>
      <pubDate>Thu, 30 Mar 2023 16:14:41 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/ping-mtu/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/ping-mtu/#1-%e7%bd%91%e7%bb%9c%e6%9c%80%e5%a4%a7mtu%e5%80%bc%e6%a3%80%e6%b5%8b%e6%96%b9%e6%b3%95&#34;&gt;1. 网络最大MTU值检测方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/ping-mtu/#2-windows%e7%b3%bb%e7%bb%9f%e8%ae%be%e7%bd%aemtu%e6%96%b9%e6%b3%95&#34;&gt;2. Windows系统设置MTU方法&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/ping-mtu/#21-vistawin7win8%e7%b3%bb%e7%bb%9f%e8%ae%be%e7%bd%ae%e6%96%b9%e6%b3%95&#34;&gt;2.1. Vista、Win7、Win8系统设置方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/ping-mtu/#22-windows-xp%e7%b3%bb%e7%bb%9f%e8%ae%be%e7%bd%ae%e6%96%b9%e6%b3%95&#34;&gt;2.2. Windows XP系统设置方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/ping-mtu/#23-mac-os-x%e8%ae%be%e7%bd%aemtu%e6%96%b9%e6%b3%95&#34;&gt;2.3. Mac OS X设置MTU方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;MTU&lt;/code&gt;，英文全称为&lt;code&gt;Maximum Transmission Unit&lt;/code&gt;，中文即最大传输单元的意思，是一种通信协议层上所能通过的最大数据包值。如果MTU设置得当，可以优化网络性能。反之设置不当，则可能影响网络速度、甚至影响部分软件和网络使用。比如连接上VPN不能访问网站，或不能连接等问题。&lt;/p&gt;
&lt;p&gt;由于VPN连接需要对原有的IP或者是TCP/UDP数据进行封装，因此增加了数据的长度。如果VPN连接上不能上网，可以将MTU设置小一些，比如1450，具体设置方法可以参考下文介绍。&lt;/p&gt;
&lt;p&gt;除了MTU的设置可能影响VPN连接使用外，如果设置不合理，也可能影响网络连接质量。现在常用的以太网网络下，MTU值默认是1500，超过此大小的话，数据包将被分段传输。如果MTU过小的话，会增加数据包拆分传输次数，而且拆包组包的过程也浪费了时间。&lt;/p&gt;
&lt;p&gt;那么按上所说，是不是设置最大值最好呢？答案是否定的，因为在不同使用网络环境，网络MTU最大值也可能不一样。比如ADSL网络MTU值是1492字节，如果强行设置为1500，因为网络本身最大只能1492，超过的话，传输前就需要拆包分段传输，在这过程中也浪费了时间，并且产生额外的数据包。&lt;/p&gt;
&lt;p&gt;所以MTU设置需要恰当，不能过大也不能过小，根据网络本身最大MTU传输字节设置即可。那么如何查看使用网络的最大MTU值呢，下面将介绍一下检查方法（Windows下手动查询，如果觉得麻烦，也可以使用Simple MTU Test这个软件查询）。&lt;/p&gt;
&lt;h2 id=&#34;1-网络最大mtu值检测方法&#34;&gt;1. 网络最大MTU值检测方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;首先同时按下键盘上的Win+R键，弹出“运行”窗口，输入”cmd.exe”，点击确定。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://www.ttz.pw/post/images/1680164253083.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;在命令行窗口中输入&lt;code&gt;”ping -l 1472 -f www.baidu.com”&lt;/code&gt;然后按下回车键。解释一下这段命令的作用：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;▸ ping：发送一个数据包检测；&lt;br&gt;
▸ -l（L的小写）：指定数据包大小；&lt;br&gt;
▸ 1472：数据包大小为1472字节；&lt;br&gt;
▸ -f：禁止路由器拆分数据包；&lt;br&gt;
▸ &lt;a href=&#34;https://www.baidu.com&#34;&gt;www.baidu.com&lt;/a&gt;：使用百度为检测目标；&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;执行以上命令后，如果成功响应了（如下图），则说明你的网络MTU最大为1500字节，这时设置MTU为1500即可。（这里我修改了检测数据包为1450，方便截图）
&lt;img src=&#34;https://www.ttz.pw/post/images/1680164651022.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果&lt;code&gt;返回&lt;/code&gt;显示需要拆分数据包但是设置 &lt;code&gt;DF&lt;/code&gt;。或是&lt;code&gt;Packer needs to be fragmented but DF set.&lt;/code&gt;的提示，则说明数据包大小超过了本身网络&lt;code&gt;最大MTU值&lt;/code&gt;。
&lt;img src=&#34;https://www.ttz.pw/post/images/1680164957070.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这时可以减小发送数据包大小再尝试，&lt;code&gt;依次减少5字节&lt;/code&gt;，直到能正确返回响应。返回后&lt;code&gt;逐渐加1字节&lt;/code&gt;再次检测，以查询网络最大MTU值。比如查询网络最大MTU值为&lt;code&gt;1452&lt;/code&gt;，那么这个并不是完整的MTU值，还需要&lt;code&gt;加上28字节&lt;/code&gt;的数据包报文（包含IP头部，但不包含协议栈更下层的头部），&lt;code&gt;完整的MTU&lt;/code&gt;应该是&lt;code&gt;1452+28=1480&lt;/code&gt;字节。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查询到网络最大MTU值后，设置即可。路由器设置的话，不同路由器，设置方法也可能不一样，建议查看使用说明设置。TP-LINK路由器的话，一般是在管理页面——网络参数——WAN口设置——编辑正在使用的网络连接——WAN口高级设置里。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当然除了直接在路由器设置外，还可以在操作系统里修改，下面将介绍一下各系统设置方法。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;2-windows系统设置mtu方法&#34;&gt;2. Windows系统设置MTU方法&lt;/h2&gt;
&lt;p&gt;除了下面介绍的手动设置方法外，一些软件也有辅助修改功能，比如魔方优化大师等。&lt;/p&gt;
&lt;h3 id=&#34;21-vistawin7win8系统设置方法&#34;&gt;2.1. Vista、Win7、Win8系统设置方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开系统盘&lt;code&gt;\Windows\System32\&lt;/code&gt;文件夹下找到&lt;code&gt;cmd.exe&lt;/code&gt;，右键“以管理员身份运行”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在“命令提示符”窗口中输入&lt;code&gt;“netsh interface ipv4 show subinterfaces”&lt;/code&gt;并回车查看当前的MTU值；&lt;br&gt;
&lt;img src=&#34;https://www.ttz.pw/post/images/1680165794339.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接下来输入&lt;code&gt;“netsh interface ipv4 set subinterface &amp;lt;修改的网络连接名&amp;gt; mtu=查询的网络最大MTU值 store=persistent”&lt;/code&gt;并回车即可；&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例如：&lt;code&gt;“netsh interface ipv4 set subinterface “&lt;/code&gt;本地连接&lt;code&gt;”mtu=1492 store=persistent”&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;22-windows-xp系统设置方法&#34;&gt;2.2. Windows XP系统设置方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;按下Win+R组合键，弹出“运行”窗口，输入&lt;code&gt;regedit&lt;/code&gt;，点击确定；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依次找到以下注册表项：&lt;code&gt;“HKEY_Local_Machine——SYSTEM——CurrentControlSet——Services——Tcpip——Parameters——interface”；&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;interface&lt;/code&gt;中下可能有很多项，需要逐个观察键值，会有一个项与你的网卡IP一致，选中该项；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后在该项上点击右键，选择&lt;code&gt;“编辑——新建——DWORD值”&lt;/code&gt;，然后在右侧将其命名为&lt;code&gt;“MTU”&lt;/code&gt;；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右键点击&lt;code&gt;MTU&lt;/code&gt;，选择&lt;code&gt;“修改”&lt;/code&gt;，在弹出的窗口中选择&lt;code&gt;“十进制”&lt;/code&gt;，设置你查询网络MTU值即可。&lt;br&gt;
&lt;img src=&#34;https://www.ttz.pw/post/images/1680165660089.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置后，需要重启电脑应用生效。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;23-mac-os-x设置mtu方法&#34;&gt;2.3. Mac OS X设置MTU方法&lt;/h3&gt;
&lt;p&gt;依次打开：系统偏好设置——网络——以太网（如果使用的是无线网络就修改无线网络）——高级设置，在“硬件”选项卡下“配置”选择手动，然后就可以设置MTU了，如下图：&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>华为云耀云hecs安装docker</title>
      <link>https://www.ttz.pw/post/huawei-docker/</link>
      <pubDate>Thu, 23 Mar 2023 18:39:04 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/huawei-docker/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/huawei-docker/#1-%e6%9f%a5%e7%9c%8b%e7%b3%bb%e7%bb%9f&#34;&gt;1. 查看系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/huawei-docker/#2-%e9%85%8d%e7%bd%ae%e5%8d%8e%e4%b8%baeuler%e4%bb%93%e5%ba%93%e6%ba%90&#34;&gt;2. 配置华为euler仓库源&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/huawei-docker/#3-%e5%ae%89%e8%a3%85docker&#34;&gt;3. 安装docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/huawei-docker/#4-%e5%bc%80%e6%9c%ba%e8%87%aa%e5%90%af%e5%8a%a8&#34;&gt;4. 开机自启动&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;1-查看系统&#34;&gt;1. 查看系统&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ cat /etc/os-release
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;NAME&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;“Huawei Cloud EulerOS”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;“2.0 &lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;x86_64&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;ID&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;“hce”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;VERSION_ID&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;“2.0”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;PRETTY_NAME&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;“Huawei Cloud EulerOS 2.0 &lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;x86_64&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;ANSI_COLOR&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;“0;31”
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;2-配置华为euler仓库源&#34;&gt;2. 配置华为euler仓库源&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;cd&lt;/span&gt; /etc/yum.repos.d
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;wget https://repo.huaweicloud.com/repository/conf/openeuler_x86_64.repo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;yum clean all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;yum makecache
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;3-安装docker&#34;&gt;3. 安装docker&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;yum -y install docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动docker&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;sudo service docker start
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;docker --version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;Docker version 18.09.0, build c0d3c43
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;4-开机自启动&#34;&gt;4. 开机自启动&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ sudo systemctl &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;enable&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      
    </item>
    
    <item>
      <title>hugo插件之代码块拷贝插件</title>
      <link>https://www.ttz.pw/post/hugo-code-copy/</link>
      <pubDate>Wed, 22 Mar 2023 23:42:13 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/hugo-code-copy/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/hugo-code-copy/#1-%e6%b7%bb%e5%8a%a0%e6%8c%89%e9%92%ae&#34;&gt;1. 添加按钮&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/hugo-code-copy/#2-%e4%b8%8e%e5%89%aa%e5%88%87%e6%9d%bf%e4%ba%a4%e4%ba%92&#34;&gt;2. 与剪切板交互&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/hugo-code-copy/#3-%e4%bf%ae%e6%94%b9%e4%b8%bb%e9%a2%98&#34;&gt;3. 修改主题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/hugo-code-copy/#4-%e8%bf%90%e8%a1%8chugo&#34;&gt;4. 运行hugo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-添加按钮&#34;&gt;1. 添加按钮&lt;/h3&gt;
&lt;p&gt;我们通过检查博客内容页面发现，hugo生成的每个代码块格式如下：&lt;/p&gt;
&lt;p&gt;没有语法突出显示的代码块具有相同的结构，但周围没有 &lt;code&gt;&amp;lt;div class=highlight&amp;gt;&lt;/code&gt; 。为了考虑到这两种情况，我选择了作为&lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt;元素下面的&lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt;子元素。&lt;/p&gt;
&lt;p&gt;copy-to-clipboard.css：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;.&lt;span style=&#34;color:#50fa7b&#34;&gt;highlight&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;position&lt;/span&gt;: &lt;span style=&#34;color:#ff79c6&#34;&gt;relative&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;.&lt;span style=&#34;color:#50fa7b&#34;&gt;highlight&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;pre&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;padding-right&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;75&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#6272a4&#34;&gt;/* background-color: #f8f8f8 !important; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;.&lt;span style=&#34;color:#50fa7b&#34;&gt;highlight-copy-btn&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;position&lt;/span&gt;: &lt;span style=&#34;color:#ff79c6&#34;&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;top&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;right&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;border&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;border-radius&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;padding&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;font-size&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;0.8&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;em&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;line-height&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;1.8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;color&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;#fff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;background-color&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;#777&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;min-width&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;55&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;text-align&lt;/span&gt;: &lt;span style=&#34;color:#ff79c6&#34;&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&lt;/span&gt;&lt;span&gt;.&lt;span style=&#34;color:#50fa7b&#34;&gt;highlight-copy-btn&lt;/span&gt;:hover {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;background-color&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;#666&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-与剪切板交互&#34;&gt;2. 与剪切板交互&lt;/h3&gt;
&lt;p&gt;按钮有了，接下来就是怎么使用JavaScript拷贝代码到剪切板，废话少说，直接上代码：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;(&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;use strict&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#ff79c6&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;document&lt;/span&gt;.queryCommandSupported(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;copy&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;function&lt;/span&gt; flashCopyMessage(el, msg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;    el.textContent &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; msg;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;    setTimeout(&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;      el.textContent &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;复制&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;    }, &lt;span style=&#34;color:#bd93f9&#34;&gt;1000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;function&lt;/span&gt; selectText(node) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;var&lt;/span&gt; selection &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;window&lt;/span&gt;.getSelection();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;var&lt;/span&gt; range &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;document&lt;/span&gt;.createRange();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;    range.selectNodeContents(node);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&lt;/span&gt;&lt;span&gt;    selection.removeAllRanges();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&lt;/span&gt;&lt;span&gt;    selection.addRange(range);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt; selection;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;function&lt;/span&gt; addCopyButton(containerEl) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;var&lt;/span&gt; copyBtn &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;document&lt;/span&gt;.createElement(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;button&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&lt;/span&gt;&lt;span&gt;    copyBtn.className &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;highlight-copy-btn&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&lt;/span&gt;&lt;span&gt;    copyBtn.textContent &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;复制&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;var&lt;/span&gt; codeEl &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; containerEl.firstElementChild;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30&lt;/span&gt;&lt;span&gt;    copyBtn.addEventListener(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;click&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#ff79c6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;var&lt;/span&gt; selection &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; selectText(codeEl);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;document&lt;/span&gt;.execCommand(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;copy&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34&lt;/span&gt;&lt;span&gt;        selection.removeAllRanges();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36&lt;/span&gt;&lt;span&gt;        flashCopyMessage(copyBtn, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;已复制!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37&lt;/span&gt;&lt;span&gt;      } &lt;span style=&#34;color:#ff79c6&#34;&gt;catch&lt;/span&gt; (e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38&lt;/span&gt;&lt;span&gt;        console &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; console.log(e);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;39&lt;/span&gt;&lt;span&gt;        flashCopyMessage(copyBtn, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;Failed :&amp;#39;(&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;40&lt;/span&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;41&lt;/span&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;42&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;43&lt;/span&gt;&lt;span&gt;    containerEl.appendChild(copyBtn);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;44&lt;/span&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;45&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;46&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#6272a4&#34;&gt;// Add copy button to code blocks
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;47&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;var&lt;/span&gt; highlightBlocks &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;document&lt;/span&gt;.getElementsByClassName(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;highlight&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;48&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;Array&lt;/span&gt;.prototype.forEach.call(highlightBlocks, addCopyButton);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;49&lt;/span&gt;&lt;span&gt;})();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;3-修改主题&#34;&gt;3. 修改主题&lt;/h3&gt;
&lt;p&gt;将copy-to-clipboard.css和copy-to-clipboard.js分别放到static/css和static/js目录下&lt;/p&gt;
&lt;p&gt;然后在页面引用这两个文件&lt;/p&gt;
&lt;p&gt;1.修改config.toml添加自定义css&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;custom_css = [&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/css/copy-to-clipboard.css&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.修改主题文件下的layouts/partials/footer.html&lt;/p&gt;
&lt;p&gt;在结尾加上下面这一句，之前测试在config.toml下面添加，不生效&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/js/copy-to-clipboard.js&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;4-运行hugo&#34;&gt;4. 运行hugo&lt;/h3&gt;
&lt;p&gt;最终的效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.ttz.pw/post/images/2023-03-22%2023.47.04.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>给Hugo添加字数统计和阅读时间功能</title>
      <link>https://www.ttz.pw/post/hugo-view-conter/</link>
      <pubDate>Wed, 22 Mar 2023 23:12:30 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/hugo-view-conter/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/hugo-view-conter/#1-%e4%bf%ae%e6%94%b9%e9%a1%b5%e9%9d%a2&#34;&gt;1. 修改页面&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;经常逛别人的博客时发现&amp;quot;共XXX字，阅读大约需要XXX分钟&amp;quot;，发现这个功能比较牛X，然后网上搜索了一下，发现hugo有函数支持这个需求的。&lt;/p&gt;
&lt;h2 id=&#34;1-修改页面&#34;&gt;1. 修改页面&lt;/h2&gt;
&lt;p&gt;博客详情页：layouts/_default/single.html&lt;/p&gt;
&lt;p&gt;修改single.html代码&lt;/p&gt;
&lt;p&gt;找到标题下面的区块,我的是这样子的&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;h2&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;subheading&amp;#34;&lt;/span&gt;&amp;gt;{{ .Params.subtitle  }}&amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;            Posted by
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;            {{ if .Params.author  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;                    {{ .Params.author  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;            {{ else  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;                    {{ .Site.Title  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;            {{ end  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;            on
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;            {{ .Date.Format &amp;#34;Monday, January 2, 2006&amp;#34;  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;            {{ if .Site.Params.page_view_conter  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;                    {{ partial &amp;#34;page_view_counter.html&amp;#34; .  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;            {{ end  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#6272a4&#34;&gt;&amp;lt;!-- Don&amp;#39;t show &amp;#34;Last Modified on&amp;#34; if update happened on the same day. --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;            {{ if (and (not .Lastmod.IsZero) (not (eq (dateFormat &amp;#34;2006-01-02&amp;#34; .Lastmod) (dateFormat &amp;#34;2006-01-02&amp;#34; .Date))))  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;br&lt;/span&gt;&amp;gt;Last Modified on {{ dateFormat &amp;#34;Monday, January 2, 2006&amp;#34; .Params.LastMod  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;            {{ end  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接下来在page_view_conter处加上字数统计功能，修改后的结果如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;h2&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;subheading&amp;#34;&lt;/span&gt;&amp;gt;{{ .Params.subtitle  }}&amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;            Posted by
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;            {{ if .Params.author  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;                    {{ .Params.author  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;            {{ else  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;                    {{ .Site.Title  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;            {{ end  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;            on
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;            {{ .Date.Format &amp;#34;Monday, January 2, 2006&amp;#34;  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;            {{ if .Site.Params.page_view_conter  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;                    &amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;busuanzi_container_page_pv&amp;#34;&lt;/span&gt;&amp;gt;|&amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;busuanzi_value_page_pv&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;                    {{ partial &amp;#34;page_view_counter.html&amp;#34; .  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;                    阅读 &amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt;&amp;gt;|&amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;post-date&amp;#34;&lt;/span&gt;&amp;gt;共{{ .WordCount  }}字&amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt;&amp;gt;，阅读约&amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;more-meta&amp;#34;&lt;/span&gt;&amp;gt; {{ .ReadingTime  }} 分钟&amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;            {{ end  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#6272a4&#34;&gt;&amp;lt;!-- Don&amp;#39;t show &amp;#34;Last Modified on&amp;#34; if update happened on the same day. --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;            {{ if (and (not .Lastmod.IsZero) (not (eq (dateFormat &amp;#34;2006-01-02&amp;#34; .Lastmod) (dateFormat &amp;#34;2006-01-02&amp;#34; .Date))))  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#ff79c6&#34;&gt;br&lt;/span&gt;&amp;gt;Last Modified on {{ dateFormat &amp;#34;Monday, January 2, 2006&amp;#34; .Params.LastMod  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&lt;/span&gt;&lt;span&gt;            {{ end  }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&lt;/span&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#ff79c6&#34;&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改配置文件
修改&lt;code&gt;config.toml&lt;/code&gt;配置文件，将&lt;code&gt;page_view_conter&lt;/code&gt;的值修改为true。
效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.ttz.pw/post/images/2023-03-22%2023.23.57.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>玩客云无拆机恢复官方固件</title>
      <link>https://www.ttz.pw/post/onecloud/</link>
      <pubDate>Wed, 15 Mar 2023 22:12:55 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/onecloud/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#1-%e8%87%aa%e5%bb%banginx%e9%80%9a%e8%bf%87http%e6%96%b9%e5%bc%8f%e5%88%b7%e6%9c%ba&#34;&gt;1. 自建nginx通过http方式刷机&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#11-%e5%9f%ba%e7%a1%80%e6%9d%a1%e4%bb%b6&#34;&gt;1.1. 基础条件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#12-%e5%88%b7%e6%9c%ba%e9%83%a8%e5%88%86&#34;&gt;1.2. 刷机部分&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#121-%e6%81%a2%e5%a4%8d%e5%9b%ba%e4%bb%b6&#34;&gt;1.2.1. 恢复固件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#122-%e8%a1%a5%e4%b8%81%e4%bf%ae%e5%a4%8d&#34;&gt;1.2.2. 补丁修复&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#123-%e6%94%b9%e4%b8%ba%e7%8e%a9%e5%ae%a2%e4%ba%91mac%e5%9c%b0%e5%9d%80&#34;&gt;1.2.3. 改为玩客云mac地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#124-%e9%87%8d%e6%96%b0%e6%89%a7%e8%a1%8c12%e6%ad%a5%e9%aa%a4&#34;&gt;1.2.4. 重新执行1.2步骤&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#125-%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9&#34;&gt;1.2.5. 注意事项&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#2-%e4%bd%bf%e7%94%a8u%e7%9b%98%e6%96%b9%e5%bc%8f%e5%88%b7%e6%9c%ba&#34;&gt;2. 使用U盘方式刷机&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#3-%e9%99%84%e5%bd%95&#34;&gt;3. 附录&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#31-%e5%a6%82%e4%bd%95%e4%bb%8eu-boot%e5%90%af%e5%8a%a8&#34;&gt;3.1. 如何从u-boot启动？&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#311-%e4%bb%8eusb%e5%90%af%e5%8a%a8&#34;&gt;3.1.1. 从USB启动&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/onecloud/#312-%e4%bb%8eemmc%e5%90%af%e5%8a%a8&#34;&gt;3.1.2. 从eMMC启动&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;1-自建nginx通过http方式刷机&#34;&gt;1. 自建nginx通过http方式刷机&lt;/h1&gt;
&lt;h2 id=&#34;11-基础条件&#34;&gt;1.1. 基础条件&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;已刷各种底包能启动usb-armbian&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onecloud.img&lt;/code&gt; 文件见件录&lt;/li&gt;
&lt;li&gt;HFS软件 → 打开APP → 拖入文件&lt;/li&gt;
&lt;li&gt;全程无网，直至恢复正确MAC&lt;/li&gt;
&lt;li&gt;确定MAC优先级逐级递减：主板MAC → 玩客云app(玩客云关机) → uboot命令&lt;code&gt;bdinfo&lt;/code&gt;中&lt;code&gt;ethaddr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用网心云联网和错误MAC联网均会导致此MAC值异常&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;12-刷机部分&#34;&gt;1.2. 刷机部分&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;刷机流程：启动usb-armbian → 恢复固件 → 完毕关机 → 拔掉U盘 → 重启系统 → 补丁修复 → 重启等待&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;121-恢复固件&#34;&gt;1.2.1. 恢复固件&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;putty → SSH → 10.0.0.100&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;EMMC&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;cd&lt;/span&gt; /dev/ &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ls mmcblk&lt;span style=&#34;color:#ff79c6&#34;&gt;[&lt;/span&gt;0-9&lt;span style=&#34;color:#ff79c6&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;wget -O - http://10.0.0.99/onecloud.img | dd &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;of&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;/dev/&lt;span style=&#34;color:#f1fa8c&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;EMMC&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;bs&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;1M
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &amp;gt; /sys/block/&lt;span style=&#34;color:#f1fa8c&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;EMMC&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt;boot0/force_ro
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;wget -O - http://10.0.0.99/uboot.bin | dd &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;of&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;/dev/&lt;span style=&#34;color:#f1fa8c&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;EMMC&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt;boot0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;shutdown -h now
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;122-补丁修复&#34;&gt;1.2.2. 补丁修复&lt;/h3&gt;
&lt;p&gt;登录路由器查看mac地址&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;putty → Telnet&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;telnet 10.0.0.88 &lt;span style=&#34;color:#bd93f9&#34;&gt;1287&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;wget http://10.0.0.99/wkcfix.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;sh wkcfix.sh b0:d5:xx:xx:xx:xx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;rm -f wkcfix.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;reboot -f
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;123-改为玩客云mac地址&#34;&gt;1.2.3. 改为玩客云mac地址&lt;/h3&gt;
&lt;p&gt;登录手机端玩客云客户端&lt;code&gt;我的&lt;/code&gt;-&lt;code&gt;oneCloud&lt;/code&gt;-&lt;code&gt;设备信息&lt;/code&gt;-&lt;code&gt;MAC地址&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;124-重新执行12步骤&#34;&gt;1.2.4. 重新执行1.2步骤&lt;/h3&gt;
&lt;h3 id=&#34;125-注意事项&#34;&gt;1.2.5. 注意事项&lt;/h3&gt;
&lt;p&gt;1.恢复mac值时，禁止乱填非本机MAC值，否则可能导致系统不分配IP地址，此时可拆机进系统重刷MAC值，或重新刷机;
2. 重启后先查看路由中是否恢复为指定mac，正常后联网等待更新；
3. IP说明:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;设备&lt;/th&gt;
          &lt;th&gt;ip地址&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;armbian(刷机后的玩客云设备)&lt;/td&gt;
          &lt;td&gt;10.10.10.100&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pc&lt;/td&gt;
          &lt;td&gt;10.10.10.99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;玩客云&lt;/td&gt;
          &lt;td&gt;10.10.10.88&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;需在pc搭建nginx放入相应包文件供刷机使用&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;2-使用u盘方式刷机&#34;&gt;2. 使用U盘方式刷机&lt;/h1&gt;
&lt;p&gt;假设你已成功刷入了armbian。&lt;br&gt;
现在开始刷机:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把拷贝有&lt;code&gt;onecloud.img&lt;/code&gt;的U盘插入靠近网口的usb口后，使用&lt;code&gt;putty&lt;/code&gt;的&lt;code&gt;ssh&lt;/code&gt;方式进入玩客云。&lt;br&gt;
输入 &lt;code&gt;fdisk -l&lt;/code&gt;查看U盘信息。&lt;br&gt;
然后请跟着操作&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;cd&lt;/span&gt; /mnt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;mkdir usb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;mount -t ntfs /dev/sda1 /mnt/usb   &lt;span style=&#34;color:#6272a4&#34;&gt;# 此处正常应该无报错，报错请重新启动玩客云或者换个U盘。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;dd &lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;/mnt/usb/onecloud.img &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;of&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;/dev/mmcblk0 &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;bs&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;1M   &lt;span style=&#34;color:#6272a4&#34;&gt;#此处的mmcblk0请根据自己的实际情况，有的可能是mmcblk1；此处DD命令正常差不多3-5分钟完成。无报错的话，请继续下一步，有报错，请更换U盘或重新启动玩客云）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;以上都没有报错，拔下U盘和电源，插入拷贝&lt;code&gt;u-boot&lt;/code&gt;的U盘和ttl线，&lt;code&gt;putty&lt;/code&gt;串口连接后，启动玩客云进入ttl模式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在ttl模式下执行&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;usb start;fatload usb &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;12000000&lt;/span&gt; u-boot.bin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;store rom_write &lt;span style=&#34;color:#bd93f9&#34;&gt;12000000&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;60000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;saveenv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;3-附录&#34;&gt;3. 附录&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;../file/wkcfix.zip&#34;&gt;刷机文件&lt;/a&gt;(包括&lt;code&gt;uboot.bin&lt;/code&gt;,&lt;code&gt;wkcfix.sh&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/hzyitc/u-boot-onecloud&#34;&gt;uboot最新版下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;../file/1.tar.gz&#34;&gt;1.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;../file/HFS.rar&#34;&gt;HFS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;../file/onecloud.rar&#34;&gt;onecloud.img&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/hzyitc/armbian-onecloud&#34;&gt;armbian最新版下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/hzyitc/armbian-onecloud/blob/readme/README_zh.md&#34;&gt;armbin使用指南&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;BRANCH&lt;/th&gt;
          &lt;th&gt;内核版本&lt;/th&gt;
          &lt;th&gt;eMMC&lt;/th&gt;
          &lt;th&gt;HDMI&lt;/th&gt;
          &lt;th&gt;VPU&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;edge&lt;/td&gt;
          &lt;td&gt;v6.1&lt;/td&gt;
          &lt;td&gt;✔️¹&lt;/td&gt;
          &lt;td&gt;✔️²&lt;/td&gt;
          &lt;td&gt;✔️²&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;current&lt;/td&gt;
          &lt;td&gt;v5.15&lt;/td&gt;
          &lt;td&gt;✔️¹&lt;/td&gt;
          &lt;td&gt;✔️²&lt;/td&gt;
          &lt;td&gt;✔️²&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;¹: 需要补丁&lt;br&gt;
²: 通过补丁支持&lt;/p&gt;
&lt;h2 id=&#34;31-如何从u-boot启动&#34;&gt;3.1. 如何从u-boot启动？&lt;/h2&gt;
&lt;h3 id=&#34;311-从usb启动&#34;&gt;3.1.1. 从USB启动&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;setenv bootdev &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;usb 0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;usb start
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;fatload &lt;span style=&#34;color:#f1fa8c&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;bootdev&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt; 0x20800000 boot.scr &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; autoscr 0x20800000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;312-从emmc启动&#34;&gt;3.1.2. 从eMMC启动&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;setenv bootdev &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;mmc 1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;fatload &lt;span style=&#34;color:#f1fa8c&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;bootdev&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt; 0x20800000 boot.scr &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; autoscr 0x20800000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      
    </item>
    
    <item>
      <title>GVLK/OEM KEY速查</title>
      <link>https://www.ttz.pw/post/gvlk/</link>
      <pubDate>Wed, 15 Mar 2023 13:42:43 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/gvlk/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#1-gvlk-key&#34;&gt;1. GVLK KEY&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#11-windows-serverltsc-%e7%89%88%e6%9c%ac&#34;&gt;1.1. Windows Server（LTSC 版本）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#111-windows-server-2022&#34;&gt;1.1.1. Windows Server 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#112-windows-server-2019&#34;&gt;1.1.2. Windows Server 2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#113-windows-server-2016&#34;&gt;1.1.3. Windows Server 2016&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#12-windows-server%e5%8d%8a%e5%b9%b4%e9%a2%91%e9%81%93%e7%89%88%e6%9c%ac&#34;&gt;1.2. Windows Server（半年频道版本）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#121-windows-server%e7%89%88%e6%9c%ac-20h2200419091903-%e5%92%8c-1809&#34;&gt;1.2.1. Windows Server，版本 20H2、2004、1909、1903 和 1809&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#122-windows-11-%e5%92%8c-windows-10%e5%8d%8a%e5%b9%b4%e9%a2%91%e9%81%93%e7%89%88%e6%9c%ac&#34;&gt;1.2.2. Windows 11 和 Windows 10（半年频道版本）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#13-windows-10ltscltsb-%e7%89%88%e6%9c%ac&#34;&gt;1.3. Windows 10（LTSC/LTSB 版本）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#131-windows-10-ltsc-2021-%e5%92%8c-2019&#34;&gt;1.3.1. Windows 10 LTSC 2021 和 2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#132-windows-10-ltsb-2016&#34;&gt;1.3.2. Windows 10 LTSB 2016&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#133-windows-10-ltsb-2015&#34;&gt;1.3.3. Windows 10 LTSB 2015&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#14-%e6%97%a9%e6%9c%9f%e7%89%88%e6%9c%ac%e7%9a%84-windows-server&#34;&gt;1.4. 早期版本的 Windows Server&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#141-windows-server-%e7%89%88%e6%9c%ac-1803&#34;&gt;1.4.1. Windows Server 版本 1803&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#142-windows-server-%e7%89%88%e6%9c%ac-1709&#34;&gt;1.4.2. Windows Server 版本 1709&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#143-windows-server-2012-r2&#34;&gt;1.4.3. Windows Server 2012 R2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#144-windows-server-2012&#34;&gt;1.4.4. Windows Server 2012&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#145-windows-server-2008-r2&#34;&gt;1.4.5. Windows Server 2008 R2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#146-windows-2008-server&#34;&gt;1.4.6. Windows 2008 Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#15-%e6%97%a9%e6%9c%9f%e7%89%88%e6%9c%ac%e7%9a%84-windows&#34;&gt;1.5. 早期版本的 Windows&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#151-windows-81&#34;&gt;1.5.1. Windows 8.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#152-windows-8&#34;&gt;1.5.2. Windows 8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#153-windows-7&#34;&gt;1.5.3. Windows 7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#154-windows-vista&#34;&gt;1.5.4. Windows Vista&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#16-office-ltsc-2021&#34;&gt;1.6. Office LTSC 2021&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#17-office-2019&#34;&gt;1.7. Office 2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#18-office-2016&#34;&gt;1.8. Office 2016&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#19-office-2013&#34;&gt;1.9. Office 2013&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#110-office-2010&#34;&gt;1.10. Office 2010&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#111-visual-studio-static-key&#34;&gt;1.11. Visual Studio Static Key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/#112-oem&#34;&gt;1.12. OEM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;无法激活任何评估版本的产品&lt;/li&gt;
&lt;li&gt;GLVK仅适用于批量通道产品以及可以转换的版本的产品&lt;/li&gt;
&lt;li&gt;OEM用于数字权利，适用于Windows 1607+（14393）的产品&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1-gvlk-key&#34;&gt;1. GVLK KEY&lt;/h2&gt;
&lt;h3 id=&#34;11-windows-serverltsc-版本&#34;&gt;1.1. Windows Server（LTSC 版本）&lt;/h3&gt;
&lt;h4 id=&#34;111-windows-server-2022&#34;&gt;1.1.1. Windows Server 2022&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2022 Datacenter&lt;/td&gt;
          &lt;td&gt;WX4NM-KYWYW-QJJR4-XV3QB-6VM33&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2022 Standard&lt;/td&gt;
          &lt;td&gt;VDYBN-27WPP-V4HQT-9VMD4-VMK7H&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;112-windows-server-2019&#34;&gt;1.1.2. Windows Server 2019&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS  客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server2019 Datacenter&lt;/td&gt;
          &lt;td&gt;WMDGN-G9PQG-XVVXX-R3X43-63DFG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2019 Standard&lt;/td&gt;
          &lt;td&gt;N69G4-B89J2-4G8F4-WWYCC-J464C&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2019 Essentials&lt;/td&gt;
          &lt;td&gt;WVDHN-86M7X-466P6-VHXV7-YY726&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;113-windows-server-2016&#34;&gt;1.1.3. Windows Server 2016&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2016&lt;/td&gt;
          &lt;td&gt;Datacenter CB7KF-BWN84-R7R2Y-793K2-8XDDG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2016&lt;/td&gt;
          &lt;td&gt;Standard WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server2016&lt;/td&gt;
          &lt;td&gt;Essentials JCKRF-N37P4-C2D82-9YXRT-4M63B&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;12-windows-server半年频道版本&#34;&gt;1.2. Windows Server（半年频道版本）&lt;/h3&gt;
&lt;h4 id=&#34;121-windows-server版本-20h2200419091903-和-1809&#34;&gt;1.2.1. Windows Server，版本 20H2、2004、1909、1903 和 1809&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server Datacenter&lt;/td&gt;
          &lt;td&gt;6NMRW-2C8FM-D24W7-TQWMY-CWH2D&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server Standard&lt;/td&gt;
          &lt;td&gt;N2KJX-J94YW-TQVFB-DG9YT-724CC&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;122-windows-11-和-windows-10半年频道版本&#34;&gt;1.2.2. Windows 11 和 Windows 10（半年频道版本）&lt;/h4&gt;
&lt;p&gt;有关受支持的版本和服务终止日期的信息，请参阅 Windows 生命周期情况说明书。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 专业版 Windows 10 专业版&lt;/td&gt;
          &lt;td&gt;W269N-WFGWX-YVC9B-4J6C9-T83GX&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 专业版 N Windows 10 专业版 N&lt;/td&gt;
          &lt;td&gt;MH37W-N47XK-V7XM9-C7227-GCQG9&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 专业工作站版 Windows 10 专业工作站版&lt;/td&gt;
          &lt;td&gt;NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 专业工作站版 N Windows 10 专业工作站版 N&lt;/td&gt;
          &lt;td&gt;9FNHH-K3HBT-3W4TD-6383H-6XYWF&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 专业教育版 Windows 10 专业教育版&lt;/td&gt;
          &lt;td&gt;6TP4R-GNPTD-KYYHQ-7B7DP-J447Y&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 专业教育版 N Windows 10 专业教育版 N&lt;/td&gt;
          &lt;td&gt;YVWGF-BXNMC-HTQYQ-CPQ99-66QFC&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 教育版 Windows 10 教育版&lt;/td&gt;
          &lt;td&gt;NW6C2-QMPVW-D7KKK-3GKT6-VCFB2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 教育版 N Windows 10 教育版 N&lt;/td&gt;
          &lt;td&gt;2WH4N-8QGBV-H22JP-CT43Q-MDWWJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 企业版 Windows 10 企业版&lt;/td&gt;
          &lt;td&gt;NPPR9-FWDCX-D2C8J-H872K-2YT43&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 企业版 N Windows 10 企业版 N&lt;/td&gt;
          &lt;td&gt;DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 企业版 G Windows 10 企业版 G&lt;/td&gt;
          &lt;td&gt;YYVX9-NTFWV-6MDM3-9PT4T-4M68B&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 11 企业版 G N Windows 10 企业版 G N&lt;/td&gt;
          &lt;td&gt;44RPN-FTY23-9VTTB-MP9BX-T84FV&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;13-windows-10ltscltsb-版本&#34;&gt;1.3. Windows 10（LTSC/LTSB 版本）&lt;/h3&gt;
&lt;h4 id=&#34;131-windows-10-ltsc-2021-和-2019&#34;&gt;1.3.1. Windows 10 LTSC 2021 和 2019&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 10 企业版 LTSC 2021 Windows 10 企业版 LTSC 2019&lt;/td&gt;
          &lt;td&gt;M7XTQ-FN8P6-TTKYV-9D4CC-J462D&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 10 企业版 N LTSC 2021 Windows 10 企业版 N LTSC 2019&lt;/td&gt;
          &lt;td&gt;92NFX-8DJQP-P6BBQ-THF9C-7CG2H&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;132-windows-10-ltsb-2016&#34;&gt;1.3.2. Windows 10 LTSB 2016&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 10 企业版 LTSB 2016&lt;/td&gt;
          &lt;td&gt;DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 10 企业版 N LTSB 2016&lt;/td&gt;
          &lt;td&gt;QFFDN-GRT3P-VKWWX-X7T3R-8B639&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;133-windows-10-ltsb-2015&#34;&gt;1.3.3. Windows 10 LTSB 2015&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 10 企业版 2015 LTSB&lt;/td&gt;
          &lt;td&gt;WNMTR-4C88C-JK8YV-HQ7T2-76DF9&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 10 企业版 2015 LTSB N&lt;/td&gt;
          &lt;td&gt;2F77B-TNFGY-69QQF-B8YKP-D69TJ&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;14-早期版本的-windows-server&#34;&gt;1.4. 早期版本的 Windows Server&lt;/h3&gt;
&lt;h4 id=&#34;141-windows-server-版本-1803&#34;&gt;1.4.1. Windows Server 版本 1803&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server Datacenter&lt;/td&gt;
          &lt;td&gt;2HXDN-KRXHB-GPYC7-YCKFJ-7FVDG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server Standard&lt;/td&gt;
          &lt;td&gt;PTXN8-JFHJM-4WC78-MPCBR-9W4KR&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;142-windows-server-版本-1709&#34;&gt;1.4.2. Windows Server 版本 1709&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server Datacenter&lt;/td&gt;
          &lt;td&gt;6Y6KB-N82V8-D8CQV-23MJW-BWTG6&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server Standard&lt;/td&gt;
          &lt;td&gt;DPCNP-XQFKJ-BJF7R-FRC8D-GF6G4&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;143-windows-server-2012-r2&#34;&gt;1.4.3. Windows Server 2012 R2&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 R2 Standard&lt;/td&gt;
          &lt;td&gt;D2N9P-3P6X9-2R39C-7RTCD-MDVJX&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 R2 Datacenter&lt;/td&gt;
          &lt;td&gt;W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 R2 Essentials&lt;/td&gt;
          &lt;td&gt;KNC87-3J2TX-XB4WP-VCPJV-M4FWM&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;144-windows-server-2012&#34;&gt;1.4.4. Windows Server 2012&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012&lt;/td&gt;
          &lt;td&gt;BN3D2-R7TKB-3YPBD-8DRP2-27GG4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 N&lt;/td&gt;
          &lt;td&gt;8N2M2-HWPGY-7PGT9-HGDD8-GVGGY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 单语言版&lt;/td&gt;
          &lt;td&gt;2WN2H-YGCQR-KFX6K-CD6TF-84YXQ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 特定国家/地区版&lt;/td&gt;
          &lt;td&gt;4K36P-JN4VD-GDC6V-KDT89-DYFKP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 Standard&lt;/td&gt;
          &lt;td&gt;XC9B7-NBPP2-83J2H-RHMBY-92BT4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 MultiPoint 标准版&lt;/td&gt;
          &lt;td&gt;HM7DN-YVMH3-46JC3-XYTG7-CYQJJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 MultiPoint 高级版&lt;/td&gt;
          &lt;td&gt;XNH6W-2V9GX-RGJ4K-Y8X6F-QGJ2G&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2012 Datacenter&lt;/td&gt;
          &lt;td&gt;48HP8-DN98B-MYWDG-T2DCC-8W83P&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;145-windows-server-2008-r2&#34;&gt;1.4.5. Windows Server 2008 R2&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 R2 Web 版&lt;/td&gt;
          &lt;td&gt;6TPJF-RBVHG-WBW2R-86QPH-6RTM4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 R2 HPC 版&lt;/td&gt;
          &lt;td&gt;TT8MH-CG224-D3D7Q-498W2-9QCTX&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 R2 标准版&lt;/td&gt;
          &lt;td&gt;YC6KT-GKW9T-YTKYR-T4X34-R7VHC&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 R2 企业版&lt;/td&gt;
          &lt;td&gt;489J6-VHDMP-X63PK-3K798-CPX3Y&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 R2 Datacenter&lt;/td&gt;
          &lt;td&gt;74YFP-3QFB3-KQT8W-PMXWJ-7M648&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;面向基于 Itanium 系统的 Windows Server 2008 R2&lt;/td&gt;
          &lt;td&gt;GT63C-RJFQ3-4GMB6-BRFB9-CB83V&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;146-windows-2008-server&#34;&gt;1.4.6. Windows 2008 Server&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Web Server 2008&lt;/td&gt;
          &lt;td&gt;WYR28-R7TFJ-3X2YQ-YCY4H-M249D&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 标准版&lt;/td&gt;
          &lt;td&gt;TM24T-X9RMF-VWXK6-X8JC9-BFGM2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;不带 Hyper-V 的 Windows Server 2008 标准版&lt;/td&gt;
          &lt;td&gt;W7VD6-7JFBR-RX26B-YKQ3Y-6FFFJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 企业版&lt;/td&gt;
          &lt;td&gt;YQGMW-MPWTJ-34KDK-48M3W-X4Q6V&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;不带 Hyper-V 的 Windows Server 2008 企业版&lt;/td&gt;
          &lt;td&gt;39BXF-X8Q23-P2WWT-38T2F-G3FPG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 HPC&lt;/td&gt;
          &lt;td&gt;RCTX3-KWVHP-BR6TB-RB6DM-6X7HP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Server 2008 Datacenter&lt;/td&gt;
          &lt;td&gt;7M67G-PC374-GR742-YH8V4-TCBY3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;不带 Hyper-V 的 Windows Server 2008 数据中心版&lt;/td&gt;
          &lt;td&gt;22XQ2-VRXRG-P8D42-K34TD-G3QQC&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;面向基于 Itanium 系统的 Windows Server 2008&lt;/td&gt;
          &lt;td&gt;4DWFP-JF3DJ-B7DTH-78FJB-PDRHK&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;15-早期版本的-windows&#34;&gt;1.5. 早期版本的 Windows&lt;/h3&gt;
&lt;h4 id=&#34;151-windows-81&#34;&gt;1.5.1. Windows 8.1&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 8.1 专业版&lt;/td&gt;
          &lt;td&gt;GCRJD-8NW9H-F2CDX-CCM8D-9D6T9&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 8.1 专业版 N&lt;/td&gt;
          &lt;td&gt;HMCNV-VVBFX-7HMBH-CTY9B-B4FXY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 8.1 企业版&lt;/td&gt;
          &lt;td&gt;MHF9N-XY6XB-WVXMC-BTDCT-MKKG7&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 8.1 企业版 N&lt;/td&gt;
          &lt;td&gt;TT4HM-HN7YT-62K67-RGRQJ-JFFXW&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;152-windows-8&#34;&gt;1.5.2. Windows 8&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 8 专业版&lt;/td&gt;
          &lt;td&gt;NG4HW-VH26C-733KW-K6F98-J8CK4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 8 专业版 N&lt;/td&gt;
          &lt;td&gt;XCVCF-2NXM9-723PB-MHCB7-2RYQQ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 8 企业版&lt;/td&gt;
          &lt;td&gt;32JNW-9KQ84-P47T8-D8GGY-CWCK7&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 8 企业版 N&lt;/td&gt;
          &lt;td&gt;JMNMF-RHW7P-DMY6X-RF3DR-X2BQT&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;153-windows-7&#34;&gt;1.5.3. Windows 7&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 7 专业版&lt;/td&gt;
          &lt;td&gt;FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 7 专业版 N&lt;/td&gt;
          &lt;td&gt;MRPKT-YTG23-K7D7T-X2JMM-QY7MG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 7 专业版 E&lt;/td&gt;
          &lt;td&gt;W82YF-2Q76Y-63HXB-FGJG9-GF7QX&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 7 企业版&lt;/td&gt;
          &lt;td&gt;33PXH-7Y6KF-2VJC9-XBBR8-HVTHH&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 7 企业版 N&lt;/td&gt;
          &lt;td&gt;YDRBP-3D83W-TY26F-D46B2-XCKRJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows 7 企业版 E&lt;/td&gt;
          &lt;td&gt;C29WB-22CC8-VJ326-GHFJW-H9DH4&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;154-windows-vista&#34;&gt;1.5.4. Windows Vista&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作系统版本&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Vista 商用版&lt;/td&gt;
          &lt;td&gt;YFKBB-PQJJV-G996G-VWGXY-2V3X8&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Vista 商用版 N&lt;/td&gt;
          &lt;td&gt;HMBQG-8H2RH-C77VX-27R82-VMQBT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Vista 企业版&lt;/td&gt;
          &lt;td&gt;VKK3X-68KWM-X2YGT-QR4M6-4BWMV&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows Vista 企业版 N&lt;/td&gt;
          &lt;td&gt;VTC42-BM838-43QHV-84HX6-XJXKV&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;16-office-ltsc-2021&#34;&gt;1.6. Office LTSC 2021&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Office产品&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Office LTSC Professional Plus 2021&lt;/td&gt;
          &lt;td&gt;FXYTK-NJJ8C-GB6DW-3DYQT-6F7TH&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Office LTSC Standard 2021&lt;/td&gt;
          &lt;td&gt;KDX7X-BNVR8-TXXGX-4Q7Y8-78VT3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project Professional 2021&lt;/td&gt;
          &lt;td&gt;FTNWT-C6WBT-8HMGF-K9PRX-QV9H8&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project Standard 2021&lt;/td&gt;
          &lt;td&gt;J2JDC-NJCYY-9RGQ4-YXWMH-T3D4T&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio LTSC Professional 2021&lt;/td&gt;
          &lt;td&gt;KNH8D-FGHT4-T8RK3-CTDYJ-K2HT4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio LTSC Standard 2021&lt;/td&gt;
          &lt;td&gt;MJVNY-BYWPY-CWV6J-2RKRT-4M8QG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Access LTSC 2021&lt;/td&gt;
          &lt;td&gt;WM8YG-YNGDD-4JHDC-PG3F4-FC4T4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Excel LTSC 2021&lt;/td&gt;
          &lt;td&gt;NWG3X-87C9K-TC7YY-BC2G7-G6RVC&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Outlook LTSC 2021&lt;/td&gt;
          &lt;td&gt;C9FM6-3N72F-HFJXB-TM3V9-T86R9&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;PowerPoint LTSC 2021&lt;/td&gt;
          &lt;td&gt;TY7XF-NFRBR-KJ44C-G83KF-GX27K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Publisher LTSC 2021&lt;/td&gt;
          &lt;td&gt;2MW9D-N4BXM-9VBPG-Q7W6M-KFBGQ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Skype for Business LTSC 2021&lt;/td&gt;
          &lt;td&gt;HWCXN-K3WBT-WJBKY-R8BD9-XK29P&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Word LTSC 2021&lt;/td&gt;
          &lt;td&gt;TN8H9-M34D3-Y64V9-TR72V-X79KV&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;17-office-2019&#34;&gt;1.7. Office 2019&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Office产品&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Office Professional Plus 2019&lt;/td&gt;
          &lt;td&gt;NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Office Standard 2019&lt;/td&gt;
          &lt;td&gt;6NWWJ-YQWMR-QKGCB-6TMB3-9D9HK&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project Professional 2019&lt;/td&gt;
          &lt;td&gt;B4NPR-3FKK7-T2MBV-FRQ4W-PKD2B&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project Standard 2019&lt;/td&gt;
          &lt;td&gt;C4F7P-NCP8C-6CQPT-MQHV9-JXD2M&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio Professional 2019&lt;/td&gt;
          &lt;td&gt;9BGNQ-K37YR-RQHF2-38RQ3-7VCBB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio Standard 2019&lt;/td&gt;
          &lt;td&gt;7TQNQ-K3YQQ-3PFH7-CCPPM-X4VQ2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Access 2019&lt;/td&gt;
          &lt;td&gt;9N9PT-27V4Y-VJ2PD-YXFMF-YTFQT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Excel 2019&lt;/td&gt;
          &lt;td&gt;TMJWT-YYNMB-3BKTF-644FC-RVXBD&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Outlook 2019&lt;/td&gt;
          &lt;td&gt;7HD7K-N4PVK-BHBCQ-YWQRW-XW4VK&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;PowerPoint 2019&lt;/td&gt;
          &lt;td&gt;RRNCX-C64HY-W2MM7-MCH9G-TJHMQ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Publisher 2019&lt;/td&gt;
          &lt;td&gt;G2KWX-3NW6P-PY93R-JXK2T-C9Y9V&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Skype for Business 2019&lt;/td&gt;
          &lt;td&gt;NCJ33-JHBBY-HTK98-MYCV8-HMKHJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Word 2019&lt;/td&gt;
          &lt;td&gt;PBX3G-NWMT6-Q7XBW-PYJGG-WXD33&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;18-office-2016&#34;&gt;1.8. Office 2016&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Office产品&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Office Professional Plus 2016&lt;/td&gt;
          &lt;td&gt;XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Office Standard 2016&lt;/td&gt;
          &lt;td&gt;JNRGM-WHDWX-FJJG3-K47QV-DRTFM&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project Professional 2016&lt;/td&gt;
          &lt;td&gt;YG9NW-3K39V-2T3HJ-93F3Q-G83KT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project Standard 2016&lt;/td&gt;
          &lt;td&gt;GNFHQ-F6YQM-KQDGJ-327XX-KQBVC&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio Professional 2016&lt;/td&gt;
          &lt;td&gt;PD3PC-RHNGV-FXJ29-8JK7D-RJRJK&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio Standard 2016&lt;/td&gt;
          &lt;td&gt;7WHWN-4T7MP-G96JF-G33KR-W8GF4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Access 2016&lt;/td&gt;
          &lt;td&gt;GNH9Y-D2J4T-FJHGG-QRVH7-QPFDW&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Excel 2016&lt;/td&gt;
          &lt;td&gt;9C2PK-NWTVB-JMPW8-BFT28-7FTBF&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;OneNote 2016&lt;/td&gt;
          &lt;td&gt;DR92N-9HTF2-97XKM-XW2WJ-XW3J6&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Outlook 2016&lt;/td&gt;
          &lt;td&gt;R69KK-NTPKF-7M3Q4-QYBHW-6MT9B&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;PowerPoint 2016&lt;/td&gt;
          &lt;td&gt;J7MQP-HNJ4Y-WJ7YM-PFYGF-BY6C6&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Publisher 2016&lt;/td&gt;
          &lt;td&gt;F47MM-N3XJP-TQXJ9-BP99D-8837K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Skype for Business 2016&lt;/td&gt;
          &lt;td&gt;869NQ-FJ69K-466HW-QYCP2-DDBV6&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Word 2016&lt;/td&gt;
          &lt;td&gt;WXY84-JN2Q9-RBCCQ-3Q3J3-3PFJ6&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;19-office-2013&#34;&gt;1.9. Office 2013&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Office产品&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Office 2013 Professional Plus&lt;/td&gt;
          &lt;td&gt;YC7DK-G2NP3-2QQC3-J6H88-GVGXT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Office 2013 Standard&lt;/td&gt;
          &lt;td&gt;KBKQT-2NMXY-JJWGP-M62JB-92CD4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project 2013 Professional&lt;/td&gt;
          &lt;td&gt;FN8TT-7WMH6-2D4X9-M337T-2342K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project 2013 Standard&lt;/td&gt;
          &lt;td&gt;6NTH3-CW976-3G3Y2-JK3TX-8QHTT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio 2013 Professional&lt;/td&gt;
          &lt;td&gt;C2FG9-N6J68-H8BTJ-BW3QX-RM3B3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio 2013 Standard&lt;/td&gt;
          &lt;td&gt;J484Y-4NKBF-W2HMG-DBMJC-PGWR7&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Access 2013&lt;/td&gt;
          &lt;td&gt;NG2JY-H4JBT-HQXYP-78QH9-4JM2D&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Excel 2013&lt;/td&gt;
          &lt;td&gt;VGPNG-Y7HQW-9RHP7-TKPV3-BG7GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;InfoPath 2013&lt;/td&gt;
          &lt;td&gt;DKT8B-N7VXH-D963P-Q4PHY-F8894&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Lync 2013&lt;/td&gt;
          &lt;td&gt;2MG3G-3BNTT-3MFW9-KDQW3-TCK7R&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;OneNote 2013&lt;/td&gt;
          &lt;td&gt;TGN6P-8MMBC-37P2F-XHXXK-P34VW&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Outlook 2013&lt;/td&gt;
          &lt;td&gt;QPN8Q-BJBTJ-334K3-93TGY-2PMBT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;PowerPoint 2013&lt;/td&gt;
          &lt;td&gt;4NT99-8RJFH-Q2VDH-KYG2C-4RD4F&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Publisher 2013&lt;/td&gt;
          &lt;td&gt;PN2WF-29XG2-T9HJ7-JQPJR-FCXK4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Word 2013&lt;/td&gt;
          &lt;td&gt;6Q7VD-NX8JD-WJ2VH-88V73-4GBJ7&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;110-office-2010&#34;&gt;1.10. Office 2010&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Office产品&lt;/th&gt;
          &lt;th&gt;KMS 客户端产品密钥&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Office Professional Plus 2010&lt;/td&gt;
          &lt;td&gt;VYBBJ-TRJPB-QFQRF-QFT4D-H3GVB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Office Standard 2010&lt;/td&gt;
          &lt;td&gt;V7QKV-4XVVR-XYV4D-F7DFM-8R6BM&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Office Home and Business 2010&lt;/td&gt;
          &lt;td&gt;D6QFG-VBYP2-XQHM7-J97RH-VVRCK&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project Professional 2010&lt;/td&gt;
          &lt;td&gt;YGX6F-PGV49-PGW3J-9BTGG-VHKC6&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Project Standard 2010&lt;/td&gt;
          &lt;td&gt;4HP3K-88W3F-W2K3D-6677X-F9PGB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio Premium 2010&lt;/td&gt;
          &lt;td&gt;D9DWC-HPYVV-JGF4P-BTWQB-WX8BJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio Professional 2010&lt;/td&gt;
          &lt;td&gt;7MCW8-VRQVK-G677T-PDJCM-Q8TCP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visio Standard 2010&lt;/td&gt;
          &lt;td&gt;767HD-QGMWX-8QTDB-9G3R2-KHFGJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Access 2010&lt;/td&gt;
          &lt;td&gt;V7Y44-9T38C-R2VJK-666HK-T7DDX&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Excel 2010&lt;/td&gt;
          &lt;td&gt;H62QG-HXVKF-PP4HP-66KMR-CW9BM&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SharePoint Workspace 2010&lt;/td&gt;
          &lt;td&gt;QYYW6-QP4CB-MBV6G-HYMCJ-4T3J4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;InfoPath 2010&lt;/td&gt;
          &lt;td&gt;K96W8-67RPQ-62T9Y-J8FQJ-BT37T&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;OneNote 2010&lt;/td&gt;
          &lt;td&gt;Q4Y4M-RHWJM-PY37F-MTKWH-D3XHX&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Outlook 2010&lt;/td&gt;
          &lt;td&gt;7YDC2-CWM8M-RRTJC-8MDVC-X3DWQ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;PowerPoint 2010&lt;/td&gt;
          &lt;td&gt;RC8FX-88JRY-3PF7C-X8P67-P4VTT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Publisher 2010&lt;/td&gt;
          &lt;td&gt;BFK7F-9MYHM-V68C7-DRQ66-83YTP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Word 2010&lt;/td&gt;
          &lt;td&gt;HVHB3-C6FV7-KQX9W-YQG79-CRY7T&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;111-visual-studio-static-key&#34;&gt;1.11. Visual Studio Static Key&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;版本&lt;/th&gt;
          &lt;th&gt;KEY&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Visual Studio 2022 Professional&lt;/td&gt;
          &lt;td&gt;TD244-P4NB7-YQ6XK-Y8MMM-YWV2J&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visual Studio 2022 Enterprise&lt;/td&gt;
          &lt;td&gt;VHF9H-NXBBB-638P6-6JHCY-88JWH&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visual Studio 2019 Professional&lt;/td&gt;
          &lt;td&gt;NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visual Studio 2019 Enterprise&lt;/td&gt;
          &lt;td&gt;BF8Y8-GN2QH-T84XB-QVY3B-RC4DF&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;112-oem&#34;&gt;1.12. OEM&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Product&lt;/th&gt;
          &lt;th&gt;KEY&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;[OEM NONSLP]Enterprise&lt;/td&gt;
          &lt;td&gt;XGVPP-NMH47-7TTHJ-W3FW7-8HV2C&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Education&lt;/td&gt;
          &lt;td&gt;YNMGQ-8RYV3-4PGQ3-C8XTP-7CFBY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Professional&lt;/td&gt;
          &lt;td&gt;VK7JG-NPHTM-C97JM-9MPGT-3V66T&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Professional for Workstation&lt;/td&gt;
          &lt;td&gt;DXG7C-N36C4-C4HTG-X4T3X-2YV77&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]ServerRdsh&lt;/td&gt;
          &lt;td&gt;NJCF7-PW8QT-3324D-688JX-2YV66&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Professional for Workstation N&lt;/td&gt;
          &lt;td&gt;WYPNQ-8C467-V2W6J-TX4WX-WT2RQ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Professional N&lt;/td&gt;
          &lt;td&gt;2B87N-8KFHP-DKV6R-Y2C8J-PKCKT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Professional Education N&lt;/td&gt;
          &lt;td&gt;GJTYN-HDMQY-FRR76-HVGC7-QPF8P&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Professional Education&lt;/td&gt;
          &lt;td&gt;8PTT6-RNW4C-6V7J2-C2D3X-MHBPB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Education N&lt;/td&gt;
          &lt;td&gt;84NGF-MHBT6-FXBX8-QWJK7-DRR8H&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Home Single Language&lt;/td&gt;
          &lt;td&gt;BT79Q-G7N6G-PGBYW-4YWX6-6F4BT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Home N&lt;/td&gt;
          &lt;td&gt;4CPRK-NM3K3-X6XXQ-RXX86-WXCHW&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Home China&lt;/td&gt;
          &lt;td&gt;N2434-X9D7W-8PF6X-8DV9T-8TYMD&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Home&lt;/td&gt;
          &lt;td&gt;YTMG3-N6DKC-DKB77-7M9GH-8HVX7&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Cloud (Windows S) N&lt;/td&gt;
          &lt;td&gt;NH9J3-68WK7-6FB93-4K3DF-DJ4F6&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Cloud (Windows S) Edition N&lt;/td&gt;
          &lt;td&gt;K9VKN-3BGWV-Y624W-MCRMQ-BHDCD&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Cloud (Windows S) Edition&lt;/td&gt;
          &lt;td&gt;KY7PN-VR6RX-83W6Y-6DDYQ-T6R4W&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Retail]Cloud (Windows S)&lt;/td&gt;
          &lt;td&gt;V3WVW-N2PV2-CGWC3-34QGF-VMJ2C&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[OEM NONSLP]PPIPro (Windows Team)&lt;/td&gt;
          &lt;td&gt;XKCNC-J26Q9-KFHD2-FKTHY-KD72Y&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[OEM NONSLP]IoT Enterprise LTSC Subscription&lt;/td&gt;
          &lt;td&gt;J7NJW-V6KBM-CC8RW-Y29Y4-HQ2MJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[OEM NONSLP]IoT Enterprise LTSC 2021&lt;/td&gt;
          &lt;td&gt;QPM6N-7J2WJ-P88HH-P3YRH-YY74H&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[OEM NONSLP]Enterprise LTSB 2015&lt;/td&gt;
          &lt;td&gt;FWN7H-PF93Q-4GGP8-M8RF3-MDWWW&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[OEM NONSLP]Enterprise LTSC 2019&lt;/td&gt;
          &lt;td&gt;43TBQ-NH92J-XKTM7-KT3KK-P39PB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[OEM NONSLP]Enterprise LTSB 2016&lt;/td&gt;
          &lt;td&gt;NK96Y-D9CD8-W44CQ-R8YTK-DYJWX&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[OEM DM]IoT Enterprise&lt;/td&gt;
          &lt;td&gt;XQQYW-NFFMW-XJPBH-K8732-CKFFD&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Volume MAK]EnterpriseSN:VB&lt;/td&gt;
          &lt;td&gt;RQFNW-9TPM3-JQ73T-QV4VQ-DV9PT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Volume MAK]Enterprise N LTSB 2015&lt;/td&gt;
          &lt;td&gt;NTX6B-BRYC2-K6786-F6MVQ-M7V2X&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Volume MAK]EnterpriseSN:RS5&lt;/td&gt;
          &lt;td&gt;M33WV-NHY3C-R7FPM-BQGPT-239PG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Volume MAK]Enterprise N LTSB 2016&lt;/td&gt;
          &lt;td&gt;2DBW3-N2PJG-MVHW3-G7TDK-9HKR4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Volume MAK]EnterpriseS:VB&lt;/td&gt;
          &lt;td&gt;KCNVH-YKWX8-GJJB9-H9FDT-6F7W2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;[Volume MAK]Enterprise N&lt;/td&gt;
          &lt;td&gt;3V6Q6-NQXCX-V8YXR-9QCYV-QPFCT&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</description>
      
    </item>
    
    <item>
      <title>安装最新VL版office快捷指南</title>
      <link>https://www.ttz.pw/post/dowload-vloffice/</link>
      <pubDate>Wed, 15 Mar 2023 13:27:50 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/dowload-vloffice/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dowload-vloffice/#1-%e4%b8%8b%e8%bd%bdodt%e5%b7%a5%e5%85%b7%e5%b9%b6%e8%a7%a3%e5%8e%8b&#34;&gt;1 下载ODT工具并解压&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dowload-vloffice/#2-%e9%85%8d%e7%bd%ae%e4%bd%a0%e6%83%b3%e8%a6%81%e7%9a%84office&#34;&gt;2 配置你想要的Office&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dowload-vloffice/#3-%e5%ae%89%e8%a3%85%e4%bd%a0%e5%bf%83%e4%bb%aa%e7%9a%84office&#34;&gt;3 安装你心仪的office&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/dowload-vloffice/#%e9%99%84%e5%bd%95&#34;&gt;附录&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此指南是&lt;a href=&#34;https://www.ttz.pw/post/kms/&#34;&gt;KMS激活Windows/Office使用指南&lt;/a&gt;的补充，由于微软在Office 2016之后的版本均不提供ISO镜像下载（指正版商业镜像），VL版本的Office需要管理员手动使用ODT工具进行部署。此教程对ODT工具部署安装Office进行简要描述。&lt;/p&gt;
&lt;h1 id=&#34;1-下载odt工具并解压&#34;&gt;1 下载ODT工具并解压&lt;/h1&gt;
&lt;p&gt;ODT工具下载： &lt;a href=&#34;https://www.microsoft.com/en-us/download/details.aspx?id=49117&#34;&gt;https://www.microsoft.com/en-us/download/details.aspx?id=49117&lt;/a&gt;
点击&lt;code&gt;[Download]&lt;/code&gt;按钮下载微软官网提供的ODT工具，下载下来的是一个自解压程序的压缩包，双击选择解压位置，你就会得到一个红色图标的&lt;code&gt;setup.exe&lt;/code&gt;和一些示例的xml文件。我们只要其中的&lt;code&gt;setup.exe&lt;/code&gt;即可。
如果上面的链接打不开，可以尝试复制下载以下链接：
&lt;a href=&#34;https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_15928-20216.exe&#34;&gt;https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_15928-20216.exe&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;2-配置你想要的office&#34;&gt;2 配置你想要的Office&lt;/h1&gt;
&lt;p&gt;配置文件生成: &lt;a href=&#34;https://config.office.com/deploymentsettings&#34;&gt;https://config.office.com/deploymentsettings&lt;/a&gt;
打开上面的微软Office提供的网站，你可以自由DIY你想要的Office。此处仅介绍几个重点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;版本选择：请选择带&lt;code&gt;批量许可证&lt;/code&gt;字样的版本，同时请不要选择带&lt;code&gt;SPLA&lt;/code&gt;字样的版本。（注意：如果你要安装Visio之类的组件，LTSC版本会和个人版OFFICE冲突，如果你电脑上有个人版OFFICE导致安装冲突请不要选择带LTSC字样版本。）&lt;/li&gt;
&lt;li&gt;你可以自由选择安装的组件和语言，比如仅安装Word，Excel和PowerPoint。&lt;/li&gt;
&lt;li&gt;授权和激活：开启自动接受EULA，点选KMS选项。&lt;/li&gt;
&lt;li&gt;DIY好你心仪的配置之后，可以点击&lt;code&gt;导出&lt;/code&gt;按钮，如有询问默认文件格式点击&lt;code&gt;[保留当前配置]&lt;/code&gt;即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;你将会下载到一个xml格式的配置文件，为了后续操作方便，你可以重命名为&lt;code&gt;office.xml&lt;/code&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;h1 id=&#34;3-安装你心仪的office&#34;&gt;3 安装你心仪的office&lt;/h1&gt;
&lt;p&gt;把步骤1得到的&lt;code&gt;setup.exe&lt;/code&gt;和步骤2得到的&lt;code&gt;office.xml&lt;/code&gt;放在同一个目录，在当前目录的地址栏输入&lt;code&gt;cmd&lt;/code&gt;回车，打开命令提示符窗口，输入以下命令即可执行安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;setup.exe /configure office.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然，你可以把你的上面的命令写成cmd文件，跟&lt;code&gt;setup.exe&lt;/code&gt;和&lt;code&gt;office.xml&lt;/code&gt;保存在一起，下次直接双击你的cmd脚本即可安装你心仪的office。
你无需保留任何大体积的安装包和关心补丁，每次安装都是联网安装你设置的最新版的Office。&lt;/p&gt;
&lt;h1 id=&#34;附录&#34;&gt;附录&lt;/h1&gt;
&lt;p&gt;如果你想对ODT工具有更多了解，比如使用ODT下载Office等，可参阅微软官方文档：
&lt;a href=&#34;https://learn.microsoft.com/zh-cn/deployoffice/overview-office-deployment-tool&#34;&gt;https://learn.microsoft.com/zh-cn/deployoffice/overview-office-deployment-tool&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>微软ISO镜像文件名含义解读</title>
      <link>https://www.ttz.pw/post/iso-meaning/</link>
      <pubDate>Wed, 15 Mar 2023 13:16:58 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/iso-meaning/</guid>
      
        <description>&lt;p&gt;很多人对微软的ISO应该不陌生，却分不出什么是真正的商业版镜像，写这篇文章的目的是让大家从镜像的文件名简单理解一下镜像文件的来源和区别，可能不会涵盖所有文件名，但其中某些标签是通用的。&lt;/p&gt;
&lt;h1 id=&#34;镜像常见来源&#34;&gt;镜像常见来源&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MSDN&lt;/code&gt;: “MSDN”镜像可能是大多数人接触的镜像，严格来说，他是提供开发人员订阅测试的版本，并不是正式版本，通常来说用一段时间没有问题就会变成正式的版本，把他当正式版也没什么大问题，但历史上也有不少镜像撤回的情况，比如之前&lt;code&gt;Windows 10 V1809&lt;/code&gt;因为存在丢失文件、蓝屏等情况，被微软撤回重新发布。MSDN订阅按年收费，用拥有订阅的用户可以下载到微软库里相对完整的产品镜像(看订阅的级别)，用于设计、开发和测试目的。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VLSC&lt;/code&gt;: 而正式版的商业版镜像会稍晚MSDN一到两周在VLSC中心提供，拥有产品账号的客户可以从VLSC中心（大批量授权中心，我们常说的“VL版”）下载镜像。而不管你购买了何种VLSC产品，你都可以下载所有VLSC中心提供的镜像（但可能没有密钥）。结束产品生命周期的产品镜像可能会在VLSC中心下架。所有的VLSC产品镜像都内置了GVLK密钥，从VLSC中心下载的镜像均不需要手动安装GVLK密钥。&lt;/li&gt;
&lt;li&gt;微软官网提供的无需账号，开放下载的零售版镜像。该镜像文件名比较简单，一般就是&lt;code&gt;系统版本_语言_架构.iso&lt;/code&gt;，不过多讨论。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;镜像标签含义&#34;&gt;镜像标签含义&lt;/h1&gt;
&lt;p&gt;首先，来看一个MSDN的镜像的文件名：
&lt;code&gt;cn_windows_10_business_edition_version_1809_updated_april_2019_x64_dvd_1194d215.iso&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cn&lt;/code&gt; : 很明显，这个代表了语言。一般是两位字母。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;windows_10&lt;/code&gt; : 产品名字，如&lt;code&gt;windows_server_2019&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;business_edition&lt;/code&gt;:产品版本，比如零售版、家庭版、专业版、企业版等，后面新出的windows 10简化为零售版和商业版。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updated_april_2019&lt;/code&gt;:版本的更新日期。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x64&lt;/code&gt;：产品架构。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dvd&lt;/code&gt;: 产品的储存介质。较老的产品有可能是cd。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1194d215&lt;/code&gt;: 这个是MSDN/Technet的镜像编号ID，唯一。
比较老的镜像可能还会有&lt;code&gt;VL&lt;/code&gt;标签，指明该镜像是批量版本镜像。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再来看一个从VLSC下载的文件名，VLSC的命名会相对更规范：
&lt;code&gt;SW_DVD9_Win_Pro_10_22H2.3_64BIT_English_Pro_Ent_EDU_N_MLF_X23-36994.ISO&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SW&lt;/code&gt;: Software的缩写，一般从VLSC下载的ISO镜像均包含该标签，识别“VL”版比较快捷的方法。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DVD9&lt;/code&gt;：根据镜像大小不同，也有DVD5，DVD5的单层DVD，最大容量4.7G，DVD9是双层DVD，最大容量8.5G。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Win_Pro_10_22H2.3:&lt;/code&gt; 产品和更新版本，22H2的第三个版本，不过多叙述。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;64BIT&lt;/code&gt;: 产品架构，还有32BIT和64ARM版本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;English&lt;/code&gt;:产品语言。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pro_Ent_EDU_N&lt;/code&gt;: 产品的版本，此处表示该ISO包含专业版（Pro）、企业版（Ent）、教育版（Edu），并且是欧洲N版（阉割了部分自带组件，反垄断）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MLF&lt;/code&gt;: Microsoft Licensing Fulfillment的缩写。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X23-36994&lt;/code&gt;: 该标签为光盘制品编号，微软在2018年10月后停止了提供VLSC的物理DVD光盘制品，但保留了该命名方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;PS：一个冷笑话：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;../images/msburn.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;附录&#34;&gt;附录&lt;/h1&gt;
&lt;p&gt;MSDN：&lt;a href=&#34;https://visualstudio.microsoft.com/zh-hans/msdn-platforms/&#34;&gt;https://visualstudio.microsoft.com/zh-hans/msdn-platforms/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;VLSC：&lt;a href=&#34;https://www.microsoft.com/licensing/servicecenter/default.aspx&#34;&gt;https://www.microsoft.com/licensing/servicecenter/default.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2018年VLSC目录（2018之后微软不再为VLSC提供物理DVD）： &lt;a href=&#34;https://download.microsoft.com/download/3/C/C/3CCD4756-7E5A-463C-AD50-E8C3F40F7C4C/20181010_VLSC_DL_Catalog.xls&#34;&gt;https://download.microsoft.com/download/3/C/C/3CCD4756-7E5A-463C-AD50-E8C3F40F7C4C/20181010_VLSC_DL_Catalog.xls&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>KMS激活Windows/Office使用指南</title>
      <link>https://www.ttz.pw/post/kms/</link>
      <pubDate>Tue, 14 Mar 2023 22:59:35 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/kms/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#1-%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97&#34;&gt;1. 使用指南&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#11-windows%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e6%bf%80%e6%b4%bb&#34;&gt;1.1. Windows操作系统激活&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#111-%e6%9f%a5%e8%af%a2%e5%bd%93%e5%89%8d%e6%bf%80%e6%b4%bb%e4%bf%a1%e6%81%af%e7%b3%bb%e7%bb%9f%e7%89%88%e6%9c%ac%e7%a1%ae%e4%bf%9d%e6%98%af%e6%94%af%e6%8c%81kms%e7%9a%84%e7%89%88%e6%9c%ac&#34;&gt;1.1.1. 查询当前激活信息/系统版本（确保是支持KMS的版本）：&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#112-%e8%ae%be%e7%bd%aekms%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%9c%b0%e5%9d%80&#34;&gt;1.1.2. 设置KMS服务器地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#113-%e6%89%8b%e5%8a%a8%e6%89%a7%e8%a1%8c%e6%bf%80%e6%b4%bb%e8%af%b7%e6%b1%82kms%e6%9c%8d%e5%8a%a1%e6%ad%a3%e5%b8%b8%e7%9a%84%e8%af%9d%e6%89%8b%e5%8a%a8%e7%82%b9%e7%ab%8b%e5%8d%b3%e6%bf%80%e6%b4%bb%e4%b8%80%e6%a0%b7%e6%95%88%e6%9e%9c%e4%b8%8d%e7%82%b9%e8%bf%87%e4%b8%80%e6%ae%b5%e6%97%b6%e9%97%b4%e4%b9%9f%e4%bc%9a%e8%87%aa%e5%b7%b1%e8%af%b7%e6%b1%82&#34;&gt;1.1.3. 手动执行激活请求(KMS服务正常的话，手动点立即激活一样效果，不点过一段时间也会自己请求)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#114-%e6%9f%a5%e8%af%a2%e8%bf%87%e6%9c%9f%e6%97%b6%e9%97%b4&#34;&gt;1.1.4. 查询过期时间&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#12-office%e6%bf%80%e6%b4%bb&#34;&gt;1.2. Office激活&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#121-%e7%89%88%e6%9c%ac%e8%bd%ac%e6%8d%a2&#34;&gt;1.2.1. 版本转换&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#13-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e5%92%8c%e6%95%85%e9%9a%9c%e9%80%9f%e6%9f%a5&#34;&gt;1.3. 常见问题和故障速查&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#14-%e6%89%b9%e5%a4%84%e7%90%86%e7%bc%96%e5%86%99%e6%8c%87%e5%8d%97&#34;&gt;1.4. 批处理编写指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/kms/#%e4%bb%80%e4%b9%88%e6%98%afkms%e8%b7%9f%e5%85%b6%e4%bb%96%e6%bf%80%e6%b4%bb%e6%96%b9%e5%bc%8f%e6%9c%89%e4%bb%80%e4%b9%88%e4%b8%8d%e5%90%8c&#34;&gt;什么是KMS？跟其他激活方式有什么不同？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;1-使用指南&#34;&gt;1. 使用指南&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;KMS激活服务，slmgr命令激活Windows系统、Office,以下操作需使用&lt;code&gt;管理员&lt;/code&gt;权限的CMD命令执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/&#34;&gt;全部GVLK KEY速查&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;details admonition warning&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-exclamation-triangle fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;官网GVLK连接&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;&lt;a href=&#34;https://learn.microsoft.com/zh-cn/windows-server/get-started/kms-client-activation-keys#generic-volume-license-keys-gvlk&#34;&gt;Windows/Server&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://learn.microsoft.com/zh-cn/previous-versions/office/office-2010/ee624355%28v=office.14%29?redirectedfrom=MSDN&#34;&gt;office2010&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://technet.microsoft.com/ZH-CN/library/dn385360.aspx&#34;&gt;office2013(官网已撤)&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://learn.microsoft.com/zh-cn/DeployOffice/vlactivation/gvlks?redirectedfrom=MSDN&#34;&gt;office2016/2019/2021&lt;/a&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h2 id=&#34;11-windows操作系统激活&#34;&gt;1.1. Windows操作系统激活&lt;/h2&gt;
&lt;div class=&#34;details admonition tip&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-lightbulb fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;操作提示&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;以下操作均假设你使用管理员权限的命令行CMD，使用VL版本的Office&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;h3 id=&#34;111-查询当前激活信息系统版本确保是支持kms的版本&#34;&gt;1.1.1. 查询当前激活信息/系统版本（确保是支持KMS的版本）：&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ttz.pw/post/iso-meaning/&#34;&gt;解读微软ISO镜像文件名含义&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;slmgr /dlv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装对应GVLK密钥（如果是从VLSC下载VL版本已经内置，不需要安装）&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;注:VL版本的镜像文件名是SW_DVD开头。MSDN下的是测试版本不是VL版本。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;slmgr /ipk xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;112-设置kms服务器地址&#34;&gt;1.1.2. 设置KMS服务器地址&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;slmgr /skms kms.ttz.pw
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;113-手动执行激活请求kms服务正常的话手动点立即激活一样效果不点过一段时间也会自己请求&#34;&gt;1.1.3. 手动执行激活请求(KMS服务正常的话，手动点立即激活一样效果，不点过一段时间也会自己请求)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;slmgr /ato
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;114-查询过期时间&#34;&gt;1.1.4. 查询过期时间&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;slmgr /xpr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更多命令可以输入&lt;code&gt;slmgr&lt;/code&gt;后回车查看。&lt;/p&gt;
&lt;h2 id=&#34;12-office激活&#34;&gt;1.2. Office激活&lt;/h2&gt;
&lt;div class=&#34;details admonition tip&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-lightbulb fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;操作提示&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;以下操作均假设你使用管理员权限的命令行CMD，使用VL版本的Office&lt;br&gt;
&lt;em&gt;注:非VL版本的Office可以通过添加转换VL证书来使用KMS，但不推荐以下命令均cd到OSPP.VBS所在文件夹操作或者省略前面的路径。&lt;/em&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;安装指南&lt;/strong&gt;：&lt;a href=&#34;https://www.ttz.pw/post/dowload-vloffice/&#34;&gt;安装最新VL版office快捷指南&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;首先找到你的OSPP.VBS所在的目录，一般是office安装所在目录（Program Files\Microsoft Office\OfficeXX），找不到的建议安装一个Everything或者使用windows自带的文件搜索框搜索一下，把OSPP.VBS拖到运行对话框即可快速获取文件路径以便复制。&lt;/p&gt;
&lt;p&gt;设置KMS服务器地址：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;cscript ospp.vbs /sethst:kms.ttz.pw
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;手动执行激活请求(KMS服务正常的话，打开任意office组件也会自动请求激活)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;cscript ospp.vbs /act
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果提示看到successful的字样，那么就是激活成功了。 更多命令可以输入&lt;code&gt;cscript ospp.vbs&lt;/code&gt;后回车查看。&lt;/p&gt;
&lt;h3 id=&#34;121-版本转换&#34;&gt;1.2.1. 版本转换&lt;/h3&gt;
&lt;p&gt;批量版本的商业镜像文件是SW_开头的ISO。对于Win10 1703+或者对应Server，你可以直接更换对应的GVLK KEY来更改系统的版本。但很多版本在发行的时候其实内置的证书不全，更改KEY会提示非核心版本，比如一些出厂安装了家庭版的笔记本，缺了个远程桌面功能，想改成专业版或者企业版，是不是只能重装呢？其实可以添加补全证书即可转换。这个方法也适用于转换其他奇奇怪怪的版本，比如EnterpriseG。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;找到一台目标版本的电脑或者镜像，把&lt;code&gt;\Windows\System32\spp\tokens\skus&lt;/code&gt;文件夹复制出来。&lt;/li&gt;
&lt;li&gt;把上面的文件夹覆盖到要转换的系统的相同位置，补全许可证。&lt;/li&gt;
&lt;li&gt;执行命令安装许可证：&lt;code&gt;slmgr /rilc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;执行命令安装对应版本的GVLK&lt;a href=&#34;https://www.ttz.pw/post/gvlk/&#34;&gt;【GVLK 速查】&lt;/a&gt;：&lt;code&gt;slmgr /ipk xxxxx-xxxxx-xxxxx-xxxxx-xxxxx&lt;/code&gt;，转换完成。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Office也可以通过添加许可证来“转换”版本，但不推荐这么干，因为重装Office比重装系统简单，一来你可能在Office里面看到多个许可证一个激活一个没激活非常强迫症，二来这样干有可能会出现“你的许可证不是正版，你可能是盗版软件的受害者？”的弹窗（虽然不影响使用，果然office比windows赚钱啊）。因此，建议直接安装使用VL版本的office。安装最新VL版office快捷指南&lt;/p&gt;
&lt;h2 id=&#34;13-常见问题和故障速查&#34;&gt;1.3. 常见问题和故障速查&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 你的系统/Office是否是批量许可证VL版本？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不是的话，可以参考上一节“版本转换”。&lt;a href=&#34;https://www.ttz.pw/post/dowload-vloffice/&#34;&gt;安装最新VL版office快捷指南&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Mac版本的office需要KMS？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mac版本的批量版本office不需要KMS激活，只需运行微软提供的&lt;code&gt;SWDVD5_Office_Mac_Serializer_*.ISO&lt;/code&gt;（相当于激活补丁，十几MB）安装即可激活。由于该文件微软提供给每个客户HASH其实都是一样的，可自行网上搜索该文件安装。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 是否以管理员权限运行CMD？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不是的话，可以开始菜单搜索CMD，然后右键管理员运行。&lt;code&gt;0x80070005&lt;/code&gt;错误一般是你没用管理员权限运行CMD。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 提示非核心版本运行？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ttz.pw/post/gvlk/&#34;&gt;【GVLK 速查】&lt;/a&gt;参考上一节“版本转换”。此外，没有GVLK的产品不被KMS正式支持（如Windows 7旗舰版），无法激活任何评估版本镜像的产品。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 提示0xC004F074软件授权服务报告无法激活计算机，无法联系任何密钥管理服务（KMS）no kms could be contacted&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个报错分两种情况，出现这个报错的底层原因是无法连接到KMS服务器，首先，有可能是你的KMS服务器挂了或者你的网络挂了导致无法连接，这个情况你可以使用&lt;code&gt;vlmcs kms.ttz.pw&lt;/code&gt;来测试KMS服务器是否有正常返回(successful)。
其次，KMS服务器和网络都正常的话，那就是可能你之前使用了一些第三方KMS激活工具，把系统的软件服务激活劫持了，无论你设置什么KMS地址都会劫持到本地去，这种情况可能没什么比较通用的解决方法，可以用下面的方法尝试检查下注册表的劫持项，不行就重开吧：&lt;/p&gt;
&lt;p&gt;打开注册表&lt;code&gt;HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options &lt;/code&gt;定位到(如果有)&lt;code&gt;SppExtComObj.exe&lt;/code&gt;，&lt;code&gt;sppsvc.exe&lt;/code&gt;，&lt;code&gt;osppsvc.exe&lt;/code&gt;，删除这些项。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注：你可以在&lt;a href=&#34;https://github.com/kkkgo/vlmcsd/releases&#34;&gt;这里&lt;/a&gt;下载到  vlmcs工具&lt;br&gt;
PS:你可能在&lt;a href=&#34;https://www.coolhub.top/tech-articles/kms_list.html&#34;&gt;这里&lt;/a&gt;能找到一些测试的KMS模拟服务器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;6. 无法激活Windows 7&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;品牌整机可能包含SLIC信息，进而无法激活Windows 7专业版。请使用Windows7 企业版，或者使用其他SLIC激活工具。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. KMS服务器可以远程控制客户端吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不能。KMS服务器唯一能控制的是可以远程下发激活请求的时间间隔策略（但可以被本机策略覆盖），可以收集到客户端计算机名、产品版本、硬件HASH、IP地址等激活必须信息，但无法控制任何电脑，请不要误解“利用你组织的服务方式激活”的意思。&lt;/p&gt;
&lt;p&gt;**8. KMS最多只能用180天吗？ **&lt;/p&gt;
&lt;p&gt;180天是常规KMS的最大宽限期，KMS在宽限期内会自动定期连接服务器自动续期（默认间隔7天，最大不超过30天），连续180天续期失败激活才会失败。详细可见KMS如何工作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其他问题可以根据出错代码找原因。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;14-批处理编写指南&#34;&gt;1.4. 批处理编写指南&lt;/h2&gt;
&lt;p&gt;以激活windows为例，使用&lt;code&gt;cscript.exe //nologo&lt;/code&gt;可以在命令行内输出。替换&lt;code&gt;kms.ttz.pw&lt;/code&gt;为你的KMS服务器地址，替换&lt;code&gt;XXXXX-XXXXX-XXXXX-XXXXX-XXXXX&lt;/code&gt;为你的&lt;code&gt;GVLK KEY&lt;/code&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;kmsserver&lt;/span&gt;=kms.ttz.pw
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;:&lt;span style=&#34;color:#6272a4&#34;&gt;: Get Administrator Rights&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;_Args&lt;/span&gt;=&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%~1&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;NEQ&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;_Args&lt;/span&gt;=&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%_Args:&amp;#34;=%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;fltmc &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul || (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;cd&lt;/span&gt; /d &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%~dp0&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;  cmd /u /c echo Set UAC = CreateObject&lt;span style=&#34;color:#f1fa8c&#34;&gt;^(&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;Shell.Application&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;^)&lt;/span&gt; : UAC.ShellExecute &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;cmd.exe&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/k cd &amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%~dp0&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;#34; &amp;amp;&amp;amp; &amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%~dpnx0&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;#34; &amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%_Args%&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;runas&amp;#34;&lt;/span&gt;, 1 &amp;gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%temp%&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;\GetAdmin.vbs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%temp%&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;\GetAdmin.vbs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;del&lt;/span&gt; /f /q &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%temp%&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;\GetAdmin.vbs&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#ff79c6&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\cscript.exe //nologo &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\slmgr.vbs /rilc &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;reg add &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\Software Protection Platform&amp;#34;&lt;/span&gt; /v NoGenTicket /t REG_DWORD /d 1 /f &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\cscript.exe //nologo &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\slmgr.vbs /act-type 0 &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\cscript.exe //nologo &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\slmgr.vbs /ckhc &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\cscript.exe //nologo &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\slmgr.vbs  /ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\cscript.exe //nologo &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\slmgr.vbs /skms &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%kmsserver%&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;echo&lt;/span&gt; Trying to activate...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\cscript.exe //nologo &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\slmgr.vbs /ato
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&lt;/span&gt;&lt;span&gt;reg delete &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\55c92734-d682-4d71-983e-d6ec3f16059f&amp;#34;&lt;/span&gt; /f &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&lt;/span&gt;&lt;span&gt;(&lt;span style=&#34;color:#ff79c6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;/f&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;delims=&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;%%&lt;/span&gt;d &lt;span style=&#34;color:#ff79c6&#34;&gt;in&lt;/span&gt; (&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;reg query hku&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#ff79c6&#34;&gt;do&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&lt;/span&gt;&lt;span&gt;    reg delete &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;%%&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;d\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\55c92734-d682-4d71-983e-d6ec3f16059f&amp;#34;&lt;/span&gt; /f &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;&amp;gt;nul &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt;&amp;gt;nul
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&lt;/span&gt;&lt;span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\cscript.exe //nologo &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;%windir%&lt;/span&gt;\System32\slmgr.vbs  /xpr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;echo&lt;/span&gt; KMS Activate Script Action Complete.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29&lt;/span&gt;&lt;span&gt;timeout 8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;什么是kms跟其他激活方式有什么不同&#34;&gt;什么是KMS？跟其他激活方式有什么不同？&lt;/h2&gt;
&lt;p&gt;KMS是密钥管理服务（Key Management Server），是自从Windows Vista后微软开始使用的一种大型组织中的批量激活技术。在没有这个技术的XP时代，大批量的激活都使用VLK（Volume License Key）激活，因此只要把一些泄露的VLK密钥（比如某某PC制造商、某某银行、某某单位的密钥）抄下来，你就可以随便安装其他电脑上。因此在XP的时代，盗版就没有激活的问题，一个镜像一个序列号走天下，Ghost XP也是满大街。同时期的Office 2007也是静态的序列号，都不需要联网验证随便装。 为了杜绝激活毫无存在感这种尴尬的情况，从Windows Vista开始，常见的激活方式分成了以下几种：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;方式&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;适用系统/软件&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;使用条件&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;零售Key&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;对应的零售产品（Retail）&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;你能买到的DVD/数字版的正版产品，或者其他代理商渠道的零售Key，既然是买正版当然能用啦！需要联网验证，或者找客服电话激活&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;SLIC OEM&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;制造商在BIOS中添加SLIC信息，适用于win7等较旧的系统，当然也有Server在用的比如Server 2022依然有SLIC激活&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;BIOS中有完整SLIC表（有些电脑出厂带了个空表，没啥用还妨碍用KMS）、有对应OEM厂商的证书和OEM产品密钥（这个是不变的）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;数字权利&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;仅适用于部分有OEM SLP密钥的Windows10+系统/不能用于Server&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;使用正版Windows7等产品升级或者其他永久激活的渠道（比如商店买的、随机附带的、用了有效的密钥等）联网同步硬件信息后，使用对应的数字权利key即可在同一台电脑上重装联网激活（比如经典的3V66T）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;KMS&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;对应的批量授权产品（Volume），或者可以被转换证书的产品&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;·对于Win10 1703+之前的系统，需要安装专业版或者企业版（Server对应批量版），并且BIOS中不含SLIC信息（或者企业版）。&lt;br /&gt;  ·Win10 1703+的系统使用对应的GVLK即可，只要系统中证书不缺或者补上证书，会自动转换产品。 &lt;br /&gt; · Office可以通过转换安装证书来使用，但建议安装批量版本。 &lt;br /&gt; ·最少180天内要成功连接一次KMS服务器，否则激活失效。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;批量多次密钥MAK&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;对应的批量授权产品（Volume），与KMS适用范围一样&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;与KMS一样用于批量激活，但是永久激活&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;虽然激活方式很多花样，但只要是使用正规渠道激活的，都是正版产品。因此“KMS”并不是很多小白理解的“盗版”、“病毒”，而是微软提供一种批量激活方式。那为什么会有这个印象呢？因为针对上面的几种激活方式，都有各自的盗版利用方式，而KMS成了较为通用的一种。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;首先，对于零售key，这个没什么好利用方式，开发者测试账户订阅倒卖的key或者去电脑城偷拍了未激活笔记本的key吧。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于批量多次密钥MAK，这个也没什么好说的，网上经常有泄露出来的MAK密钥，可用激活次数比较多但也不是无限，运气好的话可能蹲到一个能用，次数用完了可用电话渠道激活尝试，属于是可遇不可求的方式。可以用工具PidKeyTool来检测密钥有效性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于SLIC，修改BIOS加入SLIC表，或者修改引导程序加载SLIC到内存中（所以可以看到有些Win7电脑开机有个Grub4dos一闪而过），用对应的证书和key即可激活（这个不难找，可以直接搜索SLIC证书合集），但对于office没啥用，并且现在win10也用不了，另外修改BIOS有风险，在UEFI引导中加载SLIC也稍微复杂一点（可以用Clover/OpenCore等程序）。SLIC也有不同版本，比如最初的vista是2.0，win7是用的比较多的2.1，win8开始就用不了，但Server还有在用，比如SLIC2.6激活Server2022，SLIC版本向下兼容。一句话简单来说SLIC适用范围有限，盗版需要修改BIOS或者引导，操作复杂。
题外话：你可能在这里能找到SLIC信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数字权利是在Win10刚出来的时候，给Win7升级免费升级到win10搞出来的东西，正常来说你需要有一个正版的win7或者win8等系统，然后升级，程序会收集你电脑的硬件信息和密钥，生成一个“门票”提交给微软服务器，以后联网微软就可以判断硬件信息是否对的上就能激活。当然你使用零售的key或者MAK等永久激活的方式都可以获取数字权利，要是你的key来源不怎么干净，这就相当于偷渡洗白了，下次重装还能用，哈哈。office没有数字权利，不过有效的key可以绑定到自己的微软账户，类似于steam兑换码。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那这个数字权利怎么被盗版方便地利用呢？在这个免费升级的过程中，有个gatherosstate.exe，他检查当前系统已经有效永久激活的话，他就收集硬件信息和密钥等生成一个“GenuineTicket.xml”门票，发送给微软服务器，微软认可这个“门票”之后我们就可以使用数字权利了。而关键在于这个gatherosstate.exe，通过魔改的gatherosstate.exe，可以忽略一切条件不管你有没有激活在什么系统下，直接生成门票，然后使用clipup安装门票即可。理论上微软可以轻松筛选出这些使用不正常方法生成的“门票”，但微软没有这么做，毕竟收入最大来源并不是普通用户，况且Windows现在也不怎么赚钱了。这个方法的缺点也很明显，需要联网提交信息给微软，需要运行魔改版的gatherosstate，因此还需要关闭自带的Windows Defender杀毒，需要一个个手动操作，当然能一劳永逸也是个选择。常见工具有HWIDGEN等。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;最后就是KMS激活了。KMS需要一台Windows服务器上安装批量激活服务，添加对应的KMS KEY，达到一定条件后客户端就可以通过自动发现或者手动输入KMS服务器地址进行激活。关键就在于这个服务器，经过国外大神们的不断研究，开发了不少版本的KMS服务模拟器，相当于游戏的私服，很多激活工具集成了KMS模拟器，在本机通过虚拟网卡的形式弄了个虚拟局域网给本机激活，又或者通过注册表劫持服务的形式让所有激活请求都劫持到本地。很多小白就是用的这种激活工具，因为他通用，简单，但又容易被坏坏的人往里面加木马病毒广告。基于这些工具要么运行在后台要么要劫持服务，这里很不推荐使用任何KMS工具。当然你自己搭建一个KMS模拟器或者使用别人的公网模拟器的话，就比较干净一点，只要你是手动输入命令行应用KMS的话，想使用其他激活方式直接更换密钥即可，无任何影响，后文再细说。使用KMS激活会定期向服务器请求激活信息，如果超过最大180天的宽限期联系不上服务器，激活就会失效。平时看到那么多的“未激活的Windows”估计是工具激活之后把后台都杀掉了。Enterprise G（G是Gov的G，神州网信的特供版）版本使用KMS可以激活宽限400年（但会自动应用一些组策略）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;近年还有一种“KMS38”的激活方式，他并不是属于微软的正常渠道的激活方式，原理是利用了上面的数字权利程序，正常来说KMS最大宽限期只有180天，但gatherosstate.exe生成门票的时候可以继承剩余的KMS日期，bug就来了，我们可以欺骗他把日期修改到2038年，所以他叫做KMS38。这个过程甚至不需要发送门票给微软，完全离线。至于为什么是2038年？因为在有符号32位整数时间戳里面2038是最大值，就像千年虫一样，详细可以搜索“2038年问题”。
使用KMS激活理论上微软可以很轻松识别出盗版，模拟器的返回的报文很多地方都很假，比如很多模拟器用的KMS host Hardware ID都是同一套，或者ePID(KMS host extended PID)很假，又或者他可以激活任意不存在的产品……当然微软也是不怎么管了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;题外话：你可能在这里能找到EnterpriseG的激活脚本。&lt;/p&gt;
&lt;/blockquote&gt;</description>
      
    </item>
    
    <item>
      <title>安装Hugo</title>
      <link>https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/</link>
      <pubDate>Thu, 06 Oct 2022 22:30:48 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b&#34;&gt;快速开始&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#%e5%ae%89%e8%a3%85hugo&#34;&gt;安装Hugo&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#1-%e4%ba%8c%e8%bf%9b%e5%88%b6%e5%ae%89%e8%a3%85%e6%8e%a8%e8%8d%90%e7%ae%80%e5%8d%95%e5%bf%ab%e9%80%9f&#34;&gt;1. 二进制安装（推荐：简单、快速）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#2-%e6%ba%90%e7%a0%81%e5%ae%89%e8%a3%85&#34;&gt;2. 源码安装&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#%e7%94%9f%e6%88%90%e7%ab%99%e7%82%b9&#34;&gt;生成站点&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#%e5%88%9b%e5%bb%ba%e6%96%87%e7%ab%a0&#34;&gt;创建文章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#%e5%ae%89%e8%a3%85%e7%9a%ae%e8%82%a4&#34;&gt;安装皮肤&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#%e8%bf%90%e8%a1%8chugo&#34;&gt;运行Hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/%E5%AE%89%E8%A3%85hugo/#%e9%83%a8%e7%bd%b2&#34;&gt;部署&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;快速开始&#34;&gt;快速开始&lt;/h1&gt;
&lt;h2 id=&#34;安装hugo&#34;&gt;安装Hugo&lt;/h2&gt;
&lt;h3 id=&#34;1-二进制安装推荐简单快速&#34;&gt;1. 二进制安装（推荐：简单、快速）&lt;/h3&gt;
&lt;p&gt;到 &lt;a href=&#34;https://github.com/spf13/hugo/releases&#34;&gt;Hugo Releases&lt;/a&gt; 下载对应的操作系统版本的Hugo二进制文件（hugo或者hugo.exe）&lt;/p&gt;
&lt;p&gt;Mac下直接使用&lt;code&gt;Homebrew&lt;/code&gt;安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;brew install hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-源码安装&#34;&gt;2. 源码安装&lt;/h3&gt;
&lt;p&gt;源码编译安装，首先安装好依赖的工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://git-scm.com/&#34;&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mercurial.selenic.com/&#34;&gt;Mercurial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://golang.org/&#34;&gt;Go&lt;/a&gt; 1.3+ (Go 1.4+ on Windows)
设置好&lt;code&gt;GOPATH&lt;/code&gt;环境变量，获取源码并编译：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;GOPATH&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;$HOME&lt;/span&gt;/go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;$ go get -v github.com/spf13/hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;源码会下载到 &lt;code&gt;$GOPATH/src&lt;/code&gt; 目录，二进制在&lt;code&gt;$GOPATH/bin/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果需要更新所有Hugo的依赖库，增加&lt;code&gt;-u&lt;/code&gt;参数：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ go get -u -v github.com/spf13/hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;生成站点&#34;&gt;生成站点&lt;/h2&gt;
&lt;p&gt;使用Hugo快速生成站点，比如希望生成到 /path/to/site 路径：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ hugo new site /path/to/site
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样就在&lt;code&gt;/path/to/site&lt;/code&gt;目录里生成了初始站点，进去目录：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;cd&lt;/span&gt; /path/to/site
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;站点目录结构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;  ▸ archetypes/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;  ▸ content/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;  ▸ layouts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;  ▸ static/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;    config.toml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;创建文章&#34;&gt;创建文章&lt;/h2&gt;
&lt;p&gt;创建一个 about 页面：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;hugo new about.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;about.md&lt;/code&gt; 自动生成到了&lt;code&gt;content/about.md&lt;/code&gt;，打开&lt;code&gt;about.md&lt;/code&gt;看下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;+++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;date&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;2015-10-25T08:36:54-07:00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;draft&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;title&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;about&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;+++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;正文内容
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;内容是&lt;code&gt;Markdown&lt;/code&gt;格式的，&lt;code&gt;+++&lt;/code&gt;之间的内容是 &lt;a href=&#34;https://github.com/toml-lang/toml&#34;&gt;TOML&lt;/a&gt; 格式的，根据你的喜好，你可以换成 &lt;a href=&#34;http://www.yaml.org/&#34;&gt;YAML&lt;/a&gt; 格式（使用 &lt;code&gt;---&lt;/code&gt; 标记）或者 &lt;a href=&#34;http://www.yaml.org/&#34;&gt;JSON&lt;/a&gt; 格式。&lt;/p&gt;
&lt;p&gt;创建第一篇文章，放到&lt;code&gt;post&lt;/code&gt;目录，方便之后生成聚合页面。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;hugo new post/first.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开编辑&lt;code&gt;post/first.md&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;date: &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;2015-10-25T08:36:54-07:00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;title: &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;first&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;### Hello Hugo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt; 1. aaa
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt; 1. bbb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt; 1. ccc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;安装皮肤&#34;&gt;安装皮肤&lt;/h2&gt;
&lt;p&gt;到 &lt;a href=&#34;https://www.gohugo.org/theme/&#34;&gt;皮肤列表&lt;/a&gt; 挑选一个心仪的皮肤，比如你觉得 &lt;code&gt;Hyde&lt;/code&gt; 皮肤不错，找到相关的 &lt;code&gt;GitHub&lt;/code&gt; 地址，创建目录 &lt;code&gt;themes&lt;/code&gt;，在 &lt;code&gt;themes&lt;/code&gt; 目录里把皮肤 &lt;code&gt;git clone&lt;/code&gt; 下来：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# 创建 themes 目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;$ &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;cd&lt;/span&gt; themes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;$ git clone https://github.com/spf13/hyde.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;运行hugo&#34;&gt;运行Hugo&lt;/h2&gt;
&lt;p&gt;在你的站点根目录执行 &lt;code&gt;Hugo&lt;/code&gt; 命令进行调试：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ hugo server --theme&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;hyde --buildDrafts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（注明：v0.15 版本之后，不再需要使用 &amp;ndash;watch 参数了）&lt;/p&gt;
&lt;p&gt;浏览器里打开： &lt;code&gt;http://localhost:1313&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;部署&#34;&gt;部署&lt;/h2&gt;
&lt;p&gt;假设你需要部署在 &lt;code&gt;GitHub Pages&lt;/code&gt; 上，首先在GitHub上创建一个Repository，命名为：&lt;code&gt;xzeu.github.io&lt;/code&gt;（xzeu替换为你的github用户名）。&lt;/p&gt;
&lt;p&gt;在站点根目录执行 &lt;code&gt;Hugo&lt;/code&gt; 命令生成最终页面：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ hugo --theme&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;hyde --baseUrl&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;http://xzeu.github.io/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（注意，以上命令并不会生成草稿页面，如果未生成任何文章，请去掉文章头部的 &lt;code&gt;draft=true&lt;/code&gt; 再重新生成。）&lt;/p&gt;
&lt;p&gt;如果一切顺利，所有静态页面都会生成到 &lt;code&gt;public&lt;/code&gt; 目录，将pubilc目录里所有文件 &lt;code&gt;push&lt;/code&gt; 到刚创建的Repository的 &lt;code&gt;master&lt;/code&gt; 分支。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;$ &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;cd&lt;/span&gt; public
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;$ git init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;$ git remote add origin https://github.com/xzeu/xzeu.github.io.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;$ git add -A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;$ git commit -m &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;first commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;$ git push -u origin master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;浏览器里访问：&lt;code&gt;http://xzeu.github.io/&lt;/code&gt;&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
