<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>Bob&#39;s blog</title>
        <subtitle>啊啊啊波罗</subtitle>
        <icon>https://www.keeponline.cn/assets/favicon.ico</icon>
        <link>https://www.keeponline.cn</link>
        <author>
          <name>Bob</name>
        </author>
        <description>ShokaX</description>
        <language>en</language>
        <pubDate>Sat, 16 Aug 2025 00:44:00 +0800</pubDate>
        <lastBuildDate>Sat, 16 Aug 2025 00:44:00 +0800</lastBuildDate>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2025/08/16/%E9%9F%B3%E9%A2%91%E6%96%87%E4%BB%B6%E5%A4%84%E7%90%86/</guid>
            <title>音频文件处理</title>
            <link>https://www.keeponline.cn/2025/08/16/%E9%9F%B3%E9%A2%91%E6%96%87%E4%BB%B6%E5%A4%84%E7%90%86/</link>
            <category term="Python" scheme="https://www.keeponline.cn/categories/Python/" />
            <category term="Linux" scheme="https://www.keeponline.cn/tags/Linux/" />
            <pubDate>Sat, 16 Aug 2025 00:44:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;最近有个朋友找我帮忙处理一些音频文件，他目前主要遇到困难如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;提取左声道&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所有音频文件仅需要左声道即可，目前他们用的软件一次性只能处理 2000 个音频文件，但是他们目前一天需要处理的音频文件至少百万起步&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;识别没有声音的音频文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;目前需要人工将提取好的左声道音频文件丢进软件中过滤掉没有声音的音频文件&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;过滤无意义音频文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;目前需要人工过滤掉没有意义的音频文件，例如自动回复、语音助手等&lt;/p&gt;
&lt;p&gt;听完他的描述后，我也想尝试一下，虽然自己以前没有接触过这些东西，但是大概的处理思路还是有的，借助 AI 问题不大，于是我叫他发我一些音频样本试试&lt;/p&gt;
&lt;h1 id=&#34;音频声道提取&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#音频声道提取&#34;&gt;#&lt;/a&gt; 音频声道提取&lt;/h1&gt;
&lt;p&gt;音频声道提取主要是用 &lt;code&gt;FFmpeg&lt;/code&gt;  这个开源的多媒体音视频处理软件，配合脚本实现批量提取&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/bin/bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 检查 FFmpeg 是否可用&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-v&lt;/span&gt; ffmpeg &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&gt;&lt;/span&gt; /dev/null&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[31m错误: FFmpeg 未安装或未添加到系统路径&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[33m请使用以下命令安装: sudo apt install ffmpeg&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;按回车键退出...&#34;&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 设置日期格式的目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;folderName&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; +&lt;span class=&#34;token string&#34;&gt;&#34;%Y%m%d&#34;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;mp3Path&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;/tmp/mp3&#34;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# 根据实际路径修改&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;rootDir&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$mp3Path&lt;/span&gt;/&lt;span class=&#34;token variable&#34;&gt;$folderName&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;sourcePath&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$rootDir&lt;/span&gt;/source&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;leftChannelPath&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$rootDir&lt;/span&gt;/leftChannel&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建输出目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$rootDir&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;目录已存在: &lt;span class=&#34;token variable&#34;&gt;$rootDir&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$sourcePath&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$leftChannelPath&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;已创建目录: &lt;span class=&#34;token variable&#34;&gt;$rootDir&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 获取所有 MP3 文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;mp3Files&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;token assign-left variable&#34;&gt;&lt;span class=&#34;token environment constant&#34;&gt;IFS&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;$&#39;&lt;span class=&#34;token entity&#34; title=&#34;\0&#34;&gt;\0&lt;/span&gt;&#39;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;mp3Files&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$file&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$mp3Path&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-maxdepth&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-iname&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;*.mp3&#34;&lt;/span&gt; -print0&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;totalFiles&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;&lt;span class=&#34;token operator&#34;&gt;#&lt;/span&gt;mp3Files&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$totalFiles&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[33m在 &lt;span class=&#34;token variable&#34;&gt;$mp3Path&lt;/span&gt; 中未找到MP3文件&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;按回车键退出...&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[36m开始处理 &lt;span class=&#34;token variable&#34;&gt;$totalFiles&lt;/span&gt; 个文件...&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 计数器&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;processed&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;successCount&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;movedCount&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;mp3Files&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;processed&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;processed &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;percentage&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;processed &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt; totalFiles&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;basename&lt;/span&gt; -- &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$file&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;basename&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;filename&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;.*&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;outputFile&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$leftChannelPath&lt;/span&gt;/&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;basename&amp;#125;&lt;/span&gt;_LEFT.mp3&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;56&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 显示进度&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;57&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ne&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\r&#34;&gt;\r&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[K处理中: &lt;span class=&#34;token variable&#34;&gt;$processed&lt;/span&gt;/&lt;span class=&#34;token variable&#34;&gt;$totalFiles&lt;/span&gt; (&lt;span class=&#34;token variable&#34;&gt;$percentage&lt;/span&gt;%) - &lt;span class=&#34;token variable&#34;&gt;$filename&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;58&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;59&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 执行 FFmpeg 命令&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;60&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ffmpeg &lt;span class=&#34;token parameter variable&#34;&gt;-hide_banner&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ignore_unknown&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$file&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;61&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;           &lt;span class=&#34;token parameter variable&#34;&gt;-af&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;pan=mono|c0=FL&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;62&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;           &lt;span class=&#34;token parameter variable&#34;&gt;-c:a&lt;/span&gt; libmp3lame &lt;span class=&#34;token parameter variable&#34;&gt;-q:a&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;63&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;           &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$outputFile&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;64&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;           &lt;span class=&#34;token parameter variable&#34;&gt;-loglevel&lt;/span&gt; warning &lt;span class=&#34;token parameter variable&#34;&gt;-y&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&lt;span class=&#34;token file-descriptor important&#34;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;/dev/null&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;65&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;66&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$?&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;67&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\r&#34;&gt;\r&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[K&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[32m[成功] &lt;span class=&#34;token variable&#34;&gt;$filename&lt;/span&gt; -&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;basename&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$outputFile&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;68&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token assign-left variable&#34;&gt;successCount&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;successCount &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;69&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;70&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 移动源文件到 source 目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;71&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token assign-left variable&#34;&gt;destination&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$sourcePath&lt;/span&gt;/&lt;span class=&#34;token variable&#34;&gt;$filename&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;72&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$file&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$destination&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;73&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;74&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$destination&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;75&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[36m[移动] &lt;span class=&#34;token variable&#34;&gt;$filename&lt;/span&gt; -&gt; source&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;76&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token assign-left variable&#34;&gt;movedCount&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;movedCount &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;77&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;78&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[33m[警告] 移动失败: &lt;span class=&#34;token variable&#34;&gt;$filename&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;79&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;80&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;81&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\r&#34;&gt;\r&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[K&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[31m[失败] &lt;span class=&#34;token variable&#34;&gt;$filename&lt;/span&gt; (错误代码: &lt;span class=&#34;token variable&#34;&gt;$?&lt;/span&gt;)&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;82&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;83&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;84&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;85&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[36m所有文件处理完成！&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;86&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[36m输出目录: &lt;span class=&#34;token variable&#34;&gt;$leftChannelPath&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;87&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[36m源文件归档: &lt;span class=&#34;token variable&#34;&gt;$sourcePath&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;88&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[32m成功提取: &lt;span class=&#34;token variable&#34;&gt;$successCount&lt;/span&gt;/&lt;span class=&#34;token variable&#34;&gt;$totalFiles&lt;/span&gt; 个文件&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;89&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[36m成功移动: &lt;span class=&#34;token variable&#34;&gt;$movedCount&lt;/span&gt;/&lt;span class=&#34;token variable&#34;&gt;$totalFiles&lt;/span&gt; 个源文件&lt;span class=&#34;token entity&#34; title=&#34;\033&#34;&gt;\033&lt;/span&gt;[0m&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;90&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;read&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;按回车键退出...&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;执行结果:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1523.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;识别无声音频&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#识别无声音频&#34;&gt;#&lt;/a&gt; 识别无声音频&lt;/h1&gt;
&lt;p&gt;识别没有声音的音频，主要是用 &lt;code&gt;librosa&lt;/code&gt;  这个库，并且借助 &lt;code&gt;matplotlib&lt;/code&gt;  生成波形图，以便于查看&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;figcaption data-lang=&#34;python&#34;&gt;&lt;span&gt;n&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; os&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; argparse&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; numpy &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; np&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; librosa&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; shutil&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; csv&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; tqdm &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; tqdm&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; datetime&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; matplotlib&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;pyplot &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; plt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; ssl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; urllib&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;request&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 禁用 SSL 证书验证&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;ssl&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;_create_default_https_context &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; ssl&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;_create_unverified_context&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;analyze_audio&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; silence_threshold&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.001&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; max_peak&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.005&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token triple-quoted-string string&#34;&gt;&#34;&#34;&#34;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    更可靠的静音检测方法：使用绝对振幅阈值&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &#34;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 读取音频文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        y&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; sr &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; librosa&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;load&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; sr&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; mono&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        duration &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; librosa&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;get_duration&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; sr&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;sr&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 计算整体 RMS 振幅（非分贝）&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        rms &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; np&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sqrt&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;np&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;mean&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token operator&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 计算最大峰值振幅&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        peak &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; np&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;np&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;abs&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 计算静音帧比例&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        frame_length &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;sr &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0.1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# 100ms 帧&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        hop_length &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; frame_length &lt;span class=&#34;token operator&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        rms_frames &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; librosa&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;feature&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;rms&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; frame_length&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;frame_length&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; hop_length&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;hop_length&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 计算低于静音阈值的帧比例&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        silent_frames &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; frame_rms &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; rms_frames &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; frame_rms &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; silence_threshold&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        silent_ratio &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; silent_frames &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;rms_frames&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;rms_frames&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1.0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 判定是否为静音文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        is_silent &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;False&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 条件 1: 整体 RMS 振幅非常低&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; rms &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; silence_threshold &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            is_silent &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 条件 2: 最大峰值振幅非常低&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;elif&lt;/span&gt; peak &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; max_peak &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            is_silent &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 条件 3: 静音帧比例非常高&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;elif&lt;/span&gt; silent_ratio &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0.95&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;and&lt;/span&gt; rms &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; silence_threshold&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            is_silent &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 生成波形图&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;figure&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;figsize&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        time_axis &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; np&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;linspace&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; duration&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;56&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;plot&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;time_axis&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; y&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; alpha&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.6&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; label&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;波形&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;57&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;58&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 添加阈值线&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;59&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;axhline&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;silence_threshold&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; color&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;green&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; linestyle&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;--&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; label&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#39;静音阈值 (&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;silence_threshold&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;)&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;60&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;axhline&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;silence_threshold&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; color&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;green&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; linestyle&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;--&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;61&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;axhline&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;max_peak&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; color&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;red&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; linestyle&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;--&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; label&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#39;峰值阈值 (&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;max_peak&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;)&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;62&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;axhline&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;y&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;max_peak&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; color&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;red&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; linestyle&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;--&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;63&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;64&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;音频分析: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;\n状态: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;静音&#39;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; is_silent &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;有效&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;65&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;xlabel&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;时间 (秒)&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;66&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ylabel&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;振幅&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;67&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;legend&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;loc&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;upper right&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;68&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;grid&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; alpha&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.3&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;69&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;70&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 保存波形图&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;71&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        waveform_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;splitext&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;_analysis.png&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;72&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;savefig&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;waveform_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dpi&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; bbox_inches&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;tight&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;73&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        plt&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;close&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;74&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;75&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;76&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;filename&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;77&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;filepath&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; audio_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;78&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;duration&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; duration&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;79&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;rms&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;rms&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;80&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;peak&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;peak&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;81&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;silent_ratio&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;silent_ratio&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;82&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;waveform_path&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; waveform_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;83&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;is_silent&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; is_silent&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;84&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;status&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;SILENT&#34;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; is_silent &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;ACTIVE&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;85&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;error&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;None&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;86&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;87&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;except&lt;/span&gt; Exception &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; e&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;88&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;89&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;filename&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;90&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;filepath&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; audio_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;91&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;duration&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;92&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;rms&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;93&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;peak&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;94&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;silent_ratio&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;95&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;waveform_path&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;96&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;is_silent&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;97&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;status&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;ERROR: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;98&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token string&#34;&gt;&#34;error&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;99&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;100&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;101&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;detect_silent_files&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;input_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; output_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; silence_threshold&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.001&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; max_peak&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.005&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;102&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token triple-quoted-string string&#34;&gt;&#34;&#34;&#34;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;103&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    可靠的静音检测与分类&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;104&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &#34;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;105&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 创建输出目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;106&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    silent_dir &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;output_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;silent&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;107&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    active_dir &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;output_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;active&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;108&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    review_dir &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;output_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;review&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;109&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;110&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;makedirs&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;silent_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; exist_ok&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;111&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;makedirs&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;active_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; exist_ok&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;112&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;makedirs&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;review_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; exist_ok&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;113&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;114&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 获取所有音频文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;115&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    audio_files &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;116&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;listdir&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;input_dir&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;117&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;lower&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;endswith&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;.mp3&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;.wav&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;.flac&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;.ogg&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;.m4a&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;118&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            audio_files&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;append&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;input_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;119&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;120&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;在目录 &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;input_dir&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; 中找到 &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_files&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; 个音频文件&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;121&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;使用参数: 静音阈值=&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;silence_threshold&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;, 峰值阈值=&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;max_peak&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;122&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;123&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 创建报告文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;124&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    timestamp &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; datetime&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;datetime&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;now&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;strftime&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;%Y%m%d_%H%M%S&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;125&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    report_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;output_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;静音检测报告_&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;timestamp&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;.csv&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;126&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;127&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 打开 CSV 报告文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;128&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;report_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;w&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; newline&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; encoding&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;utf-8&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; csvfile&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;129&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        fieldnames &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;文件名&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;原始路径&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;时长(秒)&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;RMS振幅&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;峰值振幅&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;130&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                     &lt;span class=&#34;token string&#34;&gt;&#39;静音帧比例(%)&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;状态&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;目标路径&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;波形图路径&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;131&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        writer &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; csv&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;DictWriter&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;csvfile&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; fieldnames&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;fieldnames&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;132&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        writer&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;writeheader&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;133&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;134&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 处理每个文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;135&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        silent_count &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;136&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        active_count &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;137&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        review_count &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;138&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;139&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; file_path &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; tqdm&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_files&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; desc&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;分析音频文件&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;140&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            result &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; analyze_audio&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; silence_threshold&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; max_peak&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;141&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            dest_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;142&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;143&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token keyword&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;144&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;status&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;SILENT&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;145&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    &lt;span class=&#34;token comment&#34;&gt;# 移动静音文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;146&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    dest_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;silent_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;147&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    shutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;move&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;148&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    silent_count &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;149&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token keyword&#34;&gt;elif&lt;/span&gt; result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;status&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;ACTIVE&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;150&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    &lt;span class=&#34;token comment&#34;&gt;# 移动非静音文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;151&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    dest_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;active_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;152&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    shutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;move&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;153&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    active_count &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;154&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;155&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    &lt;span class=&#34;token comment&#34;&gt;# 错误文件移动到 review 目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;156&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    dest_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;review_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;157&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    shutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;move&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;158&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                    review_count &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;159&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token keyword&#34;&gt;except&lt;/span&gt; Exception &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; e&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;160&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token comment&#34;&gt;# 错误文件移动到 review 目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;161&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                dest_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;review_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;162&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                shutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;move&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;163&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;error&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;移动失败: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;164&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;status&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;ERROR: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;165&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                review_count &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;166&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;167&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token comment&#34;&gt;# 写入报告行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;168&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            writer&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;writerow&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;169&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;文件名&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;filename&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;170&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;原始路径&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;filepath&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;171&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;时长(秒)&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;duration&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token format-spec&#34;&gt;.2f&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;172&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;RMS振幅&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;rms&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token format-spec&#34;&gt;.6f&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;173&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;峰值振幅&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;peak&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token format-spec&#34;&gt;.6f&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;174&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;静音帧比例(%)&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;silent_ratio&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token format-spec&#34;&gt;.1f&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;175&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;状态&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;status&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;176&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;目标路径&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; dest_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;177&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token string&#34;&gt;&#39;波形图路径&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; result&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;waveform_path&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;178&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;179&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;180&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 生成统计报告&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;181&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    total_files &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_files&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;182&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    summary &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;\n静音检测完成!\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;183&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;总文件数: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;total_files&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;184&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;静音文件: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;silent_count&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; (&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;silent_count&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;total_files&lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token format-spec&#34;&gt;.1f&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;%)\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;185&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;有效音频: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;active_count&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; (&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;active_count&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;total_files&lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token format-spec&#34;&gt;.1f&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;%)\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;186&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;需要复查: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;review_count&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; (&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;review_count&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;total_files&lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token format-spec&#34;&gt;.1f&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;%)\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;187&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;\n文件已分类移动到:\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;188&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;静音文件: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;silent_dir&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;189&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;有效音频: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;active_dir&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;190&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;需要复查: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;review_dir&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;\n&#34;&lt;/span&gt;&lt;/span&gt; \&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;191&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;              &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;\n详细报告已保存到: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;report_path&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;192&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;193&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 保存统计报告&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;194&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    summary_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;output_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;统计报告_&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;timestamp&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;.txt&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;195&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;summary_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;w&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; encoding&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;utf-8&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; f&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;196&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        f&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;write&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;summary&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;197&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;198&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;summary&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;199&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;统计报告已保存到: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;summary_path&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;200&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;201&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; __name__ &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;__main__&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;202&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    parser &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; argparse&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ArgumentParser&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;description&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;可靠静音检测工具 (基于振幅阈值)&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;203&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    parser&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;add_argument&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;input_dir&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;包含音频文件的输入目录&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;204&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    parser&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;add_argument&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;output_dir&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;保存分类结果的输出目录&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;205&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    parser&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;add_argument&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;--silence_threshold&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; default&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.001&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;206&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                        &lt;span class=&#34;token builtin&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;静音检测阈值 (默认: 0.001)&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;207&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    parser&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;add_argument&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;--max_peak&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; default&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.005&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;208&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                        &lt;span class=&#34;token builtin&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;最大峰值阈值 (默认: 0.005)&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;209&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;210&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    args &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; parser&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;parse_args&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;211&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;212&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 运行检测&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;213&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    detect_silent_files&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;214&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        input_dir&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;args&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;input_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;215&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        output_dir&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;args&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;output_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;216&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        silence_threshold&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;args&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;silence_threshold&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;217&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        max_peak&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;args&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;max_peak&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;218&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;执行结果:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1525.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;识别助手音频&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#识别助手音频&#34;&gt;#&lt;/a&gt; 识别助手音频&lt;/h1&gt;
&lt;p&gt;识别语音助手的话，我第一时间想到的是将语音转换成文本文件，然后再通过关键字匹配，这里主要用到的是&lt;br /&gt;
 &lt;code&gt;PaddleSpeech&lt;/code&gt;  这个开源项目，代码如下:&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;figcaption data-lang=&#34;python&#34;&gt;&lt;span&gt;n&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; os&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; sys&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; glob&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; shutil&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; tempfile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; concurrent&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;futures &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; ThreadPoolExecutor&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; as_completed&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; pydub &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; AudioSegment&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; paddlespeech&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;cli&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;asr&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;infer &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; ASRExecutor&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 定义 AI 语音常见关键词&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;AI_KEYWORDS &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token string&#34;&gt;&#34;助手&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;无法接通&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;留言&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;智能&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;助理&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;您拨打的&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token string&#34;&gt;&#34;通话中&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;无法接听&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;挂断&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 配置参数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;DEST_DIR &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;/home/bob/AI_Voice&#34;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# 默认 AI 语音存储目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;MAX_WORKERS &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;4&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# 线程池大小，根据 CPU 核心数调整&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;convert_mp3_to_wav&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token triple-quoted-string string&#34;&gt;&#34;&#34;&#34;将MP3转换为临时WAV文件&#34;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    temp_file &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; tempfile&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;NamedTemporaryFile&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;suffix&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;.wav&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; delete&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    temp_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; temp_file&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;name&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    temp_file&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;close&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    audio &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; AudioSegment&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;from_mp3&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    audio &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; audio&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;set_frame_rate&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;16000&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;set_channels&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    audio&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;export&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;temp_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;wav&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; temp_path&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;detect_ai_voice_by_keywords&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; asr_executor&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token triple-quoted-string string&#34;&gt;&#34;&#34;&#34;使用PaddleSpeech API识别语音并检测AI关键词&#34;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wav_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; convert_mp3_to_wav&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        text &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; asr_executor&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio_file&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;wav_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; lang&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;zh&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;识别的文本: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;text&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; keyword &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; AI_KEYWORDS&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; keyword &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; text&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; text&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; text&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;except&lt;/span&gt; Exception &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; e&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;处理出错: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;finally&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exists&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;wav_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;unlink&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;wav_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;move_file&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;src_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token triple-quoted-string string&#34;&gt;&#34;&#34;&#34;移动文件到目标目录并添加元数据&#34;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;makedirs&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;dest_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; exist_ok&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;56&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    filename &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;src_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;57&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    dest_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;dest_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; filename&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;58&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;59&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;60&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        shutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;move&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;src_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;61&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;已移动文件到: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;dest_path&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;62&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;63&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;except&lt;/span&gt; Exception &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; e&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;64&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;移动文件失败: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;65&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;False&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;66&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;67&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;process_file&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; asr_executor&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;68&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token triple-quoted-string string&#34;&gt;&#34;&#34;&#34;处理单个文件并移动AI语音文件&#34;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;69&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;\n处理文件: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;basename&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_file&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;70&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;71&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    is_ai&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; text &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; detect_ai_voice_by_keywords&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; asr_executor&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;72&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;73&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; is_ai&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;74&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;  &gt;&gt; 检测到AI语音&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;75&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; move_file&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;76&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;检测到AI语音并已移动&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;77&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;78&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;检测到AI语音但移动失败&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;79&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;80&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;  &gt;&gt; 未检测到AI语音&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;81&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;未检测到AI语音&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;82&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;83&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;process_directory&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_dir&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;84&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token triple-quoted-string string&#34;&gt;&#34;&#34;&#34;多线程处理目录下的所有MP3文件&#34;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;85&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    mp3_files &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; glob&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;glob&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;join&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;*.mp3&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;86&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;not&lt;/span&gt; mp3_files&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;87&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;目录 &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; 中没有找到MP3文件&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;88&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;89&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;90&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;开始处理目录: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;91&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;找到 &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token builtin&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;mp3_files&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; 个MP3文件&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;92&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;93&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 统计结果&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;94&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ai_count &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;95&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    moved_count &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;96&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;97&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 创建线程池和 ASRExecutor 实例&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;98&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;with&lt;/span&gt; ThreadPoolExecutor&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;max_workers&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;MAX_WORKERS&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; executor&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;99&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 每个线程使用自己的 ASRExecutor 实例&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;100&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        futures &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;101&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; mp3_file &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; mp3_files&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;102&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token comment&#34;&gt;# 为每个任务创建新的 ASRExecutor 实例&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;103&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            asr_executor &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; ASRExecutor&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;104&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            future &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; executor&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;submit&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;process_file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; mp3_file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; asr_executor&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;105&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            futures&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;append&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;future&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;106&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;107&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 收集结果&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;108&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; future &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; as_completed&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;futures&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;109&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            moved&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; message &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; future&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;result&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;110&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; moved&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;111&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                ai_count &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;112&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                moved_count &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;113&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token keyword&#34;&gt;elif&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;检测到AI语音&#34;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; message&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;114&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;                ai_count &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;115&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;116&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; ai_count&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; moved_count&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;117&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;118&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;119&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;sys&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;argv&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;120&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;用法: python lessvoice.py &amp;lt;源文件或目录路径&gt; [目标目录]&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;121&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;示例: python lessvoice.py /home/bob/Documents/mp3/ &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;DEST_DIR&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;122&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        sys&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exit&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;123&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;124&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    source_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; sys&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;argv&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;125&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    dest_dir &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; sys&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;argv&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token builtin&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;sys&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;argv&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; DEST_DIR&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;126&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;makedirs&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;dest_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; exist_ok&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;127&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;AI语音将保存到: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;dest_dir&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;128&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;129&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;isfile&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;130&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 处理单个文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;131&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        asr_executor &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; ASRExecutor&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;132&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        result&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; message &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; process_file&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_dir&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; asr_executor&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;133&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;message&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;134&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;elif&lt;/span&gt; os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;isdir&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;135&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token comment&#34;&gt;# 多线程处理目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;136&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        ai_count&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; moved_count &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; process_directory&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; dest_dir&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;137&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;\n处理完成! 共发现 &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;ai_count&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; 个有效语音文件，成功识别并移动 &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;moved_count&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; 个AI音频文件到 &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;dest_dir&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;138&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;139&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string-interpolation&#34;&gt;&lt;span class=&#34;token string&#34;&gt;f&#34;路径不存在或无效: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;source_path&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;140&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;141&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; __name__ &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;__main__&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;142&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    os&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;environ&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;PIP_BREAK_SYSTEM_PACKAGES&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;1&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;143&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    main&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;执行结果:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1527.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;从转换的文本结果来看，正确率应该在  &lt;code&gt;50%&lt;/code&gt;  左右，不过可以通过关键字识别，问题不大&lt;/p&gt;
&lt;p&gt;由于朋友提供的样本数量过少，我也只能做到从他给我的 11 个样本中按照他提出的要求进行测试，目前三个脚本执行的结果跟预期一样，应该可以满足他的要求&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2025/04/28/k8s%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/</guid>
            <title>k8s环境搭建</title>
            <link>https://www.keeponline.cn/2025/04/28/k8s%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/</link>
            <category term="Linux" scheme="https://www.keeponline.cn/categories/Linux/" />
            <category term="k8s" scheme="https://www.keeponline.cn/tags/k8s/" />
            <category term="kubernetes" scheme="https://www.keeponline.cn/tags/kubernetes/" />
            <pubDate>Mon, 28 Apr 2025 10:57:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1472.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最近想学一下 &lt;code&gt;k8s&lt;/code&gt; , 先把环境搭起来，后面再慢慢琢磨怎么玩&lt;/p&gt;
&lt;h1 id=&#34;环境介绍&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#环境介绍&#34;&gt;#&lt;/a&gt; 环境介绍&lt;/h1&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;th style=&#34;text-align:left&#34;&gt;IP 地址&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;ubuntu 24.04&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;k8s-master&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;a href=&#34;http://keeponline.cn&#34;&gt;keeponline.cn&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;192.168.80.150&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;containerd、kubeadm、kubectl、kubelet、Flannel&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;k8s 控制面板节点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;centos 9&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;k8s-node1&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;a href=&#34;http://keeponline.cn&#34;&gt;keeponline.cn&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;192.168.80.151&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;containerd、kubeadm、kubectl、kubelet&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;k8s 工作节点 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;debian 12&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;k8s-node2&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;a href=&#34;http://keeponline.cn&#34;&gt;keeponline.cn&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;192.168.80.152&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;containerd、kubeadm、kubectl、kubelet&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;k8s 工作节点 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;debian 12&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;k8s-registry&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;a href=&#34;http://keeponline.cn&#34;&gt;keeponline.cn&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;192.168.80.153&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;docker-ce、harbor&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;本地镜像仓库服务器&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1470.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果有自己的公网域名，请在云服务器上做对应主机的解析记录，并申请 &lt;code&gt;k8s-registry&lt;/code&gt;  域名的证书&lt;/p&gt;
&lt;p&gt;没有的话，请在各服务器本地 &lt;code&gt;hosts&lt;/code&gt;  文件手动添加对应主机的解析记录&lt;/p&gt;
&lt;h1 id=&#34;部署前配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#部署前配置&#34;&gt;#&lt;/a&gt; 部署前配置&lt;/h1&gt;
&lt;p&gt;在部署 &lt;code&gt;k8s&lt;/code&gt;  服务之前，我们需要对 &lt;code&gt;k8s-master&lt;/code&gt; 、 &lt;code&gt;k8s-node1&lt;/code&gt;  和 &lt;code&gt;k8s-nodee2&lt;/code&gt;  作一些部署前的配置和 &lt;code&gt;containerd&lt;/code&gt;  服务以及 &lt;code&gt;kubeadm&lt;/code&gt;  部署工具的安装，由于我的环境三台服务器都属于不同的 &lt;code&gt;linux发行版&lt;/code&gt; ，除了 &lt;code&gt;kubeadm&lt;/code&gt;  的部署命令有些区别之外，其它的命令基本上都是通用的&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;启用网络数据包转发，否则部分 CNI 组件无法正常工作&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 加载 br_netfilter 内核模块&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;br_netfilter&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/modules-load.d/k8s.conf&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 配置 sysctl 内核参数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;EOF&lt;span class=&#34;token bash punctuation&#34;&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/sysctl.d/k8s.conf&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.bridge.bridge-nf-call-ip6tables = 1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.bridge.bridge-nf-call-iptables = 1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.ipv4.ip_forward = 1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;EOF&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 应用 sysctl 配置&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sysctl&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;--system&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;禁用&lt;/strong&gt; &lt;code&gt;swap&lt;/code&gt;  分区，否则 &lt;code&gt;kubelet&lt;/code&gt;  无法正常工作&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sed&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;/swap/s/^/#/&#39;&lt;/span&gt; /etc/fstab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; swapoff &lt;span class=&#34;token parameter variable&#34;&gt;-a&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1473.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;div class=&#34;note warning&#34;&gt;
&lt;p&gt;经测试发现 &lt;code&gt;Debian12&lt;/code&gt;  通过注释 &lt;code&gt;fstab&lt;/code&gt;  文件重启后依然无法禁用 &lt;code&gt;swap&lt;/code&gt;  分区，需要额外操作&lt;/p&gt;
&lt;/div&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看当前挂载的 swap 分区&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;swapon&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#通过 systemd 禁用 swap 分区&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl mask dev-sda3.swap  &lt;span class=&#34;token comment&#34;&gt;# 替换为你的 swap 设备名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl daemon-reload&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1475.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;验证配置是否生效&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 检查 br_netfilter 模块是否加载&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;lsmod &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; br_netfilter&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 检查 sysctl 参数值&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sysctl&lt;/span&gt; net.bridge.bridge-nf-call-iptables &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;       net.bridge.bridge-nf-call-ip6tables &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;       net.ipv4.ip_forward&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 预期输出：    &lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.bridge.bridge-nf-call-iptables &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.bridge.bridge-nf-call-ip6tables &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.ipv4.ip_forward &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看 swap 挂载分区&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;swapon&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# 正常情况下应该没有任何输出&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1474.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;部署containerd&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#部署containerd&#34;&gt;#&lt;/a&gt; 部署 containerd&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;containerd&lt;/code&gt;  是目前 &lt;code&gt;k8s&lt;/code&gt;  官方所推荐的容器运行时，当然你也可以使用 &lt;code&gt;Docker&lt;/code&gt; ，但不在本文章中讨论&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装 containerd&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;从  &lt;code&gt;https://github.com/containerd/containerd/releases&lt;/code&gt;  下载最新版本的 &lt;code&gt;containerd&lt;/code&gt;  二进制文件&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1476.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;解压文件到 /usr/local&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo tar Cxzvf /usr/local containerd-2.1.0-rc.1-linux-amd64.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;创建 systemd 服务&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建 system 目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; /usr/local/lib/systemd/system&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建 containerd 服务&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;EOF&lt;span class=&#34;token bash punctuation&#34;&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /usr/local/lib/systemd/system/containerd.service &lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;[Unit]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Description=containerd container runtime&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Documentation=https://containerd.io&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;After=network.target dbus.service&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;[Service]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;ExecStartPre=-/sbin/modprobe overlay&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;ExecStart=/usr/local/bin/containerd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Type=notify&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Delegate=yes&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;KillMode=process&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Restart=always&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;RestartSec=5&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;LimitNPROC=infinity&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;LimitCORE=infinity&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;TasksMax=infinity&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;OOMScoreAdjust=-999&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;[Install]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;WantedBy=multi-user.target&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;EOF&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 设置开机自启动&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl daemon-reload&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&#34;token builtin class-name&#34;&gt;enable&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;--now&lt;/span&gt; containerd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;生成 containerd 配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建 containerd 配置目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; /etc/containerd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 生成 containerd 配置文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;containerd config default &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/containerd/config.toml&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 更改 puase 镜像的仓库地址为本地镜像仓库，将 “k8s-registry.keeponline.cn/k8s” 替换成你的仓库地址&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sed&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;s|registry.k8s.io|k8s-registry.keeponline.cn/k8s|g&#39;&lt;/span&gt; /etc/containerd/config.toml&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 重启 containerd 服务&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl restart containerd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;除了 &lt;code&gt;containerd&lt;/code&gt;  之外，我们还需要安装 &lt;code&gt;runc&lt;/code&gt;  和 &lt;code&gt;CNI插件&lt;/code&gt; ，这两个程序的安装比较简单，就不多说了&lt;/p&gt;
&lt;h3 id=&#34;部署runc&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#部署runc&#34;&gt;#&lt;/a&gt; 部署 runc&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;下载 runc&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;从  &lt;code&gt;https://github.com/opencontainers/runc/releases&lt;/code&gt;  下载最新版本的二进制文件&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1477.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;安装 runc&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo install -m 755 runc.amd64 /usr/local/sbin/runc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;部署cni组件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#部署cni组件&#34;&gt;#&lt;/a&gt; 部署 CNI 组件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;下载 CNI 二进制文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;从  &lt;code&gt;https://github.com/containernetworking/plugins/releases&lt;/code&gt;  下载对应系统架构的二进制文件&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1478.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;创建 CNI 目录&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo mkdir -p /opt/cni/bin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;解压文件到 CNI 目录&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.7.1.tgz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;到此，containerd 相关的配置便完成了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;部署kubeadm&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#部署kubeadm&#34;&gt;#&lt;/a&gt; 部署 kubeadm&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;k8s&lt;/code&gt;  的部署方式五花八门，看得我有点眼花缭乱，最终选择官方推荐的 &lt;code&gt;kubeadm&lt;/code&gt;  工具部署&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu/Debian: 安装方式:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;apt&lt;/span&gt; update&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;apt-get&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-y&lt;/span&gt; apt-transport-https ca-certificates &lt;span class=&#34;token function&#34;&gt;curl&lt;/span&gt; gpg&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 2. 下载用于 Kubernetes 软件包仓库的公共签名密钥，在低于 Debian 12 和 Ubuntu 22.04 的发行版本中，/etc/apt/keyrings 默认不存在。 应在 curl 命令之前创建它。&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# sudo mkdir -p -m 755 /etc/apt/keyrings&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;curl&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-fsSL&lt;/span&gt; https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; gpg &lt;span class=&#34;token parameter variable&#34;&gt;--dearmor&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-o&lt;/span&gt; /etc/apt/keyrings/kubernetes-apt-keyring.gpg&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 3. 添加 Kubernetes apt 仓库&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/kubernetes.list&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 4. 更新 apt 包索引，安装 kubelet、kubeadm 和 kubectl，并锁定其版本&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;apt&lt;/span&gt; update&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;apt&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-y&lt;/span&gt; kubelet kubeadm kubectl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; apt-mark hold kubelet kubeadm kubectl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;CentOS/RedHat: 安装方式:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 1. 禁用 SELinux&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; setenforce &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sed&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;s/^SELINUX=enforcing$/SELINUX=permissive/&#39;&lt;/span&gt; /etc/selinux/config&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 2. 添加 Kubernetes 的 yum 仓库&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;EOF&lt;span class=&#34;token bash punctuation&#34;&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/yum.repos.d/kubernetes.repo&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;[kubernetes]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;name=Kubernetes&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;enabled=1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;gpgcheck=1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;EOF&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 3. 安装 kubelet、kubeadm 和 kubectl，并启用 kubelet 开机自启动&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; yum &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-y&lt;/span&gt; kubelet kubeadm kubectl &lt;span class=&#34;token parameter variable&#34;&gt;--disableexcludes&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;kubernetes&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&#34;token builtin class-name&#34;&gt;enable&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;--now&lt;/span&gt; kubelet&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;blockquote&gt;
&lt;p&gt;到此，k8s 相关的部署工具便安装完成了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;本地镜像仓库&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#本地镜像仓库&#34;&gt;#&lt;/a&gt; 本地镜像仓库&lt;/h1&gt;
&lt;p&gt;为了顺利部署 &lt;code&gt;k8s&lt;/code&gt;  集群服务，我们先在 &lt;code&gt;k8s-registry&lt;/code&gt;  这台服务器上安装  &lt;code&gt;docker-ce&lt;/code&gt;  和  &lt;code&gt;harbor&lt;/code&gt;  镜像仓库服务&lt;/p&gt;
&lt;p&gt;因为众所周知的原因，目前国内的网络无法正常访问 &lt;code&gt;k8s&lt;/code&gt;  的镜像仓库，所以我们需要借助第三方的镜像仓库地址获取 &lt;code&gt;k8s&lt;/code&gt;  所需要的镜像，并通过 &lt;code&gt;docker&lt;/code&gt;  推送到本地仓库，这样，我们的 &lt;code&gt;k8s&lt;/code&gt;  集群节点便可以通过本地仓库获取相对应的镜像文件了&lt;/p&gt;
&lt;h2 id=&#34;部署docker&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#部署docker&#34;&gt;#&lt;/a&gt; 部署 docker&lt;/h2&gt;
&lt;p&gt;安装 &lt;code&gt;docker-ce&lt;/code&gt;  服务，可以统一使用官方脚本安装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;curl -sL get.docker.com |sh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1479.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ubuntu&lt;/code&gt;  和 &lt;code&gt;debian&lt;/code&gt;  安装后会自动启动 &lt;code&gt;docker&lt;/code&gt;  服务并自动添加开机自启动， &lt;code&gt;centos&lt;/code&gt;  需要手动启动 &lt;code&gt;docker&lt;/code&gt;  服务&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo systemctl start docker &amp;amp;&amp;amp; sudo systemctl enable docker&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装完 &lt;code&gt;docker&lt;/code&gt;  之后，我们可以将 &lt;code&gt;docker&lt;/code&gt;  镜像仓库配置成我们本地自建的仓库地址 &lt;code&gt;(可选)&lt;/code&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建 docker 配置目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; /etc/docker&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 配置 docker 镜像源&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/docker/daemon.json &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;EOF&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&amp;#123;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &#34;registry-mirrors&#34;: [&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &#34;https://k8s-registry.keeponline.cn&#34;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  ]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&amp;#125;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;EOF&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 重新加载 docker 服务&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl daemon-reload&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl restart &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1480.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你不打算给仓库配置 ssl 证书的话，则配置 insecure-registries 指定允许访问 http 不安全站点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建 docker 配置目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; /etc/docker&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 配置 docker http 镜像源&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/docker/daemon.json &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;EOF&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&amp;#123;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &#34;insecure-registries&#34; : [&#34;192.168.80.153&#34;, &#34;k8s-registry.keeponline.cn&#34;]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  ]&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&amp;#125;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;EOF&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 重新加载 docker 服务&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl daemon-reload&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl restart &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;普通用户是没有权限使用 &lt;code&gt;docker&lt;/code&gt;  的命令，为了方便使用，我们可以把普通用户添加到 &lt;code&gt;docker&lt;/code&gt;  组中&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 添加用户 bob 到 docker 组&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;usermod&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-aG&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; bob  &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 初始化当前用户登陆环境&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;newgrp &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt;   &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看当前用户身份信息，确认是否拥有 docker 组权限&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt;		&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 预期输出：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;uid&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;bob&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token assign-left variable&#34;&gt;gid&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;996&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;docker&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token assign-left variable&#34;&gt;groups&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;996&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;docker&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,24&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;cdrom&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,25&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;floppy&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,29&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;audio&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,30&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;dip&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,44&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;video&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,46&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;plugdev&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,100&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;users&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,106&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;netdev&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;,1000&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;bob&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看 docker 版本，如果权限生效会显示 Server: Docker Engine 的信息，如果仅显示 CLient 信息则表示权限未生效&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; version&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 预期输出：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Client: Docker Engine - Community&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; Version:           &lt;span class=&#34;token number&#34;&gt;28.1&lt;/span&gt;.1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; API version:       &lt;span class=&#34;token number&#34;&gt;1.49&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; Go version:        go1.23.8&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; Git commit:        4eba377&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; Built:             Fri Apr &lt;span class=&#34;token number&#34;&gt;18&lt;/span&gt; 09:52:57 &lt;span class=&#34;token number&#34;&gt;2025&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; OS/Arch:           linux/amd64&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; Context:           default&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Server: Docker Engine - Community&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; Engine:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  Version:          &lt;span class=&#34;token number&#34;&gt;28.1&lt;/span&gt;.1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  API version:      &lt;span class=&#34;token number&#34;&gt;1.49&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;minimum version &lt;span class=&#34;token number&#34;&gt;1.24&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  Go version:       go1.23.8&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  Git commit:       01f442b&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  Built:            Fri Apr &lt;span class=&#34;token number&#34;&gt;18&lt;/span&gt; 09:52:57 &lt;span class=&#34;token number&#34;&gt;2025&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  OS/Arch:          linux/amd64&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  Experimental:     &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; containerd:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  Version:          &lt;span class=&#34;token number&#34;&gt;1.7&lt;/span&gt;.27&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4da&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; runc:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  Version:          &lt;span class=&#34;token number&#34;&gt;1.2&lt;/span&gt;.5&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  GitCommit:        v1.2.5-0-g59923ef&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; docker-init:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  Version:          &lt;span class=&#34;token number&#34;&gt;0.19&lt;/span&gt;.0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  GitCommit:        de40ad0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;部署harbor&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#部署harbor&#34;&gt;#&lt;/a&gt; 部署 harbor&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;下载 harbor 离线安装包&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;打开浏览器，访问 &lt;a href=&#34;https://github.com/goharbor/harbor/releases&#34;&gt;https://github.com/goharbor/harbor/releases&lt;/a&gt; 下载最新版本的 &lt;code&gt;harbor&lt;/code&gt;  离线安装包&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1481.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;解压文件&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tar zxvf harbor-offline-installer-v2.13.1-rc1.tgz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;安装 harbor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;切换到 &lt;code&gt;harbor&lt;/code&gt;  根目录复制一份 &lt;code&gt;harbor.yml&lt;/code&gt;  配置文件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cd harbor &amp;amp;&amp;amp; cp harbor.yml.tmpl harbor.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;更改 harbor.yml 配置信息，请查看注释信息，没有注释的地方可以保持默认&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;hostname: k8s-registry.keeponline.cn	&lt;span class=&#34;token comment&#34;&gt;# 仓库地址名称&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;http:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  port: &lt;span class=&#34;token number&#34;&gt;80&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;https:				&lt;span class=&#34;token comment&#34;&gt;# 如果没有申请 ssl 证书，请把 https 相关配置注释掉&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  port: &lt;span class=&#34;token number&#34;&gt;443&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  certificate: /home/bob/harbor/cert/keeponline.cn.pem	&lt;span class=&#34;token comment&#34;&gt;#证书路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  private_key: /home/bob/harbor/cert/keeponline.cn.key	&lt;span class=&#34;token comment&#34;&gt;#证书路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;harbor_admin_password: Harbor12345		&lt;span class=&#34;token comment&#34;&gt;# 仓库管理员默认登陆密码&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;database:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  password: root123						&lt;span class=&#34;token comment&#34;&gt;# 数据库默认密码&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  max_idle_conns: &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  max_open_conns: &lt;span class=&#34;token number&#34;&gt;900&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  conn_max_lifetime: 5m&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  conn_max_idle_time: &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;data_volume: /data&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;trivy:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  ignore_unfixed: &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  skip_update: &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  skip_java_db_update: &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  offline_scan: &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  security_check: vuln&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  insecure: &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  timeout: 5m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;jobservice:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  max_job_workers: &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  max_job_duration_hours: &lt;span class=&#34;token number&#34;&gt;24&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  job_loggers:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - STD_OUTPUT&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - FILE&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;notification:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  webhook_job_max_retry: &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;log:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  level: info&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  local:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    rotate_count: &lt;span class=&#34;token number&#34;&gt;50&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    rotate_size: 200M&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    location: /var/log/harbor&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;_version: &lt;span class=&#34;token number&#34;&gt;2.13&lt;/span&gt;.0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;proxy:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  http_proxy:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  https_proxy:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  no_proxy:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  components:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - core&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - jobservice&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - trivy&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;upload_purging:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  enabled: &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  age: 168h&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  interval: 24h&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  dryrun: &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;cache:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  enabled: &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  expire_hours: &lt;span class=&#34;token number&#34;&gt;24&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;安装 harbor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;配置完后，可直接执行目录下 &lt;code&gt;install.sh&lt;/code&gt;  脚本进行安装 (需要 &lt;code&gt;root&lt;/code&gt;  权限执行)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo ./install.sh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 预期输出：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;Step &lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;: starting Harbor &lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;+&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Running &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;/10&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Network harbor_harbor        Created                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;.0s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container harbor-log         Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;.3s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container harbor-portal      Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;.3s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container harbor-db          Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;.2s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container registry           Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;.7s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container redis              Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;.5s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container registryctl        Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;.8s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container harbor-core        Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;.0s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container harbor-jobservice  Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;.3s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; ✔ Container nginx              Started                                                                                                                                                                                                                                &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;.5s &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;✔ ----Harbor has been installed and started successfully.----&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;验证 harbor 是否能够正常访问&lt;br /&gt;
通过浏览器访问仓库地址&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1482.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;测试访问 &lt;code&gt;https&lt;/code&gt;  正常，证书正常&lt;/p&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;创建 k8s 项目&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;登陆 &lt;code&gt;harbor&lt;/code&gt; ，在 &lt;strong&gt;项目&lt;/strong&gt; 视图中点击 &lt;strong&gt;新建项目&lt;/strong&gt;，创建一个 &lt;code&gt;公开&lt;/code&gt; 的&lt;strong&gt; k8s 项目&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1483.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后续通过  &lt;code&gt;k8s-registry.keeponline.cn/k8s&lt;/code&gt;  这个地址便可以推送和拉取该项目的镜像文件&lt;/p&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;创建 systemd 服务（可选）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;创建一个 &lt;code&gt;systemd&lt;/code&gt;  服务方便后续的服务启动管理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo vi /etc/systemd/system/harbor.service&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;Unit&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;Harbor Container Registry&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;docker.service network.target&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;Requires&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;docker.service&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;oneshot&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;RemainAfterExit&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;yes&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;WorkingDirectory&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;/home/bob/harbor	&lt;span class=&#34;token comment&#34;&gt;# 填写你的 harbor 项目路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;/usr/bin/docker compose &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; /home/bob/harbor/docker-compose.yml up &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# docker-compose.yml 配置文件路径默认在 harbor 根目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;ExecStop&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;/usr/bin/docker compose &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; /home/bob/harbor/docker-compose.yml down   &lt;span class=&#34;token comment&#34;&gt;# 填写你的 docker-compose.yml 配置文件路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;TimeoutStartSec&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;multi-user.target&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;设置 &lt;code&gt;harbor&lt;/code&gt;  开机自启动&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo systemctl enable harbor&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;拉取和推送k8s相关镜像&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#拉取和推送k8s相关镜像&#34;&gt;#&lt;/a&gt; 拉取和推送 k8s 相关镜像&lt;/h2&gt;
&lt;p&gt;拉取 &lt;code&gt;k8s&lt;/code&gt;  相关镜像我们需要借助第三方的镜像网站&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;docker 登陆本地 harbor 仓库&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker login k8s-registry.keeponline.cn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bob@k8s-register:~$ &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; login k8s-registry.keeponline.cn&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Username: admin&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Password: &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;WARNING&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt; Your credentials are stored unencrypted &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;/home/bob/.docker/config.json&#39;&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Configure a credential helper to remove this warning. See&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;https://docs.docker.com/go/credential-store/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Login Succeeded&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;拉取并上传 k8s 相关镜像&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在已经安装 &lt;code&gt;kubeadm&lt;/code&gt;  的服务器上执行  &lt;code&gt;kubeadm config images list&lt;/code&gt;  可以获取当前 &lt;code&gt;k8s&lt;/code&gt;  版本所需要镜像文件和版本信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1485.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;得知需要的镜像文件和版本信息后，我们便可以在 &lt;code&gt;153&lt;/code&gt;  这台服务器上用 &lt;code&gt;docker&lt;/code&gt;  拉取和推送对应的镜像文件&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建一个镜像变量&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;images&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;kube-apiserver:v1.33.0 kube-controller-manager:v1.33.0 kube-scheduler:v1.33.0 kube-proxy:v1.33.0 coredns:v1.12.0 pause:3.10 etcd:3.5.21-0&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 拉取并推送镜像到本地仓库，请将 “k8s-registry.keeponline.cn/k8s” 换成你的仓库项目地址&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$images&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;coredns&#34;&lt;/span&gt;* &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/coredns/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/coredns/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; k8s-registry.keeponline.cn/k8s/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; push k8s-registry.keeponline.cn/k8s/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/coredns/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; k8s-registry.keeponline.cn/k8s/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; push k8s-registry.keeponline.cn/k8s/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/&lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1486.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;命令执行结束后，登陆 harbor 查看镜像是否成功推送&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1487.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;拉取 flannel 镜像&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本次 &lt;code&gt;k8s&lt;/code&gt;  环境中的 &lt;code&gt;pod&lt;/code&gt;  网络组件我选择的 &lt;code&gt;flannel&lt;/code&gt; ，如果你选择用其它的网络组件，可以略过该步骤&lt;/p&gt;
&lt;p&gt;&lt;code&gt;flannel&lt;/code&gt;  项目地址:&lt;a href=&#34;https://github.com/flannel-io/flannel#deploying-flannel-manually&#34;&gt;https://github.com/flannel-io/flannel#deploying-flannel-manually&lt;/a&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 下载 flannel 配置文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;wget&lt;/span&gt; https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 获取 flannel 镜像并推送到本地仓库&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;mapfile&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-t&lt;/span&gt; images &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; image kube-flannel.yml &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sort&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;awk&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&amp;#123;print $NF&amp;#125;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;image&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;images&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;token assign-left variable&#34;&gt;new_image&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;image&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;ghcr.io\&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;flannel-io\&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;k8s-registry.keeponline.cn&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;k8s&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; pull &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$image&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; tag &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$image&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$new_image&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; push &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$new_image&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;docker&lt;/span&gt; rmi &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$image&lt;/span&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1488.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1489.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;到此，k8s 集群所需的镜像就全部准备完毕了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;k8s集群部署&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#k8s集群部署&#34;&gt;#&lt;/a&gt; k8s 集群部署&lt;/h1&gt;
&lt;p&gt;所有的预备工作都完毕，接下来就可以愉快的部署 &lt;code&gt;k8s&lt;/code&gt;  集群了  &lt;code&gt;^_^&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;master节点部署&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#master节点部署&#34;&gt;#&lt;/a&gt; master 节点部署&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;k8s-master&lt;/code&gt;  这台服务器是本次 &lt;code&gt;k8s&lt;/code&gt;  集群环境的控制面板节点&lt;/p&gt;
&lt;p&gt;其主要作用如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;初始化集群，生成集群的全局唯一配置（如证书、kubeconfig 文件等）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部署控制平面组件（kube-apiserver、kube-scheduler、kube-controller-manager、etcd）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成供其他节点加入集群的 join token 和命令&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;初始化集群&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#初始化集群&#34;&gt;#&lt;/a&gt; 初始化集群&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;使用  &lt;code&gt;kubeadm&lt;/code&gt;  创建初始化配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubeadm config print init-defaults &amp;gt; kubeadm-init.yaml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;更改  &lt;code&gt;kubeadm-init.yaml&lt;/code&gt;  配置信息，更改注释的地址&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;apiVersion: kubeadm.k8s.io/v1beta4&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bootstrapTokens:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;- groups:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  - system:bootstrappers:kubeadm:default-node-token&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  token: abcdef.0123456789abcdef&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  ttl: 24h0m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  usages:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  - signing&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  - authentication&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;kind: InitConfiguration&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;localAPIEndpoint:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  advertiseAddress: &lt;span class=&#34;token number&#34;&gt;192.168&lt;/span&gt;.80.150		&lt;span class=&#34;token comment&#34;&gt;#API 服务地址，默认 master 地址&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  bindPort: &lt;span class=&#34;token number&#34;&gt;6443&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;nodeRegistration:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  criSocket: unix:///var/run/containerd/containerd.sock&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  imagePullPolicy: IfNotPresent&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  imagePullSerial: &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  name: k8s-master					&lt;span class=&#34;token comment&#34;&gt;# master 主机名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  taints: null&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;timeouts:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  controlPlaneComponentHealthCheck: 4m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  discovery: 5m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  etcdAPICall: 2m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  kubeletHealthCheck: 4m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  kubernetesAPICall: 1m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  tlsBootstrap: 5m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  upgradeManifests: 5m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;---&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;apiServer: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;apiVersion: kubeadm.k8s.io/v1beta4&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;caCertificateValidityPeriod: 87600h0m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;certificateValidityPeriod: 8760h0m0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;certificatesDir: /etc/kubernetes/pki&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;clusterName: kubernetes&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;controllerManager: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;dns: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;encryptionAlgorithm: RSA-2048&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;etcd:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  local:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    dataDir: /var/lib/etcd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;imageRepository: k8s-registry.keeponline.cn/k8s		&lt;span class=&#34;token comment&#34;&gt;# k8s 获取镜像仓库地址&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;kind: ClusterConfiguration&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;kubernetesVersion: &lt;span class=&#34;token number&#34;&gt;1.33&lt;/span&gt;.0					&lt;span class=&#34;token comment&#34;&gt;# k8s 版本&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;networking:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  dnsDomain: cluster.local					&lt;span class=&#34;token comment&#34;&gt;# 域&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  serviceSubnet: &lt;span class=&#34;token number&#34;&gt;10.96&lt;/span&gt;.0.0/12				&lt;span class=&#34;token comment&#34;&gt;# service 网络&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  podSubnet: &lt;span class=&#34;token number&#34;&gt;10.244&lt;/span&gt;.0.0/16					&lt;span class=&#34;token comment&#34;&gt;# pod 网络&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;proxy: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;scheduler: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;初始化集群&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo kubeadm init --config kubeadm-init.yaml --v=9&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看到下面输出则表示集群初始化成功&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1490.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;按照提示， 开始使用集群之前，需要运行以下命令，将 &lt;code&gt;k8s&lt;/code&gt;  的配置文件拷贝到家目录，否则无法调用相关命令&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; &lt;span class=&#34;token environment constant&#34;&gt;$HOME&lt;/span&gt;/.kube&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; /etc/kubernetes/admin.conf &lt;span class=&#34;token environment constant&#34;&gt;$HOME&lt;/span&gt;/.kube/config&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;chown&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-u&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-g&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token environment constant&#34;&gt;$HOME&lt;/span&gt;/.kube/config&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;还提到了我们应该在集群中部署一个 &lt;code&gt;pod的网络&lt;/code&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;You should now deploy a pod network to the cluster.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Run &lt;span class=&#34;token string&#34;&gt;&#34;kubectl apply -f [podnetwork].yaml&#34;&lt;/span&gt; with one of the options listed at:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  https://kubernetes.io/docs/concepts/cluster-administration/addons/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;最后还给出了其它工作节点加入集群的命令&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;kubeadm &lt;span class=&#34;token function&#34;&gt;join&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;192.168&lt;/span&gt;.80.150:6443 &lt;span class=&#34;token parameter variable&#34;&gt;--token&lt;/span&gt; abcdef.0123456789abcdef &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        --discovery-token-ca-cert-hash sha256:e97d2e31094891280fb06a8fa3812970b32691e1ee6e031baf48f641de781a6b&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;pod网络部署&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#pod网络部署&#34;&gt;#&lt;/a&gt; pod 网络部署&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pod&lt;/code&gt;  所需要的 &lt;code&gt;flannel&lt;/code&gt;  镜像文件我们在前面已经推送到本地仓库了，接下来部署就简单了&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下载 &lt;code&gt;flannel&lt;/code&gt;  配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;wget &lt;a href=&#34;https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml&#34;&gt;https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;修改配置文件中镜像为本地仓库地址&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;sed -i &#39;&lt;a href=&#34;http://s%7Cghcr.io/flannel-io%7Ck8s-registry.keeponline.cn/k8s%7Cg&#34;&gt;s|ghcr.io/flannel-io|k8s-registry.keeponline.cn/k8s|g&lt;/a&gt;&#39; kube-flannel.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;note warning&#34;&gt;
&lt;p&gt;需要注意的是，flannel 默认网段是 10.244.0.0/16, 如果你的 kubeadm-init.yaml 配置文件中的 podSubnet 不是这个网段，那么你还需要更改 kube-flannel.yml 配置文件中 Network 网段与你的 podSubnet 网段一致&lt;/p&gt;
&lt;/div&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;部署 flannel&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;kubectl apply -f kube-flannel.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;预期输出：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1491.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;验证 pod 和 node 状态是否有异常&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;kubectl get pods --all-namespaces    # 查看所有的 pod 状态是否 Running&lt;/li&gt;
&lt;li&gt;kubectl get nodes		 # 查看节点状态是否 Ready, 如果显示 NotReady 表示 pod 网络不正常&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;预期输出：&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1492.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;到此，master 节点部署完毕&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;加入集群&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#加入集群&#34;&gt;#&lt;/a&gt; 加入集群&lt;/h1&gt;
&lt;p&gt;接下来，登陆 &lt;code&gt;node1&lt;/code&gt;  和 &lt;code&gt;node2&lt;/code&gt;  把这两台服务器加入到该集群&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; kubeadm &lt;span class=&#34;token function&#34;&gt;join&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;192.168&lt;/span&gt;.80.150:6443 &lt;span class=&#34;token parameter variable&#34;&gt;--token&lt;/span&gt; abcdef.0123456789abcdef &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        --discovery-token-ca-cert-hash sha256:e97d2e31094891280fb06a8fa3812970b32691e1ee6e031baf48f641de781a6b&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;预期输出：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1496.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;回到 &lt;code&gt;master节&lt;/code&gt; 点查看 &lt;code&gt;nodes&lt;/code&gt;  和 &lt;code&gt;pods&lt;/code&gt;  状态信息是否正常，正常的话整个 &lt;code&gt;k8s&lt;/code&gt;  集群就部署好了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1497.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;排错&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#排错&#34;&gt;#&lt;/a&gt; 排错&lt;/h1&gt;
&lt;p&gt;部署中遇到的问题与解决方案&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;flannel&lt;/code&gt;  无法运行，查看日志提示 &lt;code&gt;Failed to check br_netfilter&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bob@k8s-master:~$ kubectl get pods &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; kube-flannel&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;NAME                    READY   STATUS             RESTARTS      AGE&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;kube-flannel-ds-2h8ph   &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;/1     Init:0/2           &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;             67s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;kube-flannel-ds-9fxvg   &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;/1     CrashLoopBackOff   &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;26s ago&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;   67s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;kube-flannel-ds-r6fdw   &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;/1     Init:0/2           &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;             67s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bob@k8s-master:~$ kubectl logs kube-flannel-ds-9fxvg &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; kube-flannel&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Defaulted container &lt;span class=&#34;token string&#34;&gt;&#34;kube-flannel&#34;&lt;/span&gt; out of: kube-flannel, install-cni-plugin &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;init&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;, install-cni &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;init&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;I0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:41.039019       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; main.go:211&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; CLI flags config: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;etcdEndpoints:http://127.0.0.1:4001,http://127.0.0.1:2379 etcdPrefix:/coreos.com/network etcdKeyfile: etcdCertfile: etcdCAFile: etcdUsername: etcdPassword: version:false kubeSubnetMgr:true kubeApiUrl: kubeAnnotationPrefix:flannel.alpha.coreos.com kubeConfigFile: iface:&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; ifaceRegex:&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; ipMasq:true ifaceCanReach: subnetFile:/run/flannel/subnet.env publicIP: publicIPv6: subnetLeaseRenewMargin:60 healthzIP:0.0.0.0 healthzPort:0 iptablesResyncSeconds:5 iptablesForwardRules:true netConfPath:/etc/kube-flannel/net-conf.json setNodeNetworkUnavailable:true&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;W0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:41.039270       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; client_config.go:618&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Neither &lt;span class=&#34;token parameter variable&#34;&gt;--kubeconfig&lt;/span&gt; nor &lt;span class=&#34;token parameter variable&#34;&gt;--master&lt;/span&gt; was specified.  Using the inClusterConfig.  This might not work.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;I0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:41.057944       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; kube.go:139&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Waiting 10m0s &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;node&lt;/span&gt; controller to &lt;span class=&#34;token function&#34;&gt;sync&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;I0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:41.058022       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; kube.go:469&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Starting kube subnet manager&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;I0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:42.058204       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; kube.go:146&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Node controller &lt;span class=&#34;token function&#34;&gt;sync&lt;/span&gt; successful&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;I0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:42.058273       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; main.go:231&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Created subnet manager: Kubernetes Subnet Manager - k8s-master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;I0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:42.058283       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; main.go:234&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Installing signal handlers&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;I0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:42.058680       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; main.go:468&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Found network config - Backend type: vxlan&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;E0507 &lt;span class=&#34;token number&#34;&gt;13&lt;/span&gt;:56:42.058789       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; main.go:268&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; Failed to check br_netfilter: &lt;span class=&#34;token function&#34;&gt;stat&lt;/span&gt; /proc/sys/net/bridge/bridge-nf-call-iptables: no such &lt;span class=&#34;token function&#34;&gt;file&lt;/span&gt; or directorylsm&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;原因分析：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;br_netfilter 内核模块未加载，导致 Flannel 无法配置网络策略&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置 net.bridge.bridge-nf-call-iptables 和 net.ipv4.ip_forward，加载 br_netfilter 模块并永久启用&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 加载 br_netfilter 内核模块&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;br_netfilter&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/modules-load.d/k8s.conf&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 配置 sysctl 内核参数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;EOF&lt;span class=&#34;token bash punctuation&#34;&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; /etc/sysctl.d/k8s.conf&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.bridge.bridge-nf-call-ip6tables = 1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.bridge.bridge-nf-call-iptables = 1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;net.ipv4.ip_forward = 1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;EOF&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 应用 sysctl 配置&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sysctl&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;--system&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;节点加入集群后，状态显示 &lt;code&gt;NotReady&lt;/code&gt; ，相关网络容器无法创建和初始化&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1494.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在工作节点上执行 &lt;code&gt;sudo journalctl -xeu kubelet |grep failed&lt;/code&gt;  查看相关报错信息根据报错进行相对应的处理&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1495.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 报错信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Failed to generate sandbox config &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; pod &lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. &lt;span class=&#34;token function&#34;&gt;open&lt;/span&gt; /run/systemd/resolve/resolv.conf: no such &lt;span class=&#34;token function&#34;&gt;file&lt;/span&gt; or directory&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;原因分析：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/run/systemd/resolve/resolv.conf&lt;/code&gt;  是由 &lt;code&gt;systemd-resolved&lt;/code&gt;  服务生成的  &lt;code&gt;DNS&lt;/code&gt;  配置文件路径，这两台工作节点并没有安装 &lt;code&gt;systemd-resolved&lt;/code&gt;  服务，所以没有这个配置文件&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方法：&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 通过 `ps` 查看 `kubelet` 的启动参数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bob@k8s-node2:~$ &lt;span class=&#34;token function&#34;&gt;ps&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ef&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; kubelet&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;root         &lt;span class=&#34;token number&#34;&gt;751&lt;/span&gt;       &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;  &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; 04:17 ?        00:00:17 /usr/bin/kubelet --bootstrap-kubeconfig&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;/etc/kubernetes/bootstrap-kubelet.conf &lt;span class=&#34;token parameter variable&#34;&gt;--kubeconfig&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;/etc/kubernetes/kubelet.conf &lt;span class=&#34;token parameter variable&#34;&gt;--config&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;/var/lib/kubelet/config.yaml --container-runtime-endpoint&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;unix:///var/run/containerd/containerd.sock --pod-infra-container-image&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;k8s-registry.keeponline.cn/k8s/pause:3.10&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bob          &lt;span class=&#34;token number&#34;&gt;947&lt;/span&gt;     &lt;span class=&#34;token number&#34;&gt;816&lt;/span&gt;  &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; 04:31 pts/0    00:00:00 &lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; kubelet&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 修改配置文件中的 resolvConf 路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bob@k8s-node2:~$ &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; /var/lib/kubelet/config.yaml&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;apiVersion: kubelet.config.k8s.io/v1beta1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;authentication:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  anonymous:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    enabled: &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  webhook:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    cacheTTL: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    enabled: &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  x509:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    clientCAFile: /etc/kubernetes/pki/ca.crt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;authorization:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  mode: Webhook&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  webhook:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    cacheAuthorizedTTL: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    cacheUnauthorizedTTL: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;cgroupDriver: systemd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;clusterDNS:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;- &lt;span class=&#34;token number&#34;&gt;10.96&lt;/span&gt;.0.10&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;clusterDomain: cluster.local&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;containerRuntimeEndpoint: &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;cpuManagerReconcilePeriod: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;crashLoopBackOff: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;evictionPressureTransitionPeriod: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;fileCheckFrequency: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;healthzBindAddress: &lt;span class=&#34;token number&#34;&gt;127.0&lt;/span&gt;.0.1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;healthzPort: &lt;span class=&#34;token number&#34;&gt;10248&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;httpCheckFrequency: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;imageMaximumGCAge: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;imageMinimumGCAge: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;kind: KubeletConfiguration&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;logging:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  flushFrequency: &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  options:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    json:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      infoBufferSize: &lt;span class=&#34;token string&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    text:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      infoBufferSize: &lt;span class=&#34;token string&#34;&gt;&#34;0&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  verbosity: &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;memorySwap: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;nodeStatusReportFrequency: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;nodeStatusUpdateFrequency: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;resolvConf: /run/systemd/resolve/resolv.conf  &lt;span class=&#34;token comment&#34;&gt;# 更改为 /etc/resolv.conf&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rotateCertificates: &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;runtimeRequestTimeout: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;shutdownGracePeriod: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;shutdownGracePeriodCriticalPods: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;staticPodPath: /etc/kubernetes/manifests&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;streamingConnectionIdleTimeout: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;56&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;syncFrequency: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;57&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;volumeStatsAggPeriod: 0s&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;58&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;59&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 重启 kubelet 服务&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;60&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bob@k8s-node2:~$ &lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; systemctl restart kubelet&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h1 id=&#34;可能有用的网站链接&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#可能有用的网站链接&#34;&gt;#&lt;/a&gt; 可能有用的网站链接&lt;/h1&gt;
&lt;p&gt;k8s 官方文档：&lt;a href=&#34;https://kubernetes.io/zh-cn/docs/home&#34;&gt;https://kubernetes.io/zh-cn/docs/home&lt;/a&gt;&lt;br /&gt;
docker 国内可用的加速镜像源:&lt;a href=&#34;https://github.com/dongyubin/DockerHub&#34;&gt;https://github.com/dongyubin/DockerHub&lt;/a&gt;&lt;br /&gt;
registry.k8s.io 国内可用镜像源:&lt;a href=&#34;https://docker.aityp.com&#34;&gt;https://docker.aityp.com&lt;/a&gt;&lt;br /&gt;
Watt Toolkit (Steam 加速器，可访问 github 等网站):&lt;a href=&#34;https://steampp.net&#34;&gt;https://steampp.net&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2025/03/13/MDT%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/</guid>
            <title>MDT快速入门</title>
            <link>https://www.keeponline.cn/2025/03/13/MDT%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/</link>
            <category term="Windows" scheme="https://www.keeponline.cn/categories/Windows/" />
            <category term="MDT" scheme="https://www.keeponline.cn/tags/MDT/" />
            <category term="WDS" scheme="https://www.keeponline.cn/tags/WDS/" />
            <pubDate>Thu, 13 Mar 2025 14:11:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1391.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;mdt简介&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mdt简介&#34;&gt;#&lt;/a&gt; MDT 简介&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;MDT（Microsoft Deployment Toolkit）&lt;/code&gt; 是  &lt;code&gt;Microsoft&lt;/code&gt;  免费提供的自动化部署框架，用于定制化操作系统部署。它基于任务序列 &lt;code&gt;（Task Sequence）&lt;/code&gt; ，支持复杂的部署流程和配置。&lt;/p&gt;
&lt;p&gt;核心功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;任务序列：定义分阶段任务（分区、驱动注入、应用安装、更新补丁等）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;驱动程序管理：根据硬件型号自动匹配并安装驱动。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;应用程序集成：静默安装 Office、企业软件等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动态配置：根据 MAC 地址、型号等条件动态生成计算机名、时区等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;日志与监控：记录详细部署日志，支持远程存储。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;搭建环境&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#搭建环境&#34;&gt;#&lt;/a&gt; 搭建环境&lt;/h1&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;IP 地址&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;Windows Server 2025&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;MDT_AD&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;192.168.10.10&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;AD、DHCP、DNS&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;域名：MDT.cn ᅟᅠ    DHCP 作用域：192.168.10.100-200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Windows Server 2025&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;MDT_Server&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;192.168.10.11&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;WDS、MDT&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;提供 PXE 服务和镜像发布&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;由于这个几个服务安装部署相对简单，文中没有提及的步骤一律按照默认下一步&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;ad服务器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ad服务器&#34;&gt;#&lt;/a&gt; AD 服务器&lt;/h1&gt;
&lt;p&gt;AD 服务器主要安装 AD、DNS、DHCP 这三个服务，可以同时安装&lt;/p&gt;
&lt;p&gt;添加服务器角色和功能，同时勾选 &lt;strong&gt;Active Directory 域服务、DHCP 服务器和 DNS 服务器&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1392.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;勾选&lt;strong&gt;如果需要，自动重新启动目标服务器&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1394.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击&lt;strong&gt;将此服务器提升为域服务器&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1395.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选择&lt;strong&gt;添加新林&lt;/strong&gt;，填写你的&lt;strong&gt;根域名&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1396.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;设置&lt;strong&gt; DSRM 密码&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1397.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;一直默认下一步，安装完后会自动重启服务器&lt;/p&gt;
&lt;h2 id=&#34;dhcp配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#dhcp配置&#34;&gt;#&lt;/a&gt; DHCP 配置&lt;/h2&gt;
&lt;p&gt;重启后点击&lt;strong&gt;通知&lt;/strong&gt;，选择&lt;strong&gt;完成 DHCP 配置&lt;/strong&gt;，都是默认&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1398.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;完成 DHCP 配置&lt;/strong&gt;后，打开&lt;strong&gt; DHCP 管理器&lt;/strong&gt;，添加一个&lt;strong&gt; IPv4 的作用域&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1399.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写&lt;strong&gt;作用域名称&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1400.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;配置&lt;strong&gt;起始 IP 地址和结束 IP 地址&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1401.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;配置&lt;strong&gt;默认网关&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1402.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;一直下一步直至完成&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1403.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;到此 AD 服务器配置完毕&lt;/p&gt;
&lt;h1 id=&#34;mdt服务器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mdt服务器&#34;&gt;#&lt;/a&gt; MDT 服务器&lt;/h1&gt;
&lt;p&gt;登陆 MDT 服务器，首先将该服务器加到域中，然后重启&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1404.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;adk安装&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#adk安装&#34;&gt;#&lt;/a&gt; ADK 安装&lt;/h2&gt;
&lt;p&gt;重启后下载安装 &lt;code&gt;Windows ADK&lt;/code&gt;  和  &lt;code&gt;Windows PE附加组件&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;ADK 下载地址:&lt;a href=&#34;https://learn.microsoft.com/zh-cn/windows-hardware/get-started/adk-install&#34;&gt;https://learn.microsoft.com/zh-cn/windows-hardware/get-started/adk-install&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;双击 &lt;code&gt;adksetup.exe&lt;/code&gt;  进行 &lt;code&gt;Windows ADK&lt;/code&gt;  的安装&lt;/p&gt;
&lt;p&gt;安装路径可以选择默认&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1405.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;安装功能我这里仅勾选&lt;strong&gt;部署工具&lt;/strong&gt;，其它的我暂时用不上&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1406.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后面都是默认，直至安装完成&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1407.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;接下来安装 &lt;code&gt;Windows PE附加组件&lt;/code&gt; ，双击 &lt;code&gt;adkwinpesetup.exe&lt;/code&gt;  进行安装，路径默认&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1408.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最新版本的 &lt;code&gt;Windows PE附加组件&lt;/code&gt; 不再支持 &lt;strong&gt;x86&lt;/strong&gt; 平台，如果老机器不支持&lt;strong&gt; UEFI 引导&lt;/strong&gt;的话，请安装&lt;strong&gt; 10.1.22000.1&lt;/strong&gt; 以下版本&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1409.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后面都是默认，直至安装完成&lt;/p&gt;
&lt;h2 id=&#34;mdt安装&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mdt安装&#34;&gt;#&lt;/a&gt; MDT 安装&lt;/h2&gt;
&lt;p&gt;安装完 &lt;code&gt;Windows ADK&lt;/code&gt;  后，下载 MDT 并进行安装&lt;/p&gt;
&lt;p&gt;MDT 下载地址：&lt;a href=&#34;https://www.microsoft.com/en-us/download/details.aspx?id=54259&#34;&gt;https://www.microsoft.com/en-us/download/details.aspx?id=54259&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1410.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;MDT 全程默认安装，安装完后在开始菜单找到 &lt;code&gt;Deployment Workbench&lt;/code&gt;  并打开&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1411.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;Deployment Share&lt;/code&gt; ，右键菜单选择 &lt;code&gt;New Deployment Share&lt;/code&gt; &lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1412.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;路径我这边选择 D 盘&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1413.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Options&lt;/code&gt;  这里我把所有的选择都去掉，请根据自己的需求勾选&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1414.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后面都是默认，创建完部署共享目录后，简单说一下相关目录的配置&lt;/p&gt;
&lt;h3 id=&#34;mdt配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mdt配置&#34;&gt;#&lt;/a&gt; MDT 配置&lt;/h3&gt;
&lt;p&gt;展开 MDT 部署目录，可以看到下面还有几个配置相关的目录，由于我的小霸王性能有限，无法测试所有的目录配置，这里只测试&lt;strong&gt; Applications、Operating Systems、Task Sequences 和 Monitoring&lt;/strong&gt;, 其它只简单介绍一下目录配置的作用&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Applications： 存放需要在部署过程中自动安装的应用程序安装包，支持 exe、msi 可执行的二进制文件，也可以调用系统的 cmd 和 powershell 执行脚本程序&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;单击选中 &lt;code&gt;Applications&lt;/code&gt; ，右键菜单选择 &lt;code&gt;New Application&lt;/code&gt; ，点击 &lt;code&gt;Next&lt;/code&gt;  选择安装包源 (该操作会将源安装包复制一份到  &lt;code&gt;DeploymentShare$\Applications&lt;/code&gt;  共享目录)&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1419.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写安装包名称，这里我用微信测试&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1417.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选择安装包所在目录 (如果不需要保留源安装包文件，可以勾选 &lt;code&gt;Move the files to the deployment share instead of copying them&lt;/code&gt; )&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1420.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写安装程序命令和参数&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1421.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后面默认，直至完成&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1422.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这样我们就添加好了一个微信的安装包&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1423.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Operation Systems： 存放操作系统镜像文件，支持 wim、esd 格式镜像，通常是将 ISO 镜像文件挂载到 CDROM 或解压到本地目录读取&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里以 Windows 11 镜像为例，将镜像挂载到本地虚拟光驱，然后在点击 &lt;code&gt;Operation Systems&lt;/code&gt; ，右键菜单选择 &lt;code&gt;Import Operating System&lt;/code&gt; ，然后选择 &lt;code&gt;Full set of source to files&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1424.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;源目录选择虚拟光驱&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1425.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;设置目录名&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1426.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后面默认，直至完成 (该操作会将虚拟光驱文件全部复制一份到 &lt;code&gt;DeploymentShare\Operating Systems&lt;/code&gt;  目录下)&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1427.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;一些不需要的版本可以选中右键删除&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1428.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这样操作系统的镜像就添加好了&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Out-of-Box Drivers： 存放硬件驱动程序，支持 cab、inf 格式文件，按照厂商 / 设备型号进行分类，在部署过程中自动注入&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;目前环境不作测试&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Packages： 存放 Windows 更新包，例如语言包和安全补丁，支持 cab 和 msu 格式文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;目前环境不作测试&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Task Sequences： 定义部署任务序列，例如自动化分区、操作系统安装、注入驱动和安装应用程序等，由一系列的 VBS 脚本和 XML 文件控制部署流程的每一步操作&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;选中 &lt;code&gt;Task Sequences&lt;/code&gt; ，右键菜单新建一个&lt;strong&gt;任务序列&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1429.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写任务序列 ID 和名称&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1430.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;任务模板选择默认的 &lt;code&gt;Standard Client Task Sequence&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1431.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选择需要部署的系统镜像&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1432.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写完整名称和组织信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1433.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;设置部署镜像的管理员密码&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1434.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后面默认，直至完成&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1435.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选中创建好的任务序列名称，右键属性查看任务序列&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1436.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;Task Sequence&lt;/code&gt;  可以查看模板的部署流程&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1437.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initialization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;初始化阶段，主要动作是在&lt;strong&gt; WinPE 环境&lt;/strong&gt;中收集本地硬件信息&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;验证阶段，主要动作是检查系统内存和处理器是否满足部署要求&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;State Capture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;状态捕获阶段，主要动作是捕获系统用户的配置文件、我的文档、桌面文件、浏览器书签和应用程序等个性化配置数据，需要搭配 USMT 工具使用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preinstall&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;预安装阶段，主要动作有磁盘分区，复制脚本和驱动文件到 WinPE 环境中&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装阶段，主要动作是安装操作系统&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Postinstall&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装后阶段，主要动作有复制脚本到本地，更新应答文件，复制驱动文件到目标系统 Drivers 目录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;State Restore&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;状态恢复阶段，主要动作是在新系统中还原之前捕获的用户配置和文档数据&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;当前测试环境仅使用默认模板配置，不更改任何选项&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Task Sequences&lt;/code&gt;  配置是整个部署环节中最复杂的一环，无法通过一篇简单的文章对其详细说明，如果想深入了解，还请自行查看官方文档&lt;/p&gt;
&lt;p&gt;微软官方文档：&lt;a href=&#34;https://learn.microsoft.com/en-us/mem/configmgr/mdt/task-sequence-steps&#34;&gt;https://learn.microsoft.com/en-us/mem/configmgr/mdt/task-sequence-steps&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Advanced Configuration：	高级配置，Selection Profiles 可以自定义配置文件，例如驱动和应用程序匹配。Linked Deployment Shares 可以将多个独立的 Deployment Share 链接起来，实现多站点协同部署。Media 主要是生成离线部署 ISO 镜像，可以刻录到 U 盘，用于客户端离线安装。Database 可以配置数据库信息，可配合数据库实现动态配置，例如自动化命名、不同地区走不一样的部署流程等&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;目前环境不作测试&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Monitoring： 实时监控客户端部署进度，需要在 &lt;code&gt;MDT Deployment Share&lt;/code&gt;  属性中启用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1438.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;生成引导镜像文件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#生成引导镜像文件&#34;&gt;#&lt;/a&gt; 生成引导镜像文件&lt;/h3&gt;
&lt;p&gt;当所有的设置都配置好，此时我们便可以生成一个引导镜像文件&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;MDT Deployment Share&lt;/code&gt;  目录，右键菜单选择  &lt;code&gt;Update Deployment Share&lt;/code&gt; , 默认更新即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1439.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;更新完成后，系统会自动在 &lt;code&gt;DeploymentShare\Boot&lt;/code&gt;  目录下创建对应的引导镜像文件&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1440.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;到此 MDT 的配置就完成了&lt;/p&gt;
&lt;h2 id=&#34;wds安装&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#wds安装&#34;&gt;#&lt;/a&gt; WDS 安装&lt;/h2&gt;
&lt;p&gt;接下来，我们安装 WDS 服务，用于发布引导镜像&lt;/p&gt;
&lt;p&gt;打开&lt;strong&gt;添加角色和功能向导&lt;/strong&gt;，勾选 &lt;code&gt;Windows部署服务&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1441.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;角色服务默认勾选&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1442.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;完成后点击关闭&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1443.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在&lt;strong&gt;服务器管理器&lt;/strong&gt;中打开&lt;strong&gt; Windows 部署服务管理控制台&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1444.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;右键菜单选择&lt;strong&gt;配置服务器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1445.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装选择&lt;/strong&gt;选择&lt;strong&gt;与 Active Directory 集成&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1446.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;远程安装文件夹的位置&lt;/strong&gt;我这个选择 D 盘&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1447.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PXE 服务器初始设置&lt;/strong&gt;选择&lt;strong&gt;响应所有客户端计算机&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1448.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;完成时请取消勾选&lt;strong&gt;立即向服务器中添加映像&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1449.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;展开服务器目录，选择&lt;strong&gt;启动映像&lt;/strong&gt;，右键菜单选择&lt;strong&gt;添加启动映像&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1450.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;映像文件选择前面 MDT 生成的引导镜像&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1451.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;映像元数据&lt;/strong&gt;可以更改名称和说明&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1452.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后面一直下一步直至完成即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1453.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;此时，同网段中的客户端可以通过 PXE 启动引导该镜像&lt;/p&gt;
&lt;h1 id=&#34;客户端测试&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#客户端测试&#34;&gt;#&lt;/a&gt; 客户端测试&lt;/h1&gt;
&lt;p&gt;在同网段中找一台客户端，开机选择网络引导&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1454.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果网络正常，可以看到客户端获取到的 DHCP 信息，按&lt;strong&gt;回车&lt;/strong&gt;确认&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1455.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;此时客户端便会从网络加载 WinPE&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1456.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;WinPE 加载完后，选择运行部署向导&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1457.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;输入访问 MDT 服务器共享的用户名和密码&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1458.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选择&lt;strong&gt;任务序列&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1459.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;设置计算机名和加域信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1460.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;应用程序选择前面配置好的微信&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1461.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后点击&lt;strong&gt; Begin&lt;/strong&gt; 开始整个部署流程&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1462.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1463.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1464.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1465.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1466.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1467.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;部署结束后，可以看到微信已经安装，系统也已经加好域，也没有任何报错，到此整个部署流程结束&lt;/p&gt;
&lt;h1 id=&#34;mdt部署优化&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mdt部署优化&#34;&gt;#&lt;/a&gt; MDT 部署优化&lt;/h1&gt;
&lt;p&gt;在进入 &lt;code&gt;WinPE&lt;/code&gt;  环境中，有几个地方是需要和用户交互的，如果希望自动化执行，我们可以通过更改 &lt;code&gt;MDT服务器&lt;/code&gt; 的 &lt;code&gt;Bootstrap.ini&lt;/code&gt;  和 &lt;code&gt;CustomSettings.ini&lt;/code&gt;  这两个配置文件实现自动化部署&lt;/p&gt;
&lt;p&gt;这两个配置文件在  &lt;code&gt;DeploymentShare\Control&lt;/code&gt;  目录下&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1468.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Bootstrap.ini&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight ini&#34;&gt;&lt;figcaption data-lang=&#34;ini&#34;&gt;&lt;span&gt;i&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token section&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token section-name selector&#34;&gt;Settings&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;Priority&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;Default&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token section&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token section-name selector&#34;&gt;Default&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;DeployRoot&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;\\MDT_SERVER\DeploymentShare$&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 配置连接共享的用户名、密码、域信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;UserID&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;mdt_user&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;UserPassword&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;Password&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;UserDomain&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;mdt.cn&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 配置部署日志的远程存储路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SLShare&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;\\192.168.10.11\Logs&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SLshareDynamicLogging&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;\\192.168.10.11\Logs\%ComputerName%&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CustomSettings.ini&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight ini&#34;&gt;&lt;figcaption data-lang=&#34;ini&#34;&gt;&lt;span&gt;i&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token section&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token section-name selector&#34;&gt;Settings&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;Priority&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;Default&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;Properties&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;MyCustomProperty&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token section&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token section-name selector&#34;&gt;Default&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;OSInstall&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;Y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipCapture&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipAdminPassword&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipProductKey&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipComputerBackup&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipBitLocker&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;EventService&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;http://MDT_Server:9800&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 跳过任务序列选择，并指定默认选择的任务序列 ID&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipTaskSequence&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;TaskSequenceID&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 跳过计算机名设置，配置固定前缀和 MAC 地址开头 2 位以及主板序列号后 2 位生成计算机名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipComputerName&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;OSDComputerName&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;MDT#Left(&#34;%MACAddress%&#34;,2)##Right(&#34;%SerialNumber%&#34;,2)#&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 跳过加域设置&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipDomainMembership&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;JoinDomain&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;MDT.cn&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;DomainAdmin&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;mdt_user&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;DomainAdminPassword&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;Password&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;DomainAdminDomain&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;MDT&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 跳过用户数据迁移和恢复&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipCapture&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipUserData&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;UserDataLocation&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;NONE&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 跳过语言和时区设置&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipLocaleSelection&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;UserLocale&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;en-US&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;UILanguage&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;zh-CN&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipTimeZone&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;TimeZoneName&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;China Standard Time&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 跳过安装应用程序选择，指定需要安装的程序包 GUID，安装多个则指定多个，例如 Applications1，Applications2，Applications3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipApplications&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;Applications1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;&amp;#123;d586e387-032b-4af3-ae4e-9bbaecbc7b5d&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;; 跳过部署向导最后一步&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token key attr-name&#34;&gt;SkipSummary&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token value attr-value&#34;&gt;YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;下面简单介绍一下这两个文件的作用：&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;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;Bootstrap.ini&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;用于初始化部署环境&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;WinPE 启动阶段加载&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;访问 MDT 网络共享和认证，部署日志远程存储，静态 IP 地址等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;CustomSettings.ini&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;用于定义部署规则&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;在 Bootstrap.ini 之后，通过网络共享加载&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;自动选择任务序列，动态生成计算机名，设置时区等&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;需要注意的是， &lt;code&gt;Bootstrap.ini&lt;/code&gt;  配置文件是保存在镜像根目录 &lt;code&gt;Deploy\Scripts&lt;/code&gt;  下，每次更改 &lt;code&gt;Bootstrap.ini&lt;/code&gt;  配置后，我们需要在 &lt;code&gt;MTD&lt;/code&gt;  控制台中更新 &lt;code&gt;MDT Deployment Share&lt;/code&gt;  配置，更新完后还需要在&lt;strong&gt; WDS 控制台&lt;/strong&gt;的&lt;strong&gt;启动映像&lt;/strong&gt;中替换成最新的&lt;strong&gt;引导镜像&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1439.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1469.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CustomSettings.ini&lt;/code&gt;  配置是通过网络共享加载的，更改不需要更新镜像，保存文件即可马上测试&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2024/11/20/Powershell%E5%BC%95%E5%AF%BC%E6%9C%AC%E5%9C%B0WinPE/</guid>
            <title>Powershell引导本地WinPE</title>
            <link>https://www.keeponline.cn/2024/11/20/Powershell%E5%BC%95%E5%AF%BC%E6%9C%AC%E5%9C%B0WinPE/</link>
            <category term="Windows" scheme="https://www.keeponline.cn/categories/Windows/" />
            <category term="PowerShell" scheme="https://www.keeponline.cn/tags/PowerShell/" />
            <pubDate>Wed, 20 Nov 2024 01:01:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-695.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;场景描述&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#场景描述&#34;&gt;#&lt;/a&gt; 场景描述&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;用户电脑在启用 &lt;code&gt;bitlocker&lt;/code&gt;  的情况下， &lt;code&gt;winpe&lt;/code&gt;  下重装系统无法格式系统分区，需要先解锁 &lt;code&gt;bitlocker&lt;/code&gt;  后重启再进入 &lt;code&gt;winpe&lt;/code&gt;  操作&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部分用户对 &lt;code&gt;BIOS&lt;/code&gt;  设置不熟悉，无法自己设置从网络引导 &lt;code&gt;winpe&lt;/code&gt; ，需要创建一个程序或脚本，让用户双击运行实现自动重启后从网络加载 &lt;code&gt;winpe&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;思路&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#思路&#34;&gt;#&lt;/a&gt; 思路&lt;/h1&gt;
&lt;p&gt;解锁 &lt;code&gt;bitlocker&lt;/code&gt;  这个问题相对简单，但是如何让电脑重启并从网络引导这步我不知道如何实现，用户电脑大部分是双网卡的，正常手动从网络启动都要选中对应的网卡才能正常从网络加载 &lt;code&gt;winpe&lt;/code&gt; , 这个程序或脚本要如何判断从哪个网卡引导？&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ivanti&lt;/code&gt;  的操作部署模板中有个 &lt;code&gt;vboot&lt;/code&gt;  的功能，这个功能刚好可以满足用户的需求，但是这个功能是需要在客户端上安装 &lt;code&gt;ivanti&lt;/code&gt;  的代理才能实现，用户这边已经明确了客户端不会安装 &lt;code&gt;ivanti&lt;/code&gt;  的代理，所以这条路走不通&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1382.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;我在官网上搜索过 &lt;code&gt;vboot&lt;/code&gt;  这个关键字，并没有找到相关文档描述该功能的具体介绍和实现方法，无奈只好另辟他路&lt;/p&gt;
&lt;p&gt;这个问题困扰了我很久，直到今天我的一台 &lt;code&gt;windows&lt;/code&gt;  虚拟机系统盘满了，我又不想重装系统，我就想简单的扩展虚拟机磁盘，我在虚拟机中将这个系统盘从&lt;strong&gt; 60G&lt;/strong&gt; 扩展到了&lt;strong&gt; 150G&lt;/strong&gt;, 想着通过扩展卷的方式扩展即可&lt;/p&gt;
&lt;p&gt;没想到磁盘末尾有个&lt;strong&gt;恢复分区&lt;/strong&gt;，导致无法直接扩展后面加进来的&lt;strong&gt; 90G&lt;/strong&gt; 空间&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1383.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;于是我下载了&lt;strong&gt;傲梅分区助手&lt;/strong&gt;，打算用该工具给系统盘进行扩展&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1384.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;提交后提示需要进入 &lt;code&gt;WinPE&lt;/code&gt;  模式下操作&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1385.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击确定后，提示程序正在创建 &lt;code&gt;WinPE&lt;/code&gt; &lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1386.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;进度条完成后系统自动重启进入 &lt;code&gt;WinPE&lt;/code&gt; , 执行后续的分区合并操作&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1387.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1388.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;我惊了，这个不就是我想要的功能吗！！！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;傲梅&lt;/strong&gt;一下就打开了我的思路，我非常确定傲梅是在本地创建了 &lt;code&gt;WinPE&lt;/code&gt;  镜像文件，并通过重启引导进入 &lt;code&gt;WinPE&lt;/code&gt; ，既然无法从网卡引导，那从本地引导也不是不行&lt;/p&gt;
&lt;p&gt;我虽然不知道如何从本地引导镜像文件，但是我知道要从本地引导，就必须添加 &lt;code&gt;BCD&lt;/code&gt;  启动项，&lt;strong&gt;傲梅&lt;/strong&gt;肯定也是这样实现的，于是我从网上下载了 &lt;code&gt;bootice&lt;/code&gt;  这个小工具，查看系统当前 &lt;code&gt;BCD&lt;/code&gt;  文件，成功验证了自己的猜想&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1389.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1390.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;br /&gt;
 可以看到&lt;strong&gt;傲梅&lt;/strong&gt;添加的 &lt;code&gt;BCD&lt;/code&gt;  启动项和参数，剩下的就简单了&lt;/p&gt;
&lt;h1 id=&#34;脚本实现&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#脚本实现&#34;&gt;#&lt;/a&gt; 脚本实现&lt;/h1&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 禁用 bitlocker&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$encryptionStatus&lt;/span&gt; = &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Get-BitLockerVolume&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ProtectionStatus&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$encryptionStatus&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;On&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    manage-bde&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;protectors &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;disable c: &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;rebootcount 0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 正则匹配 ID&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$IDPattern&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#39;\&amp;#123;([A-Fa-f0-9-]+)\&amp;#125;&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$output1&lt;/span&gt; = bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;create &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;device&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$deviceID&lt;/span&gt; = &lt;span class=&#34;token namespace&#34;&gt;[regex]&lt;/span&gt;::Match&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$output1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$IDPattern&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Groups&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Value&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$output2&lt;/span&gt; = bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;create &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;d &lt;span class=&#34;token string&#34;&gt;&#34;ivanti winpe&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;application OSLOADER&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$ApplicationID&lt;/span&gt; = &lt;span class=&#34;token namespace&#34;&gt;[regex]&lt;/span&gt;::Match&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$output2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$IDPattern&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Groups&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Value&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# winpe 文件路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$device&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;D:&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$SDIPath&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;\winpe\Boot\boot.sdi&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$WIMPath&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;\winpe\Boot\boot_x64.wim&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 添加启动项&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$deviceID&lt;/span&gt; ramdisksdidevice partition=&lt;span class=&#34;token variable&#34;&gt;$device&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$deviceID&lt;/span&gt; ramdisksdipath &lt;span class=&#34;token variable&#34;&gt;$SDIPath&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$ApplicationID&lt;/span&gt; device ramdisk=&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$device&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$WIMPath&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$deviceID&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$ApplicationID&lt;/span&gt; path \windows\system32\boot\winload&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;efi&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$ApplicationID&lt;/span&gt; osdevice ramdisk=&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$device&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$WIMPath&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$deviceID&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$ApplicationID&lt;/span&gt; systemroot \windows&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$ApplicationID&lt;/span&gt; winpe yes&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$ApplicationID&lt;/span&gt; detecthal yes&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;bcdedit &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;bootsequence &lt;span class=&#34;token variable&#34;&gt;$ApplicationID&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 重启计算机&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;Restart-Computer&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Force&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2024/10/06/%E6%A0%B9%E6%8D%AE%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%9C%B0%E5%9D%80%E6%89%BE%E6%8C%87%E5%AE%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8B%E8%BD%BD/</guid>
            <title>根据客户端地址找指定服务器下载</title>
            <link>https://www.keeponline.cn/2024/10/06/%E6%A0%B9%E6%8D%AE%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%9C%B0%E5%9D%80%E6%89%BE%E6%8C%87%E5%AE%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8B%E8%BD%BD/</link>
            <category term="Windows" scheme="https://www.keeponline.cn/categories/Windows/" />
            <category term="Powershell" scheme="https://www.keeponline.cn/tags/Powershell/" />
            <pubDate>Sun, 06 Oct 2024 22:10:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-695.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;br /&gt;
 之前有帮一个用户写过一个操作系统部署部署时下载的脚本，客户当时的需求是根据不同的客户端网段，找指定的服务器下载对应的镜像文件和软件包，当时用户给的客户端网段都是 &lt;code&gt;C段&lt;/code&gt; ，由于 &lt;code&gt;WinPE&lt;/code&gt;  中 &lt;code&gt;powershell&lt;/code&gt;  有部分命令不支持，为了偷懒测试，我就直接用批处理写了个脚本，写得比较粗糙，还请大佬别笑话&lt;/p&gt;
&lt;p&gt;脚本主要是判断客户端 &lt;code&gt;IP地址&lt;/code&gt; 的前&lt;strong&gt; 3 段&lt;/strong&gt;，再根据客户端的网络段找指定的服务器下载&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;@&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt; off&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;setlocal enabledelayedexpansion&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; sys=win10&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; s1=192&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;168&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;37&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;12&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; s2=192&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;168&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;37&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;13&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; s3=192&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;168&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;37&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;14&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; s4=192&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;168&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;37&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;15&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; s5=192&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;168&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;37&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;16&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; s6=192&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;168&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;37&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;17&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; s7=192&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;168&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;37&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;18&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; s8=192&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;168&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;34&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;253&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;REM 定义设备型号&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;f &lt;span class=&#34;token string&#34;&gt;&#34;skip=1 tokens=*&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;a in &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;wmic computersystem get model&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;model=%%a&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    goto :afterloop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;:afterloop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;model=%model: =%&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;REM 定义网段列表&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group1=192.168.134 192.168.142 192.168.150 192.168.158 192.168.166 192.168.174 192.168.182 192.168.190 192.168.128 192.168.136 192.168.144 192.168.152 192.168.161 192.168.169 192.168.177 192.168.196 192.168.204 192.168.212 192.168.220&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group2=192.168.135 192.168.143 192.168.151 192.168.159 192.168.167 192.168.175 192.168.183 192.168.191 192.168.129 192.168.137 192.168.145 192.168.153 192.168.162 192.168.170 192.168.178 192.168.197 192.168.205 192.168.213 192.168.221&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group3=192.168.136 192.168.144 192.168.152 192.168.160 192.168.168 192.168.176 192.168.184 192.168.130 192.168.138 192.168.146 192.168.155 192.168.163 192.168.171 192.168.179 192.168.198 192.168.206 192.168.214 192.168.222&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group4=192.168.137 192.168.145 192.168.153 192.168.161 192.168.169 192.168.177 192.168.185 192.168.131 192.168.139 192.168.147 192.168.156 192.168.164 192.168.172 192.168.180 192.168.199 192.168.207 192.168.215 192.168.223&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group5=192.168.138 192.168.146 192.168.154 192.168.162 192.168.170 192.168.178 192.168.186 192.168.132 192.168.140 192.168.148 192.168.157 192.168.165 192.168.173 192.168.181 192.168.200 192.168.208 192.168.216&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group6=192.168.139 192.168.147 192.168.155 192.168.163 192.168.171 192.168.179 192.168.187 192.168.133 192.168.133 192.168.141 192.168.149 192.168.158 192.168.166 192.168.174 192.168.182 192.168.201 192.168.209 192.168.217&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group7=192.168.140 192.168.148 192.168.156 192.168.164 192.168.172 192.168.180 192.168.188 192.168.134 192.168.142 192.168.150 192.168.159 192.168.167 192.168.175 192.168.183 192.168.202 192.168.210 192.168.218&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group8=192.168.141 192.168.149 192.168.157 192.168.165 192.168.173 192.168.181 192.168.189 192.168.132 192.168.135 192.168.143 192.168.151 192.168.160 192.168.168 192.168.176 192.168.203 192.168.211 192.168.219&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;REM 获取当前IP地址&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;f &lt;span class=&#34;token string&#34;&gt;&#34;tokens=2 delims=:&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;a in &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;ipconfig ^| findstr /c:&#34;IPv4&#34;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;ip=%%a&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;ip=!ip:~1!&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;ip=!ip:%% %%=!&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    goto :CheckIP&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;:CheckIP&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;REM 拆分IP地址&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;f &lt;span class=&#34;token string&#34;&gt;&#34;tokens=1-4 delims=.&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;a in &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;%ip%&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; octet1=&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;a&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; octet2=&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;b&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; octet3=&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;c&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; octet4=&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;d&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;REM 根据IP地址匹配网段和服务器&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; server=&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;g in &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;group1 group2 group3 group4 group5 group6 group7 group8 group9&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;h in &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;g!&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%octet1%.%octet2%.%octet3%&#34;&lt;/span&gt;==&lt;span class=&#34;token string&#34;&gt;&#34;%%h&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;56&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group_num=%%g&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;57&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;group_num=!group_num:group=!&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;58&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            call &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;server=%%s!group_num!%%&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;59&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;            goto :DownloadFile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;60&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;61&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;62&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;63&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;64&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;x:\windows\system32\WindowsPowerShell\v1&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;0\powershell&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;c &lt;span class=&#34;token string&#34;&gt;&#34;Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show(&#39;Unable to find a file server matching your current network. Please contact the IT administrator and try again!&#39;)&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;65&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;shutdown &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;s &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;t 05&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;66&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;67&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;:DownloadFile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;68&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt; Downloading &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; server &lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;server!&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;69&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;wget http:&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;server!&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;share/Script/UserAuth&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1 &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O x:\UserAuth&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;70&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;wget http:&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;server!&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;share/Script/InstallINF&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1 &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O x:\InstallINF&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;71&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;wget http:&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;server!&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;share/Script/ComputerName&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1 &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O x:\ComputerName&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;72&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;wget http:&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;server!&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;share/Script/PupopWindow&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1 &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O x:\PupopWindow&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;73&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;wget &lt;span class=&#34;token string&#34;&gt;&#34;http://!server!/share/drivers/!sys!/!model!.zip&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O c:\driver&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;zip&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;74&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;wget http:&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;server!&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;share/OS/&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;sys!&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;sys!&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;wim &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O c:\install&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;wim&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;75&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;wget http:&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;server!&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;share/Software\QAXInstall&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O c:\QAXInstall&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;76&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;wget http:&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;server!&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;share/Script/DomainAuto&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1 &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O c:\DomainAuto&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;ps1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;77&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;endlocal&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;前段时间用户说现在需求有变动，其它地区的客户端网段是 &lt;code&gt;B段&lt;/code&gt; ，如果按照之前的脚本，一个 &lt;code&gt;B段&lt;/code&gt; 有几百个 &lt;code&gt;C段&lt;/code&gt; ，添加起来费人&lt;/p&gt;
&lt;p&gt;听了用户的需求，我明白之前的批处理确实不太好处理这个问题，无奈只好重新研究用 &lt;code&gt;powershell&lt;/code&gt;  来解决新的需求&lt;/p&gt;
&lt;p&gt;我的想法很简单，由于 &lt;code&gt;B段&lt;/code&gt; 都是连续的，我就想着将 &lt;code&gt;IP地址&lt;/code&gt; 转换成 &lt;code&gt;十进制&lt;/code&gt; ，然后根据范围判断找指定的服务器下载，这应该比判断 &lt;code&gt;IP段&lt;/code&gt; 要简单多了吧&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$ipConfig&lt;/span&gt; = ipconfig &lt;span class=&#34;token punctuation&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;Where-Object&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$_&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-match&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;IPv4&#39;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;ForEach-Object&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$_&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;split &lt;span class=&#34;token string&#34;&gt;&#34;:&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;1&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Trim&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Current IP: &lt;span class=&#34;token variable&#34;&gt;$ipConfig&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;Convert-IPToDecimal&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;param&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$ip&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token variable&#34;&gt;$octets&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$ip&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;split &lt;span class=&#34;token string&#34;&gt;&#39;\.&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token namespace&#34;&gt;[int]&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$octets&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;0&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; 16777216&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token namespace&#34;&gt;[int]&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$octets&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;1&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; 65536&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token namespace&#34;&gt;[int]&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$octets&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;2&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; 256&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token namespace&#34;&gt;[int]&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$octets&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;3&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$ipDecimal&lt;/span&gt; = &lt;span class=&#34;token function&#34;&gt;Convert-IPToDecimal&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;ip &lt;span class=&#34;token variable&#34;&gt;$ipConfig&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Current IP in decimal: &lt;span class=&#34;token variable&#34;&gt;$ipDecimal&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$ipRanges&lt;/span&gt; = @&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    @&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;Start&lt;/span&gt; = 3221883393&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;End&lt;/span&gt; = 3221946366&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; Server = &lt;span class=&#34;token string&#34;&gt;&#39;192.10.0.1&#39;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    @&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;Start&lt;/span&gt; = 3222067201&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;End&lt;/span&gt; = 3222130174&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; Server = &lt;span class=&#34;token string&#34;&gt;&#39;192.20.0.1&#39;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    @&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;Start&lt;/span&gt; = 3232256001&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;End&lt;/span&gt; = 3232256254&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; Server = &lt;span class=&#34;token string&#34;&gt;&#39;192.168.80.1&#39;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$serverFound&lt;/span&gt; = &lt;span class=&#34;token boolean&#34;&gt;$false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$range&lt;/span&gt; in &lt;span class=&#34;token variable&#34;&gt;$ipRanges&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$ipDecimal&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-ge&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$range&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Start&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-and&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$ipDecimal&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-le&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$range&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;End&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$range&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Server&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token variable&#34;&gt;$serverFound&lt;/span&gt; = &lt;span class=&#34;token boolean&#34;&gt;$true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$serverFound&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token function&#34;&gt;Write-Host&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Matched server: &lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wget &lt;span class=&#34;token string&#34;&gt;&#34;http://&lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;/share/Script/UserAuth.ps1&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O &lt;span class=&#34;token string&#34;&gt;&#34;C:\UserAuth.ps1&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wget &lt;span class=&#34;token string&#34;&gt;&#34;http://&lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;/share/Script/InstallINF.ps1&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O &lt;span class=&#34;token string&#34;&gt;&#34;C:\InstallINF.ps1&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wget &lt;span class=&#34;token string&#34;&gt;&#34;http://&lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;/share/Script/ComputerName.ps1&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O &lt;span class=&#34;token string&#34;&gt;&#34;C:\ComputerName.ps1&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wget &lt;span class=&#34;token string&#34;&gt;&#34;http://&lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;/share/Script/PupopWindow.ps1&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O &lt;span class=&#34;token string&#34;&gt;&#34;C:\PupopWindow.ps1&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wget &lt;span class=&#34;token string&#34;&gt;&#34;http://&lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;/share/drivers/win10/model.zip&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O &lt;span class=&#34;token string&#34;&gt;&#34;C:\driver.zip&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wget &lt;span class=&#34;token string&#34;&gt;&#34;http://&lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;/share/OS/win10/install.wim&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O &lt;span class=&#34;token string&#34;&gt;&#34;C:\install.wim&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wget &lt;span class=&#34;token string&#34;&gt;&#34;http://&lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;/share/Software/QAXInstall.exe&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O &lt;span class=&#34;token string&#34;&gt;&#34;C:\QAXInstall.exe&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    wget &lt;span class=&#34;token string&#34;&gt;&#34;http://&lt;span class=&#34;token variable&#34;&gt;$serverIP&lt;/span&gt;/share/Script/DomainAuto.ps1&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;O &lt;span class=&#34;token string&#34;&gt;&#34;C:\DomainAuto.ps1&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;exit&lt;/span&gt; 0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;Add-Type&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;AssemblyName System&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Windows&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Forms&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token namespace&#34;&gt;[System.Windows.Forms.MessageBox]&lt;/span&gt;::Show&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Unable to find a file server matching your current network. Please contact the IT administrator and try again!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;exit&lt;/span&gt; 1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;老实说，虽然这个脚本并没有什么技术含量，但是我觉得还是分享一下吧，我相信并不是所有人都知道 &lt;code&gt;IP地址&lt;/code&gt; 是可以通过 &lt;code&gt;十进制&lt;/code&gt; 来访问的，我也是以前打 &lt;code&gt;CTF&lt;/code&gt;  的时候才接触到，应该算是比较冷门的知识吧&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2024/09/16/waline%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/</guid>
            <title>waline踩坑日志</title>
            <link>https://www.keeponline.cn/2024/09/16/waline%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/</link>
            <category term="waline" scheme="https://www.keeponline.cn/tags/waline/" />
            <pubDate>Mon, 16 Sep 2024 18:03:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1379.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;上次更换云服务器重新部署 &lt;code&gt;shokax&lt;/code&gt; , 在使用 &lt;code&gt;waline评论系统&lt;/code&gt; 后一直有几个问题我没有处理，今天抽时间研究了一下，把所有的问题都解决了，记录一下，希望可以帮到有相同问题的小伙伴&lt;/p&gt;
&lt;h1 id=&#34;阅读次数不显示&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#阅读次数不显示&#34;&gt;#&lt;/a&gt; 阅读次数不显示&lt;/h1&gt;
&lt;p&gt;在上一篇&lt;a href=&#34;https://keeponline.cn/2024/08/16/ShokaX%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/&#34;&gt; ShokaX 搭建教程&lt;/a&gt;文章中我有吐槽过，本地的数据库中 &lt;code&gt;wl_Counter&lt;/code&gt;  明明有记录阅读次数，但是文章中阅读次数总是显示为&lt;strong&gt; 0&lt;/strong&gt;，通过查看网页源码可以看到 &lt;code&gt;data-path&lt;/code&gt;  的路径值是没有经过 &lt;code&gt;URL编码&lt;/code&gt; 的，而数据库中的 &lt;code&gt;url&lt;/code&gt;  的值则是经过 &lt;code&gt;URL编码&lt;/code&gt; 的，所以导致路径不一致而不显示阅读次数&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1376.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;通过查找得知 &lt;code&gt;Shokax&lt;/code&gt;  目录下生成 &lt;code&gt;data-path&lt;/code&gt;  这段代码的文件为 &lt;code&gt;node_modules/.store/hexo-theme-shokax@0.4.11/node_modules/hexo-theme-shokax/layout/_partials/post/footer.pug&lt;/code&gt;  中的第七行代码&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1377.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;编辑该文件，用 &lt;code&gt;encodeURI()&lt;/code&gt;  将 &lt;code&gt;prerixedPath&lt;/code&gt;  的值进行 &lt;code&gt;URL编码&lt;/code&gt; 即可&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;- var prefixedPath &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; encodeURI&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;post.path.startsWith&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;/&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; ? post.path &lt;span class=&#34;token builtin class-name&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;/&#39;&lt;/span&gt; + post.path&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;更改完后，执行 &lt;code&gt;hexo g&lt;/code&gt;  重新生成网站静态文件，把目录发布到云服务器的 &lt;code&gt;web服务器&lt;/code&gt; &lt;strong&gt;根目录&lt;/strong&gt;，重新查看文档源码，可以看到 &lt;code&gt;data-path&lt;/code&gt;  的值跟数据库的 &lt;code&gt;url&lt;/code&gt;  值保持一致了，文章中的阅读次数也能够正常显示了&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1378.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;评论通知&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#评论通知&#34;&gt;#&lt;/a&gt; 评论通知&lt;/h1&gt;
&lt;p&gt;评论通知我这边选择了微信和邮箱这两种方式，微信是通过&lt;strong&gt;公众号&lt;/strong&gt; &lt;code&gt;方糖&lt;/code&gt; &lt;strong&gt; (原 Server 醬)&lt;/strong&gt; 订阅通知，先在微信添加 &lt;code&gt;方糖&lt;/code&gt; 公众号并注册&lt;/p&gt;
&lt;h2 id=&#34;server醬&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#server醬&#34;&gt;#&lt;/a&gt; Server 醬&lt;/h2&gt;
&lt;p&gt;在云服务器的 &lt;code&gt;waline&lt;/code&gt;  根目录下，编辑 &lt;code&gt;.env&lt;/code&gt;  环境变量文件，添加以下信息&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;SECURE_DOMAINS&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;xxx.xxx			&lt;span class=&#34;token comment&#34;&gt;#你的域名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;NOTIFY&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;true						&lt;span class=&#34;token comment&#34;&gt;#启用通知&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;NOTIFY_MODE&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;serverchan          &lt;span class=&#34;token comment&#34;&gt;#通知方式为 serverchan&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;SC_KEY&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;xxxx						&lt;span class=&#34;token comment&#34;&gt;#Server 醬的安全密钥&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;AUTHOR_EMAIL&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;xxx@xxx.com		&lt;span class=&#34;token comment&#34;&gt;#你的邮箱，此邮箱的回复不会收到推送通知&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;SITE_NAME&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;xxx  				    &lt;span class=&#34;token comment&#34;&gt;#网站名称&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;SITE_URL&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;https://xxx.xxx  		&lt;span class=&#34;token comment&#34;&gt;#你的域名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;添加完后保存，执行 &lt;code&gt;cnpm run restart&lt;/code&gt;  重启 &lt;code&gt;waline&lt;/code&gt;  服务，配置正常此时公众号可以收到一条测试信息&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1380.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;邮箱通知&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#邮箱通知&#34;&gt;#&lt;/a&gt; 邮箱通知&lt;/h2&gt;
&lt;p&gt;添加邮箱通知，编辑 &lt;code&gt;waline&lt;/code&gt;  根目录下的 &lt;code&gt;.env&lt;/code&gt;  环境变量文件，这里以 QQ 邮箱为例，添加以下内容&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;SMTP_SERVICE&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;QQ&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;SMTP_USER&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;xxx@qq.com		&lt;span class=&#34;token comment&#34;&gt;#发信用 QQ 邮箱&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;SMTP_PASS&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;xxxxx             &lt;span class=&#34;token comment&#34;&gt;#SMTP 授权密钥&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;SMTP_SECURE&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;SSL	&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;AUTHOR_EMAIL&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;xxx@xxx.com    &lt;span class=&#34;token comment&#34;&gt;#接收通知的邮箱地址&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;同时使用邮箱和其他应用同时通知&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#同时使用邮箱和其他应用同时通知&#34;&gt;#&lt;/a&gt; 同时使用邮箱和其他应用同时通知&lt;/h2&gt;
&lt;p&gt;正常情况下， &lt;code&gt;waline&lt;/code&gt;  不支持邮箱和其他应用程序同时通知，如果你希望邮箱和其他通知方式一起同时使用的话，需要在云服务器上修改 &lt;code&gt;waline根目录下.node_modules/.store/@waline+vercel@1.32.1/node_modules/@waline/vercel/src/service/notify.js&lt;/code&gt;  文件&lt;/p&gt;
&lt;p&gt;找到以下代码&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;wechat, qq, telegram, qywxAmWechat, pushplus, discord, lark&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;.every&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;          think.isEmpty,&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;   &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        mailList.push&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt; to: AUTHOR, title, content &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;   &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;如果你想同时使用邮箱和其他应用的通知方式，则删除数组中对应的应用程序名称，例如微信 (wechat)，然后保存重启 &lt;code&gt;waline&lt;/code&gt;  服务即可&lt;/p&gt;
&lt;p&gt;我目前遇到的就这几个问题，如果大家在使用中遇到其它问题，欢迎留言一起讨论&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2024/08/16/ShokaX%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/</guid>
            <title>ShokaX搭建教程</title>
            <link>https://www.keeponline.cn/2024/08/16/ShokaX%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/</link>
            <pubDate>Fri, 16 Aug 2024 14:02:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1373.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;br /&gt;
 之前的服务器到期了，续费有点贵，摸了摸口袋，发现口袋已经穿了个大洞，就不打算续费了 -_-&lt;/p&gt;
&lt;p&gt;无奈只好注册一个新的云服务器平台账户，薅一下新用户羊毛，先短期过渡一下吧&lt;/p&gt;
&lt;p&gt;刚好前段时间也经常有小伙伴问我这个博客是怎么搭建的，我就顺便把这次搭建部署的过程记录一下，感兴趣的小伙伴也可以自己尝试搭建一个&lt;/p&gt;
&lt;p&gt;这里先声明一下，我之前的博客是用 Hexo 搭建的，用的是  &lt;code&gt;Shoka&lt;/code&gt;  这个主题，但是这个主题的作者因学业和工作的原因已经停更很久了，导致该项目存在许多 &lt;strong&gt;bug&lt;/strong&gt; 和兼容性问题无人处理，本人已经不推荐大家继续使用  &lt;code&gt;Shoka&lt;/code&gt;  了&lt;/p&gt;
&lt;p&gt;这次我会以  &lt;code&gt;ShokaX&lt;/code&gt;  作为主题，  &lt;code&gt;ShokaX&lt;/code&gt;  是基于  &lt;code&gt;Shoka&lt;/code&gt;  的二次开发项目，该项目成立的目的就是为了解决  &lt;code&gt;Shoka&lt;/code&gt;  遗留下来的问题，下面是  &lt;code&gt;ShokaX&lt;/code&gt;  的官方简介&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1335.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;想了解更多关于  &lt;code&gt;ShokaX&lt;/code&gt;  的信息，请跳转到官方主页:&lt;a href=&#34;https://docs.kaitaku.xyz&#34;&gt;https://docs.kaitaku.xyz&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;前期准备&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#前期准备&#34;&gt;#&lt;/a&gt; 前期准备&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;一台本地客户端（Windows、Linux、MaxOS 均可）&lt;/li&gt;
&lt;li&gt;一台公网的云服务器&lt;/li&gt;
&lt;li&gt;一个公网域名（需要备案）&lt;br /&gt;
云服务器的操作系统并不是很重要，  &lt;code&gt;windows&lt;/code&gt;  和  &lt;code&gt;linux&lt;/code&gt;  都可以，但是推荐使用  &lt;code&gt;linux&lt;/code&gt;  , 我这边的云服务器和客户端均以  &lt;code&gt;ubuntu 22.04&lt;/code&gt;  作为本次演示的操作系统平台&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面简单说一下我们需要在客户端和云服务器都需要安装哪些应用服务&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;设备类型&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;操作系统&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;安装服务&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;服务说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;客户端&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Ubuntu&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;nodejs,shokax&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;用于本地运行博客框架&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;云服务器&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Ubuntu&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;nginx,mariadb,nodejs,waline&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;安装 web 服务器和 waline 评论系统&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id=&#34;客户端&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#客户端&#34;&gt;#&lt;/a&gt; 客户端&lt;/h1&gt;
&lt;h2 id=&#34;安装-nodejs&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#安装-nodejs&#34;&gt;#&lt;/a&gt; 安装 nodejs&lt;/h2&gt;
&lt;p&gt;首先，在自己的电脑上安装  &lt;code&gt;Node.js&lt;/code&gt;  运行环境，通过浏览器访问官网  &lt;code&gt;https://nodejs.org&lt;/code&gt; , 点击下载  &lt;code&gt;Node.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1336.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;下载完后解压文件，解压路径没有要求，例如我这里是解压到  &lt;code&gt;/opt&lt;/code&gt;  目录下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sudo tar xvf node-v20.16.0-linux-x64.tar.xz -C /opt/&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1337.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;添加环境变量使其生效，编辑家目录下的  &lt;code&gt;.bashrc&lt;/code&gt;  文件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;vi ~/.bashrc&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PATH=/opt/node-v20.16.0-linux-x64/bin/:$PATH #在文件末尾加上这条路径使 nodejs 生效&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1338.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;source ~/.bashrc #重新加载 bash 配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;node -v #查看 nodejs 版本信息，如果提示找不到 node 命令，表示环境变量没有生效或者你的 node 路径不对&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1339.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;看到命令能够正常执行，那么  &lt;code&gt;nodejs&lt;/code&gt;  的安装和配置就结束了&lt;/p&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;p&gt;如果你是  &lt;code&gt;windows&lt;/code&gt;  或  &lt;code&gt;MacOS&lt;/code&gt;  用户，请不必太过于担心，下载安装我相信你们是没有问题的，至于添加环境变量的话，自己到百度上搜一下就有很多教程了，问题不大&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&#34;安装-hexo-和-cnpm&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#安装-hexo-和-cnpm&#34;&gt;#&lt;/a&gt; 安装 hexo 和 cnpm&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;nodejs&lt;/code&gt;  安装完后，我们就可以使用  &lt;code&gt;npm&lt;/code&gt;  包管理工具了，首先安装  &lt;code&gt;hexo&lt;/code&gt;  博客框架&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;npm install -g hexo-cli #安装 hexo 命令行管理工具&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1340.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由于  &lt;code&gt;npm&lt;/code&gt;  下载都是走海外的源，下载灰常慢，这里我们安装一下淘宝团队开发的  &lt;code&gt;cnpm&lt;/code&gt;  来取代  &lt;code&gt;npm&lt;/code&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;npm install cnpm -g #安装 cnpm&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cnpm config set registry &lt;a href=&#34;https://registry.npmmirror.com/&#34;&gt;https://registry.npmmirror.com/&lt;/a&gt; #将 cnpm 源换成国内的淘宝源&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cnpm config get registry #查看当前的 cnpm 源&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1341.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装-shokax&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#安装-shokax&#34;&gt;#&lt;/a&gt; 安装 ShokaX&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;git clone &lt;a href=&#34;https://github.com/theme-shoka-x/shokax-can&#34;&gt;https://github.com/theme-shoka-x/shokax-can&lt;/a&gt; --depth=1&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;克隆项目到本地，如果你的电脑没有安装 git，还请先安装 git&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;cd shokax-can &amp;amp;&amp;amp; cnpm install&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;切换到项目目录并执行初始化操作&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1342.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;hexo s # 启动 hexo&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1343.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;启动后，打开浏览器访问 &lt;a href=&#34;http://localhost:4000&#34;&gt;http://localhost:4000&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1344.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到我们本地的博客就搭建好了，是不是觉得灰常简单&lt;/p&gt;
&lt;p&gt;后面我们把本地生成的博客目录  &lt;code&gt;public&lt;/code&gt;  拷贝到云服务器，用  &lt;code&gt;nginx&lt;/code&gt;  发布，这样大家都可以通过互联网访问到我们的博客了&lt;/p&gt;
&lt;h1 id=&#34;云服务器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#云服务器&#34;&gt;#&lt;/a&gt; 云服务器&lt;/h1&gt;
&lt;h2 id=&#34;nginx&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#nginx&#34;&gt;#&lt;/a&gt; Nginx&lt;/h2&gt;
&lt;p&gt;远程到我们的云服务器，安装  &lt;code&gt;nginx&lt;/code&gt;  服务&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;apt install nginx -y # 安装 nginx&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;systemctl enable nginx # 将 nginx 设置开机自启动&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mkdir /etc/nginx/cert # 创建数字证书存放目录，请将你的域名证书拷贝到这个目录&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1345.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;vi /etc/nginx/conf.d/www.conf # 创建 SSL 配置&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;span&gt;h&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;server &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    listen &lt;span class=&#34;token number&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    listen &lt;span class=&#34;token number&#34;&gt;443&lt;/span&gt; ssl http2&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    server_name keeponline.cn&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    root /home/git/blog&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$server_port&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;~ &lt;span class=&#34;token number&#34;&gt;443&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        rewrite ^&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;/.*&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;$ https://&lt;span class=&#34;token variable&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$1&lt;/span&gt; permanent&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# SSL setting&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ssl_certificate cert/www.keeponline.cn.pem&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ssl_certificate_key cert/www.keeponline.cn.key&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;MD5&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ssl_prefer_server_ciphers on&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ssl_session_cache shared:SSL:10m&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    ssl_session_timeout 10m&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    add_header Strict-Transport-Security &lt;span class=&#34;token string&#34;&gt;&#34;max-age=31536000&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# ShokaX Blog Location&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    location / &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        try_files &lt;span class=&#34;token variable&#34;&gt;$uri&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$uri&lt;/span&gt;/ /index.html&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# Waline Comment System Location&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    location /waline/ &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_pass http://127.0.0.1:8360/&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header Host &lt;span class=&#34;token variable&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header X-Real-IP &lt;span class=&#34;token variable&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header X-Forwarded-For &lt;span class=&#34;token variable&#34;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header X-Forwarded-Proto &lt;span class=&#34;token variable&#34;&gt;$scheme&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header REMOTE-HOST &lt;span class=&#34;token variable&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        add_header X-Cache &lt;span class=&#34;token variable&#34;&gt;$upstream_cache_status&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        add_header Cache-Control no-cache&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        expires 1h&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    location /api/ &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_pass http://127.0.0.1:8360/&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header Host &lt;span class=&#34;token variable&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header X-Real-IP &lt;span class=&#34;token variable&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header X-Fprwarded-For &lt;span class=&#34;token variable&#34;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header X-Forwarded-Proto &lt;span class=&#34;token variable&#34;&gt;$scheme&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        proxy_set_header REMOTE-HOST &lt;span class=&#34;token variable&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        add_header XCache &lt;span class=&#34;token variable&#34;&gt;$upstream_cache_status&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        add_header Cache-Control no-cache&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        expires 1h&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;p&gt;systemctl restart nginx # 重启 Nginx 服务，没有报错则说明配置没问题&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1381.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在云服务器安全组放行 tcp80、443 端口&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1347.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在浏览器中访问自己的域名，看看证书是否生效&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1348.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;到此，云服务器已经配置完毕，后续只需要在客户端上将  &lt;code&gt;shokax-can\public&lt;/code&gt;  目录下的所有文件拷贝到云服务器的  &lt;code&gt;web根目录&lt;/code&gt;  即可 (默认是 /usr/share/nginx/html/)&lt;/p&gt;
&lt;h2 id=&#34;推送测试&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#推送测试&#34;&gt;#&lt;/a&gt; 推送测试&lt;/h2&gt;
&lt;p&gt;回到本地客户端，进入  &lt;code&gt;shokax-can&lt;/code&gt;  根目录，执行  &lt;code&gt;hexo g&lt;/code&gt;  生成网站静态文件，所有网站静态文件存放在  &lt;code&gt;shokax-can\public&lt;/code&gt;  目录下&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1349.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;p&gt;这里可以看到执行  &lt;code&gt;hexo g&lt;/code&gt;  后有许多警告，我们暂时可以忽略这些警告，我会在后面告诉大家如何处理这些警告&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;使用  &lt;code&gt;rsync&lt;/code&gt;  命令将  &lt;code&gt;shokax-can\public&lt;/code&gt;  目录下的静态文件全部同步到云服务器的  &lt;code&gt;/usr/share/nginx/html/&lt;/code&gt;  目录下即可&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sudo rsync -avz public/* &lt;a href=&#34;mailto:root@keeponline.cn&#34;&gt;root@keeponline.cn&lt;/a&gt;:/usr/share/nginx/html/&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1350.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同步完后，在浏览器上重新访问我们的域名，应该就可以看到我们的博客内容了&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1351.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;后续我们只需要在本地客户端上编辑博客内容，编辑好后进入  &lt;code&gt;shokax-can&lt;/code&gt;  根目录，执行  &lt;code&gt;hexo g&lt;/code&gt;  生成网站静态文件，然后执行  &lt;code&gt;sudo rsync -avz public/* root@YourDomain:/usr/share/nginx/html/&lt;/code&gt;  这条命令，将新的内容同步到云服务器即可&lt;/p&gt;
&lt;h1 id=&#34;hexo-插件与优化&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#hexo-插件与优化&#34;&gt;#&lt;/a&gt; hexo 插件与优化&lt;/h1&gt;
&lt;p&gt;我们已经在客户端上搭建好  &lt;code&gt;hexo&lt;/code&gt;  博客和  &lt;code&gt;ShokaX&lt;/code&gt;  主题，后续我们只需要在本地客户端上编辑博客内容，编辑好后进入  &lt;code&gt;shokax-can&lt;/code&gt;  根目录，执行  &lt;code&gt;hexo g&lt;/code&gt;  重新生成网站静态文件，然后执行  &lt;code&gt;sudo rsync -avz public/* root@YourDomain:/usr/share/nginx/html/&lt;/code&gt;  这条命令，便可将新的内容同步到云服务器的 &lt;strong&gt;Web&lt;/strong&gt; 根目录下&lt;/p&gt;
&lt;p&gt;这里简单说几个  &lt;code&gt;hexo&lt;/code&gt;  常用的命令，执行以下  &lt;code&gt;hexo&lt;/code&gt;  命令必须确保我们在博客的根目录 (即 shokax-can)，否则命令会报错&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;hexo s # 启动本地博客，启动后可在本来浏览器访问博客内容&lt;/li&gt;
&lt;li&gt;hexo g # 生成网站静态文件，用于 web 服务器发布&lt;/li&gt;
&lt;li&gt;hexo cl # 清除本地生成的静态文件&lt;/li&gt;
&lt;li&gt;hexo algolia # 将博客中的内容（如文章标题、内容、标签等）上传到 Algolia 搜索引擎，并生成一个索引&lt;br /&gt;
我们暂时只需要记住这 4 个参数就可以&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;想了解更多  &lt;code&gt;hexo&lt;/code&gt;  的信息，请查看官网文档:&lt;a href=&#34;https://hexo.io/zh-cn/docs/&#34;&gt;https://hexo.io/zh-cn/docs/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;hexo-admin&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#hexo-admin&#34;&gt;#&lt;/a&gt; hexo-admin&lt;/h2&gt;
&lt;p&gt;我们搭建好博客之后，想要管理我们博客的内容，最简单的方法就是安装一个  &lt;code&gt;hexo-admin&lt;/code&gt;  插件，这样我们就可以通过浏览器增删改我们的博客内容&lt;/p&gt;
&lt;p&gt;首先切换到博客的根目录，输入下面命令开始安装  &lt;code&gt;hexo-admin&lt;/code&gt;  插件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cnpm install hexo-admin --save # 安装 hexo-admin 管理插件&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1352.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装完后，执行 hexo s 启动本地博客，在浏览器中通过 localhost:4000/admin/ 访问管理地址&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1353.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Posts 可以增删改博客文章内容&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pages 可以创建博客其它页面，例如 关于我、404 页面等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Settings 可以设置该管理页面需要账号密码验证后才能访问，点击 Setup authentification here 进入设置页面&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1354.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写你的账号密码，然后复制下面配置信息，添加到博客根目录的  &lt;code&gt;_config.yml&lt;/code&gt;  文件中即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1355.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;添加完毕后，重新启动项目，访问管理平台就会要求输入账号密码登陆了&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1356.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;告警排查&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#告警排查&#34;&gt;#&lt;/a&gt; 告警排查&lt;/h2&gt;
&lt;p&gt;在我们启动  &lt;code&gt;hexo&lt;/code&gt;  项目的时，可以看到有许多告警信息，我们一个一个解决&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prism&#39;s Diff Highlight plugin requires the Diff language definition (prism-diff.js).Make sure the language definition is loaded or use Prism&#39;s Autoloader plugin.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这是一个语法高亮插件的告警，大致意思是：我们的博客正在使用  &lt;code&gt;Prism&lt;/code&gt;  的  &lt;code&gt;Diff Highlight&lt;/code&gt;  插件，但是缺少必要的  &lt;code&gt;prism-diff.js&lt;/code&gt;  文件，这个问题我尝试过在  &lt;code&gt;JS&lt;/code&gt;  目录中添加  &lt;code&gt;prism-diff.js&lt;/code&gt;  文件，也尝试过加入  &lt;code&gt;Autoloader&lt;/code&gt;  插件，但是依然报警，知识盲区处理不了&lt;/p&gt;
&lt;p&gt;反正目前博客的语法高亮功能是正常的，既然无法从给出的提示解决问题，那么就把这个告警干掉吧，进入博客根目录，打开  &lt;code&gt;prism-diff-highlight.js&lt;/code&gt;  文件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vi node_modules/.store/prismjs@1.29.0/node_modules/prismjs/plugins/diff-highlight/prism-diff-highlight.js&lt;br /&gt;
 把告警代码注释掉即可&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1357.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;WARN [SXEC 201] Essential information(title, desc, lang, etc) config incorrectly, Page will render incorrectly&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;WARN The environment check found some problems that can lead to rendering errors, effect errors,&lt;/p&gt;
&lt;p&gt;performance degradation, not working correctly, etc&lt;/p&gt;
&lt;p&gt;WARN ShokaX has output them into console, read them to get more information. You can search error code in docs(For example, SXEC 101)&lt;/p&gt;
&lt;p&gt;根据报错信息找到对应的检测脚本，可以看到这个报错原因是配置文件中信息不完善导致告警&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1358.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;编辑博客根目录下的  &lt;code&gt;_config.yml&lt;/code&gt;  文件，完善下面这 &lt;strong&gt;5&lt;/strong&gt; 个信息即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1359.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;div class=&#34;note warning&#34;&gt;
&lt;p&gt;更改任何配置文件之前都要先备份，避免修改错了导致服务无法启动&lt;/p&gt;
&lt;/div&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;sinaimg blocked all request from outside website,so don&#39;t use this format&lt;br /&gt;
 从报错信息来看，这个是新浪图床禁止外部网站的访问&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;解决的方法也很简单，反正我们都有自己的云服务器了，建议将图片资源放在自己的云服务器上，删除主题中所有的外部图床链接，替换成本地的图片资源链接&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ShokaX&lt;/code&gt;  主题目录默认在博客根目录下的  &lt;code&gt;node_modules/hexo-theme-shokax&lt;/code&gt;  , 建议创建一个软链接到  &lt;code&gt;themes&lt;/code&gt;  目录下，方便以后管理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cd themes &amp;amp;&amp;amp; ln -s ../node_modules/hexo-theme-shokax shokax&lt;br /&gt;
 编辑主题目录下的  &lt;code&gt;_images.yml&lt;/code&gt;  文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1360.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;删除所有内容，添加自己的图片链接，把需要同步到云服务器的资源到  &lt;code&gt;shokax-can&lt;/code&gt;  根目录下的  &lt;code&gt;source&lt;/code&gt;  目录，这样每当我们执行  &lt;code&gt;hexo g&lt;/code&gt;  的时候，这些资源就会再  &lt;code&gt;public&lt;/code&gt;  目录下生成&lt;/p&gt;
&lt;p&gt;例如我将图片放在  &lt;code&gt;source\images&lt;/code&gt;  下，同步到云服务器后就可以通过  &lt;code&gt;https://xxx/images/xxx.jpg&lt;/code&gt;  访问对应的资源。这样我们就可以把地址改成自己的云服务器地址&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;需要注意，所有的链接前面都有一个 减号和空格！！！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1361.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;添加搜索功能&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#添加搜索功能&#34;&gt;#&lt;/a&gt; 添加搜索功能&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;到 algolia 官网注册一个账号 &lt;a href=&#34;https://www.algolia.com/&#34;&gt;https://www.algolia.com/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;登陆 algolia, 依次点击 Search - Index - New - Index, 填写 Index name （建议填写 shokaX）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1362.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;创建完毕后，点击左下角的 Settings - API Keys 查看你的 API Keys, 记录 appId、apiKey、adminApiKey 这三个信息&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1363.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1364.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑博客根目录下的 _config.yml 文件，在末尾加入以下内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;span&gt;h&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;algolia:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  appId: &lt;span class=&#34;token comment&#34;&gt;#Your appId&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  apiKey: &lt;span class=&#34;token comment&#34;&gt;#Your apiKey&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  adminApiKey: &lt;span class=&#34;token comment&#34;&gt;#Your adminApiKey&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  chunkSize: &lt;span class=&#34;token number&#34;&gt;5000&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  indexName: &lt;span class=&#34;token string&#34;&gt;&#34;shokaX&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  fields:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - title &lt;span class=&#34;token comment&#34;&gt;#必须配置&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - path &lt;span class=&#34;token comment&#34;&gt;#必须配置&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - categories &lt;span class=&#34;token comment&#34;&gt;#推荐配置&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - content:strip:truncate,0,2000&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - gallery&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - photos&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - tags&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1365.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;添加后保存关闭文件，在博客根目录下执行  &lt;code&gt;hexo algolia&lt;/code&gt;  便可以将博客的内容生成索引用于搜索&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1366.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;添加评论功能&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#添加评论功能&#34;&gt;#&lt;/a&gt; 添加评论功能&lt;/h2&gt;
&lt;p&gt;我之前博客用的评论插件是  &lt;code&gt;Valine&lt;/code&gt;  ，很可惜  &lt;code&gt;ShokaX&lt;/code&gt;  已经明确说明不会支持  &lt;code&gt;Valine&lt;/code&gt;  ，导致我之前博客上的评论无法迁移过来&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1367.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;不重要了，反正有原始数据，等自己有能力的时候再研究&lt;/p&gt;
&lt;p&gt;本次  &lt;code&gt;ShokaX&lt;/code&gt;  官网推荐的评论系统主要有两个，  &lt;code&gt;waline&lt;/code&gt;  和  &lt;code&gt;twikoo&lt;/code&gt;  , 我这里选择的是  &lt;code&gt;waline&lt;/code&gt;  , 部署  &lt;code&gt;waline&lt;/code&gt;  有 &lt;strong&gt;N&lt;/strong&gt; 种方式，但是我们已经有属于自己的云服务器了，所以我选择了独立部署&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1368.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;waline独立部署&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#waline独立部署&#34;&gt;#&lt;/a&gt; waline 独立部署&lt;/h2&gt;
&lt;p&gt;云服务器需要提前安装好  &lt;code&gt;nodejs&lt;/code&gt;  和  &lt;code&gt;cnpm&lt;/code&gt;  , 安装方法前面已经介绍过了，这里不多赘述&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;apt install mariadb-server -y # 安装 mariadb 数据库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;systemctl enable mariadb # 设置开机自启动&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mysql_secure_installation # 初始化数据库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git clone &lt;a href=&#34;https://github.com/loclink/waline-service.git&#34;&gt;https://github.com/loclink/waline-service.git&lt;/a&gt; # 拉取 waline 仓库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cd waline-service &amp;amp;&amp;amp; cnpm install # 进入项目目录并安装依赖&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cnpm run init:env # 初始化环境变量并生成.env 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vi .env # 编辑环境变量文件，添加数据库连接信息&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1369.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;
&lt;p&gt;cnpm run init:db # 初始化数据库&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1370.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cnpm run start # 启动项目&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1371.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在客户端博客根目录编辑 _config.shokax.yml 文件，添加以下内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;span&gt;h&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;waline:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  enable: &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 是否启用&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  serverURL: &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# waline 服务端地址，https://YourDomain/waline&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  lang: &lt;span class=&#34;token string&#34;&gt;&#34;zh-CN&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 评论界面语言&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  locale: &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 本地化替换，详见 waline 文档&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  emoji: &lt;span class=&#34;token comment&#34;&gt;# 表情包，默认为 waline 官方配置&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - https://unpkg.com/@waline/emojis@1.0.1/weibo&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - https://unpkg.com/@waline/emojis@1.0.1/alus&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - https://unpkg.com/@waline/emojis@1.0.1/bilibili&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - https://unpkg.com/@waline/emojis@1.0.1/qq&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - https://unpkg.com/@waline/emojis@1.0.1/tieba&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - https://unpkg.com/@waline/emojis@1.0.1/tw-emoji&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  meta: &lt;span class=&#34;token comment&#34;&gt;# 评论可以填写的项目&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - nick&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - mail&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - &lt;span class=&#34;token function&#34;&gt;link&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  requiredMeta: &lt;span class=&#34;token comment&#34;&gt;# 评论必须填写的项目&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - nick&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    - mail&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  wordLimit: &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 评论字数上限 (不建议为 0)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  pageSize: &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 每页显示评论条数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  pageview: &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 页面浏览量显示&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;11&#34;&gt;
&lt;li&gt;执行 hexo cl &amp;amp;&amp;amp; hexo g 后将用 Rsync 命令将 public 目录同步到云服务器的 web 根目录即可&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;waline 基本命令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;cnpm run start # 启动&lt;/li&gt;
&lt;li&gt;cnpm run stop # 停止&lt;/li&gt;
&lt;li&gt;cnpm run log # 查看日志&lt;/li&gt;
&lt;li&gt;cnpm run status # 查看运行状态&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;吐槽&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#吐槽&#34;&gt;#&lt;/a&gt; 吐槽&lt;/h1&gt;
&lt;p&gt;有一说一，独立部署  &lt;code&gt;waline&lt;/code&gt;  这块真的很多坑，  &lt;code&gt;serverURL&lt;/code&gt;  我看别人文档填的都是管理地址  &lt;code&gt;http://xxx:8360&lt;/code&gt;  , 我也就照着填，本地启动  &lt;code&gt;hexo&lt;/code&gt;  可以评论，但是部署到云服务器就不行&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1372.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;上网查了关于  &lt;code&gt;blocked:mixed-content&lt;/code&gt;  的解释，大致意思是浏览器阻止了  &lt;code&gt;https&lt;/code&gt;  站点请求非  &lt;code&gt;https&lt;/code&gt;  的资源，这是一种安全机制，旨在防止内容劫持和其它安全问题&lt;/p&gt;
&lt;p&gt;于是我就往  &lt;code&gt;nginx&lt;/code&gt;  配置加了反向代理，重启  &lt;code&gt;nginx&lt;/code&gt;  后反复测试结果依旧&lt;/p&gt;
&lt;p&gt;我在这个地方真的卡了很久，找了很多  &lt;code&gt;waline&lt;/code&gt;  的文档都没有这方面的具体说明，只知道大概是  &lt;code&gt;serverURL&lt;/code&gt;  地址的问题&lt;/p&gt;
&lt;p&gt;最后反复调教  &lt;code&gt;GPT&lt;/code&gt;  才知道这个  &lt;code&gt;serverURL&lt;/code&gt;  地址应该是填  &lt;code&gt;https://xxx/waline&lt;/code&gt;  ,  &lt;code&gt;nginx&lt;/code&gt;  配置中 &lt;code&gt;waline&lt;/code&gt;  的配置也需要修改成  &lt;code&gt;location /waline/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;目前  &lt;code&gt;waline&lt;/code&gt;  还有几个问题我没有时间去研究，例如部分文章阅读次数总是显示为 &lt;strong&gt;0&lt;/strong&gt;, 但是我在数据库中是可以看到统计次数的，就很奇怪&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1374.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;还有就是评论通知这些，等有空再研究，就先这样吧&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2024/07/06/PowerShell%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86/</guid>
            <title>PowerShell代码混淆</title>
            <link>https://www.keeponline.cn/2024/07/06/PowerShell%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86/</link>
            <category term="Windows" scheme="https://www.keeponline.cn/categories/Windows/" />
            <category term="Powershell" scheme="https://www.keeponline.cn/tags/Powershell/" />
            <pubDate>Sat, 06 Jul 2024 22:50:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-695.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;之前经常帮客户写一些需要特殊权限执行程序或者是访问指定资源的脚本，这种情况下，通常需要在脚本中包含敏感的账号信息或执行命令，这就存在很严重的敏感信息泄漏的风险&lt;/p&gt;
&lt;p&gt;因此，我必须确保即使某些用户在拥有正常权限查看这些脚本的情况下，也无法正常获取到明文的账号信息或是敏感的操作&lt;/p&gt;
&lt;p&gt;这里以一个简单的访问&lt;strong&gt; Windows 共享&lt;/strong&gt;的脚本作为加密混淆案例，我只演示混淆 &lt;code&gt;$username&lt;/code&gt;  和 &lt;code&gt;$password&lt;/code&gt;  这两行敏感数据，当然，你也可以针对整个脚本进行混淆，混淆的方法都是通用的，需要灵活搭配使用，&lt;strong&gt;1+1 远远大于 2&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 定义共享路径、用户名和密码&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$sharePath&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;\\192.168.80.129\ISO&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$username&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;bob&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$password&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;P@ssw0rd&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将密码转换为安全字符串&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$securePassword&lt;/span&gt; = &lt;span class=&#34;token function&#34;&gt;ConvertTo-SecureString&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$password&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;AsPlainText &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Force&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建凭据对象&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$credential&lt;/span&gt; = &lt;span class=&#34;token function&#34;&gt;New-Object&lt;/span&gt; System&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Management&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;Automation&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;PSCredential&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$username&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$securePassword&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用凭据连接到共享&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;New-PSDrive&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Name &lt;span class=&#34;token string&#34;&gt;&#34;P&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;PSProvider FileSystem &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Root &lt;span class=&#34;token variable&#34;&gt;$sharePath&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Credential &lt;span class=&#34;token variable&#34;&gt;$credential&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Persist&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;目前 &lt;code&gt;Powershell&lt;/code&gt;  网上出现混淆的方法有很多，我只简单介绍我自己比较常用的几种方式&lt;/p&gt;
&lt;h2 id=&#34;base64编码&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#base64编码&#34;&gt;#&lt;/a&gt; base64 编码&lt;/h2&gt;
&lt;p&gt;我看网上有很多人说 &lt;code&gt;base64&lt;/code&gt;  是一种加密方式，实际上 &lt;code&gt;base64&lt;/code&gt;  算不上加密，只是一种编码算法，并且该算法是公开可逆的，只能达到混淆的效果，任何情况下都不应该使用 &lt;code&gt;base64&lt;/code&gt;  作为敏感数据的加密手段&lt;/p&gt;
&lt;p&gt;在这个示例中，我们将需要用户名和密码的&lt;strong&gt;值&lt;/strong&gt;转化成 &lt;code&gt;base64&lt;/code&gt; , 然后通过 &lt;code&gt;[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String&lt;/code&gt;  命令解码，即可正常执行脚本&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1324.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;unicode编码&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#unicode编码&#34;&gt;#&lt;/a&gt; unicode 编码&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;unicode&lt;/code&gt;  编码需要在 &lt;code&gt;powershell 6.0&lt;/code&gt;  以上版本才支持，将需要加密字符转化成 &lt;code&gt;unicode&lt;/code&gt; ，用 &amp;quot;`u {unicode}&amp;quot; 便可以解码，由于&lt;strong&gt; ISE&lt;/strong&gt; 不支持&lt;strong&gt; 6.0&lt;/strong&gt; 以上版本，所以我直接在命令行中演示&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1326.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;ascii编码&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ascii编码&#34;&gt;#&lt;/a&gt; ASCII 编码&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ASCII&lt;/code&gt;  和 &lt;code&gt;Unicode&lt;/code&gt;  的编码原理一样，只是 &lt;code&gt;ASCII&lt;/code&gt;  默认使用的是&lt;strong&gt;十进制&lt;/strong&gt;，而 &lt;code&gt;Unicode&lt;/code&gt;  默认使用的是&lt;strong&gt;十六进制&lt;/strong&gt;， &lt;code&gt;ASCII&lt;/code&gt;  解码命令为 &lt;code&gt;[char]ASCII&lt;/code&gt; ，例如字母 &lt;code&gt;b&lt;/code&gt;  为 &lt;code&gt;[char]98&lt;/code&gt; , 如果需要解码多个字符，可以用  &lt;code&gt;-join&lt;/code&gt;  加  &lt;code&gt;ForEach-Object&lt;/code&gt;  将字符拼接&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1327.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;字符串拼接&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#字符串拼接&#34;&gt;#&lt;/a&gt; 字符串拼接&lt;/h2&gt;
&lt;p&gt;我们将变量中的字符串拆分成 N 段，然后再对变量字符进行拼接，也可以起到混淆的效果，当然，最终还是要配合编码混淆，不然意义不大&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1330.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;另外还可以对字符进行替换和分割，字符串的操作方法可太多了，希望感兴趣的小伙伴自行百度，这里就不多叙说了&lt;/p&gt;
&lt;h2 id=&#34;字母大小写和特殊字符混淆&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#字母大小写和特殊字符混淆&#34;&gt;#&lt;/a&gt; 字母大小写和特殊字符混淆&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;Windows&lt;/code&gt;  操作系统中，通常命令行中的命令和以及操作系统中的文件名字母是不区分大小写的，还有一些具有特殊含义的符号，这些机制我们都可以利用起来混淆代码，从而增加代码阅读难度让别人不能一眼就看出我们代码的原貌&lt;/p&gt;
&lt;p&gt;下面对一些特殊符号及其含义进行简单的说明，并以命令 &lt;code&gt;Write-Host &amp;quot;hello&amp;quot;&lt;/code&gt;  为混淆示例，混淆后命令依然可以正常执行&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;符号名&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;作用&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;混淆示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;单引号 &#39;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;创建一个文字字符串，字符串中的内容以原样输出，不解析变量&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;code&gt;W&#39;r&#39;ite-&#39;Host&#39; &amp;quot;hello&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;调用操作符 &amp;amp;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;用于运行命令或脚本&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;code&gt;&amp;amp;Write-Host &amp;quot;hello&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;反引号 `&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;反引号有多种用法，一般主要用于行续接和转义字符 `n`r`b`t`a`f`v, 其它没有特殊意义的字符系统会自动忽略反引号&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Wr`it`e-H`ost &amp;quot;h`el`lo&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;大括号 {}&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;{} 是脚本块，用于定义一段可以延迟执行或多次调用的代码，可以配合 &amp;amp; 执行脚本块中的命令&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;code&gt;&amp;amp;&amp;#123;Write-Host &amp;quot;hello&amp;quot;&amp;#125;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;空格&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;空格一般作为参数的分割副，正常情况下只需要一个空格，多个空格会系统会自动忽略&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Write-Host      &amp;quot;hello&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;小括号 ()&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;小括号可以用于改变运算符优先级和参数传递，也可以用于创建子表达式&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Write-Host (((&amp;quot;hello&amp;quot;)))&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1329.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;基础的混淆方法就写这么多吧，我也不想浪费大家时间看这些没有太大意义的基础教程，毕竟现在开源的混淆脚本一大堆，不管是混淆的效果还是效率都远比自己动手要好&lt;/p&gt;
&lt;h2 id=&#34;invoke-obfuscation&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#invoke-obfuscation&#34;&gt;#&lt;/a&gt; Invoke-Obfuscation&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Invoke-Obfuscation&lt;/code&gt;  是 &lt;code&gt;Github&lt;/code&gt;  上的一个开源的 &lt;code&gt;Powershell&lt;/code&gt;  加密混淆脚本，也是我目前最常用的加密混淆脚本&lt;/p&gt;
&lt;p&gt;使用方法也灰常简单，下载项目压缩包到本地并解压，从终端命令行进入到解压目录&lt;/p&gt;
&lt;p&gt;用 &lt;code&gt;Import-Module&lt;/code&gt;  命令导入 &lt;code&gt;Invoke-Obfuscation.psd1&lt;/code&gt;  脚本模块后，执行 &lt;code&gt;Invoke-Obfuscation&lt;/code&gt;  便可使用&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1331.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;输入 &lt;code&gt;tutorial&lt;/code&gt;  可以查看脚本使用说明&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1332.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Invoke-Obfuscation&lt;/code&gt;  的混淆方式有很多，这里我只简单的介绍 &lt;code&gt;ENCODING&lt;/code&gt;  的方法，还是以开头的脚本为例，加密  &lt;code&gt;$username&lt;/code&gt;  和  &lt;code&gt;$password&lt;/code&gt;  这两行敏感数据&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; scriptblock &lt;span class=&#34;token variable&#34;&gt;$username&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;bob&#34;&lt;/span&gt;  		&lt;span class=&#34;token comment&#34;&gt;# 设置你需要混淆的命令&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;encoding						  		 &lt;span class=&#34;token comment&#34;&gt;# 混淆模式我这边选择 encoding&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;4								  		 &lt;span class=&#34;token comment&#34;&gt;# 选择二进制编码混淆&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;copy&lt;/span&gt;							  		 &lt;span class=&#34;token comment&#34;&gt;# 复制混淆后的命令到剪切板&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; scriptblock &lt;span class=&#34;token variable&#34;&gt;$password&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;P@ssw0rd&#34;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# 设置你需要混淆的命令&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;encoding						   		&lt;span class=&#34;token comment&#34;&gt;# 混淆模式我这边选择 encoding&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;3								   		&lt;span class=&#34;token comment&#34;&gt;# 选择十进制编码混淆&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;copy&lt;/span&gt;							  		 &lt;span class=&#34;token comment&#34;&gt;# 复制混淆后的命令到剪切板&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1333.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后看看执行效果吧&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1334.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到混淆后脚本依然可以正常执行，如果你想了解更多 &lt;code&gt;Invoke-Obfuscation&lt;/code&gt;  的用法，可以到 &lt;code&gt;github&lt;/code&gt;  查看源项目&lt;/p&gt;
&lt;p&gt;Invoke-Obfuscation 项目地址:&lt;a href=&#34;https://github.com/danielbohannon/Invoke-Obfuscation&#34;&gt;https://github.com/danielbohannon/Invoke-Obfuscation&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;p&gt;写这篇文章的初衷并非是为了绕过某些安全防护，只是之前在工作上无法避免需要经常帮客户写一些相关的脚本，在这里分享一下自己的方法思路而已&lt;/p&gt;
&lt;/div&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2024/06/03/PowerShell%E8%84%9A%E6%9C%AC%E9%97%AE%E9%A2%98/</guid>
            <title>PowerShell脚本问题</title>
            <link>https://www.keeponline.cn/2024/06/03/PowerShell%E8%84%9A%E6%9C%AC%E9%97%AE%E9%A2%98/</link>
            <category term="Windows" scheme="https://www.keeponline.cn/categories/Windows/" />
            <category term="PowerShell" scheme="https://www.keeponline.cn/tags/PowerShell/" />
            <pubDate>Mon, 03 Jun 2024 22:40:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-695.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;前言&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#前言&#34;&gt;#&lt;/a&gt; 前言&lt;/h1&gt;
&lt;p&gt;最近在协助前东家实施一个 EPM 操作系统部署的项目，我主要帮忙编写相关自动化部署脚本，期间遇到两个比较有意思的脚本运行问题，在此记录一下，或许可以帮助到遇到同样问题的小伙伴&lt;/p&gt;
&lt;h1 id=&#34;invoke-webrequest下载慢&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#invoke-webrequest下载慢&#34;&gt;#&lt;/a&gt; invoke-webrequest 下载慢&lt;/h1&gt;
&lt;p&gt;其中有一个负责下载镜像和驱动的脚本文件，我是用了 &lt;code&gt;iwr&lt;/code&gt;  来下载，但是在实际运行时发现下载不能跑满速，下载驱动和镜像需要花费一个多小时&lt;/p&gt;
&lt;p&gt;老实说，我以前经常用 &lt;code&gt;iwr&lt;/code&gt;  下载文件，并没有发现这个问题，是因为我以前用来下载的都是小文件，毕竟以前用这个命令比较多的地方还是&lt;strong&gt;无文件落地&lt;/strong&gt;这方面，所以不会下载很大的文件&lt;/p&gt;
&lt;p&gt;我开始怀疑是不是因为 &lt;code&gt;iwr&lt;/code&gt;  命令的问题，但是后续我尝试了使用 &lt;code&gt;wget&lt;/code&gt;  下载也一样慢&lt;/p&gt;
&lt;p&gt;最后发现只需要将 &lt;code&gt;$ProgressPreference&lt;/code&gt;  变量的默认值  &lt;code&gt;Continue&lt;/code&gt;  更改成  &lt;code&gt;SilentlyContinue&lt;/code&gt;  即可满速下载&lt;/p&gt;
&lt;p&gt;本地测试一下更改前后的下载时间，下载一个 4G 左右的 win10 镜像，更改前用时 11 分钟&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1322.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;更改后，用时 18 秒&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1323.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最终测试最优解是用 &lt;code&gt;Start-BitsTransfer&lt;/code&gt;  命令下载大文件，下载速度要优于 &lt;code&gt;iwr&lt;/code&gt; ，且不需要更改 &lt;code&gt;$ProgressPreference&lt;/code&gt;  变量&lt;/p&gt;
&lt;p&gt;按照微软文档的描述， &lt;code&gt;$ProgressPreference&lt;/code&gt;  默认值为 &lt;code&gt;Continue&lt;/code&gt;  时，脚本命令会在当前窗口生成一个进度栏，以描述运行中脚本状态&lt;/p&gt;
&lt;p&gt;我不太明白如果仅仅是显示进度栏，应该不至于会导致下载速度变得如此之慢，具体的原因还是等以后自己有能力分析的时候再深入研究&lt;/p&gt;
&lt;p&gt;参考文档: &lt;a href=&#34;https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-7.4&#34;&gt;https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-7.4&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;在32位模式下运行64位应用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#在32位模式下运行64位应用&#34;&gt;#&lt;/a&gt; 在 32 位模式下运行 64 位应用&lt;/h1&gt;
&lt;p&gt;在安装完操作系统后，系统进入桌面后会自动调用安装驱动的脚本中，执行 &lt;code&gt;pnputil&lt;/code&gt;  命令的时候返回 &lt;code&gt;ObjectNotFound&lt;/code&gt; , 即使我指定绝对路径也不行&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 指定备份驱动程序文件夹的路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$backupFolderPath&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;c:\driver&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 获取备份文件夹中所有的 INF 文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$infFiles&lt;/span&gt; = &lt;span class=&#34;token function&#34;&gt;Get-ChildItem&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Path &lt;span class=&#34;token variable&#34;&gt;$backupFolderPath&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;Filter&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;*.inf&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;File &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Recurse&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 遍历并安装每个 INF 文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$infFile&lt;/span&gt; in &lt;span class=&#34;token variable&#34;&gt;$infFiles&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token comment&#34;&gt;# 安装驱动程序&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    pnputil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;add-driver&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$infFile&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;FullName &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;install&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1321.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;经过测试发现，EPM 模板默认调用的是&lt;strong&gt; 32 位&lt;/strong&gt;的 &lt;code&gt;powershell&lt;/code&gt;  执行脚本，所以才导致无法执行&lt;strong&gt; 64 位&lt;/strong&gt;的 &lt;code&gt;pnputil&lt;/code&gt;  命令，即使我写一个计划任务脚本，将这个安装驱动的脚本添加到计划任务中执行，结果也依然一样&lt;/p&gt;
&lt;p&gt;最终只能更改脚本内容，通过 &lt;code&gt;%windir%\Sysnative&lt;/code&gt; &lt;strong&gt; 虚拟目录&lt;/strong&gt;让&lt;strong&gt; 32 位&lt;/strong&gt;的 &lt;code&gt;powershell&lt;/code&gt;  执行&lt;strong&gt; 64 位&lt;/strong&gt;的 &lt;code&gt;powershell&lt;/code&gt;  再调用 &lt;code&gt;pnputil&lt;/code&gt;  命令安装驱动&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 指定备份驱动程序文件夹的路径&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$backupFolderPath&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;C:\driver\&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 获取备份文件夹中所有的 INF 文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$infFiles&lt;/span&gt; = &lt;span class=&#34;token function&#34;&gt;Get-ChildItem&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Path &lt;span class=&#34;token variable&#34;&gt;$backupFolderPath&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;Filter&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;*.inf&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;File &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Recurse&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 构建要在 64 位 PowerShell 中运行的命令&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$commands&lt;/span&gt; = @&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;foreach&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$infFile&lt;/span&gt; in &lt;span class=&#34;token variable&#34;&gt;$infFiles&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token variable&#34;&gt;$commands&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;pnputil.exe /add-driver `&#34;&lt;span class=&#34;token function&#34;&gt;$&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$infFile&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;FullName&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/span&gt;`&#34; /install&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将命令转换为字符串并以；进行分割&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$commandString&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$commands&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-join&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;; &#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建一个临时脚本文件来存储命令&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$tempScriptPath&lt;/span&gt; = &lt;span class=&#34;token namespace&#34;&gt;[System.IO.Path]&lt;/span&gt;::GetTempFileName&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;.ps1&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;Set-Content&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Path &lt;span class=&#34;token variable&#34;&gt;$tempScriptPath&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Value &lt;span class=&#34;token variable&#34;&gt;$commandString&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 64 位 PowerShell 执行临时脚本&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token variable&#34;&gt;$sysNativePath&lt;/span&gt; = &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$env&lt;/span&gt;:windir\Sysnative\WindowsPowerShell\v1.0\powershell.exe&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;Start-Process&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;FilePath &lt;span class=&#34;token variable&#34;&gt;$sysNativePath&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;ArgumentList &lt;span class=&#34;token string&#34;&gt;&#34;-ExecutionPolicy Bypass -File `&#34;&lt;span class=&#34;token variable&#34;&gt;$tempScriptPath&lt;/span&gt;`&#34;&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Wait&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除临时脚本文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;Path &lt;span class=&#34;token variable&#34;&gt;$tempScriptPath&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;参考文档: &lt;a href=&#34;https://learn.microsoft.com/zh-cn/windows/win32/winprog64/file-system-redirector&#34;&gt;https://learn.microsoft.com/zh-cn/windows/win32/winprog64/file-system-redirector&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2024/04/09/Linux%E7%9B%B4%E6%92%AD%E6%95%99%E7%A8%8B/</guid>
            <title>Linux直播教程</title>
            <link>https://www.keeponline.cn/2024/04/09/Linux%E7%9B%B4%E6%92%AD%E6%95%99%E7%A8%8B/</link>
            <category term="Linux" scheme="https://www.keeponline.cn/categories/Linux/" />
            <pubDate>Tue, 09 Apr 2024 14:02:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1288.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最近闲着无聊经常刷 B 站看直播，我就想着自己能不能也弄一个直播间玩玩，老实说，我个人对直播是没有任何的兴趣的，只是单纯的想知道在&lt;strong&gt; Linux&lt;/strong&gt; 平台直播会遇到哪些困难&lt;/p&gt;
&lt;h2 id=&#34;环境介绍&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#环境介绍&#34;&gt;#&lt;/a&gt; 环境介绍&lt;/h2&gt;
&lt;p&gt;该教程的直播平台为&lt;strong&gt; B 站&lt;/strong&gt;，我自己的电脑目前安装的操作系统是 &lt;strong&gt;Ubuntu 22.04&lt;/strong&gt;，为了验证&lt;strong&gt; Linux&lt;/strong&gt; 是否能够满足大多数人的直播需求，我会尽可能的给直播间添加各种常用插件和效果&lt;/p&gt;
&lt;p&gt;另外，我自己还有一些数码设备，例如 &lt;strong&gt;Switch 和手机平板等&lt;/strong&gt;， 顺便一起测试是否能够进行外设主机的直播&lt;/p&gt;
&lt;p&gt;为了录制某些 &lt;strong&gt;数码设备&lt;/strong&gt; 的画面，那么就需要购买一个采集卡设备，但是市面上支持&lt;strong&gt; Linux&lt;/strong&gt; 的采集卡设备并不是很多，通过一段时间的摸索了解，我最终选择了免驱动安装的 &lt;strong&gt;九音九视 UX20&lt;/strong&gt; 这个采集卡设备，这个采集卡有点小贵，心在滴血&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果是 Windows 的话，应该 200 块左右的采集卡就可以拿下了吧 ☹️&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;软件安装&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#软件安装&#34;&gt;#&lt;/a&gt; 软件安装&lt;/h2&gt;
&lt;p&gt;废话不多说，下面直接安装软件吧&lt;/p&gt;
&lt;h3 id=&#34;obs&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#obs&#34;&gt;#&lt;/a&gt; OBS&lt;/h3&gt;
&lt;p&gt;首先安装推流软件  &lt;code&gt;OBS&lt;/code&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; add-apt-repository ppa:obsproject/obs-studio&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;apt&lt;/span&gt; update&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;apt&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; ffmpeg obs-studio&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;安装完后运行  &lt;code&gt;OBS&lt;/code&gt;  查看是否正常&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1289.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;采集卡硬件测试&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#采集卡硬件测试&#34;&gt;#&lt;/a&gt; 采集卡硬件测试&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;OBS&lt;/strong&gt; 运行正常，现在测试一下采集卡跟数码设备是否能正常工作，将采集卡连接好电脑和数码设备&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Switch&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在&lt;strong&gt;源&lt;/strong&gt;中添加视频捕获设备&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1305.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;设备选择你的采集卡，如果设备连接正常的话，此时便可以看到 Switch 的画面&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1306.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Apple TV&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以同样的方式连接 &lt;strong&gt;Apple TV&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1307.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1308.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;IPAD&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;IPAD&lt;/strong&gt; 我并没有使用采集卡，因为我不想浪费钱购买一条数据线，我选择了安装&lt;strong&gt; UXPLAY&lt;/strong&gt;, 直接通过屏幕镜像投屏到电脑，然后在&lt;strong&gt; OBS&lt;/strong&gt; 上添加&lt;strong&gt;窗口捕获&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1318.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;iPhone&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;iPhone&lt;/strong&gt; 和&lt;strong&gt; IPAD&lt;/strong&gt; 一样通过&lt;strong&gt; UXPLAY&lt;/strong&gt; 投屏&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1319.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;vtude-studio&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#vtude-studio&#34;&gt;#&lt;/a&gt; Vtude Studio&lt;/h3&gt;
&lt;p&gt;这个人比较内向，并不打算露脸，所以我打算随便弄个数字人应付一下观众，这里我选择 &lt;code&gt;Vtude Studi&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Vtude Studi&lt;/code&gt;  是一个可以跟随网络摄像头和控制 Live2D 模型的软件，该软件可以通过 &lt;code&gt;Steam&lt;/code&gt;  免费下载，首先安装大家最喜欢的  &lt;code&gt;Steam&lt;/code&gt;  游戏平台&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;wget&lt;/span&gt; https://cdn.cloudflare.steamstatic.com/client/installer/steam.deb&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; ./steam.deb&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;安装完后运行 &lt;code&gt;Steam&lt;/code&gt;  进行更新，出现提示按 &lt;strong&gt;回车&lt;/strong&gt; 或 &lt;strong&gt;Y&lt;/strong&gt; 确定即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1290.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;整个更新过程大约 20 分钟左右，更新完后登陆 &lt;code&gt;Steam&lt;/code&gt; ，搜索  &lt;code&gt;Vtube Studio&lt;/code&gt;  并下载&lt;/p&gt;
&lt;p&gt;下载完后，选中 &lt;code&gt;Vtube Studio&lt;/code&gt;  右键菜单选择&lt;strong&gt;属性&lt;/strong&gt;，在&lt;strong&gt;兼容性&lt;/strong&gt;勾选&lt;strong&gt;强制使用 Steam Play 工具&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1291.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;p&gt;Proton 是由 V 社 (Valve Corpotation) 基于开源 Wine 项目开发的一个分支项目，它允许原先仅在 Windows 操作系统上运行的游戏，不需要任何修改就能在 Linux 操作系统上运行&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;如果  &lt;code&gt;Vtube Studio&lt;/code&gt;  没有运行报错，那么就可以进入正常显示的界面&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1293.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;openseeface&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#openseeface&#34;&gt;#&lt;/a&gt; OpenSeeFace&lt;/h3&gt;
&lt;p&gt;如果你希望你的虚拟形象可以根据摄像头捕获自己的面容动作并追随（例如&lt;strong&gt;眨眼、说话、头部摆动&lt;/strong&gt;），那么可以安装  &lt;code&gt;OpenSeeFace&lt;/code&gt;  这个软件实现&lt;/p&gt;
&lt;p&gt;首先安装 &lt;code&gt;python&lt;/code&gt;  环境并克隆项目到本地&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sudo&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;apt-get&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; python3 python3-pip python3-virtualenv &lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; clone https://github.com/emilianavt/OpenSeeFace&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1294.png&#34; alt=&#34;upload 4uccessful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;切换到项目根目录，创建 &lt;code&gt;python&lt;/code&gt;  虚拟环境，并安装必要的库&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;cd&lt;/span&gt; OpenSeeFace&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;virtualenv &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; python3 &lt;span class=&#34;token function&#34;&gt;env&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;source&lt;/span&gt; env/bin/activate&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;pip3 &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; onnxruntime opencv-python pillow numpy&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1296.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个启动脚本&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;python facetracker.py &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-W&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1280&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-H&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;720&lt;/span&gt; --discard-after &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; --scan-every &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; --no-3d-adapt &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; --max-feature-updates &lt;span class=&#34;token number&#34;&gt;900&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;--ip&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;127.0&lt;/span&gt;.0.1 &lt;span class=&#34;token parameter variable&#34;&gt;--port&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;11573&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1297.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;给脚本添加执行权限并运行，此时摄像头开始工作，如果摄像头检测到人脸，会在终端显示  &lt;code&gt;detect&lt;/code&gt;  字样&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1298.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;Vtube Studio&lt;/code&gt;  中启用面部捕抓，即可测试 &lt;code&gt;OpenSeeFace&lt;/code&gt;  是否正常工作&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1299.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;关于 &lt;strong&gt;Vtube Studio&lt;/strong&gt; 和 &lt;strong&gt;OpenSeeFace&lt;/strong&gt; 这两块内容，我主要是参考&lt;strong&gt; dollars0427&lt;/strong&gt; 大佬的文档，大佬的文档比我详细多了，如果对这两块内容感兴趣的小伙伴建议直接到下面文档查看 &lt;a href=&#34;https://sardo.work/2023/10/30/%E5%9C%A8linux%E4%B8%8A%E6%88%90%E7%82%BAvtuber%E5%90%A7%EF%BC%81vtube-studio%EF%BC%89/&#34;&gt;https://sardo.work/2023/10/30/%E5%9C%A8linux%E4%B8%8A%E6%88%90%E7%82%BAvtuber%E5%90%A7%EF%BC%81vtube-studio%EF%BC%89/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;blivechat&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#blivechat&#34;&gt;#&lt;/a&gt; Blivechat&lt;/h3&gt;
&lt;p&gt;如果想在直播间显示弹幕，可以用  &lt;code&gt;blivechat&lt;/code&gt;  这个项目实现&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先克隆项目到本地，由于使用了 git 子模块，clone 时需要加上 --recursive 参数：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;git clone --recursive https://github.com/xfgryujk/blivechat.git&lt;/code&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;编译前端和安装必要的模块（需要提前安装好 Node.js）：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;cd&lt;/span&gt; blivechat/frontend&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;npm&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;npm&lt;/span&gt; run build&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;pip3 &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt; requirements.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;运行服务并指定 host 和端口号：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;python3 main.py --host 127.0.0.1 --port 12345&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;成功运行后用浏览器打开  &lt;code&gt;http://localhost:12345&lt;/code&gt;  进行访问&lt;/p&gt;
&lt;p&gt;在&lt;strong&gt;首页 -- 常规 -- 房间&lt;/strong&gt;输入身份码&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1300.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以通过登陆  &lt;code&gt;https://play-live.bilibili.com/&lt;/code&gt;  查看自己的身份码&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1301.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填入&lt;strong&gt;身份码&lt;/strong&gt;后会自动生成&lt;strong&gt;房间 URL&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1302.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在&lt;strong&gt; OBS&lt;/strong&gt; 场景&lt;strong&gt;来源&lt;/strong&gt;添加&lt;strong&gt;浏览器&lt;/strong&gt;，并在&lt;strong&gt; URL&lt;/strong&gt; 中输入你的&lt;strong&gt;房间 URL&lt;/strong&gt; 就可添加弹幕，如果需要更改弹幕样式，则通过&lt;strong&gt;样式生成器&lt;/strong&gt;调整&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1304.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最终直播间效果如下&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1320.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;进阶玩法&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#进阶玩法&#34;&gt;#&lt;/a&gt; 进阶玩法&lt;/h2&gt;
&lt;p&gt;前面的教程已经可以满足普通用户的日常直播了，但是我前面也说过，我个人对直播是没有任何兴趣的，所以我想弄一个不需要真人参与的直播间，于是我又研究了一下 AI 直播间，并找到一个目前功能各方面都比较完善的开源 AI 虚拟主播项目 &lt;code&gt;AI Vtuber&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;简单看一下 &lt;code&gt;AI Vtuber&lt;/code&gt;  的架构&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1314.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;ai-vtuber&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ai-vtuber&#34;&gt;#&lt;/a&gt; AI Vtuber&lt;/h3&gt;
&lt;p&gt;克隆项目到本地&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git clone https://github.com/Ikaros-521/AI-Vtuber.git&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;克隆完毕后，切换到&lt;strong&gt; AI-Vtuber&lt;/strong&gt; 根目录，安装必要的模块库，整个过程大约一小时左右&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pip3 install -r requirements.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1309.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;安装 &lt;code&gt;AI Vtuber&lt;/code&gt;  会遇到一堆的模块下载安装报错和版本兼容性的问题，这个需要根据实际的报错排除&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1310.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1311.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;解决完依赖问题后，运行  &lt;code&gt;python3 webui.py&lt;/code&gt;  启动项目，此时应该还是会提示找不到&lt;strong&gt; xxx 模块&lt;/strong&gt;，还是根据具体情况安装缺少的模块，直至正常启动&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1312.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;正常启动后，可以通过浏览器输入 &lt;strong&gt;&lt;a href=&#34;http://localhost:8081&#34;&gt;http://localhost:8081&lt;/a&gt;&lt;/strong&gt; 访问控制台&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1313.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;进入控制台后就可以对&lt;strong&gt;大语言模型、文本转语音、虚拟身体、聊天&lt;/strong&gt;这些主要功能进行配置了&lt;/p&gt;
&lt;p&gt;配置完后，点击&lt;strong&gt;一键启动&lt;/strong&gt;，此时可以从控制台日志看到一条报错信息 &amp;quot;&lt;a href=&#34;http://main.py&#34;&gt;main.py&lt;/a&gt;: 1: python: not found&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1315.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;查看&lt;strong&gt;&lt;a href=&#34;http://webui.py&#34;&gt; webui.py&lt;/a&gt;&lt;/strong&gt; 代码，定位到 &lt;strong&gt;258 行&lt;/strong&gt;，找到下面这段代码&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1316.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;更改成  &lt;code&gt;process = subprocess.Popen([&amp;quot;python3&amp;quot;, f&amp;quot;main.py&amp;quot;], shell=False)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这样&lt;strong&gt;一键启动&lt;/strong&gt;后就可以正常运行&lt;strong&gt;&lt;a href=&#34;http://main.py&#34;&gt; main.py&lt;/a&gt;&lt;/strong&gt;，但是依然会有一堆模块报错问题&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1317.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;尽可能的安装对应的模块版本，有些模块不支持&lt;strong&gt; linux&lt;/strong&gt; 的话，可以把相关代码注释掉，老实说，在&lt;strong&gt; linux&lt;/strong&gt; 下体验非常差，如果真的想玩这个项目，还是选择&lt;strong&gt; Windows&lt;/strong&gt; 操作系统吧&lt;/p&gt;
&lt;p&gt;&lt;code&gt;AI Vtuber&lt;/code&gt;  是一个非常庞大的开源项目集合，有些最新版的模块名、API 和方法都已经有所变化，所以才会有一堆兼容性和报错的问题，我目前也只还停留在摸索阶段，没办法教大家如何使用，建议大家直接查看作者的在线文档和视频学习&lt;/p&gt;
&lt;p&gt;在线文档:&lt;a href=&#34;https://luna.docs.ie.cx/&#34;&gt;https://luna.docs.ie.cx/&lt;/a&gt;&lt;br /&gt;
 视频教程:&lt;a href=&#34;https://space.bilibili.com/3709626/channel/collectiondetail?sid=1422512&#34;&gt;https://space.bilibili.com/3709626/channel/collectiondetail?sid=1422512&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#总结&#34;&gt;#&lt;/a&gt; 总结&lt;/h2&gt;
&lt;p&gt;这篇文档总结了我自己对网络直播所知道的所有知识点，总体来说在&lt;strong&gt; Linux&lt;/strong&gt; 平台下进行直播并没有太大问题，但是&lt;strong&gt; Winodws&lt;/strong&gt; 直播的可玩性和扩展性肯定会更好，我自己也尝试直播了两天，实在是感觉没啥意思，后续应该不会再研究了这块内容了吧&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/12/31/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E6%9C%B1%E7%B4%AB%E6%9C%BA%E5%99%A8%E4%BA%BA/</guid>
            <title>宝可梦朱紫机器人</title>
            <link>https://www.keeponline.cn/2023/12/31/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E6%9C%B1%E7%B4%AB%E6%9C%BA%E5%99%A8%E4%BA%BA/</link>
            <category term="Github" scheme="https://www.keeponline.cn/categories/Github/" />
            <category term="Switch" scheme="https://www.keeponline.cn/tags/Switch/" />
            <pubDate>Sun, 31 Dec 2023 22:57:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1287.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;前言&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#前言&#34;&gt;#&lt;/a&gt; 前言&lt;/h1&gt;
&lt;p&gt;在前面的&lt;strong&gt; Switch 破解&lt;/strong&gt;这篇文章中我有提到过:&amp;quot; 我研究&lt;strong&gt; Switch 破解&lt;/strong&gt;的初衷是因为我知道有人可以通过 &lt;strong&gt;Discord&lt;/strong&gt; 和 &lt;strong&gt;DoDo&lt;/strong&gt; 机器人实现宝可梦的魔法交换，这一点让我感到很新奇 &amp;quot;，但是网上关于宝可梦交换机器人的教程实在是太少了，自己也是四处碰壁才了解到一些皮毛，在这里我将自己所知道的关于宝可梦机器人知识都总结在此，希望可以帮助更多喜欢宝可梦的玩家&lt;/p&gt;
&lt;h1 id=&#34;准备工作&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#准备工作&#34;&gt;#&lt;/a&gt; 准备工作&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;一台已破解的 Switch 设备 	（软硬破皆可）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如何破解 Switch 请参考这篇文章 &lt;a href=&#34;https://www.keeponline.cn/2023/11/29/Switch-%E7%A0%B4%E8%A7%A3/&#34;&gt;Switch 破解&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;任天堂 online 会员账号			 (宝可梦联机交换必须要加入任天堂会员)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;众所周知，任天堂所有游戏联机功能都需要加入任天堂会员才能使用，淘宝拼个家庭会员一年 40 左右&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;正版宝可梦朱紫游戏		（卡带或数字版皆可）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里有人可能会问，我&lt;strong&gt; Switch&lt;/strong&gt; 都破解了，为什么还要用正版宝可梦游戏？&lt;/p&gt;
&lt;p&gt;你自己一个人单机玩盗版改存档这些不需要有正版游戏，但是你都要联网了和别人进行宝可梦交换了，你敢玩盗版？&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;注册 DoDo 开发者平台&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;需要&lt;strong&gt; DoDo&lt;/strong&gt; 开发者平台注册一个开发账号，通过输入自己的手机号码，然后获取验证码&lt;/p&gt;
&lt;p&gt;注册地址: &lt;a href=&#34;https://doker.imdodo.com/login&#34;&gt;https://doker.imdodo.com/login&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1264.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;一台安装  &lt;code&gt;Windows 10 21H1&lt;/code&gt;  以上版本的电脑，下载并安装 &lt;a href=&#34;https://aka.ms/dotnet-core-applaunch?missing_runtime=true&amp;amp;arch=x64&amp;amp;rid=win-x64&amp;amp;os=win10&amp;amp;apphost_version=8.0.0&amp;amp;gui=true&#34;&gt;.NET 8.0 Desktop Runtime&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;否则运行下面的项目会报错&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1272.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;自动化机器人&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#自动化机器人&#34;&gt;#&lt;/a&gt; 自动化机器人&lt;/h1&gt;
&lt;h2 id=&#34;sys-botbase介绍&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#sys-botbase介绍&#34;&gt;#&lt;/a&gt; sys-botbase 介绍&lt;/h2&gt;
&lt;p&gt;据我了解，目前所有&lt;strong&gt; Switch 自动化&lt;/strong&gt;操作的机器人基本都是通过&lt;strong&gt; sys-botbase&lt;/strong&gt; 这个项目实现，&lt;strong&gt;sys-botbase&lt;/strong&gt; 这个项目最初版本是叫 &lt;strong&gt;sys-netcheat&lt;/strong&gt;, 是一个适用于&lt;strong&gt; Switch 大气层系统&lt;/strong&gt;的开源作弊器&lt;/p&gt;
&lt;p&gt;其原理很简单，用户需要将&lt;strong&gt; sys-netcheat&lt;/strong&gt; 安装在一台已破解的&lt;strong&gt; Switch&lt;/strong&gt; 上并运行，然后在计算机上使用&lt;strong&gt; nc&lt;/strong&gt; 或&lt;strong&gt; telnet&lt;/strong&gt; 与其进行端口通信，便可以在当前计算机中远程读取运行在这台&lt;strong&gt; Switch&lt;/strong&gt; 上的游戏内存数据，并且用户可以修改这些内存数据，如果你之前有在&lt;strong&gt; Windows&lt;/strong&gt; 上使用过&lt;strong&gt; Cheat Engine&lt;/strong&gt;, 那么我相信你会非常容易上手并理解它的运行原理&lt;/p&gt;
&lt;p&gt;从该项目的发布历史来看，&lt;strong&gt;sys-netcheat&lt;/strong&gt; 这个项目在 &lt;strong&gt;1.3.4&lt;/strong&gt; 版本后停止更新了很长一段时间，后续作者直接发布了 1.7 版本，并改名为 &lt;strong&gt;sys-botbase&lt;/strong&gt;，宣称已计划为该项目添加 &lt;strong&gt;模拟按键&lt;/strong&gt; 和 &lt;strong&gt;模拟屏幕触控&lt;/strong&gt; 等其它功能，可以用于帮助用户创建有趣的自动化机器人，而不再是单纯的修改游戏数据&lt;/p&gt;
&lt;p&gt;如果你需要了解该项目更多的信息，请跳转到&lt;strong&gt; sys-botbase&lt;/strong&gt; 项目地址：&lt;a href=&#34;https://github.com/olliz0r/sys-botbase&#34;&gt;https://github.com/olliz0r/sys-botbase&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装sys-botbase&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#安装sys-botbase&#34;&gt;#&lt;/a&gt; 安装 sys-botbase&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;sys-botbase&lt;/strong&gt; 的安装灰常简单，你仅需要到该项目最后发布的地址 &lt;a href=&#34;https://github.com/olliz0r/sys-botbase/releases&#34;&gt;https://github.com/olliz0r/sys-botbase/releases&lt;/a&gt; 下载最新的&lt;strong&gt; zip 压缩包&lt;/strong&gt;即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1265.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;解压后应该是一个名为 &lt;strong&gt;atmosphere&lt;/strong&gt; 的文件夹目录，复制这个目录，拷贝到你的&lt;strong&gt; SD 卡根目录&lt;/strong&gt;，选择覆盖即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1266.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果你是在&lt;strong&gt; Switch 关机状态&lt;/strong&gt;下，取出 SD 卡进行拷贝，拷贝完插入 SD 卡开机即可&lt;/p&gt;
&lt;p&gt;如果你是在开机状态下，通过数据线拷贝到&lt;strong&gt; Switch&lt;/strong&gt; 的 SD 卡的话，那么请重启一下你的&lt;strong&gt; Switch&lt;/strong&gt;, 请选择进入&lt;strong&gt;大气层真实系统&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果&lt;strong&gt; sys-botbase&lt;/strong&gt; 正在运作的话，开机进入&lt;strong&gt;大气层系统&lt;/strong&gt;后，&lt;strong&gt;右 Joycon&lt;/strong&gt; 的&lt;strong&gt; Home 键&lt;/strong&gt;会&lt;strong&gt;闪烁蓝灯&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1270.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;sys-botbase测试&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#sys-botbase测试&#34;&gt;#&lt;/a&gt; sys-botbase 测试&lt;/h2&gt;
&lt;p&gt;接下来验证&lt;strong&gt; sys-botbase&lt;/strong&gt; 是否正常工作，先将&lt;strong&gt; Switch&lt;/strong&gt; 连接网络，连接后记录&lt;strong&gt; Switch&lt;/strong&gt; 的&lt;strong&gt; IP 地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1267.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;用 python 模拟基本按键输入&lt;/p&gt;
&lt;figure class=&#34;highlight python&#34;&gt;&lt;figcaption data-lang=&#34;python&#34;&gt;&lt;span&gt;n&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; socket&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; time&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Make sure to append &#34;\r\n&#34; to the end of every command to ensure arg are parsed correctly&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;sendCommand&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; content&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    content &lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;\r\n&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    s&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sendall&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;content&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;encode&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# sys-botbase port is compiled for 6000&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;s &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; socket&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;socket&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;socket&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;AF_INET&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; socket&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;SOCK_STREAM&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;s&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;connect&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;192.168.50.171&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;6000&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Analog inputs&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;sendCommand&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;click B&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;time&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sleep&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;sendCommand&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;click Y&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;time&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sleep&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;sendCommand&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;click DDOWN&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;time&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sleep&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;sendCommand&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;click A&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;time&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sleep&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;sendCommand&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;click X&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;time&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sleep&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;sendCommand&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;click DUP&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;time&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sleep&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;sendCommand&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;click DLEFT&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;time&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sleep&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;sendCommand&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;click DRIGHT&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;time&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;sleep&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;进入	&lt;strong&gt;Switch&lt;/strong&gt; 设置中 &lt;strong&gt;手柄与感应器&lt;/strong&gt;，选择&lt;strong&gt;检查输入设备&lt;/strong&gt;，然后选择&lt;strong&gt;检查按键&lt;/strong&gt;，接下来运行脚本验证是否能够自动输入&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1268.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到&lt;strong&gt; sys-botbase&lt;/strong&gt; 运行良好，那么现在我猜你应该可以想到一些基础的玩法了吧，像游戏中一些重复性的任务，我们就可以加个&lt;strong&gt; while&lt;/strong&gt; 循环让脚本重复执行，例如&lt;strong&gt;塞尔达传说&lt;/strong&gt;刷道具又或者是&lt;strong&gt;宝可梦&lt;/strong&gt;日常孵蛋刷步数&lt;/p&gt;
&lt;p&gt;Okay,&lt;strong&gt;sys-botbase&lt;/strong&gt; 就介绍到这样，后面我再介绍&lt;strong&gt;交换机器人&lt;/strong&gt;和&lt;strong&gt;寻坑机器人&lt;/strong&gt;，这两个机器人都是在&lt;strong&gt; sys-botbase&lt;/strong&gt; 的基础上延伸其玩法，希望有能力的大佬可以开发更多好玩的机器人  &lt;code&gt;^_^&lt;/code&gt;&lt;/p&gt;
&lt;h1 id=&#34;交换机器人&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#交换机器人&#34;&gt;#&lt;/a&gt; 交换机器人&lt;/h1&gt;
&lt;h2 id=&#34;sysbotnet介绍&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#sysbotnet介绍&#34;&gt;#&lt;/a&gt; SysBot.NET 介绍&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://SysBot.NET&#34;&gt;SysBot.NET&lt;/a&gt;&lt;/strong&gt; 这个项目是由&lt;strong&gt; kwsch 大佬&lt;/strong&gt;创建的，可能有人会不知道这位大佬的名字，但是玩宝可梦的玩家应该都知道&lt;strong&gt; PKHex&lt;/strong&gt; 这个宝可梦系列游戏存档编辑器工具吧，这个工具就是由&lt;strong&gt; kwsch 大佬&lt;/strong&gt;开发的，但是&lt;strong&gt; PKHex&lt;/strong&gt; 并不是本次讨论的主要重点，我接着说 &lt;strong&gt;&lt;a href=&#34;http://SysBot.NET&#34;&gt;SysBot.NET&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://SysBot.NET&#34;&gt;SysBot.NET&lt;/a&gt;&lt;/strong&gt; 主要是利用&lt;strong&gt; sys-botbase&lt;/strong&gt; 与&lt;strong&gt; Switch&lt;/strong&gt; 主机进行通信，然后通过对接&lt;strong&gt; Discord&lt;/strong&gt; 机器人自定义的逻辑功能实现远程控制和自动化操作，下载项目后用&lt;strong&gt; Visual Studio&lt;/strong&gt; 打开，这里对其主要的类进行一个简单说明:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1271.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SysBot.Base 提供了与 sys-botbase 的连接和交互功能，包括同步和异步的连接类。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SysBot.Pokemon 项目则构建在 SysBot.Base 之上，实现了针对特定游戏（例如宝可梦剑 / 盾）的自动化功能，包括魔法交换、在线交换、闪光蛋寻找等功能，目前已知朱紫可以实现自动开启太晶坑、宝可梦交换、创建集友圈刷任务等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SysBot.Pokemon.WinForms 提供了一个简单的 GUI 界面，用于方便地启动和管理宝可梦机器人。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SysBot.Pokemon.Discord 提供了一个 Discord 接口，允许用户通过 Discord 与宝可梦机器人进行远程交互。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SysBot.NET 项目地址：&lt;a href=&#34;https://github.com/kwsch/SysBot.NET&#34;&gt;https://github.com/kwsch/SysBot.NET&lt;/a&gt;&lt;br /&gt;
 更多信息可以参考作者 Wiki: &lt;a href=&#34;https://github.com/kwsch/SysBot.NET/wiki&#34;&gt;https://github.com/kwsch/SysBot.NET/wiki&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;sysbotnet搭建&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#sysbotnet搭建&#34;&gt;#&lt;/a&gt; SysBot.NET 搭建&lt;/h2&gt;
&lt;p&gt;由于&lt;strong&gt; kwsch 大佬&lt;/strong&gt;的项目仅支持海外的社交软件，在国内不会翻墙根本用不了，这里我们用国内大佬&lt;strong&gt; easyworld&lt;/strong&gt; 的 &lt;strong&gt;&lt;a href=&#34;http://SysBot.NET&#34;&gt;SysBot.NET&lt;/a&gt;&lt;/strong&gt; 项目，&lt;strong&gt;easyworld 大佬&lt;/strong&gt;在源项目中添加了&lt;strong&gt; DoDo、BiliBili 和 QQ&lt;/strong&gt; 这几款软件的支持，并且有详细的中文搭建指南&lt;/p&gt;
&lt;p&gt;由于&lt;strong&gt; easyworld 大佬&lt;/strong&gt;提供的搭建文档已经非常完善了，所以我也不打算重复叙说，大家按照大佬的文档下载项目，然后下载并安装&lt;strong&gt; Visual Studio&lt;/strong&gt;，安装 &lt;strong&gt;.NET 桌面开发环境&lt;/strong&gt;，最后打开项目按照文档要求&lt;strong&gt;修改&lt;/strong&gt;一下项目&lt;strong&gt;设置&lt;/strong&gt;，生成可执行程序即可&lt;/p&gt;
&lt;p&gt;SysBot.NET 项目地址: &lt;a href=&#34;https://github.com/easyworld/SysBot.NET&#34;&gt;https://github.com/easyworld/SysBot.NET&lt;/a&gt;&lt;br /&gt;
DoDo 机器人搭建官方指南: &lt;a href=&#34;https://docs.qq.com/doc/DSVVZZk9saUNTeHNn&#34;&gt;https://docs.qq.com/doc/DSVVZZk9saUNTeHNn&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你按照大佬的文档在搭建中遇到问题无法解决可留言给我，我可以在该文章中加入对应问题的解决方案&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;sysbot测试&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#sysbot测试&#34;&gt;#&lt;/a&gt; SysBot 测试&lt;/h2&gt;
&lt;p&gt;运行&lt;strong&gt; SysBot.exe&lt;/strong&gt; 主程序，会在当前目录生成一个 &lt;code&gt;config.json&lt;/code&gt;  文件，用文本编辑器打开，开头的    &lt;code&gt;&amp;quot;Mode&amp;quot;: 4,&lt;/code&gt;  表示当前版本为朱紫，请根据你的游戏版本修改对应的数字&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1：剑盾&lt;/li&gt;
&lt;li&gt;2：晶灿钻石明亮珍珠&lt;/li&gt;
&lt;li&gt;3：传说阿尔宙斯&lt;/li&gt;
&lt;li&gt;4：朱紫&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1273.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在主程序的 &lt;strong&gt;Hub&lt;/strong&gt; 菜单找到 &lt;strong&gt;Integration&lt;/strong&gt;, 找到&lt;strong&gt; Dodo&lt;/strong&gt;, 填写你的&lt;strong&gt; Dodo&lt;/strong&gt; 机器人 &lt;code&gt;ClientId&lt;/code&gt; 、 &lt;code&gt;Token&lt;/code&gt;  和 &lt;code&gt;ChannelId&lt;/code&gt;  信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1282.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;返回 &lt;strong&gt;Bots&lt;/strong&gt; 主界面，填写你的&lt;strong&gt; Switch IP&lt;/strong&gt; 地址，设置模式选择  &lt;code&gt;LinkTrader&lt;/code&gt; , 然后点&lt;strong&gt; Add&lt;/strong&gt; 添加即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1283.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后点击 &lt;strong&gt;StartAll&lt;/strong&gt; 启动机器人，如果一切正常，此时你的&lt;strong&gt; Dodo&lt;/strong&gt; 机器人会自动在你的频道发送消息提醒&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1284.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击&lt;strong&gt; Logs&lt;/strong&gt; 查看程序是否正确获取到游戏相关信息，如果启动有问题，请根据&lt;strong&gt; Logs&lt;/strong&gt; 的报错信息进行排查&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1285.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;启动成功后，我们就可以在&lt;strong&gt; Dodo&lt;/strong&gt; 频道中 &lt;code&gt;@机器人&lt;/code&gt; ，发送对应的指令进行宝可梦交换了，目前支持 3 种指令模式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;@机器人 中文 PS 代码&lt;/li&gt;
&lt;li&gt;@机器人 trade 标准 PS 代码&lt;/li&gt;
&lt;li&gt;直接在群里发对应版本的 pk 文件（pk8、pa8、pb8、pk9）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1286.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;中文 PS 代码文档参考: &lt;a href=&#34;https://docs.qq.com/doc/DSVlldkxMSW92VXZF&#34;&gt;https://docs.qq.com/doc/DSVlldkxMSW92VXZF&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;寻坑机器人&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#寻坑机器人&#34;&gt;#&lt;/a&gt; 寻坑机器人&lt;/h1&gt;
&lt;h2 id=&#34;raidcrawler简单介绍&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#raidcrawler简单介绍&#34;&gt;#&lt;/a&gt; RaidCrawler 简单介绍&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;RaidCrawler&lt;/strong&gt; 是由&lt;strong&gt; LegoFigure11 大佬&lt;/strong&gt;开源的一个&lt;strong&gt;宝可梦朱紫&lt;/strong&gt;太晶坑机器人，它可以读取地图上所有&lt;strong&gt;太晶坑&lt;/strong&gt;的数据，并自动扫描符合用户设置的&lt;strong&gt;太晶坑&lt;/strong&gt;数据，实现自动寻坑功能&lt;/p&gt;
&lt;p&gt;项目地址:&lt;a href=&#34;https://github.com/LegoFigure11/RaidCrawler/&#34;&gt;https://github.com/LegoFigure11/RaidCrawler/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;raidcrawler使用教程&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#raidcrawler使用教程&#34;&gt;#&lt;/a&gt; RaidCrawler 使用教程&lt;/h2&gt;
&lt;p&gt;下载最新版本的 &lt;a href=&#34;https://github.com/LegoFigure11/RaidCrawler/releases&#34;&gt;RaidCrawlre.zip&lt;/a&gt; , 解压该文件，进入目录  &lt;code&gt;net8.0-windows\win-x64&lt;/code&gt; , 运行 &lt;code&gt;RaidCrawler.WinForms.exe&lt;/code&gt;  主程序&lt;/p&gt;
&lt;p&gt;点击 &lt;strong&gt;Edit Filters&lt;/strong&gt; 过滤器，顺便输入一个名字，勾选 &lt;code&gt;Shiny&lt;/code&gt;  表示只搜索闪光宝可梦，然后点击 &lt;strong&gt;Add Filter&lt;/strong&gt; 保存即可&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Stars&lt;/code&gt;  可以选择太晶坑的等级， &lt;code&gt;Gender&lt;/code&gt;  选择宝可梦性别， &lt;code&gt;Species&lt;/code&gt;  可以指定宝可梦，但是这样随机性太限制，可能需要刷很长时间&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1275.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;添加完过滤条件后，输入你的 &lt;strong&gt;Switch IP&lt;/strong&gt;, 点击&lt;strong&gt; Connect&lt;/strong&gt; 即可读取游戏数据&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1276.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;你可以手动点击查看每一个太晶坑的属性&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1277.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击  &lt;code&gt;Advance Deta&lt;/code&gt;  便可以自动通过更改设备日期刷新地图中所有太晶坑的数据&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1280.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;找到符合过滤器的宝可梦程序会自动停止&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1278.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击  &lt;code&gt;Open Map&lt;/code&gt;  查看对应宝可梦所在的太晶坑位置，前往指定位置挑战即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1279.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果你没有购买&lt;strong&gt; DLC&lt;/strong&gt;，那么还需要在设置中取消&lt;strong&gt;北上村&lt;/strong&gt;和&lt;strong&gt;篮之圆盘&lt;/strong&gt;的地图，避免扫描无效地图的太晶坑数据&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1281.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;关于宝可梦机器人的总结到此为止，希望大家玩得开心，我目前基本是弃游状态，期待下一代 &lt;code&gt;Pokemon Z-A&lt;/code&gt;  的表现&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/11/29/Switch-%E7%A0%B4%E8%A7%A3/</guid>
            <title>Switch 破解</title>
            <link>https://www.keeponline.cn/2023/11/29/Switch-%E7%A0%B4%E8%A7%A3/</link>
            <category term="Nintendo" scheme="https://www.keeponline.cn/categories/Nintendo/" />
            <category term="Switch" scheme="https://www.keeponline.cn/tags/Switch/" />
            <pubDate>Wed, 29 Nov 2023 14:12:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1261.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;一眨眼，已经度过了一年与 Switch 为伍的欢乐时光，从最初的懵逼小白到现在的新手入门，再从&lt;strong&gt;寻找塞尔达&lt;/strong&gt;到&lt;strong&gt;讨伐加侬多夫&lt;/strong&gt;，这一路的艰辛与汗水只有自己知道&lt;/p&gt;
&lt;p&gt;我一直想写一篇跟 Switch 相关的文章，但是却不知道写那方面的题材，想写游戏攻略，自己又玩得菜，想写游戏心得，好像我也没啥心得&lt;/p&gt;
&lt;p&gt;碰巧最近想研究 Switch 的破解，经过一段时间的痛苦摸索，总算是能够靠自己安装使用破解系统了，觉得这个还是可以写出来跟大家分享一下的&lt;/p&gt;
&lt;h1 id=&#34;前言&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#前言&#34;&gt;#&lt;/a&gt; 前言&lt;/h1&gt;
&lt;p&gt;在探讨&lt;strong&gt;破解&lt;/strong&gt;这个话题之前，我要明确一点，我坚决反对任何以牟利为目的的&lt;strong&gt;破解&lt;/strong&gt;行为。我研究 Switch 破解的初衷，仅仅是因为自己在玩宝可梦的时候，知道有人可以通过 &lt;code&gt;Discord&lt;/code&gt;  和 &lt;code&gt;DODO&lt;/code&gt;  机器人实现宝可梦的魔法交换，这一点让我感到很新奇，从而激发了我的探索欲望&lt;/p&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;p&gt;免责声明：用户对 Switch 的破解行为需要谨慎考虑，因破解造成的数据丢失和设备损坏请自行承担。在决定是否破解设备之前，建议详细了解&lt;strong&gt;任天堂&lt;/strong&gt;的相关法律法规、用户协议，并考虑潜在的后果。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&#34;相关术语&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#相关术语&#34;&gt;#&lt;/a&gt; 相关术语&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;FW（Firmware）固件，通常指固化在集成电路内部的程序代码，主要负责控制和协调集成电路的功能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OFW (Official Firmware) 官方固件，指官方提供未进过第三方修改的原始固件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CFW (Custom Firmware) 自定义固件，指用户自己开发或篡改过的固件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RCM (ReCovery Mode) 恢复模式，在该模式下可以访问内部数据，如备份升级系统&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Homebrew 指未经官方授权的软件，如自定义固件、工具、游戏和模拟器等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Atmosphere 大气层系统是 Github 上一个开源的第三方定制的 Switch 固件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sigpatch 可以禁用 Switch 系统对已安装程序的签名检查&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NAND 是 Switch 设备内置的存储介质&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SysNAND (System NAND) 系统内置存储，这里存放着 Switch 的正版操作系统&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EmuNAND (Emulated NAND) 仿真虚拟存储，这里的 EmuNAND 是通过克隆 SysNAND 的一个系统副本，运行在 SD 卡上，完全与正版系统隔离&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NSP 文件 是破解系统后通过 NXDumpTool 程序将 eShop 下载安装的数字版游戏导出来的游戏本体文件，在导出游戏本体前，你需要用 Lockpick_RCM 提取 prod.keys 和 title.keys，否则 NXDumpTool 无法正常解密导致导出失败，另外需要将游戏本体、升级补丁和 DLC 单独导出为独立的 NSP 文件，所以 NSP 通常会有多个文件，你必须先安装游戏本体，然后是升级补丁，最后再安装 DLC，这样才不容易安装出错&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;XCI 文件 是从实体游戏卡带导出来的游戏本体文件，与 NSP 不同的是，XCI 不需要授权许可即可安装使用，并且 XCI 通常会将升级补丁和 DLC 整合在一起，安装方便&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;破解类型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#破解类型&#34;&gt;#&lt;/a&gt; 破解类型&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Switch&lt;/strong&gt; 目前有四个版本:&lt;strong&gt; 普通版、lite 版、续航版、OLED&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;破解主要分为 &lt;strong&gt;软破&lt;/strong&gt; 和 &lt;strong&gt;硬破&lt;/strong&gt; 这两种，其中早期的&lt;strong&gt;普通版&lt;/strong&gt;可以&lt;strong&gt;软破&lt;/strong&gt;，其它版本只能&lt;strong&gt;硬破&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Switch 版本可以通过序列号区分，在此盗用一下 &lt;strong&gt;B 站 UP 菜圈在逃土狗&lt;/strong&gt; 的视频截图 &lt;strong&gt;(如侵权请联系)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1260.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;软破:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;早期的 &lt;strong&gt;Switch&lt;/strong&gt; 可以通过外接 &lt;strong&gt;注入器&lt;/strong&gt; 引导处理器进入 &lt;strong&gt;Recovery Mode （RCM）&lt;/strong&gt;，从而获取系统的控制权限，加载自制系统或程序达到破解效果。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1248.png&#34; alt=&#34;注入器&#34; /&gt;&lt;/p&gt;
&lt;p&gt;具体实现的原理是，初代&lt;strong&gt; Switch&lt;/strong&gt; 的&lt;strong&gt; CPU&lt;/strong&gt; 采用的是 &lt;code&gt;Nvidia Tegra X1 T210&lt;/code&gt;  芯片，该处理器的 &lt;code&gt;boot ROM&lt;/code&gt;  存在一个可进入&lt;strong&gt; Recovery Mode （RCM）&lt;strong&gt;的高危漏洞，在 Switch 通电之前，将右边 &lt;code&gt;joycon&lt;/code&gt;  连接口中的一个金属引脚&lt;/strong&gt;（pin10）&lt;strong&gt;与&lt;/strong&gt;（pin1,7,9）&lt;strong&gt;其一进行短接后，再按住&lt;/strong&gt;音量键 +&lt;/strong&gt; 时开机 ，Switch 就能进入 (&lt;strong&gt;RCM&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;这种通过外接 &lt;strong&gt;注入器&lt;/strong&gt; 破解的好处是不需要拆解设备，需要网购一个 &lt;strong&gt;注入器&lt;/strong&gt; 或者用电脑、手机安装注入软件和引导文件进行外接注入开机。坏处是这种通过短路注入的方式，在设备断电后便不生效，所以每次关机后，重新开机都需要拆卸 &lt;code&gt;Joycon&lt;/code&gt;  进行短接后，再通过外接 &lt;strong&gt;注入器&lt;/strong&gt; 才能重新进入破解系统&lt;/p&gt;
&lt;p&gt;目前能够&lt;strong&gt;软破&lt;/strong&gt;的设备都已面世 7 年之久，按照电子产品的寿命，这批设备都已经步入报废期了，这里不推荐大家再折腾&lt;strong&gt;软破&lt;/strong&gt;设备&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;硬破:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一批 Switch 被破解后，任天堂将后续的发布的 Switch 处理器替换成安全性更高的  &lt;code&gt;Nvidia Tegra X1 T214 &lt;/code&gt; , 虽然  &lt;code&gt;T214&lt;/code&gt;  修复了  &lt;code&gt;T210&lt;/code&gt;  的  &lt;code&gt;RCM&lt;/code&gt;  漏洞，但由于这两款处理器都是  &lt;code&gt;Tegra&lt;/code&gt;  的架构，其核心架构和指令集并没太多变化，最终还是被黑客找到了该处理器进入 &lt;strong&gt;RCM&lt;/strong&gt; 的办法。黑客通过拆机在处理器边上焊接自制芯片，该芯片在设备通电后主动向处理器发送特定的脉冲信号对其进行干扰，使其无法执行正常的预设指令，从而让处理器进入&lt;strong&gt; RCM&lt;/strong&gt; 获取其控制权限&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1249.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;硬坡&lt;/strong&gt;的好处是开机可以自动进入 &lt;code&gt;hekate&lt;/code&gt;  引导界面，由用户自行选择需要进入的系统。但是&lt;strong&gt;硬破&lt;/strong&gt;需要&lt;strong&gt;拆机&lt;/strong&gt;焊接芯片，会有一定的几率焊接失败，导致设备损坏的风险，手残党建议将这个步骤交给专业人士操作&lt;/p&gt;
&lt;h1 id=&#34;实战&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#实战&#34;&gt;#&lt;/a&gt; 实战&lt;/h1&gt;
&lt;p&gt;由于 &lt;strong&gt;软破&lt;/strong&gt; 设备早已停产，这里只以 &lt;strong&gt;硬破&lt;/strong&gt; 设备为例，焊接芯片这里不作赘述，我的硬实力不行，这步我也是找别人焊接的，下面假设你的设备已经焊接好破解芯片，我们直接进入安装破解系统的步骤&lt;/p&gt;
&lt;h2 id=&#34;sd卡准备&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#sd卡准备&#34;&gt;#&lt;/a&gt; SD 卡准备&lt;/h2&gt;
&lt;p&gt;首先，准备一张 &lt;strong&gt;128G&lt;/strong&gt; 以上容量的 &lt;strong&gt;SD 卡&lt;/strong&gt;，接入电脑，将其格式化成 &lt;strong&gt;FAT32&lt;/strong&gt; 文件系统格式&lt;/p&gt;
&lt;p&gt;我这里准备的是一张 &lt;strong&gt;256G&lt;/strong&gt; 的&lt;strong&gt; SD 卡&lt;/strong&gt;，由于我的是 &lt;strong&gt;ubuntu&lt;/strong&gt; 系统，相对还是麻烦一点， &lt;strong&gt;windows&lt;/strong&gt; 应该不用教了吧&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;df -hT # 查看当前的挂载点和文件系统类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;umount /media/bob/3937-6132 # 卸载当前的 TF 挂载点，否则无法格式化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sudo mkfs -t vfat /dev/sdb1 # 将 TF 卡 格式化成 FAT32 文件系统格式&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1245.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;大气层系统&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#大气层系统&#34;&gt;#&lt;/a&gt; 大气层系统&lt;/h2&gt;
&lt;p&gt;格式化完 &lt;strong&gt;SD 卡&lt;/strong&gt; 后，接下来就是将大气层系统写入到 &lt;strong&gt;SD 卡&lt;/strong&gt;，为了让这个步骤变得简单，我们可以找别人整理好的大气层系统，这些系统已经整合了&lt;strong&gt;固件、引导程序和常用的工具&lt;/strong&gt;，也就是常说的整合版&lt;/p&gt;
&lt;p&gt;这里以&lt;strong&gt; DeepSea&lt;/strong&gt; 整合包为例，&lt;strong&gt;DeepSea&lt;/strong&gt; 是由一群支持正版的玩家共同维护的开源项目，该整合包并不包含 &lt;code&gt;sigpatch签名补丁&lt;/code&gt; ，所以是无法安装运行盗版游戏的，&lt;strong&gt;如果你想通过破解系统游玩盗版游戏，请下载文章最后给出的整合包项目&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过下面地址下载并解压&lt;strong&gt; DeepSea&lt;/strong&gt; 整合包，将所有的文件拷贝到 &lt;strong&gt;SD 卡&lt;/strong&gt; 的根目录&lt;/p&gt;
&lt;p&gt;DeepSea： &lt;a href=&#34;https://github.com/Team-Neptune/DeepSea/releases&#34;&gt;https://github.com/Team-Neptune/DeepSea/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1246.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;strong&gt;SD 卡&lt;/strong&gt; 插入 &lt;strong&gt;Switch&lt;/strong&gt; 按开机键开机，即可进入 &lt;strong&gt;hekate&lt;/strong&gt; 引导界面&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1250.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以先通过右上角的 &lt;code&gt;Console Info&lt;/code&gt;  查看一些设备信息，例如  &lt;code&gt;HW &amp;amp; Fuses&lt;/code&gt;  查看 &lt;code&gt;SKU&lt;/code&gt;  型号和 &lt;code&gt;Burnt Fuses&lt;/code&gt;  的熔断数&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1251.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1252.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;第一次破解强烈建议对系统进行一次备份，按  &lt;code&gt;B&lt;/code&gt;  键返回主界面，点击上方的 &lt;code&gt;Tools&lt;/code&gt; , 然后点击 &lt;code&gt;Backup eMMC&lt;/code&gt;  对系统进行完整备份，整个备份过程在 10～20 分钟左右，备份路径为&lt;strong&gt; SD 卡&lt;/strong&gt;根目录的&lt;strong&gt; backup&lt;/strong&gt; 文件夹，请妥善保管好你的备份文件，据说后续可以用来&lt;strong&gt;救砖&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1253.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1254.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;备份完后，返回主界面，点击 &lt;code&gt;emuMMC&lt;/code&gt;  进入虚拟系统菜单，第一次进来 &lt;code&gt;emuMMC Info &amp;amp; Selection&lt;/code&gt;  下方应该是显示  &lt;code&gt;Disabled!&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1255.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;我们点击  &lt;code&gt;Create emuMMC&lt;/code&gt;  即可对源正版系统进行克隆，从而创建一个虚拟系统，也就是我们常说的大气层破解系统，点击后弹出对话框，让我们选择虚拟系统的创建类型，这里选择 &lt;code&gt;SD File&lt;/code&gt;  即可，整个系统的创建过程大约在 10～20 分钟左右，等待创建完成即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1256.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1257.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;完成后左边的 &lt;code&gt;emuMMC Info &amp;amp; Selection&lt;/code&gt;  下方将显示  &lt;code&gt;Enabled!&lt;/code&gt; ，此时我们的破解系统就完成了&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1258.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后回到主页，选择  &lt;code&gt;Launch&lt;/code&gt;  即可选择我们要启动的系统&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1259.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在这里我们可以看有三个系统选项，其中 &lt;code&gt;CFW(SYSNAND)&lt;/code&gt;  和 &lt;code&gt;Stock(SYSNAND)&lt;/code&gt;  调用的都是正版的操作系统，而 &lt;code&gt;CFW（EMUMMC）&lt;/code&gt; 则是运行在&lt;strong&gt; SD 卡&lt;/strong&gt;的虚拟系统，网络上大部分人会管这叫双系统，它们之间的区别我会在下面说明&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CFW(SYSNAND)&lt;/code&gt;  为真实系统破解状态，该系统调用的是正版系统，可以正常联网玩正版游戏，可以使用一些辅助插件提升游戏性能和修改游戏数据，&lt;strong&gt;但绝对不要在这个系统安装游玩盗版游戏&lt;/strong&gt;，虚拟真实系统是黑客破解的初衷，他们仅仅是为了摆脱官方的种种限制，充分发挥机器性能提升游戏画质、流畅度以及可玩性和可扩展性&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CFW（EMUMMC）&lt;/code&gt; 为大气层虚拟系统，这个系统运行在&lt;strong&gt; SD 卡&lt;/strong&gt;上，可以安装盗版游戏和各自辅助插件 (例如金手指)，可以联网，但是联网玩盗版游戏&lt;strong&gt;必 ban&lt;/strong&gt;，&lt;strong&gt;如果是为了玩盗版游戏就进该系统&lt;/strong&gt;，但是切忌&lt;strong&gt;不要联网&lt;/strong&gt;（尽管目前已经可以做到在虚拟系统屏蔽设备的真实序列号），也不要在该系统绑定你的任天堂账号&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Stock(SYSNAND)&lt;/code&gt;  为正版系统，即破解前的原系统，没破解前怎么玩就怎么玩，没啥好说的&lt;/p&gt;
&lt;p&gt;一句话总结，玩破解游戏就进 &lt;code&gt;CFW（EMUMMC）&lt;/code&gt; ，只要不联网怎么玩都行，玩正版游戏就进 &lt;code&gt;Stock(SYSNAND)&lt;/code&gt; ， &lt;code&gt;CFW(SYSNAND)&lt;/code&gt;  小白不要碰&lt;/p&gt;
&lt;h1 id=&#34;相关文档和开源项目&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#相关文档和开源项目&#34;&gt;#&lt;/a&gt; 相关文档和开源项目&lt;/h1&gt;
&lt;p&gt;文档链接:&lt;/p&gt;
&lt;p&gt;homebrew： &lt;a href=&#34;https://switch.homebrew.guide/&#34;&gt;https://switch.homebrew.guide/&lt;/a&gt;&lt;br /&gt;
Fusée Gelée 漏洞原理: &lt;a href=&#34;https://github.com/Ginurx/fusee_gelee_explained_in_chinese&#34;&gt;https://github.com/Ginurx/fusee_gelee_explained_in_chinese&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;项目链接:&lt;br /&gt;
hekate: &lt;a href=&#34;https://github.com/CTCaer/hekate&#34;&gt;https://github.com/CTCaer/hekate&lt;/a&gt;&lt;br /&gt;
Atmosphere: &lt;a href=&#34;https://github.com/Atmosphere-NX/Atmosphere&#34;&gt;https://github.com/Atmosphere-NX/Atmosphere&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大气层整合包：需要安装破解游玩游戏请下载这个整合包，游戏资源和安装方法请自行百度&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/carcaschoi/ShallowSea/releases&#34;&gt;https://github.com/carcaschoi/ShallowSea/releases&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;由于我目前也是个小白，文章难免会出现一些错误的理解和引导，还望大佬能够指正，最后希望大家能够好好享受游戏带来的乐趣，别再卷了&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/10/24/ChatGPT-On-Wechat/</guid>
            <title>ChatGPT on Wechat</title>
            <link>https://www.keeponline.cn/2023/10/24/ChatGPT-On-Wechat/</link>
            <category term="Github" scheme="https://www.keeponline.cn/categories/Github/" />
            <category term="ChatGPT On Wechat" scheme="https://www.keeponline.cn/tags/ChatGPT-On-Wechat/" />
            <pubDate>Tue, 24 Oct 2023 19:17:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1224.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最近发现一个超好玩的&lt;strong&gt; Github&lt;/strong&gt; 项目，让&lt;strong&gt; ChatGPT&lt;/strong&gt; 接入微信，可以实现在微信上对&lt;strong&gt; ChatGPT&lt;/strong&gt; 进行提问，真的是&lt;strong&gt;泰裤辣！！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个项目部署炒鸡简单，为了避免瞎几把扯浪费键盘寿命，下面马上进入正题&lt;/p&gt;
&lt;h2 id=&#34;项目部署&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#项目部署&#34;&gt;#&lt;/a&gt; 项目部署&lt;/h2&gt;
&lt;p&gt;准备一台&lt;strong&gt; Linux&lt;/strong&gt; 设备，这里以&lt;strong&gt; Ubuntu 22.04&lt;/strong&gt; 为例&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1227.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装&lt;strong&gt; python3&lt;/strong&gt;，但是系统好像默认自带了&lt;strong&gt; python3.10&lt;/strong&gt;, 如果你安装的镜像不包含&lt;strong&gt; python3&lt;/strong&gt; 还请自行安装&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1228.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;p&gt;官方建议 &lt;strong&gt;Python 版本&lt;/strong&gt; 在 &lt;strong&gt;3.7.1~3.9.X&lt;/strong&gt; 之间，推荐 &lt;strong&gt;3.8 版本&lt;/strong&gt;，&lt;strong&gt;3.10&lt;/strong&gt; 及以上版本在 &lt;strong&gt;MacOS&lt;/strong&gt; 可用，其他系统上不确定能否正常运行&lt;/p&gt;
&lt;/div&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;code&gt;sudo apt install python3-pip&lt;/code&gt;  # 安装&lt;strong&gt; pip3&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1233.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;code&gt;sudo apt install git -y&lt;/code&gt;  # 安装&lt;strong&gt; git&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1229.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;code&gt;git clone https://github.com/zhayujie/chatgpt-on-wechat &amp;amp;&amp;amp; cd chatgpt-on-wechat/&lt;/code&gt;  # 克隆项目到本地并切换到项目根目录&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1232.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;&lt;code&gt;pip3 install -r requirements.txt&lt;/code&gt;  # 安装核心依赖 &lt;strong&gt;(必须安装)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1234.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;&lt;code&gt;pip3 install -r requirements-optional.txt&lt;/code&gt;  # 安装拓展依赖 &lt;strong&gt;(可选，建议安装)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1235.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;&lt;code&gt;cp config-template.json config.json&lt;/code&gt;  # 创建主配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1236.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;&lt;code&gt;vi config.json&lt;/code&gt;   # 编辑主配置文件，这里主要修改的配置名有 &lt;strong&gt;open_ai_api_key、single_chat_prefix、single_chat_reply_prefix&lt;/strong&gt; ， 其它的自己根据需求更改和添加，如果你无法注册&lt;strong&gt; OpenAI&lt;/strong&gt;，后面我也提供另一种方法获取&lt;strong&gt; OpenAI&lt;/strong&gt; 的&lt;strong&gt; KEY&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight json&#34;&gt;&lt;figcaption data-lang=&#34;JSON&#34;&gt;&lt;span&gt;n&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;# config.json文件内容示例&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;open_ai_api_key&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YOUR API KEY&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                          # 填入你的 OpenAI API KEY&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;model&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;gpt-3.5-turbo&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                                   # 模型名称&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; 支持 gpt&lt;span class=&#34;token number&#34;&gt;-3.5&lt;/span&gt;-turbo&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; gpt&lt;span class=&#34;token number&#34;&gt;-3.5&lt;/span&gt;-turbo-16k&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; gpt&lt;span class=&#34;token number&#34;&gt;-4&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; wenxin&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; xunfei&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;proxy&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;            # 代理客户端的ip和端口，国内环境开启代理的需要填写该项，如 &lt;span class=&#34;token string&#34;&gt;&#34;127.0.0.1:7890&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;single_chat_prefix&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;bot&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;@bot&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                      # 私聊时文本需要包含该前缀才能触发机器人回复&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;single_chat_reply_prefix&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;[bot] &#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                       # 私聊时自动回复的前缀，用于区分真人&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;group_chat_prefix&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;@bot&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                              # 群聊时包含该前缀则会触发机器人回复&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;group_name_white_list&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;ChatGPT测试群&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;ChatGPT测试群2&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; # 开启自动回复的群名称列表&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;group_chat_in_one_session&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;ChatGPT测试群&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;              # 支持会话上下文共享的群名称  &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;image_create_prefix&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;画&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;看&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;找&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                   # 开启图片回复的前缀&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;conversation_max_tokens&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                            # 支持上下文记忆的最多字符数&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;speech_recognition&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                                # 是否开启语音识别&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;group_speech_recognition&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                          # 是否开启群组语音识别&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;use_azure_chatgpt&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                                 # 是否使用Azure ChatGPT service代替openai ChatGPT service. 当设置为&lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;时需要设置 open_ai_api_base，如 https&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token comment&#34;&gt;//xxx.openai.azure.com/&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;azure_deployment_id&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                                  # 采用Azure ChatGPT时，模型部署名称&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;azure_api_version&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                                    # 采用Azure ChatGPT时，API版本&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;character_desc&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题，并且可以使用多种语言与人交流。&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;  # 人格描述&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  # 订阅消息，公众号和企业微信channel中请填写，当被订阅时会自动回复，可使用特殊占位符。目前支持的占位符有&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;trigger_prefix&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;，在程序中它会自动替换成bot的触发词。&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;subscribe_msg&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;感谢您的关注！\n这里是ChatGPT，可以自由对话。\n支持语音对话。\n支持图片输出，画字开头的消息将按要求创作图片。\n支持角色扮演和文字冒险等丰富插件。\n输入&amp;#123;trigger_prefix&amp;#125;#help 查看详细指令。&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;use_linkai&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                                        # 是否使用LinkAI接口，默认关闭，开启后可国内访问，使用知识库和MJ&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;linkai_api_key&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;                                       # LinkAI Api Key&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;linkai_app_code&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;                                       # LinkAI 应用code&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;touch nohup.out &lt;/code&gt;  # 创建日志文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nohup python3 app.py &amp;amp; tail -f nohup.out&lt;/code&gt;     # 在后台运行程序并通过日志输出二维码&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1237.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;11&#34;&gt;
&lt;li&gt;通过手机微信扫二维码登录，登录成功出现  &lt;code&gt;Logon successfully as Your WechatName&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1238.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;12&#34;&gt;
&lt;li&gt;登录成功后，别人给你发信息的时候，在消息前面添加关键字  &lt;code&gt;bot&lt;/code&gt;  便可触发 &lt;strong&gt;ChatGPT&lt;/strong&gt; 的自动回复，由于我没有第二个微信，所以只能自己发给自己了&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1239.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;到此整个&lt;strong&gt; ChatGPT&lt;/strong&gt; 接入微信的教程就结束了，是不是非常简单  &lt;code&gt;^_^&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;已知问题&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#已知问题&#34;&gt;#&lt;/a&gt; 已知问题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git clone&lt;/code&gt;  报  &lt;code&gt;error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1230.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo apt install libssl-dev -y&lt;/code&gt;  # 安装 &lt;strong&gt;libssl-dev&lt;/strong&gt; 即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1231.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;code&gt;pip3 install&lt;/code&gt;  安装依赖报错&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1242.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;根据报错信息可以判断是 &lt;strong&gt;pip&lt;/strong&gt; 版本问题，使用  &lt;code&gt;python3 -m pip install --upgrade pip&lt;/code&gt;  升级即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1243.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;不能科学上网的小伙伴可以到 &lt;a href=&#34;https://openai-hk.com/open/index&#34;&gt;https://openai-hk.com/open/index&lt;/a&gt; 网站注册一个账号，可以获取该网站所提供的&lt;strong&gt; Key&lt;/strong&gt;，新用户还能获取免费赠送的 1000 积分，每次通过&lt;strong&gt; KEY&lt;/strong&gt; 查询会扣除对应的积分，赠送的 1000 积分用于测试是完全没有任何问题的&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;首先说明一点，本站不做任何的推广和广告，上面给出的&lt;strong&gt;&lt;a href=&#34;http://openai-hk.com&#34;&gt; openai-hk.com&lt;/a&gt;&lt;/strong&gt; 网站，只是为了给大家提供一个可以用于免费测试&lt;strong&gt; ChatCPT&lt;/strong&gt; 思路，切勿盲目充值&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;登录控制台，点击&lt;strong&gt;获取 KEY&lt;/strong&gt;, 把这个 &lt;strong&gt;KEY&lt;/strong&gt; 复制下来&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1240.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;返回服务器项目根路径，编辑 &lt;strong&gt;config.json&lt;/strong&gt; 文件，添加  &lt;strong&gt;&amp;quot;open_ai_api_base&amp;quot;&lt;/strong&gt; 和 &lt;strong&gt;&amp;quot;open_ai_api_key&amp;quot;&lt;/strong&gt; 配置&lt;/p&gt;
&lt;figure class=&#34;highlight json&#34;&gt;&lt;figcaption data-lang=&#34;JSON&#34;&gt;&lt;span&gt;n&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token property&#34;&gt;&#34;open_ai_api_base&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;https://api.openai-hk.com/v1&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token property&#34;&gt;&#34;open_ai_api_key&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Your key&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1241.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;编辑好后保存，然后运行 &lt;code&gt;nohup python3 app.py &amp;amp; tail -f nohup.out&lt;/code&gt;  即可&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;更多信息请查看源项目:&lt;/strong&gt; &lt;a href=&#34;https://github.com/zhayujie/chatgpt-on-wechat&#34;&gt;https://github.com/zhayujie/chatgpt-on-wechat&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/10/19/Mobileiron-Clinet-for-Android/</guid>
            <title>Mobileiron Clinet for Android</title>
            <link>https://www.keeponline.cn/2023/10/19/Mobileiron-Clinet-for-Android/</link>
            <category term="ivanti" scheme="https://www.keeponline.cn/categories/ivanti/" />
            <category term="Mobileiron" scheme="https://www.keeponline.cn/tags/Mobileiron/" />
            <pubDate>Thu, 19 Oct 2023 14:18:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1191.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;前面我们已经搭建好了一台  &lt;code&gt;Mobileiron&lt;/code&gt;  服务器，并且简单说明了一下界面菜单的配置，接下来是对客户端的管控策略进行测试&lt;/p&gt;
&lt;p&gt;本次测试客户端平台为  &lt;code&gt;Android&lt;/code&gt;  , 下面简单说一下测试环境&lt;/p&gt;
&lt;h1 id=&#34;测试环境&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#测试环境&#34;&gt;#&lt;/a&gt; 测试环境&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Portal&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Role&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Version&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Address&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Mobileiron&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;MDM Server&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.2&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;http://mc.keeponline.cn&#34;&gt;mc.keeponline.cn&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;配置公网证书&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Android&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Android Clinet&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Android 9&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;192.168.1.6&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;安装 Mobile@Work 客户端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Windows&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;ADB Master&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Windows 11&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;192.168.1.2&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;安装 ABD 调试程序&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id=&#34;测试前配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#测试前配置&#34;&gt;#&lt;/a&gt; 测试前配置&lt;/h1&gt;
&lt;p&gt;由于目前国内的网络和设备无法正常访问 &lt;code&gt;Google服务&lt;/code&gt; ，测试前需要先在服务器上进行简单的配置，并在客户端上安装  &lt;code&gt;Mobile@Work&lt;/code&gt;  应用和使用  &lt;code&gt;ADB&lt;/code&gt;  命令将  &lt;code&gt;Mobile@Work&lt;/code&gt;  设置为设备所有者，这样  &lt;code&gt;Mobileiron Server&lt;/code&gt;  才能在国内的环境中管理  &lt;code&gt;Android&lt;/code&gt;  设备&lt;/p&gt;
&lt;h2 id=&#34;core-server&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#core-server&#34;&gt;#&lt;/a&gt; Core Server&lt;/h2&gt;
&lt;p&gt;登录  &lt;code&gt;Core Admin Portal&lt;/code&gt;  , 开启  &lt;code&gt;AOSP/Closed Network Devices&lt;/code&gt;  功能&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1185.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;创建  &lt;code&gt;Andriod enterprise&lt;/code&gt;  配置，启用  &lt;code&gt;Enable Closed Network/AOSP deployment&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1180.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;并将 &lt;code&gt;Andriod enterprise&lt;/code&gt;  配置应用到 &lt;code&gt;Android&lt;/code&gt;  标签&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1204.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后创建一个用户用于注册设备，这里以本地用户为例&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1203.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;android-client&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#android-client&#34;&gt;#&lt;/a&gt; Android Client&lt;/h2&gt;
&lt;p&gt;在手机浏览器中通过访问 &lt;a href=&#34;https://support.mobileiron.com/MIClient-latest.apk&#34;&gt;https://support.mobileiron.com/MIClient-latest.apk&lt;/a&gt; 下载安装 &lt;code&gt;Mobile@Work&lt;/code&gt;  应用，也可以在电脑上下载好安装包，通过&lt;strong&gt; USB 连接&lt;/strong&gt;或其它方式&lt;strong&gt;拷贝&lt;/strong&gt;到安卓设备上进行安装，安装完允许所有权限，然后点击完成&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1192.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在手机设置中启用&lt;strong&gt;开发者模式&lt;/strong&gt;，通常在&lt;strong&gt;关于手机&lt;/strong&gt;界面，&lt;strong&gt;连续点击 5 次版本号&lt;/strong&gt;开启，由于不同厂商型号的手机开启方式有些不太一样，具体开启方式可能还需要自行在搜索引擎中查找&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1193.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;开启后进入&lt;strong&gt;开发者模式&lt;/strong&gt;，开启&lt;strong&gt; USB 调试&lt;/strong&gt;功能，弹出权限窗口请点击&lt;strong&gt;确定&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1195.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;windows&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#windows&#34;&gt;#&lt;/a&gt; Windows&lt;/h2&gt;
&lt;p&gt;在 &lt;strong&gt;Windows&lt;/strong&gt; 上下载  &lt;code&gt;Android Debug Bridge（ADB）&lt;/code&gt; , 用于将 &lt;code&gt;Mobile@Work&lt;/code&gt;  设置为设备所有者&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Android Debug Bridge（ADB）官方下载地址:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows:  &lt;a href=&#34;https://dl.google.com/android/repository/platform-tools-latest-windows.zip&#34;&gt;https://dl.google.com/android/repository/platform-tools-latest-windows.zip&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MacOS : &lt;a href=&#34;https://dl.google.com/android/repository/platform-tools-latest-darwin.zip&#34;&gt;https://dl.google.com/android/repository/platform-tools-latest-darwin.zip&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Linux:  &lt;a href=&#34;https://dl.google.com/android/repository/platform-tools-latest-linux.zip&#34;&gt;https://dl.google.com/android/repository/platform-tools-latest-linux.zip&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下载后解压，然后进入解压目录，在地址栏上输入  &lt;code&gt;cmd&lt;/code&gt;  回车打开命令提示符&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1196.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;手机通过&lt;strong&gt; USB 数据线&lt;/strong&gt;连接到计算机，弹出&lt;strong&gt;允许 USB 调试&lt;/strong&gt;窗口请点击&lt;strong&gt;确定&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1197.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;回到命令提示符，输入  &lt;code&gt;adb devices&lt;/code&gt;  查看已连接设备，出现  &lt;code&gt;设备ID&lt;/code&gt;  和 &lt;code&gt;device&lt;/code&gt;  信息表示连接成功&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1200.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;连接成功后，输入 &lt;code&gt;adb shell dpm set-device-owner com.mobileiron/.receiver.MIDeviceAdmin&lt;/code&gt;  将 &lt;code&gt;Mobile@Work&lt;/code&gt;  设置为设备所有者，出现  &lt;code&gt;Success: Device owner set to package ComponentInfo&amp;#123;com.mobileiron/com.mobileiron.receiver.MIDeviceAdmin&amp;#125;&lt;/code&gt;  表示设置成功&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1202.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;注意事项&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#注意事项&#34;&gt;#&lt;/a&gt; 注意事项&lt;/h3&gt;
&lt;p&gt;如果使用 &lt;code&gt;adb devices&lt;/code&gt;  命令返回  &lt;code&gt;设备ID&lt;/code&gt;  和  &lt;code&gt;unauthorized&lt;/code&gt;  ，则表示用户在手机上没有允许&lt;strong&gt; USB 调试&lt;/strong&gt;权限，此时请查看手机是否弹出&lt;strong&gt; USB 调试&lt;/strong&gt;请求，需要在手机上允许&lt;strong&gt; USB 调试&lt;/strong&gt;后再使用  &lt;code&gt;adb devices&lt;/code&gt;  查看已连接设备&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1199.png&#34; alt=&#34;upload successfu&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果执行 &lt;code&gt;adb shell dpm set-device-owner com.mobileiron/.receiver.MIDeviceAdmin&lt;/code&gt;  报  &lt;code&gt;java.lang.IllegalStateException: Trying to set the device owner, but device owner is already set.&lt;/code&gt;  错误，表示该设备已经有一个设备所有者了&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1201.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在系统设置中找到账号相关的地方，退出所有已登录的账号再尝试，如果还是不行的话，自己又没有能力找到原因，在设备没有重要数据的情况下，个人建议是将手机恢复出厂再尝试&lt;/p&gt;
&lt;h1 id=&#34;正式测试&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#正式测试&#34;&gt;#&lt;/a&gt; 正式测试&lt;/h1&gt;
&lt;p&gt;经过前面的操作，我们可以正式进入功能测试阶段&lt;/p&gt;
&lt;h2 id=&#34;客户端注册&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#客户端注册&#34;&gt;#&lt;/a&gt; 客户端注册&lt;/h2&gt;
&lt;p&gt;在设备中运行 &lt;code&gt;Mobile@Work&lt;/code&gt; ，点击&lt;strong&gt;或者使用服务器的 URL 注册&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1206.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;输入服务器地址，点击下一步&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1207.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果弹出 &lt;strong&gt;不受信任的证书&lt;/strong&gt; 点击&lt;strong&gt;接受&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1208.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;输入之前创建的&lt;strong&gt;用户名&lt;/strong&gt;和&lt;strong&gt;密码&lt;/strong&gt;点击登录&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1209.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击&lt;strong&gt;继续&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1210.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选择&lt;strong&gt;启用此设备管理应用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1211.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;注册完成&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1212.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;mdm策略&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mdm策略&#34;&gt;#&lt;/a&gt; MDM 策略&lt;/h2&gt;
&lt;p&gt;客户端注册完成后，登录 &lt;code&gt;MDM&lt;/code&gt;  服务器，下面针对安卓设备的一些常用策略进行测试&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;下面所有策略创建后都需要通过 Actions --&amp;gt; Apply To Label --&amp;gt; Android 才生效&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;wifi-config&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#wifi-config&#34;&gt;#&lt;/a&gt; WIFI Config&lt;/h3&gt;
&lt;p&gt;创建 WIFI 配置，让设备在 WIFI 信号范围内自动连接&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1213.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;kiosk-policy&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#kiosk-policy&#34;&gt;#&lt;/a&gt; Kiosk Policy&lt;/h3&gt;
&lt;p&gt;创建自助终端策略，用户只能使用指定的应用程序，无法对设备做其它任何操作&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1217.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;策略生效后打开 &lt;code&gt;Mobile@Work&lt;/code&gt; ，点击进入&lt;strong&gt;自助服务终端&lt;/strong&gt;即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1218.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;security-policy&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#security-policy&#34;&gt;#&lt;/a&gt; Security Policy&lt;/h3&gt;
&lt;p&gt;创建安全策略，可以配置密码强度、数据加密和访问控制策略&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1215.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;应用策略后设备上会弹出提示需要配置新的屏幕锁定设置&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1216.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;lockdown-policy&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#lockdown-policy&#34;&gt;#&lt;/a&gt; Lockdown Policy&lt;/h3&gt;
&lt;p&gt;创建限制策略，该策略可以限制设备大部分功能，如网络连接、摄像头、USB 存储、SD 存储、屏幕截图、应用程序、恢复出厂等等&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1220.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1222.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1223.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;策略生效后部分功能截图&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1221.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;由于当前环境比较单一，还有很多其它配置需要搭配其它服务使用，如 Email、数据加密等服务，以后如果有机会的话再更新吧&lt;/p&gt;
&lt;h3 id=&#34;wipe&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#wipe&#34;&gt;#&lt;/a&gt; wipe&lt;/h3&gt;
&lt;p&gt;擦除设备手机将自动进入恢复出厂设置&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1244.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/07/05/EPM-MDM/</guid>
            <title>EPM MDM注册</title>
            <link>https://www.keeponline.cn/2023/07/05/EPM-MDM/</link>
            <category term="ivanti" scheme="https://www.keeponline.cn/categories/ivanti/" />
            <category term="MDM" scheme="https://www.keeponline.cn/tags/MDM/" />
            <pubDate>Wed, 05 Jul 2023 10:40:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-392.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不知不觉距离上次搭建 &lt;code&gt;CSA&lt;/code&gt;  云平台已经过去两个月了，为自己的懒惰感到惭愧&lt;/strong&gt;🙈&lt;/p&gt;
&lt;p&gt;这里简单的说一下整个&lt;strong&gt; MDM&lt;/strong&gt; 配置流程:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;核心服务器 MDM 配置&lt;/p&gt;
&lt;p&gt;主要配置 CSA、策略轮询时间和苹果消息推送服务等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agent 安装包&lt;/p&gt;
&lt;p&gt;用于管理设备，如策略下发、远程等&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agent Manifest Package 配置&lt;/p&gt;
&lt;p&gt;主要用于告知设备注册后从何处下载 plist 文件，plist 文件则提供 Agent 安装包所在位置以及相关说明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;联合管理代理&lt;/p&gt;
&lt;p&gt;通过 MDM 注册后自动部署代理和配置文件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;mdm配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mdm配置&#34;&gt;#&lt;/a&gt; MDM 配置&lt;/h1&gt;
&lt;h2 id=&#34;common-settings&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#common-settings&#34;&gt;#&lt;/a&gt; Common Settings&lt;/h2&gt;
&lt;p&gt;废话不多说，在&lt;strong&gt; EPM 控制台&lt;/strong&gt;中，依次点击  &lt;code&gt;Modem Device Management &amp;gt; MDM configurations &amp;gt; Common Setting &amp;gt; Cloud Services Appliances(CSA)&lt;/code&gt;  选择我们的  &lt;code&gt;CSA Server&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1151.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Sync Settings&lt;/code&gt;  配置设备定时签到时间，默认情况下，设备通过&lt;strong&gt; MDM 注册&lt;/strong&gt;到核心服务器，设备会在&lt;strong&gt; 1440 分钟&lt;/strong&gt;后主动找服务器签到同步策略，如无特殊要求，此处保持默认即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1152.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;apns&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#apns&#34;&gt;#&lt;/a&gt; APNS&lt;/h2&gt;
&lt;p&gt;配置 &lt;code&gt;APNS(Apple Push Notification Service)&lt;/code&gt; , 依次点击  &lt;code&gt;Apple &amp;gt; Apple Push Notification service &amp;gt; Configure&lt;/code&gt;  进行证书配置&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1154.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;选择创建一个新证书&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1155.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;创建证书请求&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1156.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;跳转到 Aplle Push 证书门户&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1157.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;创建证书&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1158.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1159.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选择刚刚生成的 &lt;strong&gt;plist&lt;/strong&gt; 请求文件，然后点击 &lt;strong&gt;Upload&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1160.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;下载证书&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1162.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;选择证书并设置密码&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1163.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;点击 Save 保存&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1164.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最后点击&lt;strong&gt; OK&lt;/strong&gt; 重启&lt;strong&gt; MDM 服务&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1165.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;APNS 是由苹果公司提供的推送服务，主要用于向 iOS、MacOS 和 WatchOS 设备发送远程通知、即时消息、应用更新、提醒和警报等这几个主要的作用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;macos-agent&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#macos-agent&#34;&gt;#&lt;/a&gt; MacOS Agent&lt;/h1&gt;
&lt;p&gt;创建 &lt;strong&gt;MacOS Agent&lt;/strong&gt; ，依次点击  &lt;code&gt;Configuration &amp;gt; Agent configuration &amp;gt; New Mac agent configuration&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1168.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写配置名称，选择&lt;strong&gt; Client connectivity&lt;/strong&gt;, 这里的&lt;strong&gt; Core infomation&lt;/strong&gt; 的 &lt;strong&gt;Core address&lt;/strong&gt; 必须填写核心服务器的 &lt;code&gt;FQDN(Fully Qualified Domain Name)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1169.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cloud Services Appliance&lt;/strong&gt; 勾选启用并选择我们的&lt;strong&gt; CSA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1170.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remote control tunnel&lt;/strong&gt; 勾选启用并选择我们的&lt;strong&gt; Remote Tunnel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1171.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;其它的策略根据自身需求调整，这里就不多赘述&lt;/p&gt;
&lt;h1 id=&#34;agent-manifest-package&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#agent-manifest-package&#34;&gt;#&lt;/a&gt; Agent Manifest Package&lt;/h1&gt;
&lt;p&gt;依次点击  &lt;code&gt;Distribution &amp;gt; Distribution packages &amp;gt; New &amp;gt; Macintosh &amp;gt; Macintosh MDM&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1166.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写程序包 &lt;strong&gt;Name&lt;/strong&gt;，&lt;strong&gt;Application info&lt;/strong&gt; 选择  &lt;code&gt;Manifest URL&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL:	&lt;a href=&#34;https://download.ivanti.com/product/mac/2022/SU3/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2022/SU3/manifest.plist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bundle ID: com.ivanti.IvantiAgentTool&lt;/li&gt;
&lt;li&gt;Bundle version: 11.0.5.2606&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1167.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;截至当前 &lt;strong&gt;EPM 2022 SU3 MDM properties&lt;/strong&gt; 信息，请根据自己的&lt;strong&gt; EPM 版本&lt;/strong&gt;填写&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Patch Version&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;URL&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Bundle ID&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Bundle Version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2022 SU3&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2022/SU3/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2022/SU3/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.ivanti.IvantiAgentTool&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.5.2606&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2022 SU2&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2022/SU2/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2022/SU2/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.ivanti.IvantiAgentTool&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.5.2497&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2022 SU1&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2022/SU1/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2022/SU1/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.ivanti.ivscan&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.5.2378&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2022&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2022/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2022/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.5.2280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2021.1 SU4&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2021/SU4/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2021/SU4/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.ivanti.IvantiAgentTool&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.5.2539&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2021.1 SU3&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2021/SU3/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2021/SU3/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.ivanti.IvantiAgentTool&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.5.2445&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2021.1 SU2&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Ver. 2	&lt;a href=&#34;https://download.ivanti.com/product/mac/2021/SU2v2/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2021/SU2v2/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.4.2203&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2021.1 SU2&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2021/SU2/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2021/SU2/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.4.2192&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2021.1 SU1&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2021/SU1/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2021/SU1/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.4.2119&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2021.1&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2021/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2021/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.4.1887&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2020.1 SU6&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;No changes made to the agent. Use same values as 2020.1 SU5	com.&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.3.1742&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2020.1 SU5&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2020/SU5/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2020/SU5/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.3.1742&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2020.1 SU3&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2020/SU3/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2020/SU3/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.3.1652&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2020.1 SU2&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2020/SU2/V2/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2020/SU2/V2/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.3.1497&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2020.1 SU1&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2020/SU1/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2020/SU1/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.3.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;2020.1&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://download.ivanti.com/product/mac/2020/manifest.plist&#34;&gt;https://download.ivanti.com/product/mac/2020/manifest.plist&lt;/a&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;com.landesk.LANDesk_Settings&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;11.0.3.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;联合管理代理&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#联合管理代理&#34;&gt;#&lt;/a&gt; 联合管理代理&lt;/h1&gt;
&lt;p&gt;依次点击  &lt;code&gt;Modem Device Management &amp;gt; CO-management agents&lt;/code&gt;  打开联合管理代理界面，勾选 &lt;strong&gt;Install Mac Agent&lt;/strong&gt;, 设备配置文件选择我们的代理配置，例外建议添加&lt;strong&gt; Allow Ivanti RC screen capture approval 和 EPM Agent authorization&lt;/strong&gt; 这两个跟远程相关的配置，最下方选择我们的&lt;strong&gt; Macintosh MDM&lt;/strong&gt; 程序包&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1172.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;到此，整个简单的&lt;strong&gt; MDM 配置&lt;/strong&gt;基本上已经结束&lt;/p&gt;
&lt;h1 id=&#34;mdm注册&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#mdm注册&#34;&gt;#&lt;/a&gt; MDM 注册&lt;/h1&gt;
&lt;p&gt;拷贝核心服务器  &lt;code&gt;C:\Program Files\LANDesk\ManagementSuite\ldlogon\mac\mdmenroller.pkg&lt;/code&gt;  到 &lt;strong&gt;Mac OS&lt;/strong&gt;&lt;br /&gt;
 客户端安装&lt;/p&gt;
&lt;p&gt;安装完后打开选择 &lt;strong&gt;手动输入详细信息&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1173.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写&lt;strong&gt;核心服务器管理员账号和密码&lt;/strong&gt;以及&lt;strong&gt; CSA&lt;/strong&gt; 跟&lt;strong&gt;核心服务器 FQDN&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1174.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击注册，此时弹出需要安装&lt;strong&gt; Ivanti MDM&lt;/strong&gt; 描述文件，点击&lt;strong&gt; Install&lt;/strong&gt; 进行安装&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1176.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;非常尴尬，这里安装描述文件的时候报错了，提示&lt;strong&gt; MDM 服务器无法验证，证书可能已过期&lt;/strong&gt;，刚好前段时间，群里有个大佬也问过这个问题，我就厚着脸皮问大佬解决了没有，大佬说这个问题是 ESA 模块导致的，安装 ESA 模块更改了 IIS 的某些配置，但是具体改了什么他也不知道，所以最后只能重装解决&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1177.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;那我也只好重装 EPM 服务器了，此处省略 N 个字，安装描述文件后会自动下载联合管理的相关配置和代理程序&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1178.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;安装完毕后，此时服务器控制台已经可以看到这台 Mac 电脑的信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1179.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;好了，MDM 注册就到这吧，后续深入学习再更新&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/06/11/EPM-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2/</guid>
            <title>EPM操作系统部署</title>
            <link>https://www.keeponline.cn/2023/06/11/EPM-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2/</link>
            <category term="ivanti" scheme="https://www.keeponline.cn/categories/ivanti/" />
            <category term="EPM" scheme="https://www.keeponline.cn/tags/EPM/" />
            <pubDate>Sun, 11 Jun 2023 10:12:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-392.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;前两周有个 EPM 实施项目，客户是在厦门那边，我本以为过去一周内可以解决回来，没想到在操作系统部署这块踩了超多坑，最后待了两周才解决，这里记录一下&lt;/p&gt;
&lt;h2 id=&#34;无dhcp服务器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#无dhcp服务器&#34;&gt;#&lt;/a&gt; 无 DHCP 服务器&lt;/h2&gt;
&lt;p&gt;上来面对的第一个坑就是客户端环境中没有 &lt;code&gt;DHCP&lt;/code&gt;  服务器，所有的客户端都需要手动配置&lt;strong&gt; IP 地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正常情况下，操作系统部署是通过 &lt;code&gt;PXE&lt;/code&gt;  网络引导加载 &lt;code&gt;WinPE&lt;/code&gt; , 然后在 &lt;code&gt;WinPE&lt;/code&gt;  中跟服务器建立通信，读取服务器上的部署模板信息&lt;/p&gt;
&lt;p&gt;在没有 &lt;code&gt;DHCP&lt;/code&gt;  的情况下根本无法从网络中加载 &lt;code&gt;WinPE&lt;/code&gt; , 那就只能在服务器上生成 &lt;code&gt;WinPE&lt;/code&gt;  的&lt;strong&gt; ISO 镜像&lt;/strong&gt;，通过刻录软件将其刻录到&lt;strong&gt; U 盘&lt;/strong&gt;，然后用&lt;strong&gt; U 盘&lt;/strong&gt;引导进入 &lt;code&gt;WinPE&lt;/code&gt;  环境&lt;/p&gt;
&lt;h3 id=&#34;修改bootwim文件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#修改bootwim文件&#34;&gt;#&lt;/a&gt; 修改 boot.wim 文件&lt;/h3&gt;
&lt;p&gt;在创建 &lt;code&gt;WinPE&lt;/code&gt;  镜像之前，我们需要挂载 &lt;code&gt;WinPE&lt;/code&gt;  文件，添加中文字体，让其支持中文显示，否则部署模板中的中文会显示乱码，并且修改 &lt;code&gt;startnet.cmd&lt;/code&gt;  文件，让 &lt;code&gt;WinPE&lt;/code&gt;  初始化的时候可以手动配置&lt;strong&gt; IP 地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;WinPE&lt;/code&gt;  文件默认路径为 &lt;code&gt;C:\Program Files\LANDesk\ManagementSuite\LANDesk\vboot&lt;/code&gt;  下的 &lt;code&gt;boot.wim&lt;/code&gt;  和 &lt;code&gt;boot_x64.wim&lt;/code&gt; , 其中 &lt;code&gt;boot.wim&lt;/code&gt;  为 32 位 &lt;code&gt;BIOS&lt;/code&gt;  引导文件， &lt;code&gt;boot_x64.wim&lt;/code&gt;  为 &lt;code&gt;UEFI&lt;/code&gt; 64 位引导文件&lt;/p&gt;
&lt;p&gt;我们先修改第一个 &lt;code&gt;boot.wim&lt;/code&gt;  文件，以管理员权限打开 &lt;code&gt;cmd&lt;/code&gt;  命令行&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建一个空目录用于挂载 WIM 文件&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;mkdir c:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1129.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;挂载 boot.wim 到 c:\mount 目录&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;DISM&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;wim &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;wimfile:&lt;span class=&#34;token string&#34;&gt;&#34;C:\Program Files\LANDesk\ManagementSuite\LANDesk\vboot\boot.wim&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;index:1 &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;mountdir:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1130.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;修改 WinPE 初始化脚本&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;编辑  &lt;code&gt;C:\mount\Windows\System32\startnet.cmd&lt;/code&gt;  脚本文件，在 @echo off 后面插入静态 IP 配置命令&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;       &lt;span class=&#34;token keyword&#34;&gt;If&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;using&lt;/span&gt; static ip&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;press 1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;       &lt;span class=&#34;token keyword&#34;&gt;If&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;using&lt;/span&gt; DHCP&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;press 2&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;       &lt;span class=&#34;token keyword&#34;&gt;If&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;press 3&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;p choice=      your choice:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%choice%&#34;&lt;/span&gt;==&lt;span class=&#34;token string&#34;&gt;&#34;1&#34;&lt;/span&gt; goto ip1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%choice%&#34;&lt;/span&gt;==&lt;span class=&#34;token string&#34;&gt;&#34;2&#34;&lt;/span&gt; goto ip2&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%choice%&#34;&lt;/span&gt;==&lt;span class=&#34;token string&#34;&gt;&#34;3&#34;&lt;/span&gt; goto &lt;span class=&#34;token keyword&#34;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;goto &lt;span class=&#34;token keyword&#34;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;:ip1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;netsh interface show interface&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;p name=	please enter your NIC name:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;p ldip=      please enter your static ip address:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;p ldmask=      please enter your netmask:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;p ldgw=      please enter your gateway:&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;  IP config starting&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;  starting config ip and gateway&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;netsh interface ip &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; address name=&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;name% source=static addr=&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;ldip% mask=&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;ldmask% gateway=&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;ldgw%&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;  config success!&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;goto &lt;span class=&#34;token keyword&#34;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;:ip2&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;  IP auto config &lt;span class=&#34;token function&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;netsh interface ip &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; address name = &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;name% source = dhcp&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;  starting DNS&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;netsh interface ip &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; dns name = &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;name% source = dhcp &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;echo&lt;/span&gt;  config success!&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;:&lt;span class=&#34;token keyword&#34;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1131.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;添加 hosts 文件解析&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为了减少用户的操作，上面的启动脚本我没有添加配置&lt;strong&gt; DNS&lt;/strong&gt; 的命令，而是直接将&lt;strong&gt; EPM 服务器&lt;/strong&gt;的解析记录添加到 &lt;code&gt;WinPE&lt;/code&gt;  的 &lt;code&gt;hosts&lt;/code&gt;  文件进行解析&lt;/p&gt;
&lt;p&gt;用 &lt;code&gt;notepad&lt;/code&gt;  打开 &lt;code&gt;C:\mount\Windows\System32\drivers\etc\hosts&lt;/code&gt;  添加服务器解析记录&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1132.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;添加中文包&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;WinPE&lt;/code&gt;  默认是不支持中文的，如果部署模板中有中文字符会变成乱码，根据当前 &lt;code&gt;WinPE&lt;/code&gt;  的版本下载对应的 &lt;code&gt;ADK&lt;/code&gt;  安装到电脑中，执行下面的命令添加中文语言包&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;DISM&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe  &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Add-Package&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;Image:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;PackagePath:&lt;span class=&#34;token string&#34;&gt;&#34;C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\x86\WinPE_OCs\WinPE-FontSupport-ZH-CN.cab&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;DISM&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Add-Package&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;Image:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;PackagePath:&lt;span class=&#34;token string&#34;&gt;&#34;C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\x86\WinPE_OCs\zh-cn\lp.cab&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Dism&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;image:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Get-Intl&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Dism&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;image:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Set-UILang&lt;/span&gt;:ZH-CN&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Dism&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;image:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Set-AllIntl&lt;/span&gt;:ZH-CN&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1134.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;保存镜像&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;完成上面的步骤后，关闭任何已打开的镜像相关文件包括目录，否则保存时会无法完全卸载挂载目录&lt;/p&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Dism&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;unmount-Wim &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;MountDir:c:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;Commit&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1133.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;卸载后重复上面的 2 - 6 的操作，将第 2 歩的挂载镜像改成 boot_x64, 第 5 步的中文包路径又 x86 改成 amd64&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;DISM&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;wim &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;wimfile:&lt;span class=&#34;token string&#34;&gt;&#34;C:\Program Files\LANDesk\ManagementSuite\LANDesk\vboot\boot_x64.wim&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;index:1 &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;mountdir:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;DISM&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe  &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Add-Package&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;Image:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;PackagePath:&lt;span class=&#34;token string&#34;&gt;&#34;C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-FontSupport-ZH-CN.cab&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;DISM&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;exe &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;Add-Package&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;Image:C:\&lt;span class=&#34;token function&#34;&gt;mount&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;PackagePath:&lt;span class=&#34;token string&#34;&gt;&#34;C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\zh-cn\lp.cab&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;生成iso镜像&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#生成iso镜像&#34;&gt;#&lt;/a&gt; 生成 ISO 镜像&lt;/h2&gt;
&lt;p&gt;修改好 &lt;code&gt;WinPE&lt;/code&gt;  文件后，返回控制台，在操作系统部署这里创建一个镜像文件&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1135.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;创建好后用刻录软件将镜像文件写入到优盘，我这里为了方便演示就直接用虚拟机光驱加载镜像模拟优盘启动，测试该镜像是否能够在没有 &lt;code&gt;DHCP&lt;/code&gt;  的环境下正常工作&lt;/p&gt;
&lt;p&gt;开机进入引导菜单，选择 &lt;code&gt;WinPE&lt;/code&gt;  的启动设备&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1136.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;进入初始化界面，选择  &lt;code&gt;1&lt;/code&gt;  使用&lt;strong&gt;静态 IP&lt;/strong&gt;，这里会列出所有网卡接口的信息，由用户输入对应的网卡接口名称进行配置&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1137.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;配置好 IP 地址信号后回车，如果网络能够正常跟服务器通信，此时便能看到部署程序&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1138.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这里弹出需要身份认证，后续可以取消掉，先输入核心服务器的管理员账号密码登录&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1139.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;登录后弹出部署模板选择，但是目前我并没有配置部署模板，所以这里没有模板&lt;/p&gt;
&lt;p&gt;目前看来 &lt;code&gt;WinPE&lt;/code&gt;  跟核心服务器通信是正常的，我们先返回核心服务器配置部署模板&lt;/p&gt;
&lt;h2 id=&#34;模板部署&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#模板部署&#34;&gt;#&lt;/a&gt; 模板部署&lt;/h2&gt;
&lt;p&gt;在控制台操作系统部署界面选择  &lt;code&gt;Preboot &amp;gt; PXE Boot Options&lt;/code&gt; , 勾选上  &lt;code&gt;Allow anonymous login for public templates&lt;/code&gt; , 这样下次我们在 &lt;code&gt;WinPE&lt;/code&gt;  进入模板选择的界面就不需要身份认证了&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1140.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;p&gt;需要注意的是，需要将部署模板创建在 Public 分组才能让匿名用户查看并选择部署&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;由于用户希望部署时能够自动分配计算机名，这里需要添加设备名称规则，使用 LD+Mac 地址 确保设备名称的唯一性&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1141.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;编写分区脚本，由于用户目前还有 Windows 7 系统，所以需要写一个 GPT 分区脚本和一个 MBR 分区脚本&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;GPT&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem == CreatePartitions-UEFI ==&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem == These commands are used with DiskPart to&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem create five partitions&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; a UEFI/GPT-based PC&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem Adjust the partition sizes to fill the drive&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem as necessary&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; ==&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;select&lt;/span&gt; disk 0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;clean&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;convert gpt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem == 1&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; Windows RE tools partition ===============&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem create partition primary size=900&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem format quick fs=ntfs label=&lt;span class=&#34;token string&#34;&gt;&#34;Windows RE tools&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem assign letter=&lt;span class=&#34;token string&#34;&gt;&#34;T&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem &lt;span class=&#34;token function&#34;&gt;set&lt;/span&gt; id=&lt;span class=&#34;token string&#34;&gt;&#34;de94bba4-06d1-4d40-a16a-bfd50179d6ac&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem gpt attributes=0x8000000000000001&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem == 2&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; System partition =========================&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;create partition efi size=260&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem NOTE: &lt;span class=&#34;token keyword&#34;&gt;For&lt;/span&gt; Advanced Format 4Kn drives&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem change this value to size = 260&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;format quick fs=fat32 label=&lt;span class=&#34;token string&#34;&gt;&#34;System&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;assign letter=&lt;span class=&#34;token string&#34;&gt;&#34;S&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem == 3&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; Microsoft Reserved &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;MSR&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; partition =======&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;create partition msr size=128&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem == 4&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; Windows partition ========================&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem == a&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; Create the Windows partition size=102407&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;100GB&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; ==========&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;create partition primary size=102407&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem == c&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; Prepare the Windows partition =========&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;format quick fs=ntfs label=&lt;span class=&#34;token string&#34;&gt;&#34;Windows&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;assign letter=&lt;span class=&#34;token string&#34;&gt;&#34;C&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem === 5&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; User &lt;span class=&#34;token keyword&#34;&gt;data&lt;/span&gt; partition ================&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;create partition primary size=210000&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem Use all remaining space to create user &lt;span class=&#34;token keyword&#34;&gt;data&lt;/span&gt; partition===&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;format quick fs=ntfs label=&lt;span class=&#34;token string&#34;&gt;&#34;Data&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;assign letter=&lt;span class=&#34;token string&#34;&gt;&#34;D&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem === 5&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt; User document partition ================&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;create partition primary&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;rem Use all remaining space to create user &lt;span class=&#34;token keyword&#34;&gt;data&lt;/span&gt; partition===&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;format quick fs=ntfs label=&lt;span class=&#34;token string&#34;&gt;&#34;Document&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;assign letter=&lt;span class=&#34;token string&#34;&gt;&#34;E&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;list volume&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;exit&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ul&gt;
&lt;li&gt;MBR&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight powershell&#34;&gt;&lt;figcaption data-lang=&#34;PowerShell&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;select&lt;/span&gt; disk 0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;clean&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;convert mbr&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;create partition primary size=100000&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;format fs=ntfs quick label=&lt;span class=&#34;token string&#34;&gt;&#34;Windows&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;assign letter=&lt;span class=&#34;token string&#34;&gt;&#34;C&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;create partition primary size=200000&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;format fs=ntfs quick label=&lt;span class=&#34;token string&#34;&gt;&#34;Data&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;assign letter=&lt;span class=&#34;token string&#34;&gt;&#34;D&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;create partition primary&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;format fs=ntfs quick label=&lt;span class=&#34;token string&#34;&gt;&#34;Document&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;assign letter=&lt;span class=&#34;token string&#34;&gt;&#34;E&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;list volume&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;exit&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;将相关脚本、镜像、部署工具、软件包放到共享目录&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1143.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;创建部署模板&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1144.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;开始测试&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;客户端开机进入 WinPE 环境&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;a. 选择部署模板&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1145.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;b. 部署执行阶段&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1146.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;c. 部署完成&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装完操作系统后重启会自动执行后续动作&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1147.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;问题总结&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#问题总结&#34;&gt;#&lt;/a&gt; 问题总结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;DHCPless&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一次接触无 &lt;code&gt;DHCP&lt;/code&gt;  的环境，刚开始毫无思绪，因为之前客户操作系统部署都是通过网络 &lt;code&gt;PXE&lt;/code&gt;  引导部署，我知道可以通过控制台生成&lt;strong&gt; ISO 镜像&lt;/strong&gt;刻录到优盘，由优盘启动可以不需要 &lt;code&gt;PXE&lt;/code&gt;  和 &lt;code&gt;DHCP&lt;/code&gt; ，但是我们的 &lt;code&gt;WinPE&lt;/code&gt;  不像网络上的第三方 &lt;code&gt;WinPE&lt;/code&gt;  那样具备有图形化界面，所以我不知道在进入&lt;strong&gt; PE 环境&lt;/strong&gt;后如何给当前系统配置一个&lt;strong&gt; IP 地址&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;后来问了群里的一些大佬，得知 &lt;strong&gt;WinPE&lt;/strong&gt; 进入系统后默认执行 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;c:\windows\system32\startnet.cmd&lt;/span&gt;&lt;/strong&gt; 进行初始化，可以通过修改这个脚本预先配置好&lt;strong&gt; IP 信息&lt;/strong&gt;，最终通过添加 &lt;code&gt;netsh&lt;/code&gt;  命令解决这个问题&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;磁盘分区&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一开始我用系统自带的分区模板进行分区测试，发现不是很好用，在创建第二个分区的时候很容易报错，我对自带的分区模板一些字段定义也不是了解，在官网也找不到相关的文档可以用于参考&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1148.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最终决定用  &lt;code&gt;diskpart&lt;/code&gt;  命令进行分区&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1149.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Win7 UEFI 引导&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个是最让我最奔溃的问题，用户主要的用的操作系统是 &lt;code&gt;Win7&lt;/code&gt; , 但是他们购买的新机器不支持 &lt;code&gt;Legacy&lt;/code&gt;  引导，只能以 &lt;code&gt;UEFI&lt;/code&gt;  方式引导，硬件上已经完全不支持 &lt;code&gt;Win7&lt;/code&gt;  了&lt;/p&gt;
&lt;p&gt;我尝试过从网上下载很多标题注明支持新机器的&lt;strong&gt; Win7 镜像&lt;/strong&gt;，并且自己也尝试封装了几个&lt;strong&gt;镜像&lt;/strong&gt;，但是都有着各种各样的问题&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;  a. 安装完操作系统重启后不认盘&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;  b. 安装完操作系统重启后一直卡在 Windows Logo&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;  c. 安装完操作系统后进入登录界面，键盘鼠标无法使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;  d. 能够正常安装系统并进入到桌面，但是在安装完软件后执行 sysprep 进行二次封装，再部署又会出现卡 logo 的现象&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;最终为了进度，我只能跟用户商量如果新机器要安装 &lt;code&gt;Win7&lt;/code&gt; ，就不能用 &lt;code&gt;EPM&lt;/code&gt;  的部署方式，可以用网络上第三方 &lt;code&gt;WinPE&lt;/code&gt;  系统进行安装，因为第三方 &lt;code&gt;WinPE&lt;/code&gt;  可以解决  &lt;code&gt;Win7&lt;/code&gt;  卡  &lt;code&gt;Logo&lt;/code&gt;  这个问题&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1150.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;多硬盘如何区分系统盘&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个问题最终也没有办法完美解决，多硬盘的情况下，比较理想的是判断分区中是否存在&lt;strong&gt; Windows&lt;/strong&gt; 目录，如果有则认为是系统盘&lt;/p&gt;
&lt;p&gt;但是实际上会有很多其它的情况，下面列出我当前已经遇到的情况:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;a. 用户之前的电脑是单硬盘，并且存在系统，后面加装了一个硬盘，但是前面的系统盘并没有格式化，就会出现一个以上分区存在 Windows 目录&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;b. 系统盘损坏或被格式化，所有分区下都找不到 Windows 目录&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;c. 后续新增硬盘，以新硬盘为系统盘，一般情况下新硬盘可能连格式化的步骤都没有做，连分区都没有，根本无法识别&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;最主要的是 &lt;code&gt;WinPE&lt;/code&gt;  只支持少部分的 &lt;code&gt;cmd&lt;/code&gt;  命令，不支持 &lt;code&gt;Powershell&lt;/code&gt; , 所以真的很难用&lt;strong&gt; cmd 脚本&lt;/strong&gt;去做判断，只能说即使有想法也很难仅靠 &lt;code&gt;cmd&lt;/code&gt;  命令实现&lt;/p&gt;
&lt;p&gt;最终是给出两个部署模板，由用户自行选择&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一个是新硬盘部署，重新格式化并分区分配盘符，将操作系统安装在 C 盘&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一个是重装系统，重装系统分为 GPT 和 MBR 两个模板，固定&lt;strong&gt;第 0 个&lt;/strong&gt;磁盘为系统盘，&lt;strong&gt;GPT 分区&lt;/strong&gt;下格式化第三个分区，并分配 &lt;strong&gt;C&lt;/strong&gt; 驱动器号，&lt;strong&gt;MBR 分区&lt;/strong&gt;下格式化第一个分区，并分配 &lt;strong&gt;C&lt;/strong&gt; 驱动器号&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;最后再吐槽一下，操作系统部署的实施真的很折磨人，本来整个部署流程顺利跑下来都需要一个多小时，遇到问题就得修改后重新跑一遍，我虽然没有统计自己跑了多少遍部署流程，但是肯定不少于&lt;strong&gt; 50 次&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在测&lt;strong&gt; Win7&lt;/strong&gt; 的时候真的感觉人要奔溃，我大部分的时间都浪费在这上面，当时真的很希望能够有个人可以一起分析研究这个问题&lt;/p&gt;
&lt;p&gt;哎，就酱吧，无力吐槽&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;最后更新&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#最后更新&#34;&gt;#&lt;/a&gt; 最后更新&lt;/h1&gt;
&lt;p&gt;八月底又去了一趟客户现场，主要是上次六月份部署完后客户一直没有使用，现在基本上已经忘记了如何使用，而且客户对目前的操作系统部署方案也不是很满意，尤其是硬盘分区这一块，我本次过去就是重新教他们使用并尽可能的优化部署方案&lt;/p&gt;
&lt;h2 id=&#34;磁盘分区&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#磁盘分区&#34;&gt;#&lt;/a&gt; 磁盘分区&lt;/h2&gt;
&lt;p&gt;分区的问题我之前是用脚本去执行的，脚本执行就无法避免可能会分错区造成数据丢失，上一次过来的时候因为被 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;Win7 UEFI&lt;/span&gt;&lt;/strong&gt; 引导的问题搞得我没法静下心来思考其它的事情，我也不知道当初为什么死磕脚本来完成这个分区动作&lt;/p&gt;
&lt;p&gt;这次过来，我已经明白靠脚本是无法满足用户的需求，这种情况只能用图形化的分区工具让用户自行选择磁盘进行分区&lt;/p&gt;
&lt;p&gt;我在服务器下载了 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;DiskGenius&lt;/span&gt;&lt;/strong&gt; 并解压放到共享目录，在 &lt;strong&gt;PE&lt;/strong&gt; 映射服务器的共享目录，执行 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;DiskGenius&lt;/span&gt;&lt;/strong&gt; 可以正常跑起来，这样分区的问题就解决了&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1187.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;不管用户有几个磁盘和分区，我只要求用户将需要安装操作系统的分区分配 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;C&lt;/span&gt;&lt;/strong&gt; 盘符即可&lt;/p&gt;
&lt;p&gt;现在回过头想想上次过来为什么会没有想到用图形化工具分区，真的被自己蠢哭了，看来人一着急就容易钻牛角尖&lt;/p&gt;
&lt;h2 id=&#34;系统配置模板不生效&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#系统配置模板不生效&#34;&gt;#&lt;/a&gt; 系统配置模板不生效&lt;/h2&gt;
&lt;p&gt;安装完操作系统第一次开机登录系统界面，连上网络后会自动执行系统配置后面的步骤，但是如果设备无法自动连接到网络，并且客户长时间没有操作导致设备进入休眠状态，唤醒后系统配置模板可能不会工作&lt;/p&gt;
&lt;p&gt;正常情况下，在部署模板执行完 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;Configure Taget OS&lt;/span&gt;&lt;/strong&gt; 便会自动重启&lt;strong&gt; WinPE&lt;/strong&gt;，进入操作系统安装配置步骤，要知道系统配置模板为什么不生效，就需要知道  &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;Configure Taget OS&lt;/span&gt;&lt;/strong&gt; 这一步具体做了什么事情&lt;/p&gt;
&lt;p&gt;按照官方文档对 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;CTOS&lt;/span&gt;&lt;/strong&gt; 的描述，执行 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;CTOS&lt;/span&gt;&lt;/strong&gt; 步骤后会将后续需要的文件复制到客户端的 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;C:\ldprovisioning&lt;/span&gt;&lt;/strong&gt; 目录，并在 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;%WINDIR%\Setup\Scripts\SetupComplete.cmd&lt;/span&gt;&lt;/strong&gt; 脚本中调用 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;%WINDIR%\ldprovisioning\ldprovisioning.cmd&lt;/span&gt;&lt;/strong&gt;, 下面简单描述一下 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;SetupComplete.cmd&lt;/span&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovisioning.cmd&lt;/span&gt;&lt;/strong&gt; 这两个 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;CMD&lt;/span&gt;&lt;/strong&gt; 批处理文件&lt;/p&gt;
&lt;h3 id=&#34;setupcompletecmd&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#setupcompletecmd&#34;&gt;#&lt;/a&gt; SetupComplete.cmd&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&#34;red&#34;&gt;SetupComplete.cmd&lt;/span&gt;&lt;/strong&gt; 是 &lt;strong&gt;Windows&lt;/strong&gt; 操作系统安装结束后，用户登录到桌面的时候立即启动，该脚本以 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;system&lt;/span&gt;&lt;/strong&gt; 权限执行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;执行顺序如下:&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装完 Windows 操作系统后，在显示登录屏幕显示之前，系统会在 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;%WINDIR%\Setup\Scripts&lt;/span&gt;&lt;/strong&gt; 目录中搜索 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;SetupComplete.cmd&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果找到 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;SetupComplete.cmd&lt;/span&gt;&lt;/strong&gt; 文件便会执行，并将执行操作记录在 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;%WINDIR%\Windows\Panther\UnattendGC\Setupact.log&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设备在安装过程中加域，为了确保域策略不会干预脚本运行，在完成 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;SetupComplete.cmd&lt;/span&gt;&lt;/strong&gt; 之前，域策略不会应用到于计算机&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;参考文档:&lt;a href=&#34;https://learn.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/add-a-custom-script-to-windows-setup?view=windows-10&#34;&gt;https://learn.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/add-a-custom-script-to-windows-setup?view=windows-10&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;ldprovisioningcmd&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ldprovisioningcmd&#34;&gt;#&lt;/a&gt; ldprovisioning.cmd&lt;/h3&gt;
&lt;p&gt;前面的 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;SetupComplete.cmd&lt;/span&gt;&lt;/strong&gt; 脚本调用 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovisioning.cmd&lt;/span&gt;&lt;/strong&gt; 后 ， &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovisioning.cmd&lt;/span&gt;&lt;/strong&gt; 会安装基本的 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;Ivanti CBA&lt;/span&gt;&lt;/strong&gt; 代理服务并启动&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1190.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;启动代理服务后，客户端调用 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;C:\ldprovision\ldprovision.exe&lt;/span&gt;&lt;/strong&gt; 程序向核心服务器报告 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;CTOS&lt;/span&gt;&lt;/strong&gt; 步骤执行成功，接着继续执行后续部署模板&lt;/p&gt;
&lt;h3 id=&#34;处理方法&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#处理方法&#34;&gt;#&lt;/a&gt; 处理方法&lt;/h3&gt;
&lt;p&gt;知道 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;CTOS&lt;/span&gt;&lt;/strong&gt; 的动作后事情便简单多了，已知 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;SetupComplete.cmd&lt;/span&gt;&lt;/strong&gt; 在登录桌面时调用 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovisioning.cmd&lt;/span&gt;&lt;/strong&gt; ，此时如果网络不通，则安装 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;Ivanti CBA&lt;/span&gt;&lt;/strong&gt; 代理失败，客户端无法向服务器报告 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;CTOS&lt;/span&gt;&lt;/strong&gt; 的状态，服务器的部署模板历史记录会一直停留在 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;CTOS&lt;/span&gt;&lt;/strong&gt; ，另外， &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovisioning.cmd&lt;/span&gt;&lt;/strong&gt; 执行后会删除 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;C:\ldprovision&lt;/span&gt;&lt;/strong&gt; 目录，这样用户就无法继续执行 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovisioning.cmd&lt;/span&gt;&lt;/strong&gt; 安装 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;Ivanti CBA&lt;/span&gt;&lt;/strong&gt; 代理&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;处理方案:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;将客户端的 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;C:\ldprovision&lt;/span&gt;&lt;/strong&gt; 目录文件拷贝到共享服务器，在系统安装模板中将共享服务器上的 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovision&lt;/span&gt;&lt;/strong&gt; 目录复制到客户端上（&lt;span class=&#34;red&#34;&gt;不能放在系统盘根目录哦&lt;/span&gt;）&lt;/p&gt;
&lt;p&gt;这样后续无论是什么原因导致系统配置模板没有生效，用户都可以在联网状态下，手动将 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovision&lt;/span&gt;&lt;/strong&gt; 目录复制到 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;%systemdrive%&lt;/span&gt;&lt;/strong&gt; 根目录下执行 &lt;strong&gt;&lt;span class=&#34;red&#34;&gt;ldprovisioning.cmd&lt;/span&gt;&lt;/strong&gt; 继续后面的部署模板&lt;/p&gt;
&lt;h2 id=&#34;其它问题&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#其它问题&#34;&gt;#&lt;/a&gt; 其它问题&lt;/h2&gt;
&lt;p&gt;还有其它一些小问题也一并帮用户优化了，例如修改系统启动等待时间、关闭 UAC、激活 Windows、驱动安装等，这里就不一一列举了，最终的部署效果用户还是很满意的&lt;/p&gt;
&lt;p&gt;经过本次的项目实施，自己也收获了许多系统部署的经验，EPM 操作系统部署这块后续不会再更新了&lt;/p&gt;
&lt;p&gt;&lt;span class=&#34;red&#34;&gt;&lt;strong&gt;✿✿ヽ (°▽°) ノ✿✿&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/04/24/CSA/</guid>
            <title>CSA</title>
            <link>https://www.keeponline.cn/2023/04/24/CSA/</link>
            <category term="ivanti" scheme="https://www.keeponline.cn/categories/ivanti/" />
            <category term="CSA" scheme="https://www.keeponline.cn/tags/CSA/" />
            <pubDate>Mon, 24 Apr 2023 11:21:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1127.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最近想测试 &lt;code&gt;EPM MDM&lt;/code&gt;  功能，但是 &lt;code&gt;MDM&lt;/code&gt;  必须配合 &lt;code&gt;CSA&lt;/code&gt;  才能使用，于是便想搭个 &lt;code&gt;Ivanti Cloud Sevice Application&lt;/code&gt; （云网关） 玩一下&lt;/p&gt;
&lt;p&gt;在安装配置的过程中踩过很多坑，所以记录一下配置过程，也方便今后的知识传递&lt;/p&gt;
&lt;h1 id=&#34;系统搭建&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#系统搭建&#34;&gt;#&lt;/a&gt; 系统搭建&lt;/h1&gt;
&lt;p&gt;由于  &lt;code&gt;Ivanti&lt;/code&gt;  提供的 &lt;code&gt; CSA&lt;/code&gt;  镜像是包含  &lt;code&gt;CentOS 7&lt;/code&gt;  操作系统的 &lt;code&gt;ISO&lt;/code&gt;  文件，我们需要在云服务器上搭建这个镜像，这里就需要将我们的 &lt;code&gt;ISO&lt;/code&gt;  镜像文件注册到云平台上&lt;/p&gt;
&lt;p&gt;我现在用的是华为云的服务器，所以这里就以华为云为例，其它的云平台应该都是大同小异&lt;/p&gt;
&lt;h2 id=&#34;iso镜像上传&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#iso镜像上传&#34;&gt;#&lt;/a&gt; ISO 镜像上传&lt;/h2&gt;
&lt;p&gt;下载  &lt;code&gt;OBS Browiser+&lt;/code&gt;  工具将外部镜像文件上传到  &lt;code&gt;OBS&lt;/code&gt;  个人桶，请自身根据对应的操作系统平台下载安装&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows x86: 	&lt;a href=&#34;https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsbrowserplus/win32/OBSBrowserPlus-HEC-win32.zip&#34;&gt;https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsbrowserplus/win32/OBSBrowserPlus-HEC-win32.zip&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows x64:	&lt;a href=&#34;https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsbrowserplus/win64/OBSBrowserPlus-HEC-win64.zip&#34;&gt;https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsbrowserplus/win64/OBSBrowserPlus-HEC-win64.zip&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MacOS:		&lt;a href=&#34;https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsbrowserplus/mac/OBSBrowserPlus-HEC-mac64.zip&#34;&gt;https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsbrowserplus/mac/OBSBrowserPlus-HEC-mac64.zip&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装 &lt;code&gt;OBS Browiser+&lt;/code&gt;  工具后运行打开，随便输入一个 &lt;code&gt;OBS Browiser+&lt;/code&gt;  的账号，点击  &lt;code&gt;获取AccessKey&lt;/code&gt;  跳转到华为云访问密钥的界面&lt;/p&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;pre&gt;&lt;code&gt;该账号不需要跟云服务平台账号一致，也跟云服务器平台毫无关系，仅仅是用于区分本地`OBS Browiser+` 登录的账号
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1066.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击&lt;strong&gt;新增访问密钥&lt;/strong&gt;，输入密钥描述信息即可创建，创建密钥后可以下载密钥文件，下载后需要保存好密钥文件，该文件仅能下载一次&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1067.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;打开密钥文件，在 &lt;code&gt;OBS Browiser+&lt;/code&gt;  上输入对应的  &lt;code&gt;Access Key ID&lt;/code&gt;  和  &lt;code&gt; Secret Access Key&lt;/code&gt;  即可登录&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1068.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;登录后点击&lt;strong&gt;创建桶&lt;/strong&gt;，填写桶相关的信息后确定保存&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1069.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;进入新建的桶，选择上传&lt;strong&gt; CSA 镜像文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1070.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;然后等待镜像文件上传完毕即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1071.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;创建镜像&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#创建镜像&#34;&gt;#&lt;/a&gt; 创建镜像&lt;/h2&gt;
&lt;p&gt;镜像上传完毕后，打开华为云的控制台，在服务列表中选择 &lt;strong&gt;镜像服务 IMS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1072.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选择&lt;strong&gt;私有镜像 --&amp;gt; 导入镜像 --&amp;gt; 立即导入&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1073.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选择你创建&lt;strong&gt;桶&lt;/strong&gt;的区域，镜像类型选择&lt;strong&gt; ISO 镜像&lt;/strong&gt;，在&lt;strong&gt;桶列表&lt;/strong&gt;选择刚刚上传的 ISO 镜像文件，填写好配置信息，点击立即创建&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1075.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;提交后等待创建完成即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1076.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装服务器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#安装服务器&#34;&gt;#&lt;/a&gt; 安装服务器&lt;/h2&gt;
&lt;p&gt;私有镜像创建完毕后，我们需要用此镜像创建一个&lt;strong&gt;按需计费&lt;/strong&gt;的&lt;strong&gt;临时弹性云服务器&lt;/strong&gt;，点击镜像右侧的&lt;strong&gt;安装服务器&lt;/strong&gt;，选择对应的规格，系统会自动安装规格计算得出该服务器每小时的费用&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1077.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击&lt;strong&gt;确定&lt;/strong&gt;提交，此时系统会自动为我们创建一台弹性云服务器&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1078.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;可以点击&lt;strong&gt;返回弹性云服务器列表&lt;/strong&gt;查看创建进度&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1080.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;云服务器创建完毕后，点击远程登录 (VNC)&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1090.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;等待操作系统初始化完毕，显示登录界面&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1091.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;然后关闭远程页面，回到&lt;strong&gt;弹性云服务器控制台&lt;/strong&gt;，我们再对该云服务器创建一个私有镜像&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1081.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;创建方式选择&lt;strong&gt;创建私有镜像&lt;/strong&gt;，镜像类型选择&lt;strong&gt;系统盘镜像&lt;/strong&gt;，然后选择刚刚创建好的 CSA 云服务器，点击&lt;strong&gt;立即创建&lt;/strong&gt;&lt;br /&gt;
&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1082.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;等待系统创建完成即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1083.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;镜像创建完毕后，这台&lt;strong&gt;临时弹性云服务器&lt;/strong&gt;已经没有其它可利用价值了，为了避免它掏空我们的腰包，我们需要返回弹性云服务器，把它删除掉&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1084.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1085.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;切换操作系统&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#切换操作系统&#34;&gt;#&lt;/a&gt; 切换操作系统&lt;/h2&gt;
&lt;p&gt;回到我们已经购买好的云服务器，选择&lt;strong&gt;切换操作系统&lt;/strong&gt;，镜像类型选择&lt;strong&gt;私有镜像&lt;/strong&gt;，此时应该可以看到我们前面所创建好的&lt;strong&gt;系统盘镜像&lt;/strong&gt;，选择我们的&lt;strong&gt; CSA 镜像&lt;/strong&gt;，设置密码选择&lt;strong&gt;使用镜像密码&lt;/strong&gt;，然后点击确定开始重装系统&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1087.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1088.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;操作系统切换完毕后，选择远程登录，远程方式选择&lt;strong&gt; VNC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1089.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;查看是否能够正常登录，在登录界面选择 &lt;code&gt;admin用户&lt;/code&gt; ，输入密码 &lt;code&gt;admin&lt;/code&gt; , 点击 &lt;code&gt;Sign In&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1092.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;能够正常登录证明我们的操作系统已经安装完毕，接下来就是配置了&lt;/p&gt;
&lt;h1 id=&#34;csa配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#csa配置&#34;&gt;#&lt;/a&gt; CSA 配置&lt;/h1&gt;
&lt;p&gt;进入系统后会自动弹出 &lt;code&gt;CSA&lt;/code&gt;  的使用条例，不用管，拉到最下面，直接点击 &lt;code&gt;Accept&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1093.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;更改 &lt;code&gt;CSA&lt;/code&gt;  登录密码，更改完后会要求输入新密码重新访问&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1094.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;时区设置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#时区设置&#34;&gt;#&lt;/a&gt; 时区设置&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt; CSA Web&lt;/code&gt;  控制台中选择  &lt;code&gt;System --&amp;gt; Date/time settings --&amp;gt; Time zone&lt;/code&gt;  选择对应的时区&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1099.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;网络设置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#网络设置&#34;&gt;#&lt;/a&gt; 网络设置&lt;/h2&gt;
&lt;p&gt;在  &lt;code&gt;System --&amp;gt; Network Setting&lt;/code&gt; , 填写你的 &lt;code&gt;IP地址、DNS服务器、主机名&lt;/code&gt; 相关信息，然后 &lt;code&gt;Save&lt;/code&gt;  保存&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1095.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;网关服务设置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#网关服务设置&#34;&gt;#&lt;/a&gt; 网关服务设置&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Gateway service&lt;/code&gt;  ， &lt;code&gt;TLS&lt;/code&gt;  选择  &lt;code&gt;TLSv1.2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1096.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;往下拉找到  &lt;code&gt;Additional host names&lt;/code&gt;  在这里添加 &lt;code&gt;CSA&lt;/code&gt;  的公网解析记录，然后 &lt;code&gt;Save&lt;/code&gt;  即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1128.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;配置-csa-service-密码&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#配置-csa-service-密码&#34;&gt;#&lt;/a&gt; 配置 CSA Service 密码&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Users&lt;/code&gt;  ，在  &lt;code&gt;service&lt;/code&gt;  账号右侧的  &lt;code&gt;Set Password&lt;/code&gt;  配置一个连接密码，该账号主要是用于 &lt;code&gt;EPM&lt;/code&gt;  连接，可以跟 &lt;code&gt;admin&lt;/code&gt;  设置不一样的密码&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1111.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;激活csa&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#激活csa&#34;&gt;#&lt;/a&gt; 激活 CSA&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Activation --&amp;gt; Activate Now&lt;/code&gt;  开始激活  &lt;code&gt;CSA&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1100.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;证书配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#证书配置&#34;&gt;#&lt;/a&gt; 证书配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;通过上面的配置，如果云服务器的安全组没有拦截 443 端口的话，那么我们应该可以在自己的电脑上通过浏览器访问 CSA 的控制台了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;pre&gt;&lt;code&gt;如果不能在从互联网访问CSA，请检查CSA的网络配置是否有误，以及云服务器的安全组是否允许该端口流量入站
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;我们从自己的电脑访问 CSA 控制台，点击  &lt;code&gt;Manage CSA certificates --&amp;gt; Create CRS&lt;/code&gt;  创建证书申请请求&lt;/p&gt;
&lt;p&gt;填写相关信息，这里重要的是  &lt;code&gt;Common Name&lt;/code&gt;  信息，其它的随意，然后点击  &lt;code&gt;Create&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1112.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;Display&lt;/code&gt;  可查看申请证书请求文件 &lt;code&gt;CSR&lt;/code&gt;  内容&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1113.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;接下来就是申请证书，我这里以华为云测试证书为演示&lt;/p&gt;
&lt;p&gt;登录华为云证书管理控制台，在&lt;strong&gt; SSL 证书管理&lt;/strong&gt;界面&lt;strong&gt;创建测试证书&lt;/strong&gt;，点击&lt;strong&gt;申请证书&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1114.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;证书请求文件选择&lt;strong&gt;自己生成 CSR&lt;/strong&gt;, 复制前面在&lt;strong&gt; CSA&lt;/strong&gt; 上申请的&lt;strong&gt; CSR&lt;/strong&gt;，点击下一步&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1115.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写公司联系人信息，点击提交申请&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1116.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;此时会提示 &lt;code&gt;DNS验证&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1117.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击可以查看验证步骤，根据步骤去 &lt;code&gt;DNS解析&lt;/code&gt; 配置即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1118.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;DNS域名解析&lt;/code&gt; 添加对应的 &lt;code&gt;TXT记录&lt;/code&gt; ，添加完返回证书界面验证即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1119.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;验证通过后下载证书&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1120.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1121.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;下载后解压，打开 &lt;code&gt;cert文件&lt;/code&gt; ，复制里面的所有内容&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1122.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;回到&lt;strong&gt; CSA 证书管理&lt;/strong&gt;界面，点击  &lt;code&gt;Add CSA Certificate&lt;/code&gt; , 粘贴 &lt;code&gt;cert文件&lt;/code&gt; 的内容，然后保存&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1123.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;此时 &lt;code&gt;CSA&lt;/code&gt;  服务将重启，需要等待一段时间，等待证书添加完毕后，访问 &lt;code&gt;CSA&lt;/code&gt;  应该会提示证书错误，我们需要删除所有的自签名证书，只留下我们刚刚申请的证书&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1124.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;然后重启 CSA 服务器&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1125.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;重启后再访问 &lt;code&gt;CSA&lt;/code&gt;  证书就生效啦，是不是很简单 &lt;code&gt; ^ _ ^&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1126.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SSL 证书是 MDM 的必要条件，如果不需要 MDM 功能可以不用配置 SSL 证书&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;remote-tunnel&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#remote-tunnel&#34;&gt;#&lt;/a&gt; Remote Tunnel&lt;/h2&gt;
&lt;p&gt;如果需要对外网的设备进行远程控制，那么就必须配置一个  &lt;code&gt;Remote Tunnel&lt;/code&gt;  服务，该服务可以安装在任意一台在公网的  &lt;code&gt;Linux&lt;/code&gt;  或  &lt;code&gt;Windows&lt;/code&gt;  设备，但是通常我们会将该服务安装在 &lt;code&gt;CSA&lt;/code&gt;  这台设备上，毕竟谁的钱都不是大风刮来的，完全没有必要另外单独搞一台设备安装这个  &lt;code&gt;Remote Tunnel&lt;/code&gt;  服务&lt;/p&gt;
&lt;p&gt;先看一下 &lt;code&gt;Remote Tunnel&lt;/code&gt;  的通信架构图&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1106.png&#34; alt=&#34;upload successfu&#34; /&gt;&lt;/p&gt;
&lt;p&gt;由图得知，外部设备需要能够访问 &lt;code&gt;Remote Tunnel&lt;/code&gt;  服务器的 &lt;code&gt;TCP 44345&lt;/code&gt;  端口， &lt;code&gt;RCViewer&lt;/code&gt;  需要能够访问  &lt;code&gt;Remote Tunnel&lt;/code&gt;  服务器的 &lt;code&gt;TCP 44344&lt;/code&gt;  端口， &lt;code&gt;Core Server&lt;/code&gt;  需要能够访问  &lt;code&gt;Remote Tunnel &lt;/code&gt; 服务器的 &lt;code&gt;TCP 44346&lt;/code&gt;  端口，所以我们的 &lt;code&gt;CSA&lt;/code&gt;  需要在防火墙入站规则放行  &lt;code&gt;TCP 443、44344、44345、44346&lt;/code&gt;  这几个端口&lt;/p&gt;
&lt;p&gt;安装步骤如下:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 SSH 连接 CSA Server，用 sudo su 切换到 root 账户&lt;/li&gt;
&lt;li&gt;使用 curl -O -sSL &lt;a href=&#34;https://download.ivanti.com/product/CSA/46/tunnel_install_centos7.tar.gz&#34;&gt;https://download.ivanti.com/product/CSA/46/tunnel_install_centos7.tar.gz&lt;/a&gt; 下载安装文件&lt;/li&gt;
&lt;li&gt;解压 tunnel_install_centos7.tar.gz&lt;/li&gt;
&lt;li&gt;切换到 centos7 目录&lt;/li&gt;
&lt;li&gt;执行安装脚本&lt;/li&gt;
&lt;li&gt;安装完使用 ss 命令查看对应端口是否处在监听状态&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1107.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;epm设置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#epm设置&#34;&gt;#&lt;/a&gt; EPM 设置&lt;/h1&gt;
&lt;h2 id=&#34;添加-csa-服务器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#添加-csa-服务器&#34;&gt;#&lt;/a&gt; 添加 CSA 服务器&lt;/h2&gt;
&lt;p&gt;在  &lt;code&gt;EPM &lt;/code&gt; 控制台依次点击  &lt;code&gt;配置 --&amp;gt; 管理 Cloud Services Appliance&lt;/code&gt; , 填写  &lt;code&gt;CSA&lt;/code&gt;  相关信息，密码是 &lt;code&gt;CSA service&lt;/code&gt;  账号的密码，可不要搞错了哦&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1101.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击&lt;strong&gt;应用&lt;/strong&gt;添加&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1103.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;添加成功&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1104.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;添加-remote-tunnel&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#添加-remote-tunnel&#34;&gt;#&lt;/a&gt; 添加 Remote Tunnel&lt;/h2&gt;
&lt;p&gt;在  &lt;code&gt;EPM&lt;/code&gt;  控制台依次点击  &lt;code&gt;配置 --&amp;gt; 管理 远程控制隧道&lt;/code&gt; ，填写  &lt;code&gt;隧道&lt;/code&gt;  相关信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1108.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;客户端连通性策略启用csa和tunnel策略&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#客户端连通性策略启用csa和tunnel策略&#34;&gt;#&lt;/a&gt; 客户端连通性策略启用 CSA 和 Tunnel 策略&lt;/h2&gt;
&lt;p&gt;在&lt;strong&gt;代理设置&lt;/strong&gt;中找到&lt;strong&gt;客户端连通性&lt;/strong&gt;策略，在  &lt;code&gt;Cloud Services Appliance&lt;/code&gt;  启用  &lt;code&gt;CSA通信&lt;/code&gt; ，并将左侧&lt;strong&gt;可用项&lt;/strong&gt;的 &lt;code&gt;CSA&lt;/code&gt;  移动到右侧&lt;strong&gt;已选项&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1105.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;远程控制隧道&lt;/code&gt; ，启用 &lt;code&gt;远程隧道通信&lt;/code&gt; ，将左侧&lt;strong&gt;可用项&lt;/strong&gt;的 &lt;code&gt;Tunnel&lt;/code&gt;  移动到右侧&lt;strong&gt;已选项&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1109.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;到此 &lt;code&gt;CSA&lt;/code&gt;  的所有相关配置都基本完成了，此时生成新的代理安装包在外网的设备上安装便可进行管理，后续我再研究一下 &lt;code&gt;MDM&lt;/code&gt;  的功能&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/03/03/Pulse-Secure/</guid>
            <title>Pulse Secure</title>
            <link>https://www.keeponline.cn/2023/03/03/Pulse-Secure/</link>
            <category term="ivanti" scheme="https://www.keeponline.cn/categories/ivanti/" />
            <category term="Pulse" scheme="https://www.keeponline.cn/tags/Pulse/" />
            <pubDate>Fri, 03 Mar 2023 15:39:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1053.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;最近因为无聊，就跟别人搞了个  &lt;code&gt;Pulse &lt;/code&gt; 的镜像包，毕竟我对 &lt;code&gt;EPM&lt;/code&gt;  已经没有太多的热情了，废话不多说，下面就先把环境搭起来吧&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;pulse安装&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#pulse安装&#34;&gt;#&lt;/a&gt; Pulse 安装&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Pulse&lt;/code&gt;  的安装文件是一个 &lt;code&gt;Zip&lt;/code&gt;  压缩包，解压出来是开源虚拟化 &lt;code&gt;OVF&lt;/code&gt;  格式文件，用 &lt;code&gt;VMware&lt;/code&gt;  打开 &lt;code&gt;OVF&lt;/code&gt;  文件即可进行 &lt;code&gt;Pulse&lt;/code&gt;  的安装&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1014.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;开机前先配置虚拟机的网络适配器，默认情况下三个网络连接的都是桥接模式&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1015.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;配置好网卡后，打开电源进入 &lt;code&gt;GRUB&lt;/code&gt;  引导界面选择  &lt;code&gt;Factory Reset&lt;/code&gt;  进行初始化安装&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1013.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1016.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;按照提示填写对应信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1017.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;完成后可以看到当前的系统软件版本、 &lt;code&gt;Licensing Hardware ID&lt;/code&gt;  和交互命令，到此安装结束&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1018.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;通过浏览器访问 Web 控制台，能够正常显示和登录就说明服务器安装正常&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1019.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;system-配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#system-配置&#34;&gt;#&lt;/a&gt; System 配置&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以下是 &lt;code&gt;System&lt;/code&gt;  系统的一些基本配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;license&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#license&#34;&gt;#&lt;/a&gt; License&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;System &amp;gt; Configuration &amp;gt; Licensing&lt;/code&gt; ，在  &lt;code&gt;installled licensing details&lt;/code&gt;  填写你的许可信息，然后点击  &lt;code&gt;Add&lt;/code&gt;  即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1020.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;date-time&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#date-time&#34;&gt;#&lt;/a&gt; Date &amp;amp; Time&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;System &amp;gt; Status &amp;gt; Overview&lt;/code&gt; , 在  &lt;code&gt;Appliance Details &lt;/code&gt; 找到  &lt;code&gt;System Date &amp;amp; Time&lt;/code&gt; , 点击 &lt;code&gt;Edit&lt;/code&gt;  更改时区和时间设置&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1025.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1026.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;netwrok&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#netwrok&#34;&gt;#&lt;/a&gt; Netwrok&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;System &amp;gt; Network&lt;/code&gt; , 可查看网络相关的设置，在  &lt;code&gt;Overview&lt;/code&gt;  界面可配置主机名和 DNS 等信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1021.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Internal Port&lt;/code&gt;  配置内网信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1022.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;External Port&lt;/code&gt;  配置公网信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1024.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Management Port&lt;/code&gt;  配置管理接口信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1054.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;certifications&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#certifications&#34;&gt;#&lt;/a&gt; Certifications&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Configuration &amp;gt; Certificates &amp;gt; Device Certificate &amp;gt; Import Certificate &amp;amp;Key &lt;/code&gt; 进入证书导入界面&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1047.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在  &lt;code&gt;If certificate and private key are separate files&lt;/code&gt;  中选择对应的证书文件，然后点击 &lt;code&gt; Import&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1048.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;导入成功后，点击证书名称进入证书详情界面&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1049.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;Present certificate on these ports&lt;/code&gt;  选项中添加 &lt;code&gt;External Virtual Ports&lt;/code&gt;  将证书配置到公网，然后点击  &lt;code&gt;Save Changes&lt;/code&gt;  保存退出&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1050.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;authentication-配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#authentication-配置&#34;&gt;#&lt;/a&gt; Authentication 配置&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以下是  &lt;code&gt;Authentication&lt;/code&gt;  认证相关的配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;local-authentication&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#local-authentication&#34;&gt;#&lt;/a&gt; Local Authentication&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Authentication &amp;gt; Auth Servers&lt;/code&gt; , 在 &lt;code&gt;New&lt;/code&gt;  下拉菜单中选择 &lt;code&gt;Local Authentication&lt;/code&gt; , 然后点击  &lt;code&gt;New Server&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1027.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写策略名称，密码强度要求和账号锁定规则，填写完后点击  &lt;code&gt;Save Changes&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1028.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击  &lt;code&gt;Save Changes&lt;/code&gt;  后可以添加用户，点击  &lt;code&gt;Users&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1031.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击  &lt;code&gt;New&lt;/code&gt; , 填写新用户的信息，填完后点击  &lt;code&gt;Save Changes&lt;/code&gt;  保存&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1032.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;ldap-server&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ldap-server&#34;&gt;#&lt;/a&gt; LDAP Server&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Authentication &amp;gt; Auth Servers&lt;/code&gt; , 在 &lt;code&gt;New&lt;/code&gt;  下拉菜单中选择 &lt;code&gt;LDAP Server&lt;/code&gt; , 然后点击  &lt;code&gt;New Server&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1029.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写策略名称和 &lt;code&gt;LDAP&lt;/code&gt;  的 IP 地址以及端口信息， &lt;code&gt;LDAP Server Type&lt;/code&gt;  选择  &lt;code&gt;Active Directory&lt;/code&gt;  , &lt;code&gt;Connection&lt;/code&gt;  选择  &lt;code&gt;Unencrypted&lt;/code&gt; , 然后点击  &lt;code&gt;Test Connection&lt;/code&gt;  看看是否能够正常连接&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1041.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;active-directory&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#active-directory&#34;&gt;#&lt;/a&gt; Active Directory&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Authentication &amp;gt; Auth Servers&lt;/code&gt; , 在 &lt;code&gt;New&lt;/code&gt;  下拉菜单中选择 &lt;code&gt;Active Directory&lt;/code&gt; , 然后点击  &lt;code&gt;New Server&lt;/code&gt; , 填写策略名称和域名信息，填写完毕后点击  &lt;code&gt;Save Changes&lt;/code&gt; , 如无法加入域则检查服务器时间是否正确，也可以通过 &lt;code&gt;Troubleshooting&lt;/code&gt;  功能进行故障排查&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1042.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;signing-in&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#signing-in&#34;&gt;#&lt;/a&gt; Signing In&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Authentication &amp;gt; Signing In &amp;gt; Signing Policys&lt;/code&gt; , 选择  &lt;code&gt;User Type&lt;/code&gt; , 填写 &lt;code&gt;Sign-in URL&lt;/code&gt; , 选择 &lt;code&gt;Authentication realm&lt;/code&gt;  后点击 &lt;code&gt;Save Changes&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1043.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;users-配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#users-配置&#34;&gt;#&lt;/a&gt; Users 配置&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以下是 &lt;code&gt;Users&lt;/code&gt;  系统的一些基本配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;user-roles&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#user-roles&#34;&gt;#&lt;/a&gt; User Roles&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Users &amp;gt; User Roles&lt;/code&gt; , 然后点击  &lt;code&gt;New Roles&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1034.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写策略名称，勾选角色访问权限，点击  &lt;code&gt;Svae Change&lt;/code&gt;  保存&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1035.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;users-realms&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#users-realms&#34;&gt;#&lt;/a&gt; Users Realms&lt;/h2&gt;
&lt;p&gt;点击  &lt;code&gt;Users &amp;gt; User Realms&lt;/code&gt; , 然后点击  &lt;code&gt;New Users Realms&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1036.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;填写策略名称，选择认证服务器，勾选是否需要二次认证，点击  &lt;code&gt;Svae Change&lt;/code&gt;  保存&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1037.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;保存后在  &lt;code&gt;Role Mapping&lt;/code&gt;  界面点击  &lt;code&gt;New Rule&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1038.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Rule Based on&lt;/code&gt;  选择 &lt;code&gt;Group membership&lt;/code&gt; , 填写策略名称，点击 &lt;code&gt;Groups&lt;/code&gt; , 添加用户，然后选择 &lt;code&gt;Role&lt;/code&gt;  策略，最后点击  &lt;code&gt;Svae Change&lt;/code&gt;  保存&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1044.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;客户端登录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#客户端登录&#34;&gt;#&lt;/a&gt; 客户端登录&lt;/h1&gt;
&lt;p&gt;按照上面的策略配置，用户已经可以通过浏览器访问和登录 &lt;code&gt;Pulse&lt;/code&gt;  了，下面是用户登录界面和登录后的界面&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1052.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1051.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;由于当前我的环境还没什么服务可以测试，后续有空添加其它服务再进行测试&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/02/14/Mobileiron-Basic-Configuration/</guid>
            <title>Mobileiron Basic Configuration</title>
            <link>https://www.keeponline.cn/2023/02/14/Mobileiron-Basic-Configuration/</link>
            <category term="ivanti" scheme="https://www.keeponline.cn/categories/ivanti/" />
            <category term="Mobileiron" scheme="https://www.keeponline.cn/tags/Mobileiron/" />
            <pubDate>Tue, 14 Feb 2023 10:54:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-902.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Mobileiron&lt;/code&gt;  的学习因为之前住院和出院后的放疗，摆烂了大半年，以至于之前测试环境中的域名已经过期😂😂😂&lt;/p&gt;
&lt;p&gt;为了后续更好的测试，我重新安装了新的环境，域名改成  &lt;code&gt;mc.keeponline.cn&lt;/code&gt;  其它不变&lt;/p&gt;
&lt;p&gt;这里简单说一下， &lt;code&gt;mobileiron&lt;/code&gt;  有两个 &lt;code&gt;Web&lt;/code&gt;  管理控制台，分别是:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Core Admin Portal : &lt;a href=&#34;https://mc.keeponline.cn/mifs/admin&#34;&gt;https://mc.keeponline.cn/mifs/admin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Core System Manager : &lt;a href=&#34;https://mc.keeponline.cn:8443/mics&#34;&gt;https://mc.keeponline.cn:8443/mics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中 &lt;code&gt;Admin Portal&lt;/code&gt;  是用于配置设备管理的控制台， &lt;code&gt; System Manager&lt;/code&gt;  是用于配置服务器的一些相关设置的控制台，这里主要说一下 &lt;code&gt;Admin Portal&lt;/code&gt;  的配置&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;dashboard&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#dashboard&#34;&gt;#&lt;/a&gt; Dashboard&lt;/h1&gt;
&lt;p&gt;控制台仪表盘界面可以很直观地查看设备的各种详细信息，就是一个图形化报告的汇总，没啥好说的&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1008.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;devices-users&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#devices-users&#34;&gt;#&lt;/a&gt; Devices &amp;amp; USERS&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;该菜单栏可配置 &lt;code&gt;Device、Users、Lebels、ActiveSync、Apple Device Enrollment、Apple Education&lt;/code&gt;  策略&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;devices&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#devices&#34;&gt;#&lt;/a&gt; Devices&lt;/h2&gt;
&lt;p&gt;这里可以查看所有已经注册的设备、邀请新用户注册和对设备进行管理，例如锁定设备、给设备推送消息通知&lt;/p&gt;
&lt;h3 id=&#34;添加单设备&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#添加单设备&#34;&gt;#&lt;/a&gt; 添加单设备&lt;/h3&gt;
&lt;p&gt;依次点击  &lt;code&gt;Devices &amp;amp; Users &amp;gt; Devices &amp;gt; Add &amp;gt; Single Device&lt;/code&gt; , 填写设备相关信息，填写完毕点击  &lt;code&gt;Register&lt;/code&gt; , 弹出注册相关信息，这些信息可以通过短信或邮件发送给用户，让用户主动注册设备&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1009.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1010.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1011.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;添加本地用户&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#添加本地用户&#34;&gt;#&lt;/a&gt; 添加本地用户&lt;/h2&gt;
&lt;p&gt;登录  &lt;code&gt;Admin Portal&lt;/code&gt; , 点击  &lt;code&gt;Devices &amp;amp; Users &amp;gt; Users &amp;gt; Add &amp;gt; Add Local User&lt;/code&gt; , 填写用户相关信息，然后点击 &lt;code&gt;Save&lt;/code&gt;  保存即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1006.png&#34; alt=&#34;upload successfu&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;添加ad域用户&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#添加ad域用户&#34;&gt;#&lt;/a&gt; 添加 AD 域用户&lt;/h2&gt;
&lt;p&gt;添加 &lt;code&gt;AD域用户&lt;/code&gt; 需要先配置 &lt;code&gt;LADP&lt;/code&gt; , 然后点击  &lt;code&gt;Devices &amp;amp; Users &amp;gt; Users &amp;gt; LDAP Entities &amp;gt; LDAP USERS&lt;/code&gt; , 输入域账号，点击放大镜图标进行搜索，搜索到用户后勾选该用户，然后点击  &lt;code&gt;Action &amp;gt; Assing Roles&lt;/code&gt;  给该用户分配权限，如果只是普通用户，我们分配一个  &lt;code&gt;User Portal&lt;/code&gt;  权限即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1007.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;admin&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#admin&#34;&gt;#&lt;/a&gt; Admin&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;该菜单可以配置  &lt;code&gt;Admins 和 Device Spaces&lt;/code&gt;  策略&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;admins&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#admins&#34;&gt;#&lt;/a&gt; Admins&lt;/h2&gt;
&lt;p&gt;依次点击  &lt;code&gt;Admin &amp;gt; Admins &amp;gt; Actions &amp;gt;  Edit Roles&lt;/code&gt;  可以编辑管理员账号的权限&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1058.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;device-spaces&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#device-spaces&#34;&gt;#&lt;/a&gt; Device Spaces&lt;/h2&gt;
&lt;p&gt;依次点击  &lt;code&gt;Admin &amp;gt; Device Spaces Add+&lt;/code&gt;  可以添加设备范围，例如添加一个  &lt;code&gt;Android&lt;/code&gt;  手机的设备范围&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1059.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;apps&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#apps&#34;&gt;#&lt;/a&gt; Apps&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;该菜单可以配置  &lt;code&gt;App Catalog、Categories、App Tunnels、App Control、Apps@Work Settings、 Apple Licenses&lt;/code&gt;  策略&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;app-catalog&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#app-catalog&#34;&gt;#&lt;/a&gt; App Catalog&lt;/h2&gt;
&lt;p&gt;依次点击  &lt;code&gt;Apps &amp;gt; App Catalog &amp;gt; Add+&lt;/code&gt;  可以添加应用程序&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1060.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;例如添加一个  &lt;code&gt;Apple IOS&lt;/code&gt;  的应用，这里选择  &lt;code&gt;iTunes&lt;/code&gt; , 在  &lt;code&gt;Application Name&lt;/code&gt;  输入应用程序名称， &lt;code&gt;App Store&lt;/code&gt;  选择地区，点击  &lt;code&gt;Search&lt;/code&gt;  即可查找对应的程序&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1061.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;选中对应的程序，然后点击左下角的  &lt;code&gt;Next&lt;/code&gt; ，给应用添加一个类别标签&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1062.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;点击  &lt;code&gt;Next&lt;/code&gt;  配置  &lt;code&gt;App@Work Catalog&lt;/code&gt;  信息然后下一步保存即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1063.png&#34; alt=&#34;upload successfu&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这样一个应用程序就添加好了，接下来我们需要为这个应用程序添加一个标签关联对应的设备策略，选中该应用程序，点击  &lt;code&gt;Actions &amp;gt; Apply To Labels&lt;/code&gt;  , 在这里选中  &lt;code&gt;iOS&lt;/code&gt;  这个标签就可以了，这样所有的  &lt;code&gt;iOS&lt;/code&gt;  设备都可以在 &lt;code&gt;App@Work Catalog&lt;/code&gt;  中下载安装该应用&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1064.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;categories&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#categories&#34;&gt;#&lt;/a&gt; Categories&lt;/h2&gt;
&lt;p&gt;依次点击  &lt;code&gt;Apps &amp;gt; Categories&lt;/code&gt;  可以添加分类标签，这个相对简单，没啥好说的&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1065.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;policies-configs&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#policies-configs&#34;&gt;#&lt;/a&gt; Policies &amp;amp; Configs&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;该菜单可以配置  &lt;code&gt;Configurations、Policies、ActiveSync Policies、Compliance Policies、Compliance Actions&lt;/code&gt;  策略&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;configurations&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#configurations&#34;&gt;#&lt;/a&gt; Configurations&lt;/h2&gt;
&lt;p&gt;这里的配置很多，例如安卓设备国内因为无法访问  &lt;code&gt;Google&lt;/code&gt;  服务，所以只能使用  &lt;code&gt;Non-GSM&lt;/code&gt;  模式管理，就需要开启  &lt;code&gt;Closed Network/AOSP&lt;/code&gt;  模式&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1180.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;其它的配置目前还用不上，后续测试用上了再作介绍&lt;/p&gt;
&lt;h2 id=&#34;policies&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#policies&#34;&gt;#&lt;/a&gt; Policies&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Policies&lt;/code&gt;  这里简单介绍几个我知道的策略吧&lt;/p&gt;
&lt;h3 id=&#34;android-kiosk-mode&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#android-kiosk-mode&#34;&gt;#&lt;/a&gt; Android Kiosk Mode&lt;/h3&gt;
&lt;p&gt;Kiosk 模式就是自助终端模式，可以限制用户使用原系统的任何功能，只能使用管理员允许的 APP, 相当于一个强管控的模式&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1181.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;security&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#security&#34;&gt;#&lt;/a&gt; Security&lt;/h3&gt;
&lt;p&gt;安全策略这里配置设备密码复杂性，数据加密等&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1182.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;lockdown&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#lockdown&#34;&gt;#&lt;/a&gt; LockDown&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;LockDown&lt;/code&gt;  策略这里可以限制设备的使用功能，例如禁用相机、蓝牙、屏幕截屏、WiFi、APP 等功能，基本上设备的绝大部分功能限制都在个策略上可以实现，这里就不一一列举了&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1183.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1184.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;services&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#services&#34;&gt;#&lt;/a&gt; Services&lt;/h1&gt;
&lt;p&gt;服务这里大部分我都不认识，这些服务基本都是我日常接触不到的，只能说一些我知道的服务&lt;/p&gt;
&lt;h2 id=&#34;ldap&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ldap&#34;&gt;#&lt;/a&gt; LDAP&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;LDAP&lt;/code&gt;  用于对接我们的域服务器目录数据，登录  &lt;code&gt;Admin Portal&lt;/code&gt; , 点击  &lt;code&gt;Services &amp;gt; LDAP &amp;gt; Add New&lt;/code&gt; , 填写 &lt;code&gt;AD域&lt;/code&gt; 信息，然后点击 &lt;code&gt;View LDAP Browser&lt;/code&gt;  查看是否能够正常预览 AD 架构，预览正常点击 &lt;code&gt;Save&lt;/code&gt;  保存即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1004.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;google&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#google&#34;&gt;#&lt;/a&gt; Google&lt;/h2&gt;
&lt;p&gt;谷歌服务这里可以选择安装设备的管理模式，目前国内的话，因为无法正常访问谷歌服务，所以这里需要启用 &lt;code&gt;AOSP/Closed Network Devices&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这样设备只需要通过简单的刷写 &lt;code&gt;Set Device Owner&lt;/code&gt;  数据，也能实现  &lt;code&gt;Non-GMS&lt;/code&gt;  设备的管理&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1185.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;settings&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#settings&#34;&gt;#&lt;/a&gt; Settings&lt;/h1&gt;
&lt;p&gt;这里可以配置本地用户的密码策略、客户端证书认证、iOS MDM 配置等&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-1186.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;就先这样吧，后续有需求再测试吧&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.keeponline.cn/2023/01/03/%E8%87%AA%E5%BB%BASwitch%E5%8A%A0%E9%80%9F%E5%99%A8/</guid>
            <title>自建游戏加速器</title>
            <link>https://www.keeponline.cn/2023/01/03/%E8%87%AA%E5%BB%BASwitch%E5%8A%A0%E9%80%9F%E5%99%A8/</link>
            <category term="Github" scheme="https://www.keeponline.cn/categories/Github/" />
            <category term="Netsh" scheme="https://www.keeponline.cn/tags/Netsh/" />
            <pubDate>Tue, 03 Jan 2023 16:20:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-962.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;前段时间我不是住院咩，在住院期间就很无聊，每天都是在刷 b 站，然后就刷到 &lt;code&gt;Switch&lt;/code&gt;  宝可梦第九世代朱紫发布了，看了一些 UP 主的评测和游玩，心里就一直痒痒的&lt;/p&gt;
&lt;p&gt;老实说，我已经有两年左右的时间没怎么玩游戏了，上一次玩宝可梦还是在 &lt;code&gt;Gameboy&lt;/code&gt;  上玩的第三世代，后面发布的宝可梦就直接把 &lt;code&gt;Gameboy&lt;/code&gt;  给淘汰了&lt;/p&gt;
&lt;p&gt;这些年来虽然没有再玩过宝可梦的游戏了，但是宝可梦的动漫和剧场版都是一直有在看的，这是我目前保留不多的童真，超怀念小时候玩 &lt;code&gt;FC&lt;/code&gt;  和 &lt;code&gt;GameBoy&lt;/code&gt; ，那时候玩游戏是真的快乐&lt;/p&gt;
&lt;p&gt;就在上周，我一时没忍住就购买了 &lt;code&gt;Switch OLED 朱紫限定版&lt;/code&gt; 主机和 &lt;code&gt;宝可梦紫&lt;/code&gt; 卡带，并且在元旦那天我也把这个游戏给通关了😁😁😁&lt;/p&gt;
&lt;p&gt;游戏方面就不多聊了，反正画质不是小时候玩的 &lt;code&gt;Gameboy&lt;/code&gt;  能够相提并论的，这里主要是说一下 &lt;code&gt;Switch&lt;/code&gt;  主机在联网上面的遇到的一些问题和我的解决方法&lt;/p&gt;
&lt;p&gt;由于我是第一次接触 &lt;code&gt;Switch&lt;/code&gt;  这款游戏机，之前并不知道 &lt;code&gt;Switch&lt;/code&gt;  在国内的网络体验是如此垃圾，这里总结一下&lt;/p&gt;
&lt;h1 id=&#34;switch联网问题&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#switch联网问题&#34;&gt;#&lt;/a&gt; Switch 联网问题&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;游戏下载慢&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我拿到 &lt;code&gt;Switch&lt;/code&gt;  的第一时间就是注册了任天堂的账号，因为贫穷的原因，我想在商城上看看有什么免费的游戏下载，先是挑选了一些免费游戏，然后尝试下载&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-963.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;看到下载时间为 32 小时，顿时奔溃，于是开始上网查找原因，大概就是任天堂在国内没有服务器，并且在国内也没有 &lt;code&gt;ICP许可证&lt;/code&gt; 而无法向国内提供 &lt;code&gt;CDN服务&lt;/code&gt; 所导致下载慢&lt;/p&gt;
&lt;p&gt;解决的办法也简单，更改 DNS 或者使用游戏加速器&lt;/p&gt;
&lt;p&gt;我试了一下更改 DNS 的方法，确实是有效的，但是一个个测试太繁琐，需要浪费很多时间，最后才找到一个合适的 DNS，下载时间瞬间就变成一个小时了&lt;/p&gt;
&lt;p&gt;这里推荐一个  &lt;code&gt;DNS Benchmark&lt;/code&gt;  的小工具，可以帮助我们批量测试 &lt;code&gt;DNS&lt;/code&gt;  的链接速度，节省自己在 &lt;code&gt;Switch&lt;/code&gt;  一个一个的更换测试时间&lt;/p&gt;
&lt;p&gt;这个软件很简单，打开后通过  &lt;code&gt;Nameserver -- Add/Remove&lt;/code&gt;  菜单移除掉自带的所有 &lt;code&gt;DNS&lt;/code&gt; , 然后添加自己需要测试的 &lt;code&gt;DNS&lt;/code&gt; , 添加完后点击  &lt;code&gt;Run Benchmark&lt;/code&gt;  就可以了，结束后响应时间最快的 &lt;code&gt;DNS&lt;/code&gt;  会自动排在最上面，一般选择最上面的 &lt;code&gt;DNS&lt;/code&gt;  即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-967.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;另外说一下，游戏加速器我也试用了几个产品，不得不说游戏加速器是真的好用，缺点就是要收费，一年三百多块的样子，我这段时间因为这条狗腿的问题已经是负债累累了，实在是囊中羞涩&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS: 土豪直接上加速器，后面的不用看了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;游戏联机错误&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下载的问题解决了，本以为就可以痛快的玩游戏了，但是我通过游戏联机的时候结果直接报错&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-964.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;我人都麻了，然后又开始上网找原因，大概就是 &lt;code&gt;Switch&lt;/code&gt;  想要联机稳定，主要是看网络测试中的 &lt;code&gt;NAT类型&lt;/code&gt; 是否为 &lt;code&gt;A&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-965.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;测试结果为 &lt;code&gt;B&lt;/code&gt; , 上网搜了一下，这个问题好像除了用加速器外别无他法了☹️&lt;/p&gt;
&lt;h1 id=&#34;clash代理&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#clash代理&#34;&gt;#&lt;/a&gt; Clash 代理&lt;/h1&gt;
&lt;p&gt;此时我想起自己有一台海外的 &lt;code&gt;VPS&lt;/code&gt; ，应该可以做点什么把这三百块钱给省下来，我目前这台 &lt;code&gt;VPS&lt;/code&gt;  上之前搭建了有 &lt;code&gt;V2ray&lt;/code&gt;  作为 &lt;code&gt;Vmess&lt;/code&gt;  服务器，不知道能不能用 &lt;code&gt;Vmess&lt;/code&gt;  做代理改善 &lt;code&gt;Switch&lt;/code&gt;  的联机环境&lt;/p&gt;
&lt;p&gt;既然要用 &lt;code&gt;Vmess&lt;/code&gt;  作为代理，那么就需要找一个支持 &lt;code&gt;Vmess&lt;/code&gt;  的代理服务器，我之前研究科学上网的时候，有使用过 &lt;code&gt;Clash&lt;/code&gt;  这个工具，这个工具提供代理服务，但是不能直接使用 &lt;code&gt;Vmess&lt;/code&gt;  链接进行科学上网，而是采用 &lt;code&gt;订阅链接&lt;/code&gt; 的方式提供代理服务&lt;/p&gt;
&lt;p&gt;我们可以通过 &lt;a href=&#34;https://acl4ssr-sub.github.io/&#34;&gt;https://acl4ssr-sub.github.io/&lt;/a&gt; 这个地址进行订阅转换，该网站提供  &lt;code&gt;ss/ssr/vmess链接&lt;/code&gt;  转换订阅服务，并且可批量转换&lt;/p&gt;
&lt;p&gt;开始之前，我们还需要下载一个叫  &lt;code&gt;subconverter&lt;/code&gt;  的转换工具，这个工具能让本地提供订阅转换服务，因为我并不打算使用该网站提供的后端转换服务，原因是对方可以获取到你的相关信息，所以用这个工具可以在本地提供这个订阅服务&lt;/p&gt;
&lt;p&gt;通过 &lt;a href=&#34;https://github.com/tindy2013/subconverter/releases/&#34;&gt;https://github.com/tindy2013/subconverter/releases/&lt;/a&gt; 下载  &lt;code&gt;subconverter&lt;/code&gt;  , 下载对应的平台版本后解压，解压后运行 &lt;code&gt;subconverter.exe&lt;/code&gt;  程序，运行后会弹出一个窗口，这个窗口不要关闭，最小化即可&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-968.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;然后在 &lt;a href=&#34;https://acl4ssr-sub.github.io/&#34;&gt;https://acl4ssr-sub.github.io/&lt;/a&gt; 填写你的  &lt;code&gt;ss/ssr/vmess链接&lt;/code&gt; ，客户端选择 &lt;code&gt;Clash&lt;/code&gt; , 远程配置 &lt;code&gt;不选&lt;/code&gt; ，后端地址选择 &lt;code&gt;本地版&lt;/code&gt; ，然后点击 &lt;code&gt;生产订阅链接&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-969.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;复制定制订阅链接，我们在本地的浏览器打开看看是否能够正常访问&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-970.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;确定能够正常访问后，打开 &lt;code&gt;Clash&lt;/code&gt; , 在  &lt;code&gt;Profiles&lt;/code&gt;  输入定制订阅链接，然后点击  &lt;code&gt;Download&lt;/code&gt;  即可下载配置文件&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-971.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;然后在  &lt;code&gt;Proxies&lt;/code&gt;  测试一下节点响应情况，我的响应时间是 600 多毫秒，情况有点糟糕，感觉这个方法不太行&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-972.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;还是先试一试吧，在  &lt;code&gt;General&lt;/code&gt;  开启全局代理服务&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-973.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;然后在 &lt;code&gt;Switch&lt;/code&gt;  上配置一下代理信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-974.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;配置好代理后进行网络测试&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-975.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;结果  &lt;code&gt;NAT类型&lt;/code&gt;  还是 &lt;code&gt;B&lt;/code&gt; , 看来通过代理这种方法并不能改善联机的网络&lt;/p&gt;
&lt;p&gt;虽然 &lt;code&gt;Clash代理&lt;/code&gt; 并不能改善 &lt;code&gt;Switch&lt;/code&gt;  的联机体验，但是可以用来给我的 &lt;code&gt;ipad&lt;/code&gt;  和 &lt;code&gt;iphone&lt;/code&gt;  平时看外站，所以还是有点用的&lt;/p&gt;
&lt;h1 id=&#34;netch游戏加速器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#netch游戏加速器&#34;&gt;#&lt;/a&gt; Netch 游戏加速器&lt;/h1&gt;
&lt;p&gt;代理的方法碰壁后，我就只能找其它的方法，最终让我找到了一个开源的游戏加速器 &lt;code&gt;Netch&lt;/code&gt; , 这个软件使用方式很简单，目前只支持 &lt;code&gt;Windows平台&lt;/code&gt; ，废话不多说，马上进入主题， &lt;code&gt;Netch&lt;/code&gt;  下载地址 &lt;a href=&#34;https://github.com/netchx/netch/releases/&#34;&gt;https://github.com/netchx/netch/releases/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载 &lt;code&gt;Netch&lt;/code&gt;  解压后运行主程序，可以看到 &lt;code&gt;Netch&lt;/code&gt;  支持目前绝大多数的代理协议&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-976.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;为了可以更好的玩耍，我打算搭建 &lt;code&gt;SS&lt;/code&gt;  服务器，因为 &lt;code&gt;Vmess&lt;/code&gt;  协议是经过多次加密，相对来说体验较差，而且 &lt;code&gt;SS&lt;/code&gt;  服务搭建也简单，因为之前就有用过一个一键安装的脚本，我真的是个大聪明😜&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;PS: SS协议流量在国内一定会被检测到并且封IP,我之前不知道,结果被ban了,后续我还是乖乖的用回Vmess协议了&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对了，我的 &lt;code&gt;VPS&lt;/code&gt;  是 &lt;code&gt;CentOS 7&lt;/code&gt;  的版本，如果是  &lt;code&gt;Ubuntu&lt;/code&gt;  或  &lt;code&gt;Debian&lt;/code&gt;  直接  &lt;code&gt;apt install shadowsocks-libev&lt;/code&gt;  即可&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下载一键安装脚本并添加执行权限&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;wget&lt;/span&gt; --no-check-certificate &lt;span class=&#34;token parameter variable&#34;&gt;-O&lt;/span&gt; shadowsocks-libev.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;chmod&lt;/span&gt; +x shadowsocks-libev.sh&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-977.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;执行脚本进行一键安装&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;./shadowsocks-libev.sh &lt;span class=&#34;token operator&#34;&gt;&lt;span class=&#34;token file-descriptor important&#34;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&#34;token file-descriptor important&#34;&gt;&amp;amp;1&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;tee&lt;/span&gt; shadowsocks-libev.log&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;按照提示输入密码和端口协议这些相关信息，最后按回车自动安装&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-978.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;安装完成后显示相关的信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-979.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;如果需要修改的话改这个文件即可  &lt;code&gt;/etc/shadowsocks-libev/config.json&lt;/code&gt; , 改完后要重启服务哦&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;span&gt;l&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;启动：/etc/init.d/shadowsocks start&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;停止：/etc/init.d/shadowsocks stop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;重启：/etc/init.d/shadowsocks restart&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;查看状态：/etc/init.d/shadowsocks status&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;然后在  &lt;code&gt;Netch&lt;/code&gt;  上添加我们的  &lt;code&gt;Shadowsocks&lt;/code&gt;  服务器，填写对应的信息然后保存&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-980.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;保存后在模式这里选择  &lt;code&gt;Tencent Preset&lt;/code&gt; , 然后点击闪电图标进行网络测试&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-981.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;152 毫秒还可以，这次应该可以愉快的玩耍了，点击启动开启服务，此时会弹出一个窗口，里面有 &lt;code&gt;IP地址/掩码/网关&lt;/code&gt; 信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-982.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;Switch&lt;/code&gt;  网络配置界面，将 IP 地址改成手动，配置 &lt;code&gt;Netch&lt;/code&gt;  提供给我们的网络信息&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-983.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;保存后返回网络测试，可以看到虽然下载上传的速度变成几兆了，但是 &lt;code&gt;NAT类型&lt;/code&gt; 变成 &lt;code&gt;A&lt;/code&gt;  了&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-984.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-985.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;太激动了，马上登录我的宝可梦尝试联机，&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; data-src=&#34;/images/pasted-986.png&#34; alt=&#34;upload successful&#34; /&gt;&lt;/p&gt;
&lt;p&gt;太棒了，这次选择团战没有报错，而且也有玩家加入，终于可以愉快的和玩家一起刷太晶坑了🥰🥰🥰&lt;/p&gt;
&lt;h1 id=&#34;总结&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#总结&#34;&gt;#&lt;/a&gt; 总结&lt;/h1&gt;
&lt;p&gt;最后再说一下吧，有的人可能会说一台 VPS 也不便宜啊，搞得这么麻烦，还不如直接买加速器&lt;/p&gt;
&lt;p&gt;其实吧，有的时候一些云服务器厂商搞活动，一台云服务器 1 年才两百块左右，长时间使用我觉得是可以省下几顿大餐的，而且加速器仅仅只能用于游戏加速，云服务器就不一样了，我还可以在上面搭建各种服务对吧&lt;/p&gt;
&lt;p&gt;就这样吧，反正只是单纯记录一下自己尝试过的 &lt;code&gt;Switch&lt;/code&gt;  联机方法，并且有些方法也不仅仅可以用来优化 &lt;code&gt;Switch&lt;/code&gt;  的网络，以后要是有其它更好的方法我再分享吧&lt;/p&gt;
 ]]></description>
        </item>
    </channel>
</rss>
