<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>HQY</title><link>https://kinber.cn/</link><description>HQY|VPS|VPN|华为|思科|H3C|DELL|VMWARE|VCENTER|ESXI</description><item><title>简要介绍WASAPI播放音频的方法</title><link>https://kinber.cn/post/6694.html</link><description>&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;说说怎么用WASAPI播放声音吧。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;本文完整代码可以在以下链接找到&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a href=&quot;https://gitee.com/peaboss/archive/tree/main/learnaudios&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://gitee.com/peaboss/archive/tree/main/learnaudios&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;目录是demo/wasplay。&lt;/p&gt;&lt;h2 id=&quot;wasapi介绍&quot; style=&quot;margin: 10px 0px; padding: 0px; font-size: 21px; line-height: 1.5; font-family: Verdana, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;WASAPI介绍&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;参考链接&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/coreaudio/wasapi&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://learn.microsoft.com/en-us/windows/win32/coreaudio/wasapi&lt;/a&gt;，这个是英文原版的，建议阅读，&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows/win32/coreaudio/wasapi&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://learn.microsoft.com/zh-cn/windows/win32/coreaudio/wasapi&lt;/a&gt;是机翻的，有些地方不太好，当然也可以两份对照着阅读。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;WASAPI是Windows Core Audio的一部分，是从Vista开始引入的，作为应用层最底层的音频API。所以现在用的DirectSound系列也好，waveXxx(也就是MME)也好，他们都是基于Core Audio的，而音频流的管理，则是通过WASAPI。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;WASAPI是一个比较复杂的API，但是其方便了许多偏底层的音频开发，因为在这之前有WDM音频驱动和Kernel Streaming(内核流)这种模式，开发难度极高，甚至为了降低延迟就有厂商搞出了ASIO这玩意。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;延迟对于音频开发来说非常重要，因为早期Windows没有一套像样的低延迟音频API，所以开发起来要另辟蹊径，费时费力，而现在有了WASAPI就不一样了，一套API就可以实现低延迟、高品质的音频输入输出了。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;可以说微软推出WASAPI就是为了一统Windows音频开发的江湖。&lt;/p&gt;&lt;h2 id=&quot;wasapi使用&quot; style=&quot;margin: 10px 0px; padding: 0px; font-size: 21px; line-height: 1.5; font-family: Verdana, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;WASAPI使用&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;现在我们看看WASAPI应该怎么用吧。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;首先说明，WASAPI(或者说整个Core Audio)是基于Windows经典的COM组件对象模型，使用一系列接口来实现各类功能。所以我们要使用它，就必须先了解一些基础的COM知识。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;其实之前讲DirectSound的时候也说到了这个，但是因为DirectSound有&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;DirectSoundCreate&lt;/code&gt;这个函数，所以操作简单了不少，而用Core Audio就复杂一些了。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;一些有关COM概念的介绍网上有不少不错的资料，这里就不多说了，比如&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;官方文档&amp;nbsp;&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows/win32/com/component-object-model--com--portal&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://learn.microsoft.com/zh-cn/windows/win32/com/component-object-model--com--portal&lt;/a&gt;&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;或者&amp;nbsp;&lt;a href=&quot;https://blog.csdn.net/qq_40628925/article/details/118097146&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://blog.csdn.net/qq_40628925/article/details/118097146&lt;/a&gt;&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;还有&amp;nbsp;&lt;a href=&quot;https://blog.csdn.net/wangqiulin123456/article/details/8026270&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://blog.csdn.net/wangqiulin123456/article/details/8026270&lt;/a&gt;（排版差了点）&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;COM在我们的使用中就是一个接口，这个接口类似于Java或者C#里的接口，在C++就是一个纯虚类，用C语言表示就是一个虚函数表，利用这个特性实现了跨编程语言、跨操作系统的功能。每个接口都继承自&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;IUnknown&lt;/code&gt;类，有三个基本方法，一般最需要关注的就是&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Release&lt;/code&gt;的调用了，因为这涉及到内存释放，如果不调用就会造成泄漏。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;使用COM的函数需要注意返回值，类型为&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;HRESULT&lt;/code&gt;，实际上就是一个int，其中&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;S_OK&lt;/code&gt;代表成功，其他不少返回值都有其特定的含义，具体在查API的时候可以看到，不过呢一般情况下都是会返回&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;S_OK&lt;/code&gt;的，只有少部分会失败，我们只需关注容易失败的就行了。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在使用COM之前先要初始化，这个过程比较简单，调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;CoInitializeEx&lt;/code&gt;函数即可，当然使用完了一会要调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;CoUninitialize&lt;/code&gt;来撤销初始化。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;其中&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;CoInitializeEx&lt;/code&gt;有两个参数，第一个固定为&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;NULL&lt;/code&gt;，第二个填0即可，默认就是多线程的，返回值一般不用管，基本上不会出错的；&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;CoUninitialize&lt;/code&gt;没有参数也没有返回值。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;然后需要调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;CoCreateInstance&lt;/code&gt;来创建一个对象，这个函数比较复杂，&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-cocreateinstance&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;这里&lt;/a&gt;是官方的介绍。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;贴一下官方的函数原型&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot; highlighted=&quot;true&quot; style=&quot;margin: 10px auto; padding: 0px; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; font-family: var(--code-font, &amp;#39;&amp;quot;Courier New&amp;quot;, sans-serif, Consolas, Monaco&amp;#39;); font-size: 12px; background-color: rgb(255, 255, 255);&quot;&gt;HRESULT&amp;nbsp;CoCreateInstance(&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;&amp;nbsp;REFCLSID&amp;nbsp;&amp;nbsp;rclsid,&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;&amp;nbsp;LPUNKNOWN&amp;nbsp;pUnkOuter,&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwClsContext,&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;&amp;nbsp;REFIID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;riid,&amp;nbsp;&amp;nbsp;[out]&amp;nbsp;LPVOID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*ppv);&lt;/pre&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;第一个是CLSID，我们只要知道这是一个GUID常量就行了&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第二个一般用NULL就行了&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第三个一般用CLSCTX_ALL就行了&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第四个一是要创建的对象的类型IID，也是一个GUID常量&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第五个就是创建的对象指针的地址&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;下面贴出创建的例子&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot; highlighted=&quot;true&quot; style=&quot;margin: 10px auto; padding: 0px; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; font-family: var(--code-font, &amp;#39;&amp;quot;Courier New&amp;quot;, sans-serif, Consolas, Monaco&amp;#39;); font-size: 12px; background-color: rgb(255, 255, 255);&quot;&gt;const&amp;nbsp;GUID&amp;nbsp;IID_IMMDeviceEnumerator&amp;nbsp;=&amp;nbsp;__uuidof(IMMDeviceEnumerator);const&amp;nbsp;CLSID&amp;nbsp;CLSID_MMDeviceEnumerator&amp;nbsp;=&amp;nbsp;__uuidof(MMDeviceEnumerator);IMMDeviceEnumerator&amp;nbsp;*enumerator&amp;nbsp;=&amp;nbsp;NULL;CoCreateInstance(CLSID_MMDeviceEnumerator,&amp;nbsp;NULL,&amp;nbsp;CLSCTX_ALL,&amp;nbsp;IID_IMMDeviceEnumerator,&amp;nbsp;(void&amp;nbsp;**)&amp;amp;enumerator);&lt;/pre&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;这样我们就有了一个IMMDeviceEnumerator对象指针了。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;接着再&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot; highlighted=&quot;true&quot; style=&quot;margin: 10px auto; padding: 0px; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; font-family: var(--code-font, &amp;#39;&amp;quot;Courier New&amp;quot;, sans-serif, Consolas, Monaco&amp;#39;); font-size: 12px; background-color: rgb(255, 255, 255);&quot;&gt;IMMDevice&amp;nbsp;*device&amp;nbsp;=&amp;nbsp;NULL;enumerator-&amp;gt;GetDefaultAudioEndpoint(eRender,&amp;nbsp;eConsole,&amp;nbsp;&amp;amp;device);enumerator-&amp;gt;Release();&lt;/pre&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;就能创建一个IMMDevice对象了，这里创建的是默认设备对象，也可以枚举所有设备选择其中一个，选择的过程一般交给用户来处理，具体可以去看看IMMDeviceEnumerator的&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/mmdeviceapi/nn-mmdeviceapi-immdeviceenumerator&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;介绍&lt;/a&gt;。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;拿到了IMMDevice对象之后就可以创建IAudioClient对象了。&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot; highlighted=&quot;true&quot; style=&quot;margin: 10px auto; padding: 0px; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; font-family: var(--code-font, &amp;#39;&amp;quot;Courier New&amp;quot;, sans-serif, Consolas, Monaco&amp;#39;); font-size: 12px; background-color: rgb(255, 255, 255);&quot;&gt;const&amp;nbsp;GUID&amp;nbsp;IID_IAudioClient&amp;nbsp;=&amp;nbsp;__uuidof(IAudioClient);IAudioClient&amp;nbsp;*aclient&amp;nbsp;=&amp;nbsp;NULL;device-&amp;gt;Activate(IID_IAudioClient,&amp;nbsp;CLSCTX_ALL,&amp;nbsp;NULL,&amp;nbsp;(void&amp;nbsp;**)&amp;amp;aclient);&lt;/pre&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;前面说了这么多，终于到了我们需要的IAudioClient了。这是我们的核心部分，接口文档链接：&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nn-audioclient-iaudioclient&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://learn.microsoft.com/en-us/windows/win32/api/audioclient/nn-audioclient-iaudioclient&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;IAudioClient后面还有IAudioClient2和IAudioClient3，不过都是一些扩展功能，本文内容用不上。不过如果要用的话，就得用IUnknown的QueryInterface方法了，这个在之前讲DirectSound事件驱动模式的时候已经用过了。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;这里是一个官方示例代码&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows/win32/coreaudio/rendering-a-stream&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://learn.microsoft.com/zh-cn/windows/win32/coreaudio/rendering-a-stream&lt;/a&gt;，不过呢虽然官方的代码很详细，但是不能直接跑，而且用的方法也不能体现WASAPI的优势(居然在循环里调用Sleep来等，而且这个时间是500ms)。而我们采用的是事件驱动机制，和之前用DirectSound是一样的，好处在于其延迟可以低至10ms左右，如果用独占流配合更好的设备的话，理论上可以更低(据说Win10共享流也可以更低)，这对于录音来说是极其重要的。当然我们用共享流就行了，不然其他程序的声音就没了，独占流更适合专业性强的软件。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;IAudioClient有若干方法，其中大部分都会用到，具体细节可以看文档说明。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;首先我们要调用的是&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Initialize&lt;/code&gt;方法，不过在调用之前可以用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;IsFormatSupported&lt;/code&gt;来确认选定的格式是否受支持。也可以调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;GetDevicePeriod&lt;/code&gt;来查看设备支持的处理周期。还可以调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;GetMixFormat&lt;/code&gt;来获取系统内部的混音格式直接用，不过这样的话就得自己处理重采样了，对于专业的软件来说还是需要的，毕竟早期Windows自带的重采样质量稍差(其实DirectSound就默认支持重采样了，但是WASAPI一开始不支持，关于重采样的更多内容会在后文讨论)。除了以上三个方法可以在&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Initialize&lt;/code&gt;之前调用，其他的全部要先调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Initialize&lt;/code&gt;才能用。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;官方文档上&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Initialize&lt;/code&gt;的原型：&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot; highlighted=&quot;true&quot; style=&quot;margin: 10px auto; padding: 0px; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; font-family: var(--code-font, &amp;#39;&amp;quot;Courier New&amp;quot;, sans-serif, Consolas, Monaco&amp;#39;); font-size: 12px; background-color: rgb(255, 255, 255);&quot;&gt;HRESULT&amp;nbsp;Initialize(&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;AUDCLNT_SHAREMODE&amp;nbsp;&amp;nbsp;ShareMode,&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamFlags,&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;REFERENCE_TIME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hnsBufferDuration,&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;REFERENCE_TIME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hnsPeriodicity,&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;const&amp;nbsp;WAVEFORMATEX&amp;nbsp;*pFormat,&amp;nbsp;&amp;nbsp;[in]&amp;nbsp;LPCGUID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AudioSessionGuid);&lt;/pre&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;第一个参数是共享模式还是独占模式的选项，就AUDCLNT_SHAREMODE_EXCLUSIVE、AUDCLNT_SHAREMODE_SHARED这俩，我们用AUDCLNT_SHAREMODE_SHARED共享模式就行了&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第二个参数是控制流的选项，多个参数用按位或运算叠加，我们需要AUDCLNT_STREAMFLAGS_EVENTCALLBACK实现事件驱动，还有AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM和AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY(提供更高的质量)实现自动重采样&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第三个参数是缓冲区持续时间长度(单位100纳秒)，对于共享模式和事件驱动同时使用的情况，填0即可&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第四个参数是设置设备处理周期，独占模式才要设置，填0即可&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第五个参数是音频格式，支持WAVEFORMATEX和WAVEFORMATEXTENSIBLE，从要播放的文件获取&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;第六个参数是AudioSession类型GUID的指针，不用Session填NULL即可&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;调用完以后检查一下返回值，因为那么多方法里这个出错的概率比较大，当然规范的写法是每个方法都要检测返回值以避免错误。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;之后需要调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;SetEventHandle&lt;/code&gt;来指定接收事件的句柄，调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;GetBufferSize&lt;/code&gt;来确定系统分配的缓冲区大小(单位是音频帧个数)，也可以选择调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;GetStreamLatency&lt;/code&gt;查看系统安排的延迟时间(单位100纳秒)(不过我发现这个方法似乎不会给出一个有效的值，一直是0，可能是bug)。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;现在可以调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;GetService&lt;/code&gt;来获取一个&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;IAudioRenderClient&lt;/code&gt;对象，该对象仅提供两个方法：&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;GetBuffer&lt;/code&gt;和&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;ReleaseBuffer&lt;/code&gt;，用来获取和释放需要填充的音频数据缓冲区指针。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在第一次调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;Start&lt;/code&gt;之前用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;IAudioRenderClient&lt;/code&gt;提前获取缓冲区并填充数据可以降低播放的延迟，这样就可以开始播放了。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;紧接着我们就要启动一个线程来等待事件的到来然后填充数据了。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;要在线程中调用&lt;code style=&quot;margin: 0px 3px; padding: 0px 5px; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace, sans-serif; line-height: 1.8; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px; color: rgb(192, 52, 29); background-color: rgba(0, 0, 0, 0.04); border: none !important;&quot;&gt;GetCurrentPadding&lt;/code&gt;来获取缓冲区已有的数据，因为缓冲区一般比较大，而实际上每10毫秒就会需要新的数据了，此时缓冲区内还有剩余数据没有播放。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;具体代码如下：&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot; highlighted=&quot;true&quot; style=&quot;margin: 10px auto; padding: 0px; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; font-family: var(--code-font, &amp;#39;&amp;quot;Courier New&amp;quot;, sans-serif, Consolas, Monaco&amp;#39;); font-size: 12px; background-color: rgb(255, 255, 255);&quot;&gt;device-&amp;gt;Activate(IID_IAudioClient,&amp;nbsp;CLSCTX_ALL,&amp;nbsp;NULL,&amp;nbsp;(void&amp;nbsp;**)&amp;amp;aclient);HRESULT&amp;nbsp;hr&amp;nbsp;=&amp;nbsp;aclient-&amp;gt;Initialize(AUDCLNT_SHAREMODE_SHARED,AUDCLNT_STREAMFLAGS_EVENTCALLBACK&amp;nbsp;|&amp;nbsp;AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM&amp;nbsp;|&amp;nbsp;&amp;nbsp;AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY,0,&amp;nbsp;0,&amp;nbsp;fmtex,&amp;nbsp;NULL);&amp;nbsp;//&amp;nbsp;fmtex是要播放的文件的//&amp;nbsp;这里最好检测一下hr结果，然后妥善处理aclient-&amp;gt;GetBufferSize(&amp;amp;blocksize);aclient-&amp;gt;SetEventHandle(hevents[0]);aclient-&amp;gt;GetService(IID_IAudioRenderClient,&amp;nbsp;(void&amp;nbsp;**)&amp;amp;arender);BYTE&amp;nbsp;*pdata;arender-&amp;gt;GetBuffer(blocksize,&amp;nbsp;&amp;amp;pdata);fill(pdata,&amp;nbsp;blockalign&amp;nbsp;*&amp;nbsp;blocksize);&amp;nbsp;//&amp;nbsp;注意这个blockalign是文件里获取的，实际数据大小等于帧数*每帧大小arender-&amp;gt;ReleaseBuffer(blocksize,&amp;nbsp;0);hthread&amp;nbsp;=&amp;nbsp;CreateThread(0,&amp;nbsp;0,&amp;nbsp;fill_thread,&amp;nbsp;this,&amp;nbsp;0,&amp;nbsp;NULL);SetThreadPriority(hthread,&amp;nbsp;THREAD_PRIORITY_TIME_CRITICAL);&amp;nbsp;//&amp;nbsp;提高一下线程优先级aclient-&amp;gt;Start();&lt;/pre&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;线程代码如下：&lt;/p&gt;&lt;pre class=&quot;highlighter-hljs&quot; highlighted=&quot;true&quot; style=&quot;margin: 10px auto; padding: 0px; transition-duration: 0.2s; transition-property: background, font-size, border-color, border-radius, border-width, padding, margin, color; overflow: auto; font-family: var(--code-font, &amp;#39;&amp;quot;Courier New&amp;quot;, sans-serif, Consolas, Monaco&amp;#39;); font-size: 12px; background-color: rgb(255, 255, 255);&quot;&gt;DWORD&amp;nbsp;__stdcall&amp;nbsp;fill_thread(void&amp;nbsp;*obj){WASPlayer&amp;nbsp;*player&amp;nbsp;=&amp;nbsp;(WASPlayer&amp;nbsp;*)obj;while&amp;nbsp;(1)&amp;nbsp;{DWORD&amp;nbsp;r&amp;nbsp;=&amp;nbsp;WaitForMultipleObjects(2,&amp;nbsp;player-&amp;gt;hevents,&amp;nbsp;FALSE,&amp;nbsp;INFINATE);BYTE&amp;nbsp;*pdata;if&amp;nbsp;(r&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{UINT32&amp;nbsp;padding;player-&amp;gt;aclient-&amp;gt;GetCurrentPadding(&amp;amp;padding);&amp;nbsp;//&amp;nbsp;获取当前缓冲区已经填充的数据大小UINT32&amp;nbsp;frames&amp;nbsp;=&amp;nbsp;player-&amp;gt;blocksize&amp;nbsp;-&amp;nbsp;padding;&amp;nbsp;//&amp;nbsp;计算需要填充的大小UINT32&amp;nbsp;bytes&amp;nbsp;=&amp;nbsp;frames&amp;nbsp;*&amp;nbsp;player-&amp;gt;blockalign;&amp;nbsp;&amp;nbsp;//&amp;nbsp;计算出需要的字节数player-&amp;gt;arender-&amp;gt;GetBuffer(frames,&amp;nbsp;&amp;amp;pdata);int&amp;nbsp;filled&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;//&amp;nbsp;实际填充的大小if&amp;nbsp;(pdata)&amp;nbsp;//&amp;nbsp;一般不会为空filled&amp;nbsp;=&amp;nbsp;player-&amp;gt;fill(pdata,&amp;nbsp;bytes);player-&amp;gt;arender-&amp;gt;ReleaseBuffer(frames,&amp;nbsp;0);if&amp;nbsp;(filled&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{printf(&amp;quot;[debug]&amp;nbsp;No&amp;nbsp;buffer\n&amp;quot;);break;}}else&amp;nbsp;if&amp;nbsp;(r&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;{printf(&amp;quot;[debug]&amp;nbsp;Set&amp;nbsp;stop\n&amp;quot;);break;}else&amp;nbsp;{printf(&amp;quot;[debug]&amp;nbsp;Unknown\n&amp;quot;);break;}}player-&amp;gt;stop();printf(&amp;quot;[debug]&amp;nbsp;Thread&amp;nbsp;end\n&amp;quot;);return&amp;nbsp;0;}&lt;/pre&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;以上就是一些简单的说明和示例代码了，具体可以查看本文前面的完整代码。&lt;/p&gt;&lt;h2 id=&quot;录音说明&quot; style=&quot;margin: 10px 0px; padding: 0px; font-size: 21px; line-height: 1.5; font-family: Verdana, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;录音说明&lt;/h2&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;本文代码适当修改就可以实现录音功能了，还可以实现环回(Loopback)录音，不过Loopback和事件驱动模式下还有一些bug，据说win10修复了但是没有具体测试过。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;这里贴一下官方文档：&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;麦克风录制&amp;nbsp;&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/coreaudio/capturing-a-stream&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://learn.microsoft.com/en-us/windows/win32/coreaudio/capturing-a-stream&lt;/a&gt;&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;Loopback录制&amp;nbsp;&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/coreaudio/loopback-recording&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://learn.microsoft.com/en-us/windows/win32/coreaudio/loopback-recording&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;有兴趣可以去参阅一下。&lt;/p&gt;&lt;h1 id=&quot;关于重采样&quot; style=&quot;margin: 10px 0px; padding: 0px; font-size: 28px; line-height: 1.5; font-family: Verdana, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;关于重采样&lt;/h1&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;这个单独拎出来讲，是因为内容比较多，几句话是说不完的，有关资料可以提供一个斯坦福大学CCRMA的Julius O. Smith教授的网站，介绍了关于数字音频重采样的理论和方法等内容。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;链接在此：&lt;a href=&quot;https://ccrma.stanford.edu/~jos/resample/resample.html&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://ccrma.stanford.edu/~jos/resample/resample.html&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;简单说的话，音频方面的重采样包括采样率转换、量化方式的转换和声道数等的转换(尽管大部分时候采样率转换可能是很多人说的意思)。打个比方，系统内部的混音格式是48000Hz、32位浮点数，而我要播放的文件是48000Hz、16位定点整数，那么只需要把每一帧的数据按量化最大值(16位整数是32767)进行除法转换到-1~1范围的浮点数就行了，比较容易；但如果我要播放的文件是44100Hz、16位的标准CD格式(这也是主流的格式)，那就不仅仅是转换浮点数这么简单了，涉及到采样率转换这个比较棘手的问题。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;还有比如32位浮点数或者24位整数转16位整数就涉及到抖动(Dither)这个概念，这是因为16位整数的量化误差相对较大，人为加入一些小噪音可以减少量化误差带来的影响。关于抖动，可以看看这篇文章：&lt;a href=&quot;https://www.bilibili.com/read/cv13718097/&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;https://www.bilibili.com/read/cv13718097/&lt;/a&gt;。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;高采样率转低采样率会造成混叠的现象(如96kHz到44.1kHz)，理想情况下高于22.05kHz的频率应该被低通滤波器过滤掉，但实际上不存在这样的滤波器，所以在这种情况下多少会有混叠，如何减少这个现象也是一个重要的因素；反过来低采样率到高采样率还有产生镜像频率的问题。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;关于采样率转换算法CCRMA网站上有详细的描述，网上也有不少开源代码，当然不同厂商也有自己的独家改进算法，不同软件采样率转换质量的比较，可以看这个：&lt;a href=&quot;http://src.infinitewave.ca/&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;http://src.infinitewave.ca/&lt;/a&gt;。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;如果把采样率转换和量化的转换放一起，那难度就更高了，不过一般情况下，Windows内部的混音器都是采用32位浮点数的，不同的是采样率，所以对Windows来说采样率转换可能才是重点。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;当然不知到什么时候开始WASAPI有了AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM和AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY这俩，一个是自动重采样，同时使用另一个可以获得高质量的采样率转换，我们姑且认定其质量应该不会太差，但实际不敢保证，因为&lt;a href=&quot;http://src.infinitewave.ca/&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot; style=&quot;margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-decoration-line: underline;&quot;&gt;http://src.infinitewave.ca/&lt;/a&gt;并没有关于WASAPI的采样率转换质量对比，只有DirectSound的。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;重采样这块可以挖个大坑，什么时候能填就不知道了（非专业，没怎么学过数字信号处理?）。&lt;/p&gt;&lt;h1 id=&quot;总结&quot; style=&quot;margin: 10px 0px; padding: 0px; font-size: 28px; line-height: 1.5; font-family: Verdana, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;总结&lt;/h1&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;WASAPI看起来麻烦，其实并不难，实现简单的功能甚至比DirectSound还方便，但是关于WASAPI的说明介绍还是太少了，导致相关资料不好找，除了官方那份庞大的文档，而没有一份简单的入门介绍。于是在研究一段时间WASAPI后写了一些代码，并写出本文，希望起到抛砖引玉的效果。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 03 Jul 2026 11:31:00 +0800</pubDate></item><item><title> Lada 马赛克修复神器  Restore videos with pixelated/mosaic regions ，基于AI 视频像素化与马赛克去除开源工具</title><link>https://kinber.cn/post/6693.html</link><description>&lt;figure data-first-child=&quot;&quot; data-size=&quot;normal&quot; style=&quot;margin: 0px 0px 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;&lt;div class=&quot;RichText-ConditionalImagePortal&quot; style=&quot;user-select: initial !important; overflow: hidden; max-height: 5000px;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/202607031783048466484777.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p class=&quot;ztext-empty-paragraph&quot; style=&quot;margin-top: -0.8em; margin-bottom: -0.8em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;&lt;br style=&quot;user-select: initial !important;&quot;/&gt;&lt;/p&gt;&lt;p data-pid=&quot;gcB04xTj&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;去除各种视频马赛克是众多老司机乐此不疲的追求，也有众多的收费、免费工具。&lt;/p&gt;&lt;p data-pid=&quot;NZEOQt_7&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;&lt;span style=&quot;user-select: initial !important;&quot;&gt;Lada&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;是一个最近在社区比较火的基于AI 视频像素化与马赛克去除开源工具，Lada的核心功能是恢复视频中马赛克／像素化部分，并将处理结果与原始视频的音频进行合成输出。&lt;/p&gt;&lt;p data-pid=&quot;_WnxWG1u&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;项目地址：https://codeberg.org/ladaapp/lada&lt;/p&gt;&lt;p data-pid=&quot;ZR6suCod&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;备注：2025/10/21&amp;nbsp;&lt;span class=&quot;invisible&quot; style=&quot;background-color: transparent; color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-stretch: normal; font-size: 0px; line-height: 0; font-family: a; text-shadow: none; user-select: initial !important;&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;visible&quot; style=&quot;user-select: initial !important;&quot;&gt;github.com/ladaapp/lada&lt;/span&gt;&lt;span class=&quot;invisible&quot; style=&quot;background-color: transparent; color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-stretch: normal; font-size: 0px; line-height: 0; font-family: a; text-shadow: none; user-select: initial !important;&quot;&gt;&lt;/span&gt;&amp;nbsp;删库&lt;/p&gt;&lt;p data-pid=&quot;ZR6suCod&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0.9); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;a href=&quot;https://github.com/ladaapp/lada&quot; _src=&quot;https://github.com/ladaapp/lada&quot;&gt;https://github.com/ladaapp/lada&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p data-pid=&quot;OgMhr8s5&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;Lada 的目标并不是对所有视频、所有场景都做到完美恢复，而是希望在条件允许的前提下，对那些有遮挡（&lt;span style=&quot;user-select: initial !important;&quot;&gt;像素化&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;、&lt;span style=&quot;user-select: initial !important;&quot;&gt;马赛克&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;）处理的视频内容，尝试“还原”或“减弱”遮挡效果，使得画面更可识别。&lt;/p&gt;&lt;p data-pid=&quot;6_OJ-0CD&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;Lada 建立在几个成熟的开源库之上，包括用于视频超分辨率的&amp;nbsp;&lt;span style=&quot;user-select: initial !important;&quot;&gt;BasicVSR++&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;、用于对象检测的&amp;nbsp;&lt;span style=&quot;user-select: initial !important;&quot;&gt;YOLO&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;，以及用于增强的&amp;nbsp;&lt;span style=&quot;user-select: initial !important;&quot;&gt;Real-ESRGAN&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;。此种组合使 Lada 能够高效处理复杂的视频恢复任务。&lt;/p&gt;&lt;p data-pid=&quot;d5c4lhjt&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;Lada 的处理流程可以抽象成两大子模块：&lt;/p&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;user-select: initial !important; font-weight: 600;&quot;&gt;马赛克／像素块检测（&lt;span style=&quot;user-select: initial !important;&quot;&gt;Mosaic Detection&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;）：&lt;/span&gt;即首先识别出&lt;span style=&quot;user-select: initial !important;&quot;&gt;视频帧&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;中哪些区域被像素化或马赛克覆盖，需要被恢复。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;user-select: initial !important; font-weight: 600;&quot;&gt;马赛克恢复 / 图像重建（&lt;span style=&quot;user-select: initial !important;&quot;&gt;Mosaic Restoration&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&amp;nbsp;/ Depixelization）：&lt;/span&gt;在确定要恢复的区域后，用深度学习模型对这些区域进行“还原”或重构，使它们看起来更清晰、更接近真实图像&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-pid=&quot;nq1K1KKs&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;在实际应用中，Lada 的一些应用场景：&lt;/p&gt;&lt;ul style=&quot;list-style-type: none;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;研究或学术用途：探索&lt;span style=&quot;user-select: initial !important;&quot;&gt;图像修复&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;、去遮挡、图像重建等&lt;span style=&quot;user-select: initial !important;&quot;&gt;前沿技术&lt;svg width=&quot;10px&quot; height=&quot;10px&quot; viewbox=&quot;0 0 16 16&quot; class=&quot;ZDI ZDI--FourPointedStar16 css-1dvsrp&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;m5.068 9.267-3.08-.77a.512.512 0 0 1 0-.994l3.08-.77a2.289 2.289 0 0 0 1.665-1.665l.77-3.08a.512.512 0 0 1 .994 0l.77 3.08c.205.82.845 1.46 1.665 1.665l3.08.77a.512.512 0 0 1 0 .994l-3.08.77a2.29 2.29 0 0 0-1.665 1.665l-.77 3.08a.512.512 0 0 1-.994 0l-.77-3.08a2.289 2.289 0 0 0-1.665-1.665Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&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;教育或技术演示用途&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-pid=&quot;HqBRkfcW&quot; style=&quot;margin-top: 1.4em; margin-bottom: 0px; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, &amp;quot;MiSans L3&amp;quot;, &amp;quot;Segoe UI&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255); user-select: initial !important;&quot;&gt;喜欢动手的老司机们行动起来吧，DIY你最爱视频无马赛克版本。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0.9); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;脑配置16G内存，&lt;/span&gt;&lt;a data-v-9ab83f5e=&quot;&quot; class=&quot;text--lk&quot; ml-key=&quot;comment-search-keyword&quot; ml-extends=&quot;[object Object]&quot; style=&quot;margin: 0px; padding: 0px; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59, 130, 246, .5); --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0); --tw-ring-shadow: 0 0 rgba(0,0,0,0); --tw-shadow: 0 0 rgba(0,0,0,0); --tw-shadow-colored: 0 0 rgba(0,0,0,0); --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); color: var(--LINK); cursor: pointer; font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;3060显卡&lt;/a&gt;&lt;span data-v-9ab83f5e=&quot;&quot; class=&quot;weui-icon-filled-search text--lk mr-[3px] h-2.5 w-2.5 cursor-pointer align-text-top&quot; style=&quot;margin: 0px 3px 0px 0px; padding: 0px; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59, 130, 246, .5); --tw-ring-offset-shadow: 0 0 ; --tw-ring-shadow: 0 0 ; --tw-shadow: 0 0 ; --tw-shadow-colored: 0 0 ; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; display: inline-block; vertical-align: text-top; width: 0.625rem; height: 0.625rem; cursor: pointer; color: var(--LINK); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0.9); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;，12G显存，视频大小2G多，转码流畅，去码还原度95以上，细节上差一点，但是差的不多&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0.9); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;从逻辑角度看，应该还是会依据原内容进行&lt;/span&gt;&lt;a data-v-9ab83f5e=&quot;&quot; class=&quot;text--lk&quot; ml-key=&quot;comment-search-keyword&quot; ml-extends=&quot;[object Object]&quot; style=&quot;margin: 0px; padding: 0px; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59, 130, 246, .5); --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0); --tw-ring-shadow: 0 0 rgba(0,0,0,0); --tw-shadow: 0 0 rgba(0,0,0,0); --tw-shadow-colored: 0 0 rgba(0,0,0,0); --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); color: var(--LINK); cursor: pointer; font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;ai补足&lt;/a&gt;&lt;span data-v-9ab83f5e=&quot;&quot; class=&quot;weui-icon-filled-search text--lk mr-[3px] h-2.5 w-2.5 cursor-pointer align-text-top&quot; style=&quot;margin: 0px 3px 0px 0px; padding: 0px; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgba(59, 130, 246, .5); --tw-ring-offset-shadow: 0 0 ; --tw-ring-shadow: 0 0 ; --tw-shadow: 0 0 ; --tw-shadow-colored: 0 0 ; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; display: inline-block; vertical-align: text-top; width: 0.625rem; height: 0.625rem; cursor: pointer; color: var(--LINK); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0.9); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;。其原理是追踪马赛克位置的变化，随着画面内容的变化，马赛克内容抖动也会变，然后不断用算力去依据大量变化的内容数据进行推理补足&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0.9); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0.9); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255); margin-top: 0px !important;&quot;&gt;&lt;h1 align=&quot;center&quot; tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-right: 0px; margin-bottom: var(--base-size-16); margin-left: 0px; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em; margin-top: 0px !important;&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/ladaapp/lada/blob/main/assets/io.github.ladaapp.lada.png&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-underline-offset: 0.2rem;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703111650178304861036129.png&quot; alt=&quot;Lada Icon&quot; style=&quot;box-sizing: content-box; border-style: none; width: 64px; height: 64px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box;&quot;/&gt;Lada&lt;/h1&gt;&lt;a id=&quot;user-content-------lada&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 
  Lada
&quot; href=&quot;https://github.com/ladaapp/lada#------lada&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 60.8px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;em style=&quot;box-sizing: border-box;&quot;&gt;Lada&lt;/em&gt;&amp;nbsp;is a tool designed to recover pixelated adult videos (JAV). It helps restore the visual quality of such content, making it more enjoyable to watch.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Features&lt;/h2&gt;&lt;a id=&quot;user-content-features&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Features&quot; href=&quot;https://github.com/ladaapp/lada#features&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); padding-left: 2em; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;Recover Pixelated Videos&lt;/span&gt;: Restore pixelated or mosaic scenes in adult videos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;Watch/Export Videos&lt;/span&gt;: Use either the CLI or GUI to watch or export your restored videos.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Usage&lt;/h2&gt;&lt;a id=&quot;user-content-usage&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Usage&quot; href=&quot;https://github.com/ladaapp/lada#usage&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;GUI&lt;/h3&gt;&lt;a id=&quot;user-content-gui&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: GUI&quot; href=&quot;https://github.com/ladaapp/lada#gui&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;After opening a file, you can either watch the restored video in real time or export it to a new file to watch it later:&lt;/p&gt;&lt;p&gt;&lt;themed-picture data-catalyst-inline=&quot;true&quot; data-catalyst=&quot;&quot; style=&quot;box-sizing: border-box; display: inline; visibility: visible; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;picture style=&quot;box-sizing: border-box;&quot;&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;/ladaapp/lada/raw/main/assets/screenshot_gui_1_dark.png&quot; style=&quot;box-sizing: border-box;&quot;/&gt;&lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;/ladaapp/lada/raw/main/assets/screenshot_gui_1_light.png&quot; style=&quot;box-sizing: border-box;&quot;/&gt;&lt;img alt=&quot;Screenshot showing video preview&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703111651178304861143346.png&quot; width=&quot;36%&quot; style=&quot;box-sizing: content-box; border-style: none; visibility: visible;&quot;/&gt;&amp;nbsp;&lt;/picture&gt;&lt;/themed-picture&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;themed-picture data-catalyst-inline=&quot;true&quot; data-catalyst=&quot;&quot; style=&quot;box-sizing: border-box; display: inline; visibility: visible; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;picture style=&quot;box-sizing: border-box;&quot;&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;/ladaapp/lada/raw/main/assets/screenshot_gui_2_dark.png&quot; style=&quot;box-sizing: border-box;&quot;/&gt;&lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;/ladaapp/lada/raw/main/assets/screenshot_gui_2_light.png&quot; style=&quot;box-sizing: border-box;&quot;/&gt;&lt;img alt=&quot;Screenshot showing video export&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703111652178304861237691.png&quot; width=&quot;45%&quot; style=&quot;box-sizing: content-box; border-style: none; visibility: visible;&quot;/&gt;&lt;/picture&gt;&lt;/themed-picture&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Additional settings can be found in the left sidebar.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;CLI&lt;/h3&gt;&lt;a id=&quot;user-content-cli&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: CLI&quot; href=&quot;https://github.com/ladaapp/lada#cli&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;You can also use the command-line interface (CLI) to restore video(s):&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); justify-content: space-between; display: flex; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; overflow: auto !important; position: relative !important;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;lada-cli&amp;nbsp;--input&amp;nbsp;&amp;lt;input&amp;nbsp;video&amp;nbsp;path&amp;gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot; style=&quot;box-sizing: border-box; animation: auto ease 0s 1 normal none running none;&quot;&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;lada-cli --input &amp;lt;input video path&amp;gt;&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/ladaapp/lada/blob/main/assets/screenshot_cli_1.png&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703111652178304861242754.png&quot; alt=&quot;screenshot showing video export&quot; width=&quot;60%&quot; style=&quot;box-sizing: content-box; border-style: none;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;For more information about additional options, use the&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;--help&lt;/code&gt;&amp;nbsp;argument.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Performance expectations and hardware requirements&lt;/h2&gt;&lt;a id=&quot;user-content-performance-expectations-and-hardware-requirements&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Performance expectations and hardware requirements&quot; href=&quot;https://github.com/ladaapp/lada#performance-expectations-and-hardware-requirements&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;The restoration quality can vary depending on the scene. Some may look quite realistic, while others could display noticeable artifacts, sometimes worse than the original mosaics.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;To run the app effectively, you&amp;#39;ll need a GPU and some patience. A graphics card with at least 4-6GB of VRAM should work well for most cases.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;The app also requires a fair amount of RAM for buffering, which improves performance. For 1080p content, 6-8GB of RAM should suffice, but 4K video will require significantly more.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;To watch the restored video in real-time, you&amp;#39;ll need a powerful machine. Otherwise, the player may pause and buffer as it computes the next set of restored frames. While viewing the video, no encoding is done, but additional RAM will be used for buffering.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;If your GPU isn&amp;#39;t fast enough for real-time playback, you can export the video and watch it later in your preferred media player (this is supported in both the GUI and CLI).&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Although the app can run on a CPU, performance will be extremely slow, making it impractical for most users.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Installation&lt;/h2&gt;&lt;a id=&quot;user-content-installation&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Installation&quot; href=&quot;https://github.com/ladaapp/lada#installation&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;Using Flatpak&lt;/h3&gt;&lt;a id=&quot;user-content-using-flatpak&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Using Flatpak&quot; href=&quot;https://github.com/ladaapp/lada#using-flatpak&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;The easiest way to install the app (CLI and GUI) on Linux is via Flathub:&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a href=&quot;https://flathub.org/apps/details/io.github.ladaapp.lada&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;&lt;img width=&quot;200&quot; alt=&quot;Download from Flathub&quot; src=&quot;https://camo.githubusercontent.com/e4e7b579c0c1a06a83ac89dab3c9aaef885341267016f448ae7a7fa7a3e0d242/68747470733a2f2f666c61746875622e6f72672f6170692f62616467653f737667266c6f63616c653d656e&quot; data-canonical-src=&quot;https://flathub.org/api/badge?svg&amp;amp;locale=en&quot; style=&quot;box-sizing: content-box; border-style: none;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-note&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-accent-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-accent);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Note&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;The Flatpak only works with x86_64 CPUs. Nvidia/CUDA (Turing or newer: RTX 20xx up to including RTX 50xx) and Intel Arc GPUs are supported. Ensure your GPU driver is up-to-date. It can also be used without a GPU but it will be very slow. Make sure to install either the Intel or the Nvidia Add-On from Flathub.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-tip&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-success-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-success);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Tip&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;After installation you should find Lada in your application launcher to start the GUI. You can also run it via&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;flatpak run io.github.ladaapp.lada&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-tip&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-success-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-success);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Tip&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16);&quot;&gt;When using the CLI via Flatpak we need to make the file/directory available by giving it permission to the file system so it can access the input/output files&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; overflow: auto !important; position: relative !important; margin-bottom: var(--base-size-16); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); justify-content: space-between; display: flex;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;flatpak&amp;nbsp;run&amp;nbsp;--filesystem=host&amp;nbsp;--command=lada-cli&amp;nbsp;io.github.ladaapp.lada&amp;nbsp;--input&amp;nbsp;&amp;lt;input&amp;nbsp;video&amp;nbsp;path&amp;gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot; style=&quot;box-sizing: border-box; animation: auto ease 0s 1 normal none running none;&quot;&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;flatpak run --filesystem=host --command=lada-cli io.github.ladaapp.lada --input &amp;lt;input video path&amp;gt;&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); background-color: rgba(0, 0, 0, 0); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16);&quot;&gt;You may want to set an alias to make it easier to use&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; overflow: auto !important; position: relative !important; margin-bottom: var(--base-size-16); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); justify-content: space-between; display: flex;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;alias&amp;nbsp;lada-cli=&amp;quot;flatpak&amp;nbsp;run&amp;nbsp;--filesystem=host&amp;nbsp;--command=lada-cli&amp;nbsp;io.github.ladaapp.lada&amp;quot;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot; style=&quot;box-sizing: border-box; animation: auto ease 0s 1 normal none running none;&quot;&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;alias lada-cli=&amp;quot;flatpak run --filesystem=host --command=lada-cli io.github.ladaapp.lada&amp;quot;&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); background-color: rgba(0, 0, 0, 0); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;You could also give the filesystem permission permanently via&amp;nbsp;&lt;a href=&quot;https://flathub.org/apps/com.github.tchx84.Flatseal&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Flatseal&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-tip&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-success-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-success);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Tip&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;If you want to use the Post-export action feature to run a command/script after export has finished you&amp;#39;ll need to give the Flatpak additional permissions. Add the&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;--talk-name=org.freedesktop.Flatpak&lt;/code&gt;&amp;nbsp;permission and then run your command via&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;flatpak-spawn&lt;/code&gt;. For example: If the script you want to run is /home/user/myscript.sh then set custom command as&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;flatpak-spawn --host /home/user/myscript.sh&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-tip&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-success-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-success);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Tip&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16);&quot;&gt;If you installed Lada from Flathub and drag-and-drop doesn&amp;#39;t work, your file browser might not support&amp;nbsp;&lt;a href=&quot;https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.FileTransfer.html&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;File Transfer Portal&lt;/a&gt;. You can fix this by:&lt;/p&gt;&lt;ol dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding-left: 2em;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;Switching or updating your file browser to one that supports it.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Granting the app filesystem permissions (e.g., via&amp;nbsp;&lt;a href=&quot;https://flathub.org/apps/com.github.tchx84.Flatseal&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Flatseal&lt;/a&gt;&amp;nbsp;so it can read files directly).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Using the &amp;#39;Open&amp;#39; button to select the file instead of drag-and-drop.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;Using Docker&lt;/h3&gt;&lt;a id=&quot;user-content-using-docker&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Using Docker&quot; href=&quot;https://github.com/ladaapp/lada#using-docker&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;The app is also available via Docker (CLI only). You can get the image&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;ladaapp/lada&lt;/code&gt;&amp;nbsp;from&amp;nbsp;&lt;a href=&quot;https://hub.docker.com/r/ladaapp/lada&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Docker Hub&lt;/a&gt;&amp;nbsp;with this command:&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); justify-content: space-between; display: flex; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; overflow: auto !important; position: relative !important;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;docker&amp;nbsp;pull&amp;nbsp;ladaapp/lada:latest&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot; style=&quot;box-sizing: border-box; animation: auto ease 0s 1 normal none running none;&quot;&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;docker pull ladaapp/lada:latest&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-note&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-accent-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-accent);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Note&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;The Docker image only works with x86_64 CPUs and Nvidia/CUDA GPUs (Turing or newer: RTX 20xx up to including RTX 50xx). Ensure your NVIDIA GPU driver is up-to-date. It can also be used without a GPU but it will be very slow.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-tip&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-success-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-success);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Tip&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;Make sure that you have installed the&amp;nbsp;&lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;NVIDIA Container Toolkit&lt;/a&gt;&amp;nbsp;on your system so Docker can pass through the GPU&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-tip&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-success-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-success);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Tip&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16);&quot;&gt;When using Docker you&amp;#39;ll need to make the file/directory available to the container as well as the GPU:&lt;/p&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; overflow: auto !important; position: relative !important; margin-bottom: var(--base-size-16); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); justify-content: space-between; display: flex;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;docker&amp;nbsp;run&amp;nbsp;--rm&amp;nbsp;--gpus&amp;nbsp;all&amp;nbsp;--mount&amp;nbsp;type=bind,src=&amp;lt;input&amp;nbsp;video&amp;nbsp;path&amp;gt;,dst=/mnt&amp;nbsp;ladaapp/lada:latest&amp;nbsp;--input&amp;nbsp;&amp;quot;/mnt/&amp;lt;input&amp;nbsp;video&amp;nbsp;file&amp;gt;&amp;quot;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot; style=&quot;box-sizing: border-box; animation: auto ease 0s 1 normal none running none;&quot;&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;docker run --rm --gpus all --mount type=bind,src=&amp;lt;input video path&amp;gt;,dst=/mnt ladaapp/lada:latest --input &amp;quot;/mnt/&amp;lt;input video file&amp;gt;&amp;quot;&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); background-color: rgba(0, 0, 0, 0); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-tip&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-success-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-success);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Tip&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16);&quot;&gt;If you want to use hardware encoders like&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;hevc_nvenc&lt;/code&gt;&amp;nbsp;you have to provide the container with&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;video&lt;/code&gt;&amp;nbsp;capability.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;With docker run you can use&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;--gpus &amp;#39;all,&amp;quot;capabilities=compute,video&amp;quot;&amp;#39;&lt;/code&gt;. Learn more&amp;nbsp;&lt;a href=&quot;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;Using Windows&lt;/h3&gt;&lt;a id=&quot;user-content-using-windows&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Using Windows&quot; href=&quot;https://github.com/ladaapp/lada#using-windows&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;For Windows users, the app (CLI and GUI) is packaged as a standalone .7z archive file. You&amp;#39;ll need&amp;nbsp;&lt;a href=&quot;https://7-zip.org/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;7-zip&lt;/a&gt;&amp;nbsp;to unpack the files. It is recommended to validate the file after downloading. See the Tip below.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Get the latest release from the&amp;nbsp;&lt;a href=&quot;https://codeberg.org/ladaapp/lada/releases&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Releases Page&lt;/a&gt;.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;You&amp;#39;ll find&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;lada.exe&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;lada-cli.exe&lt;/code&gt;&amp;nbsp;after extracting the archive.&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-note&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-accent-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-accent);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Note&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;The Windows release only works with x86_64 CPUs. Nvidia/CUDA (Turing or newer: RTX 20xx up to including RTX 50xx) and Intel Arc GPUs are supported. Ensure your GPU driver is up-to-date. It can also be used without a GPU but it will be very slow.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-note&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-accent-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-accent);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Note&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;Be aware that the first start of lada.exe or lada-cli.exe could take a while before Windows Defender or your AV has scanned it. The next time you open the program it should start fast.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-tip&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding: var(--base-size-8) var(--base-size-16); margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); border-left-color: var(--borderColor-success-emphasis); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-medium,500); align-items: center; line-height: 1; display: flex; color: var(--fgColor-success);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;Tip&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16);&quot;&gt;It is recommended to compare the checksum of the downloaded file against the value you&amp;#39;ll find in the release announcement. This makes sure that you got the correct and unaltered file, especially important if you got the file from an unofficial source.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16);&quot;&gt;Calculate the checksum of the downloaded file on your computer and compare it against the&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;SHA256&lt;/code&gt;&amp;nbsp;value you&amp;#39;ll find in the release announcement. They must be the same!&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;You can do this with Powershell&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;Get-FileHash /path/to/file.7z&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;a href=&quot;https://www.quickhash-gui.org/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;QuickHash-GUI&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;Alternative Installation Methods&lt;/h3&gt;&lt;a id=&quot;user-content-alternative-installation-methods&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Alternative Installation Methods&quot; href=&quot;https://github.com/ladaapp/lada#alternative-installation-methods&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;If the packages above don&amp;#39;t work for you then you&amp;#39;ll have to follow the&amp;nbsp;&lt;a href=&quot;https://github.com/ladaapp/lada#build&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Build&lt;/a&gt;&amp;nbsp;steps to set up the project.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Note that these instructions are mostly intended for developers to set up their environment to start working on the source code. But you should hopefully be able to follow the instructions even if you aren&amp;#39;t a developer.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Officially, Lada supports only Nvidia and Intel Arc GPUs but there have been reports that AMD ROCm-compatible cards and Apple work as well.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;You can check the issue tracker to find out more about the current state of supporting other systems.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Contribute&lt;/h2&gt;&lt;a id=&quot;user-content-contribute&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Contribute&quot; href=&quot;https://github.com/ladaapp/lada#contribute&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;You can find the Lada project&amp;nbsp;&lt;a href=&quot;https://github.com/ladaapp/lada&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;on GitHub&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://codeberg.org/ladaapp/lada&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;on Codeberg&lt;/a&gt;.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;The home of the project is on Codeberg. GitHub is set up only as a mirror so it&amp;#39;s code will stay in sync with the main branch on Codeberg.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;For contributing code, ideas or bug reports use&amp;nbsp;&lt;a href=&quot;https://codeberg.org/ladaapp/lada/pulls&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Pull requests&lt;/a&gt;&amp;nbsp;and the&amp;nbsp;&lt;a href=&quot;https://codeberg.org/ladaapp/lada/issues&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Issue tracker&lt;/a&gt;&amp;nbsp;on Codeberg.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;If you want to help translating the app you can contribute to existing translations or set up a new language over at&amp;nbsp;&lt;a href=&quot;https://translate.codeberg.org/projects/lada/lada/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Codeberg Translate&lt;/a&gt;.&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a href=&quot;https://translate.codeberg.org/engage/lada/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;&lt;img src=&quot;https://camo.githubusercontent.com/200a3d803fe2239a87ca35b7d44d9d155a10d4b7b9920e97cafc735093c8fb07/68747470733a2f2f7472616e736c6174652e636f6465626572672e6f72672f7769646765742f6c6164612f6c6164612f6d756c74692d6175746f2e737667&quot; alt=&quot;Translation status&quot; data-canonical-src=&quot;https://translate.codeberg.org/widget/lada/lada/multi-auto.svg&quot; style=&quot;box-sizing: content-box; border-style: none;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Releases&lt;/h2&gt;&lt;a id=&quot;user-content-releases&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Releases&quot; href=&quot;https://github.com/ladaapp/lada#releases&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;New releases will be published on both&amp;nbsp;&lt;a href=&quot;https://github.com/ladaapp/lada/releases&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;GitHub Releases&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://codeberg.org/ladaapp/lada/releases&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Codeberg Releases&lt;/a&gt;. You should get a notification about new releases if you star the project on either platform.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Build&lt;/h2&gt;&lt;a id=&quot;user-content-build&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Build&quot; href=&quot;https://github.com/ladaapp/lada#build&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;If you want to start hacking on this project you&amp;#39;ll need to install the app from source. Check out the detailed installation guides for&amp;nbsp;&lt;a href=&quot;https://github.com/ladaapp/lada/blob/main/docs/linux_install.md&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Linux&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/ladaapp/lada/blob/main/docs/macOS_install.md&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;macOS&lt;/a&gt;, and&amp;nbsp;&lt;a href=&quot;https://github.com/ladaapp/lada/blob/main/docs/windows_install.md&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Windows&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Training and dataset creation&lt;/h2&gt;&lt;a id=&quot;user-content-training-and-dataset-creation&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Training and dataset creation&quot; href=&quot;https://github.com/ladaapp/lada#training-and-dataset-creation&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;For instructions on training your own models and datasets, refer to&amp;nbsp;&lt;a href=&quot;https://github.com/ladaapp/lada/blob/main/docs/training_and_dataset_creation.md&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Training and dataset creation&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;License&lt;/h2&gt;&lt;a id=&quot;user-content-license&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: License&quot; href=&quot;https://github.com/ladaapp/lada#license&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Source code and models are licensed under AGPL-3.0. See the&amp;nbsp;&lt;a href=&quot;https://github.com/ladaapp/lada/blob/main/LICENSE.md&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;LICENSE.md&lt;/a&gt;&amp;nbsp;file for full details.&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;Acknowledgement&lt;/h2&gt;&lt;a id=&quot;user-content-acknowledgement&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Acknowledgement&quot; href=&quot;https://github.com/ladaapp/lada#acknowledgement&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;This project builds upon work done by these fantastic individuals and projects:&lt;/p&gt;&lt;ul dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding-left: 2em; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/HypoX64/DeepMosaics&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;DeepMosaics&lt;/a&gt;: Provided code for mosaic dataset creation. Also inspired me to start this project.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://ckkelvinchan.github.io/projects/BasicVSR++&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;BasicVSR++&lt;/a&gt;&amp;nbsp;/&amp;nbsp;&lt;a href=&quot;https://github.com/open-mmlab/mmagic&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;MMagic&lt;/a&gt;: Used as the base model for mosaic removal.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ultralytics/ultralytics&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;YOLO/Ultralytics&lt;/a&gt;: Used for training mosaic and NSFW detection models.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/VQAssessment/DOVER&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;DOVER&lt;/a&gt;: Used to assess video quality of created clips during the dataset creation process to filter out low-quality clips.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/tgenlis83/dnn-watermark&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;DNN Watermark / PITA Dataset&lt;/a&gt;: Used most of its code for creating a watermark detection dataset used to filter out scenes obstructed by text/watermarks/logos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/notAI-tech/NudeNet/&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;NudeNet&lt;/a&gt;: Used as an additional NSFW classifier to filter out false positives by our own NSFW segmentation model&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/twitter/twemoji&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Twitter Emoji&lt;/a&gt;: Provided eggplant emoji as base for the app icon.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/xinntao/Real-ESRGAN&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Real-ESRGAN&lt;/a&gt;: Used their image degradation model design for our mosaic detection model degradation pipeline.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/hnuzhy/BPJDet&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;BPJDet&lt;/a&gt;: Model for detecting human body and head. Used for creating SFW mosaics so that mosaic detection model can be trained so skip such material.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Star-Clouds/CenterFace&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;CenterFace&lt;/a&gt;: Model for detecting human faces. Used for creating SFW mosaics so that mosaic detection model can be trained so skip such material.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;PyTorch, FFmpeg, GStreamer, GTK and&amp;nbsp;&lt;a href=&quot;https://xkcd.com/2347/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;all other folks building our ecosystem&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0.9); font-family: -apple-system-font, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei UI&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, Arial, sans-serif; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 03 Jul 2026 11:14:12 +0800</pubDate></item><item><title>一个在浏览器里运行的太阳系实时探索工具，1:1 还原真实比例，从太阳表面一直延伸到 10 万 AU 外的奥尔特云</title><link>https://kinber.cn/post/6692.html</link><description>&lt;h1 style=&quot;text-align: center; font-size: 1.4em; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;Solar-Wanderer&lt;/span&gt;&lt;/h1&gt;&lt;blockquote style=&quot;font-size: 12px; margin-left: 12px; text-align: justify; padding: 12px; background: rgba(122, 234, 240, 0.094); border-width: 0px 0px 0px 4px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-color: rgb(61, 184, 191); border-image: none 100% / 1 / 0 stretch; border-radius: 4px; line-height: 26px; visibility: visible;&quot;&gt;&lt;p style=&quot;margin: 10px; word-spacing: 2px; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;一个在浏览器里运行的太阳系实时探索工具，1:1 还原真实比例，从太阳表面一直延伸到 10 万 AU 外的奥尔特云。数据来自 NASA JPL 星历表，行星位置跟实际天文观测对得上。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style=&quot;text-align: justify; color: rgb(51, 51, 51); margin: 10px; word-spacing: 2px; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;Github地址&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify; color: rgb(51, 51, 51); margin: 10px; word-spacing: 2px; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold; visibility: visible;&quot;&gt;https://github.com/hyqzz/Solar-Wanderer&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;section style=&quot;text-align: center; visibility: visible;&quot; nodeleaf=&quot;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img js_insertlocalimg&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100016804&quot; data-ratio=&quot;0.4685185185185185&quot; data-s=&quot;300,640&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703111209_57770.png&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-original-style=&quot;null&quot; data-index=&quot;3&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703111209_57770.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important; visibility: visible !important; width: 647px !important;&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783018340502&quot; data-report-img-idx=&quot;0&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;h2 style=&quot;color: rgb(255, 255, 255); font-size: 1.4em; line-height: 1.6; width: fit-content; margin: 20px 0px 5px; padding: 1px 12.5px; border-radius: 4px; background-image: linear-gradient(to right, rgb(61, 184, 211), rgb(128, 247, 196)); background-position: 0% 0%; background-size: 200% 100%; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; display: inline-block; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;功能特性&lt;/span&gt;&lt;/h2&gt;&lt;ul style=&quot;visibility: visible;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;实时定位：九大行星、月球、21 颗卫星、小行星带、&lt;span class=&quot;&quot; link-id=&quot;link-1783018340391-0.749900860194511&quot;&gt;柯伊伯带&lt;/span&gt;、28 颗海外天体、4 颗彗星，位置误差不超过 0.074 度&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;无缝缩放：从太空轨道一路扎到星球表面，再进到水里，没有加载画面打断&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;双端可用：电脑键鼠、手机触屏都能操作，同一套物理和比例&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;体量够轻：核心代码 gzip 后约 200KB，不用装东西、不用注册、没有后端服务器&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;精度可验：测过跟 &lt;span class=&quot;&quot; link-id=&quot;link-1783018340393-0.8092565133679961&quot;&gt;JPL Horizons&lt;/span&gt; 的对比，行星角度差不到 0.1 度，月球 0.12 度，地球自转跟真实子午线对齐&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;color: rgb(255, 255, 255); font-size: 1.4em; line-height: 1.6; width: fit-content; margin: 20px 0px 5px; padding: 1px 12.5px; border-radius: 4px; background-image: linear-gradient(to right, rgb(61, 184, 211), rgb(128, 247, 196)); background-position: 0% 0%; background-size: 200% 100%; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; display: inline-block;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;怎么用&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-align: justify;color: rgb(51, 51, 51);margin: 10px;word-spacing: 2px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;直接打开 https://sw.icodestar.net，等页面加载完就能点目录里的天体名字跳转。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: justify;color: rgb(51, 51, 51);margin: 10px;word-spacing: 2px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;几个上手路线：&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;点&amp;quot;月球&amp;quot;→双指捏合放大→着陆→抬头看，地球悬在黑天上&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;从地球不断后拉，行星缩成点，再拉远直到奥尔特云浮现&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;双击&amp;quot;土星&amp;quot;→ zoom 到能看见&lt;span class=&quot;&quot; link-id=&quot;link-1783018340393-0.5405325864894641&quot;&gt;卡西尼缝&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: justify;color: rgb(51, 51, 51);margin: 10px;word-spacing: 2px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;想自己改代码的话，仓库是 MIT 协议：&lt;/span&gt;&lt;/p&gt;&lt;pre style=&quot;font-size: 12px; border-radius: 5px; line-height: 2; margin: 1em 0.5em; padding: 0.5em; box-shadow: rgba(0, 0, 0, 0.55) 0px 1px 5px; background-color: rgb(255, 255, 255);&quot;&gt;&lt;section style=&quot;background-repeat: no-repeat; width: 100%; height: 16px;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; version=&quot;1.1&quot; width=&quot;45&quot; height=&quot;12&quot; viewbox=&quot;0 0 450 130&quot; role=&quot;img&quot; aria-label=&quot;插图&quot;&gt;&lt;ellipse cx=&quot;65&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(220,60,54)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(237,108,96)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;225&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(218,151,33)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(247,193,81)&quot;&gt;&lt;/ellipse&gt;&lt;ellipse cx=&quot;385&quot; cy=&quot;65&quot; rx=&quot;50&quot; ry=&quot;52&quot; stroke=&quot;rgb(27,161,37)&quot; stroke-width=&quot;2&quot; fill=&quot;rgb(100,200,86)&quot;&gt;&lt;/ellipse&gt;&lt;/svg&gt;&lt;/section&gt;&lt;code style=&quot;font-family: Menlo, Monaco, Consolas, &amp;quot;Liberation Mono&amp;quot;, &amp;quot;Roboto Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, monospace; display: block; overflow-x: auto; margin: 0.5em; padding: 3px 5px; color: rgb(36, 41, 46); background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;git&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #E36209;&quot;&gt;clone&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;https://github.com/hyqzz/Solar-Wanderer.git&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style=&quot;color: #E36209;&quot;&gt;cd&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;Solar-Wanderer&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;npm install&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;npm run dev &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 03 Jul 2026 11:11:52 +0800</pubDate></item><item><title>有人拿开源项目收费200元，被喷惨了！我查了 License 后，发现很多人都搞错了……</title><link>https://kinber.cn/post/6691.html</link><description>&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;前几天，在一个技术交流群里，看到这样一段聊天。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;figure data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 10px 0px; padding: 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.34234234234234234&quot; data-type=&quot;png&quot; data-w=&quot;555&quot; style=&quot;display: block; margin: 0px auto; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px; object-fit: fill; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; height: auto !important; visibility: visible !important; width: 555px !important;&quot; data-imgfileid=&quot;100016048&quot; data-aistatus=&quot;1&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703110759_96537.png&quot; data-original-style=&quot;display: block;margin: 0px auto;max-width: 100%;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;height: auto !important;&quot; data-index=&quot;3&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703110759_96537.png&quot; _width=&quot;555px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783039778647&quot; data-report-img-idx=&quot;0&quot; data-fail=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;原因是一个码农拿一个开源产品&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;ITOps Agent&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;来收取200的会员费用，提供后续长期更新，群里炸锅了，都说要举报他。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;我去看了一眼这个项目的&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181); font-size: 14px; line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; margin: 0px 2px; padding: 2px 4px; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; overflow-wrap: break-word; font-family: &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, Menlo, monospace; word-break: break-all; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;License&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;结果发现，它使用的是：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;figure data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 10px 0px; padding: 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.5468036529680366&quot; data-type=&quot;png&quot; data-w=&quot;876&quot; style=&quot;display: block; margin: 0px auto; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px; object-fit: fill; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; height: auto !important; visibility: visible !important; width: 657px !important;&quot; data-imgfileid=&quot;100016047&quot; data-aistatus=&quot;1&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703110800_91619.png&quot; data-original-style=&quot;display: block;margin: 0px auto;max-width: 100%;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;height: auto !important;&quot; data-index=&quot;4&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703110800_91619.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783039778647&quot; data-report-img-idx=&quot;1&quot; data-fail=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;Mozilla Public License Version 2.0（MPL-2.0）&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;看到这里，我突然意识到：&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;很多程序员、运维，甚至开发者，都误解了&amp;quot;开源&amp;quot;。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;今天，我们就聊聊这个话题。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;开源，就一定不能收费吗？&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;这是很多人的第一反应。 不少人认为：&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;开源 = 免费&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;开源 = 公益&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;开源 = 谁收费谁没良心&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;但事实上，&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;开源和免费，从来都不是一回事。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;真正决定一个项目能不能商用、能不能收费的，不是网友怎么看，而是：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;开源协议（License）。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;它才是真正具有法律效力的规则。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;我查了一下，这个项目用的是 &lt;span class=&quot;&quot; link-id=&quot;link-1783039778533-0.37602119554249924&quot;&gt;MPL 2.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;很多人听过：&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;MIT&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Apache&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;GPL&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;但是对&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: &amp;#39;Operator Mono&amp;#39;, Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;MPL 2.0&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;可能不太了解。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;它其实属于一种：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;弱&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: &amp;#39;Operator Mono&amp;#39;, Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Copyleft&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;（弱传染）协议。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;简单来说：它既鼓励开源，又允许商业化。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;很多人以为：&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;MPL = 不能赚钱。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;实际上，并不是。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;MPL 2.0 到底允不允许收费？&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;答案是：&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;允许的。&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;只要遵守协议。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;也就是说，别人可以收安装费，技术支持费，培训费，咨询费或运维服务等费用。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;以上这些协议本身都没有禁止。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;很多人听到这里可能会惊讶：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;什么？开源还能收费？&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;是的。 而且这种模式，在开源世界其实非常普遍。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;那为什么大家会觉得不舒服？&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;因为很多人脑海里出现的是另一种画面。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;别人花了几年时间：&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;写代码&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;修 Bug&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;回 Issue&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;写文档&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;做版本更新&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;结果另一个人：&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;下载源码，打包，改个 Logo，换个名字&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;然后开始收费。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;如果真是这样，很多人心里都会觉得：&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;这不是&amp;quot;借鸡生蛋&amp;quot;吗？&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;其实，这里面混淆了两个概念。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;收费，本身没有问题&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;真正应该讨论的是：&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;收费有没有提供价值。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;举个最简单的例子。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;很多企业根本不会部署&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: &amp;#39;Operator Mono&amp;#39;, Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Kubernetes&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;。有人提供：&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;私有化部署&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Helm 安装&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Docker 镜像&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;升级方案&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Bug 修复&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;企业微信群支持&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;持续版本更新&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;收费吗？当然收费。甚至几百，几千都很正常。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;因为客户买的不是源码。而是你的时间，你的经验，你的服务。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;真正容易踩坑的是这一点&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;很多人不知道，&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: &amp;#39;Operator Mono&amp;#39;, Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;MPL 2.0&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;有一个非常重要的规定。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;如果你修改了原来的源码文件。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;那么&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;修改后的这个文件，仍然必须遵循 MPL。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;也就是说：别人有权获得这部分源码。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;但是，如果是你自己新增了一些新模块，完全是可以闭环的。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;这就是 MPL 最经典的一点：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;文件级开源。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;不像&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: &amp;#39;Operator Mono&amp;#39;, Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;GPL&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;那样，整个项目都必须开源。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;也不像&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: &amp;#39;Operator Mono&amp;#39;, Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;MIT&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;那样，改完全部闭源也可以。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;它刚好处于两者之间。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;所以，交流群里的那个人违法吗？&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;答案其实很简单。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;但要分两种情况。&lt;/span&gt;&lt;/p&gt;&lt;h3 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;&quot;&gt;&lt;span style=&quot;font-size: 20px; color: #773098; line-height: 1.5em; letter-spacing: 0em; display: block;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;第一种：卖的是服务&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;比如：&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;提供安装包&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;持续更新&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;售后支持&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;视频教程&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;微信交流群&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;然后收费 200 元。&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;这种情况，大概率没有问题。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;因为：收费的是服务，不是 License。&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;虽然不道德，但不违法&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;&quot;&gt;&lt;span style=&quot;font-size: 20px; color: #773098; line-height: 1.5em; letter-spacing: 0em; display: block;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;第二种：修改源码还不遵守协议&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;比如：修改了&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;color: rgb(150, 84, 181);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;background-attachment: scroll;background-clip: border-box;background-color: rgba(27, 31, 35, 0.05);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 2px;margin-right: 2px;padding-top: 2px;padding-bottom: 2px;padding-left: 4px;padding-right: 4px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;overflow-wrap: break-word;font-family: &amp;#39;Operator Mono&amp;#39;, Consolas, Monaco, Menlo, monospace;word-break: break-all;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;MPL&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;源码，删除原作者版权，完全闭源。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;然后当成自己的产品卖。如果是这样，就有可能违反 MPL 协议。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;所以真正的问题，不是收费。而是&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;有没有遵守 License所约束的条件。&lt;/strong&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;为什么越来越多开源作者开始收费？&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;以前很多人觉得：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;开源作者，就应该&amp;quot;用爱发电&amp;quot;。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;现实却是：维护一个优秀项目，成本非常高，&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;服务器要钱，域名要钱 ，时间更值钱。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;很多项目：一个 Bug，可能作者要花整个周末修复，现在有了AI还好点，可能短时间内修复。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;如果没有收入，作者靠什么坚持几年？&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;所以现在越来越多优秀项目都开始：&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;企业版收费&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;社区版免费&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;提供商业支持&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;提供技术咨询&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin-top: 5px; margin-bottom: 5px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;提供 &lt;span class=&quot;&quot; link-id=&quot;link-1783039778533-0.0859528340359319&quot;&gt;SaaS&lt;/span&gt; 服务&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;这其实才是健康的开源生态。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;作者获得收入，项目持续更新，用户得到更好的服务，这是一个共赢。&lt;/span&gt;&lt;/p&gt;&lt;h1 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;&quot;&gt;&lt;span style=&quot;font-size: 24px; color: #773098; line-height: 1.5em; letter-spacing: 0em; display: block;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;开源，不代表作者必须无偿奉献&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;这几年，我越来越认同一句话：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;开源是一种协作方式，不是一种慈善行为。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;作者可以选择：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;免费，收费，企业版，社区版，双许可证，商业授权。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;这些都没有问题。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;因为只有项目能够持续活下去，整个开源生态才能越来越好。&lt;/span&gt;&lt;/p&gt;&lt;h2 data-tool=&quot;mdnice编辑器&quot; style=&quot;margin: 30px 0px 15px; padding: 0px; align-items: unset; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; border-style: none; border-width: 1px; border-color: rgb(0, 0, 0); border-radius: 0px; box-shadow: none; display: flex; flex-direction: unset; float: unset; height: auto; justify-content: center; line-height: 1.5em; overflow: unset; text-shadow: none; transform: none; width: 100%; -webkit-box-reflect: unset;&quot;&gt;&lt;span style=&quot;font-size: 22px; border-color: #000000 #000000 #773098; color: #773098; line-height: 1.5em; letter-spacing: 0em; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: 85%; height: auto; align-items: unset; border-style: none none solid; border-width: 1px; border-radius: 0px; box-shadow: none; display: block; flex-direction: unset; float: unset; justify-content: unset; margin: 0px; overflow: unset; padding: 0px 0px 10px; text-align: center; text-indent: 0em; text-shadow: none; transform: none; -webkit-box-reflect: unset;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;最后，分享一句我很认同的话&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;License 是底线。&lt;/strong&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;价值，是上限。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;遵守开源协议，是每一个技术人的基本素养。&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;而真正决定别人愿不愿意付费的，不是源码是不是免费的，而是&lt;/span&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;你提供的服务，到底值不值这个价格。&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;所以下次再看到：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;&amp;quot;有人拿开源项目收费！&amp;quot;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;不妨先问一句：&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;他违反 License 了吗？&lt;/strong&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;如果没有，那真正值得讨论的，应该是：&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;margin-top: 20px; margin-bottom: 20px; padding: 10px 10px 10px 20px; border-top: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-right: 1px solid rgb(150, 84, 181); border-left-width: 3px; border-left-color: rgb(150, 84, 181); border-radius: 0px; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgb(251, 249, 253); width: auto; height: auto; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px; overflow: auto;&quot;&gt;&lt;p style=&quot;text-indent: 0em; padding: 8px 0px; color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;他提供的价值，配不配得上这 200 元？&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;兄弟们，你怎么看？&lt;/span&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;color: rgb(90, 90, 90); font-size: 15px; line-height: 1.8em; letter-spacing: 0.02em; text-indent: 0em; margin-top: 10px; margin-bottom: 10px; padding: 8px 0px;&quot;&gt;&lt;strong style=&quot;color: rgb(0, 0, 0); background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: no-repeat; background-size: auto; width: auto; height: auto; margin: 0px; padding: 0px; border-style: none; border-width: 3px; border-color: rgba(0, 0, 0, 0.4); border-radius: 0px;&quot;&gt;开源项目应不应该收费？欢迎评论区聊聊。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 03 Jul 2026 11:07:37 +0800</pubDate></item><item><title>客户端到Active Directory服务器的端口</title><link>https://kinber.cn/post/6690.html</link><description>&lt;h2 msttexthash=&quot;35165728&quot; msthash=&quot;69&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255); visibility: visible;&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;Active Directory 端口摘要&lt;/span&gt;&lt;/h2&gt;&lt;p msttexthash=&quot;467025767&quot; msthash=&quot;70&quot; style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5rem; padding: 0px; border: 0px; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255); visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;这里是 Active Directory 默认安装时使用的端口列表。这发生在域控制器和已加入域的计算机之间。&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-bottom: 1.5em; margin-left: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border: 0px; list-style-position: initial; list-style-image: initial; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255); visibility: visible;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;TCP 135 Microsoft RPC&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;TCP/UDP 49152 – 65535 RPC &lt;span class=&quot;&quot; link-id=&quot;link-1783039935578-0.4233660729170339&quot;&gt;动态端口&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;TCP 88 Kerberos&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;TCP 389 LDAP&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;UDP 53 DNS&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;visibility: visible;&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;TCP 445 SMB&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 msttexthash=&quot;546793&quot; msthash=&quot;77&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255); visibility: visible;&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible;&quot;&gt;TCP 135 Microsoft RPC Mapper&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;section style=&quot;text-align: center; visibility: visible;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008712&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.5006257822277848&quot; data-w=&quot;799&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101521_71978.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;3&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101521_71978.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783039935807&quot; data-report-img-idx=&quot;0&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-bottom: 1.5em; margin-left: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border: 0px; list-style-position: initial; list-style-image: initial; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;描述：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;端口135是一个关键的客户端/服务器端口。该端口被许多Microsoft服务使用，不应被防火墙阻挡。首先，客户端连接到RPC映射服务（端口135），并询问映射器该服务正在监听哪个端口（该端口将是动态端口范围......见下文）。RPC 映射器响应客户端的端口，然后客户端连接到该端口。你可以在上面的截图中看到这一点。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;防火墙：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;允许客户端和服务器之间切换。135号端口不应暴露在互联网上&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 msttexthash=&quot;40197209&quot; msthash=&quot;81&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot;&gt;TCP/UDP 49152 – 65535 RPC 动态端口&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008713&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.5024691358024691&quot; data-w=&quot;810&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101523_68929.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;4&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101523_68929.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783044898683&quot; data-report-img-idx=&quot;1&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-bottom: 1.5em; margin-left: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border: 0px; list-style-position: initial; list-style-image: initial; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;描述：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;动态端口范围被各种服务器应用使用。RPC 动态端口分配指示 RPC 程序使用配置为 TCP 和 UDP 的范围内的特定随机端口，基于所用操作系统的实现。RPC 映射器（端口 135）用于连接客户端与运行在这些动态端口上的服务。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;防火墙：&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;允许客户端和服务器之间切换。该端口范围不应暴露在互联网上。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 msttexthash=&quot;208468&quot; msthash=&quot;87&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot;&gt;TCP 88 Kerberos&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008715&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.4925373134328358&quot; data-w=&quot;804&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101526_69543.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;5&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101526_69543.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783044903534&quot; data-report-img-idx=&quot;2&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-bottom: 1.5em; margin-left: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border: 0px; list-style-position: initial; list-style-image: initial; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;描述：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span class=&quot;&quot; link-id=&quot;link-1783039935578-0.27172357712789585&quot;&gt;Kerberos&lt;/span&gt; 是一种认证协议，能够以安全的方式认证客户端与服务器之间的请求。这是 Microsoft Windows 对域加入设备的默认认证方法。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;防火墙：&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;允许客户端和服务器之间切换。端口不应暴露在互联网上。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 msttexthash=&quot;102037&quot; msthash=&quot;91&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;TCP 389 LDAP&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008716&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.5093632958801498&quot; data-w=&quot;801&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101528_20395.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;6&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101528_20395.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783044904511&quot; data-report-img-idx=&quot;3&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-bottom: 1.5em; margin-left: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border: 0px; list-style-position: initial; list-style-image: initial; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;描述：&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;LDAP是一种目录访问协议。该协议用于搜索、添加/删除、认证和修改如Active Directory中的目录服务器中的数据。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;防火墙：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;允许客户端和服务器之间切换。端口不应暴露在互联网上。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 msttexthash=&quot;77246&quot; msthash=&quot;95&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;UDP 53 DNS&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008717&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.5024875621890548&quot; data-w=&quot;804&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101530_29082.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;7&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101530_29082.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783044904978&quot; data-report-img-idx=&quot;4&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-bottom: 1.5em; margin-left: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border: 0px; list-style-position: initial; list-style-image: initial; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;描述：&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;DNS 是一项关键服务，用于将 IP 地址映射到主机名称。这是客户端用于查找域内资源记录和查找外部域名的关键服务。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;防火墙：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;允许客户端和服务器之间切换。如果你的Active Directory服务器上运行DNS，我不建议将其暴露在互联网上。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 msttexthash=&quot;87347&quot; msthash=&quot;99&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;TCP 445 SMB&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008718&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.5025&quot; data-w=&quot;800&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101532_39758.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;8&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101532_39758.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783044905382&quot; data-report-img-idx=&quot;5&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-bottom: 1.5em; margin-left: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border: 0px; list-style-position: initial; list-style-image: initial; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;描述：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;服务器消息块（SMB 协议）是一种客户端到服务器之间的通信协议，用于访问网络上的文件、打印机和数据。该端口用于启动时获取 &lt;span class=&quot;&quot; link-id=&quot;link-1783039935581-0.4875080981934543&quot;&gt;GPO 信息&lt;/span&gt;，运行&amp;nbsp;gpupdate&amp;nbsp;命令时也会使用。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;font-weight: 700;&quot;&gt;&lt;span leaf=&quot;&quot;&gt;防火墙：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;允许客户端和服务器之间切换。不要将该端口暴露在互联网上。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 msttexthash=&quot;80835807&quot; msthash=&quot;103&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;用户登录域加入计算机时使用的端口&lt;/span&gt;&lt;/h2&gt;&lt;p msttexthash=&quot;327967679&quot; msthash=&quot;104&quot; style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5rem; padding: 0px; border: 0px; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;在这个例子中，我会登录PC1（192.168.100.20），并从域控制器捕获网络数据包。&lt;/span&gt;&lt;/p&gt;&lt;p msttexthash=&quot;332110246&quot; msthash=&quot;105&quot; style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5rem; padding: 0px; border: 0px; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;这里是TCP/UDP端口的对话视图。这是从客户端发送到域控制器和目的端口的流量。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008719&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.40987654320987654&quot; data-w=&quot;810&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101533_28939.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;9&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101533_28939.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783044906050&quot; data-report-img-idx=&quot;6&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008720&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.4962871287128713&quot; data-w=&quot;808&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101535_55979.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;10&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101535_55979.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783044906368&quot; data-report-img-idx=&quot;7&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;p msttexthash=&quot;87694841&quot; msthash=&quot;107&quot; style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5rem; padding: 0px; border: 0px; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot;&gt;以下是客户端使用的目的端口的摘要。&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; margin-bottom: 1.5em; margin-left: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; border: 0px; list-style-position: initial; list-style-image: initial; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span class=&quot;&quot; link-id=&quot;link-1783039935582-0.8457236149182772&quot;&gt;TCP 88&lt;/span&gt;（Kerberos）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;TCP 135（&lt;span class=&quot;&quot; link-id=&quot;link-1783039935582-0.5891648766697919&quot;&gt;Microsoft RPC&lt;/span&gt;）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;TCP 389（LDAP）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;TCP 445（Microsoft DS）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;TCP 49668（用于 LSA、SAM、NetLogon 的 RPC）——从 135 端口的请求开始&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;UDP 53（DNS）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;UDP 389（LDAP）&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 msttexthash=&quot;47674809&quot; msthash=&quot;115&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot;&gt;运行 Gpupdate 时使用的端口&lt;/span&gt;&lt;/h2&gt;&lt;p msttexthash=&quot;167501074&quot; msthash=&quot;116&quot; style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5rem; padding: 0px; border: 0px; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;登录客户端时，我会运行&amp;nbsp;gpupdate&amp;nbsp;命令查看使用了哪些端口。&lt;/span&gt;&lt;/p&gt;&lt;p msttexthash=&quot;165587474&quot; msthash=&quot;117&quot; style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5rem; padding: 0px; border: 0px; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;结果如下。看起来运行gpupdate时，TCP端口445被使用最多。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;section style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100008721&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; type=&quot;block&quot; style=&quot;height: auto !important; visibility: visible !important; width: 677px !important;&quot; data-ratio=&quot;0.7311028500619579&quot; data-w=&quot;807&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101538_74734.png&quot; data-original-style=&quot;height: auto !important;&quot; data-index=&quot;11&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101538_74734.png&quot; _width=&quot;677px&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1783044907094&quot; data-report-img-idx=&quot;8&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/p&gt;&lt;h2 msttexthash=&quot;67914873&quot; msthash=&quot;119&quot; style=&quot;box-sizing: inherit; margin: 0px 0px 1.5rem; padding: 0px; border: 0px; font-family: &amp;quot;Barlow Semi Condensed&amp;quot;; color: rgb(11, 17, 41); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot;&gt;连接计算机到该域时使用的端口&lt;/span&gt;&lt;/h2&gt;&lt;p msttexthash=&quot;81890042&quot; msthash=&quot;120&quot; style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5rem; padding: 0px; border: 0px; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;这看起来与其他数据包捕获方式相似。&lt;/span&gt;&lt;/p&gt;&lt;p msttexthash=&quot;1251610113&quot; msthash=&quot;121&quot; style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5rem; padding: 0px; border: 0px; color: rgb(11, 17, 41); font-family: &amp;quot;Nunito Sans&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span leaf=&quot;&quot;&gt;TCP 88（Kerberos）&lt;/span&gt;&lt;br istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span leaf=&quot;&quot;&gt;TCP 135（Microsoft RPC）&lt;/span&gt;&lt;br istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span leaf=&quot;&quot;&gt;TCP 389（LDAP）&lt;/span&gt;&lt;br istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span leaf=&quot;&quot;&gt;TCP 445（Microsoft DS）TCP&lt;/span&gt;&lt;br istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span leaf=&quot;&quot;&gt;49668（用于 LSA、SAM、NetLogon的 RPC）——此程序始于对端口 135&lt;/span&gt;&lt;br istranslated=&quot;1&quot; style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span leaf=&quot;&quot;&gt;UDP 53（DNS）的请求&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 03 Jul 2026 10:10:45 +0800</pubDate></item><item><title>Pyhon操作SQLPub数据库</title><link>https://kinber.cn/post/6689.html</link><description>&lt;h3 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 20px; color: rgb(79, 79, 79); line-height: 30px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;一、创建SQLPub数据库&lt;/h3&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1&amp;nbsp;访问SQLPub官网，申请免费数据库：&lt;a href=&quot;https://sqlpub.com/&quot; title=&quot;SQLPub&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; outline: none; margin: 0px; padding: 0px; font-weight: normal; cursor: pointer; color: rgb(78, 161, 219); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;SQLPub&lt;/a&gt;&lt;/h5&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); text-align: center; line-height: 24px !important;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img alt=&quot;&quot; height=&quot;333&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101030178304463012766.png&quot; width=&quot;485&quot; style=&quot;box-sizing: border-box; outline: none; border: 0px; height: auto; font-synthesis-style: auto; overflow-wrap: break-word; cursor: zoom-in;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;申请成功后保存数据库连接信息，&lt;span style=&quot;box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-synthesis-style: auto; overflow-wrap: break-word; color: #FE2C24;&quot;&gt;密码只显示一次&lt;/span&gt;，注意保存！&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2 点击左上角个人中心进行登录&lt;/h5&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;登录账号为注册邮箱地址，密码与数据库密码一致。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); text-align: center; line-height: 24px !important;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img alt=&quot;&quot; height=&quot;282&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101031178304463183469.png&quot; width=&quot;596&quot; style=&quot;box-sizing: border-box; outline: none; border: 0px; height: auto; font-synthesis-style: auto; overflow-wrap: break-word; cursor: zoom-in;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); text-align: center; line-height: 24px !important;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 20px; color: rgb(79, 79, 79); line-height: 30px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;二、添加测试数据&lt;/h3&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1 通过Dashboard连接数据库&lt;/h5&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); text-align: center; line-height: 24px !important;&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;279&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101032178304463218824.png&quot; width=&quot;588&quot; style=&quot;box-sizing: border-box; outline: none; border: 0px; height: auto; font-synthesis-style: auto; overflow-wrap: break-word; cursor: zoom-in;&quot;/&gt;&lt;/p&gt;&lt;p class=&quot;img-center&quot; style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; text-align: center; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;278&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101033178304463357217.png&quot; width=&quot;590&quot; style=&quot;box-sizing: border-box; outline: none; border: 0px; height: auto; font-synthesis-style: auto; overflow-wrap: break-word; cursor: zoom-in;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 创建测试用表&lt;/h5&gt;&lt;pre style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 24px; padding: 8px; text-wrap: wrap; overflow-wrap: break-word; overflow: auto hidden; font-family: Consolas, Inconsolata, Courier, monospace; line-height: 22px; color: rgb(180, 180, 180); max-height: 340px; border-radius: 5px; font-synthesis-style: auto; background-color: rgb(255, 255, 255);&quot;&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;`ao_sql`.`user`&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`id`&amp;nbsp;INT&amp;nbsp;AUTO_INCREMENT&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;用户ID&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`username`&amp;nbsp;VARCHAR(50)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;用户名&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`password`&amp;nbsp;VARCHAR(100)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;密码&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`email`&amp;nbsp;VARCHAR(100)&amp;nbsp;UNIQUE&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;电子邮箱&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`create_time`&amp;nbsp;TIMESTAMP&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;创建时间&amp;#39;
)&amp;nbsp;ENGINE=InnoDB&amp;nbsp;DEFAULT&amp;nbsp;CHARSET=utf8mb4&amp;nbsp;COMMENT=&amp;#39;用户表&amp;#39;;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;执行后：&lt;/p&gt;&lt;p class=&quot;img-center&quot; style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; text-align: center; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;285&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101034178304463436518.png&quot; width=&quot;604&quot; style=&quot;box-sizing: border-box; outline: none; border: 0px; height: auto; font-synthesis-style: auto; overflow-wrap: break-word; cursor: zoom-in;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3 插入测试数据&lt;/h5&gt;&lt;pre style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 24px; padding: 8px; text-wrap: wrap; overflow-wrap: break-word; overflow: auto hidden; font-family: Consolas, Inconsolata, Courier, monospace; line-height: 22px; color: rgb(180, 180, 180); max-height: 340px; border-radius: 5px; font-synthesis-style: auto; background-color: rgb(255, 255, 255);&quot;&gt;INSERT&amp;nbsp;INTO&amp;nbsp;`ao_sql`.`user`&amp;nbsp;(`username`,&amp;nbsp;`password`,&amp;nbsp;`email`)&amp;nbsp;VALUES
(&amp;#39;john_doe&amp;#39;,&amp;nbsp;&amp;#39;qwert&amp;#39;,&amp;nbsp;&amp;#39;john.doe@example.com&amp;#39;),
(&amp;#39;alice_smith&amp;#39;,&amp;nbsp;&amp;#39;asdfg&amp;#39;,&amp;nbsp;&amp;#39;alice.smith@example.com&amp;#39;),
(&amp;#39;bob_jackson&amp;#39;,&amp;nbsp;&amp;#39;zxcvb&amp;#39;,&amp;nbsp;&amp;#39;bob.jackson@example.com&amp;#39;),
(&amp;#39;emma_wilson&amp;#39;,&amp;nbsp;&amp;#39;12345&amp;#39;,&amp;nbsp;&amp;#39;emma.wilson@example.com&amp;#39;);&lt;/pre&gt;&lt;p class=&quot;img-center&quot; style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; text-align: center; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;285&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101035178304463543277.png&quot; width=&quot;610&quot; style=&quot;box-sizing: border-box; outline: none; border: 0px; height: auto; font-synthesis-style: auto; overflow-wrap: break-word; cursor: zoom-in;&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4 查询测试数据&lt;/h5&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;查询测试数据是否正常插入：&lt;/p&gt;&lt;pre style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 24px; padding: 8px; text-wrap: wrap; overflow-wrap: break-word; overflow: auto hidden; font-family: Consolas, Inconsolata, Courier, monospace; line-height: 22px; color: rgb(180, 180, 180); max-height: 340px; border-radius: 5px; font-synthesis-style: auto; background-color: rgb(255, 255, 255);&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;`user`&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;`id`&lt;/pre&gt;&lt;p class=&quot;img-center&quot; style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; text-align: center; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 24px !important;&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;294&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260703101035178304463553178.png&quot; width=&quot;622&quot; style=&quot;box-sizing: border-box; outline: none; border: 0px; height: auto; font-synthesis-style: auto; overflow-wrap: break-word; cursor: zoom-in;&quot;/&gt;&lt;/p&gt;&lt;h3 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 20px; color: rgb(79, 79, 79); line-height: 30px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;/h3&gt;&lt;h3 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 20px; color: rgb(79, 79, 79); line-height: 30px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;三、Python操作数据库&lt;/h3&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 安装pymysql&lt;/h5&gt;&lt;pre style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 24px; padding: 8px; text-wrap: wrap; overflow-wrap: break-word; overflow: auto hidden; font-family: Consolas, Inconsolata, Courier, monospace; line-height: 22px; color: rgb(180, 180, 180); max-height: 340px; border-radius: 5px; font-synthesis-style: auto; background-color: rgb(255, 255, 255);&quot;&gt;pip&amp;nbsp;install&amp;nbsp;pymysql&lt;/pre&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2 创建测试python脚本&lt;/h5&gt;&lt;pre style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 24px; padding: 8px; text-wrap: wrap; overflow-wrap: break-word; overflow: auto hidden; font-family: Consolas, Inconsolata, Courier, monospace; line-height: 22px; color: rgb(180, 180, 180); max-height: 340px; border-radius: 5px; font-synthesis-style: auto; background-color: rgb(255, 255, 255);&quot;&gt;import&amp;nbsp;pymysql

#&amp;nbsp;配置连接
db&amp;nbsp;=&amp;nbsp;pymysql.connect(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;host=&amp;quot;mysql2.sqlpub.com&amp;quot;,&amp;nbsp;&amp;nbsp;#&amp;nbsp;数据库地址端口
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;port=3307,&amp;nbsp;&amp;nbsp;#&amp;nbsp;数据库端口
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user=&amp;quot;用户名&amp;quot;,&amp;nbsp;&amp;nbsp;#&amp;nbsp;数据库用户
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password=&amp;quot;密码&amp;quot;,&amp;nbsp;&amp;nbsp;#&amp;nbsp;数据库密码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;database=&amp;quot;数据库&amp;quot;,&amp;nbsp;&amp;nbsp;#&amp;nbsp;数据库名
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charset=&amp;#39;utf8mb4&amp;#39;&amp;nbsp;&amp;nbsp;#&amp;nbsp;避免中文乱码[6,7](@ref)
)

try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;db.cursor()&amp;nbsp;as&amp;nbsp;cursor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;查询示例
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute(&amp;quot;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;`user`&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;`id`&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(cursor.fetchall())

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.commit()&amp;nbsp;&amp;nbsp;#&amp;nbsp;提交事务！
except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.rollback()&amp;nbsp;&amp;nbsp;#&amp;nbsp;失败回滚
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;错误:&amp;nbsp;{e}&amp;quot;)
finally:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.close()&lt;/pre&gt;&lt;h5 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 16px; color: rgb(79, 79, 79); line-height: 26px; font-synthesis-style: auto; overflow-wrap: break-word; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 3 运行后得到相同结果&lt;/h5&gt;&lt;pre style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 24px; padding: 8px; text-wrap: wrap; overflow-wrap: break-word; overflow: auto hidden; font-family: Consolas, Inconsolata, Courier, monospace; line-height: 22px; color: rgb(180, 180, 180); max-height: 340px; border-radius: 5px; font-synthesis-style: auto; background-color: rgb(255, 255, 255);&quot;&gt;((1,&amp;nbsp;&amp;#39;john_doe&amp;#39;,&amp;nbsp;&amp;#39;qwert&amp;#39;,&amp;nbsp;&amp;#39;john.doe@example.com&amp;#39;,&amp;nbsp;datetime.datetime(2025,&amp;nbsp;6,&amp;nbsp;27,&amp;nbsp;17,&amp;nbsp;4,&amp;nbsp;38)),&amp;nbsp;(2,&amp;nbsp;&amp;#39;alice_smith&amp;#39;,&amp;nbsp;&amp;#39;asdfg&amp;#39;,&amp;nbsp;&amp;#39;alice.smith@example.com&amp;#39;,&amp;nbsp;datetime.datetime(2025,&amp;nbsp;6,&amp;nbsp;27,&amp;nbsp;17,&amp;nbsp;4,&amp;nbsp;38)),&amp;nbsp;(3,&amp;nbsp;&amp;#39;bob_jackson&amp;#39;,&amp;nbsp;&amp;#39;zxcvb&amp;#39;,&amp;nbsp;&amp;#39;bob.jackson@example.com&amp;#39;,&amp;nbsp;datetime.datetime(2025,&amp;nbsp;6,&amp;nbsp;27,&amp;nbsp;17,&amp;nbsp;4,&amp;nbsp;38)),&amp;nbsp;(4,&amp;nbsp;&amp;#39;emma_wilson&amp;#39;,&amp;nbsp;&amp;#39;12345&amp;#39;,&amp;nbsp;&amp;#39;emma.wilson@example.com&amp;#39;,&amp;nbsp;datetime.datetime(2025,&amp;nbsp;6,&amp;nbsp;27,&amp;nbsp;17,&amp;nbsp;4,&amp;nbsp;38)))

Process&amp;nbsp;finished&amp;nbsp;with&amp;nbsp;exit&amp;nbsp;code&amp;nbsp;0&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 03 Jul 2026 10:10:17 +0800</pubDate></item><item><title>API接口逆向思路 - 拼多多篇</title><link>https://kinber.cn/post/6688.html</link><description>&lt;article class=&quot;message message-immersive is-danger&quot; style=&quot;box-sizing: inherit; background-color: rgb(254, 236, 240); border-radius: 0px; font-size: 1rem; margin: 0px -1.5rem 1.5rem; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; text-wrap: wrap;&quot;&gt;&lt;div class=&quot;message-body&quot; style=&quot;box-sizing: inherit; border: none; border-radius: 4px; color: rgb(204, 15, 53); padding: 1.25em 1.5em;&quot;&gt;&lt;span class=&quot;fas fa-exclamation-triangle mr-2&quot; style=&quot;box-sizing: inherit; -webkit-font-smoothing: antialiased; display: inline-block; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; text-rendering: auto; line-height: inherit; font-family: &amp;quot;Font Awesome 5 Free&amp;quot;; font-weight: 900; margin-right: 0.5rem !important;&quot;&gt;&lt;/span&gt;为不触及同行利益，本篇博客只提供思路，并且单一的了解此博客内容也无法产生利益，不提供可运行代码。&lt;/div&gt;&lt;/article&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;前段时间有个客户找我做一个和拼多多相关的业务，重点询问了我一个有关拼多多接口的问题，我因为比较忙，所以没帮他写，但是提供了一个思路给他，接下来我们一起看看这个问题。&lt;/p&gt;&lt;p&gt;&lt;span id=&quot;more&quot; style=&quot;box-sizing: inherit; color: #4A4A4A; font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #4A4A4A; font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;做过拼多多接口逆向或者其他平台（比如德州仪器，耐克）逆向的同学，可能对 API 的校验非常了解，常规 API 除了最容易获得的 Token 以外，Request Header 中还会附加一些其他的自定义内容用来加强保护 API 强度，比如最出名的是 Akamai 公司的 Sensor_data, 这个 request 属性中包含的内容堪称变态，大概有鼠标轨迹，浏览器指纹，canvas 指纹，SSL 指纹，时间戳算法，键盘动作等等，能逆向成功并且通过 Akamai 检测的同学可以说已经是行业顶级了。那接下来我们一起看看拼多多的防范手段。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;我们随便进入一个拼多多的页面，然后查看开发者工具你会看到这样一个东西。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154519178297831941331.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154519178297831941331.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;除了这个 Anti-Content 之外，其他所有的认证头信息都非常容易获得，所以此篇博客都是围绕这个东西开始叙述思路，因为其他的请求信息不需要教，你也可以轻松获得。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;废话不多说，开始进入 spy 环节，经常逆向 API 的同学肯定非常清楚第一步当然是点开调用链开始我们的奇幻之旅。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154519178297831912375.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154519178297831912375.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;可以看到这个请求经过了四个不同的 JS 文件，最终完成了这个请求。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;使用过 react，vue 或者 angular 开发并且使用 webpack 打包过的同学肯定知道， **chunk**和文件名为 GUID 的这两种 JS 文件，一般都是 node*modules 的模块打包，不包含业务代码，基本都是一些第三方库和框架代码，所以我们只需要从 commons.*.js 这文件下手&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154519178297831955240.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154519178297831955240.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;点开调用链第一次经过 commons.*.js 的地方，开发者工具帮我们自动定位到这个片段。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154519178297831912340.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154519178297831912340.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;不要犹豫，打上断点，然后刷新页面重新请求一下。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154520178297832073177.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154520178297832073177.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;可以看到此时 request headers 还没有附加 Anti-Content ,继续调用链往上找。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154520178297832035325.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154520178297832035325.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;使用同样的方法点开第二个调用链经过的地方，并且打上断点。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154520178297832033405.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154520178297832033405.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;可以看到返回了一个 Promise，因为 Promise 是一个异步语法糖，所以这里没啥用，继续按照相同的办法往调用顶上走，使用老套路打上断点，一直重复这个动作，最后发现。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832161071.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832161071.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832134049.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832134049.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;是这里产生了 Anti_Content，那就很简单了，我们把产生的中间段代码跟踪一下就知道是怎么产生的，然后就是漫长的阅读和 Debugging 时间，做过 API 逆向的同学肯定知道，这个过程非常痛苦，轻则十几分钟出结果，重则几天没有结果，因为 JS 打包后的文件非常变态，变量名全是 a,b,c,d 之类的，并且为了兼容浏览器版本，JavaScript 全部都是 es moudule（是的，就是你经常 F12 看到的那一堆和乱码一样的代码），但是还好，只是 1 个小时左右就找到了，这里非常考验你的经验，熟练的同学会非常快，具体过程就不多说了，此篇博客只提供思路。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832110849.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832110849.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;这里产生了这个 Anti_Content，我们可以测试一下，打开浏览器 Console，然后输入这个函数。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832198121.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832198121.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;非常好，检验没问题，那接下来就非常考验你对于 web 开发的专业知识掌握和底层的理解，你此时要考虑这几个问题：&lt;/p&gt;&lt;ul style=&quot;box-sizing: inherit; margin-top: 1em; margin-bottom: 1em; margin-left: 2em; padding: 0px; list-style-position: outside; list-style-image: initial; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;1.如何提取 webpack 打包的代码片段。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;2.如何提取 ”提取到的 webpack 代码片段” 中的这段函数。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;3.如何在任何编程语言中运行这段函数？（因为你可能使用任何语言编写爬虫和自动化软件）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;我们开始一步步攻克，首先你要知道 webpack 是什么，以及 babel 是如何把代码编译成浏览器所兼容的 JS，所以你的第一步就是把打包后的代码通过 babel 还原成打包前的，你需要知道 webpack 打包的 JS 脚本会分为&lt;span style=&quot;box-sizing: inherit; color: #363636; font-weight: 700;&quot;&gt;加载器&lt;/span&gt;和&lt;span style=&quot;box-sizing: inherit; color: #363636; font-weight: 700;&quot;&gt;执行器&lt;/span&gt;（执行器就是刚刚我们一直跟踪的那个 JS 文件），通常加载器和执行器是一对多的。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154522178297832227626.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154522178297832227626.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;然后你需要用 nodejs 写一个这样的 ast 还原代码，大概长这样（不提供源码，只提供思路）。&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;highlight javascript hljs&quot; id=&quot;code-1782978301691306&quot; style=&quot;box-sizing: inherit; margin-top: 2em; margin-bottom: 2em; padding: 0px; overflow: hidden; background: rgb(29, 31, 33); color: rgb(197, 200, 198); max-width: 100%; text-align: center; width: 1050px; position: relative; border-radius: 4px; font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; margin-right: 0px !important; margin-left: 0px !important;&quot;&gt;&lt;figcaption class=&quot;level is-mobile&quot; style=&quot;box-sizing: inherit; align-items: center; justify-content: space-between; display: flex; background: rgba(200, 200, 200, 0.15); padding: 0.3em 0em 0.3em 0.75em; font-size: 0.8em; margin-bottom: 1.5rem; overflow: auto; margin-top: 0px !important; margin-right: 0px !important; margin-left: 0px !important;&quot;&gt;&lt;div class=&quot;level-left&quot; style=&quot;box-sizing: inherit; flex: 0 0 auto; align-items: center; justify-content: flex-start; display: flex; color: inherit;&quot;&gt;&lt;span class=&quot;fold&quot; style=&quot;box-sizing: inherit; font-style: inherit; color: inherit; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace, &amp;quot;Microsoft YaHei&amp;quot;; cursor: pointer;&quot;&gt;&lt;span class=&quot;fas fa-angle-down&quot; style=&quot;box-sizing: inherit; -webkit-font-smoothing: antialiased; display: inline-block; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; text-rendering: auto; line-height: inherit; font-family: &amp;quot;Font Awesome 5 Free&amp;quot;; font-weight: 900; color: inherit;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;level-right&quot; style=&quot;box-sizing: inherit; flex: 0 0 auto; align-items: center; justify-content: flex-end; display: flex; color: inherit; margin-top: 0px;&quot;&gt;&lt;a class=&quot;copy&quot; title=&quot;Copy&quot; data-clipboard-target=&quot;#code-1782978301691306 .code&quot; style=&quot;box-sizing: inherit; color: inherit; cursor: pointer; opacity: 0.7; padding: 0em 0.75em;&quot;&gt;&lt;span class=&quot;fas fa-copy&quot; style=&quot;box-sizing: inherit; -webkit-font-smoothing: antialiased; display: inline-block; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; text-rendering: auto; line-height: inherit; font-family: &amp;quot;Font Awesome 5 Free&amp;quot;; font-weight: 900; color: inherit;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;div class=&quot;highlight-body&quot; style=&quot;box-sizing: inherit; overflow: auto;&quot;&gt;&lt;table width=&quot;NaN&quot;&gt;&lt;tbody style=&quot;box-sizing: inherit;&quot;&gt;&lt;tr style=&quot;box-sizing: inherit;&quot; class=&quot;firstRow&quot;&gt;&lt;td class=&quot;gutter&quot; style=&quot;box-sizing: inherit; padding: 0.5em 0.75em; vertical-align: top; text-align: right; border-style: none; border-color: initial; border-top-width: initial; border-right-width: initial; border-bottom-width: 0px; border-left-width: initial; background: rgba(200, 200, 200, 0.15);&quot;&gt;&lt;pre style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 0px; padding: 0px; -webkit-font-smoothing: auto; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace, &amp;quot;Microsoft YaHei&amp;quot;; background-color: transparent; color: inherit; font-size: 0.85em; overflow: visible; overflow-wrap: normal; max-width: 100%;&quot;&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;1&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;2&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;3&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;4&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;5&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;6&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;7&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;8&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;9&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;10&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;11&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;12&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;13&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;14&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;15&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;16&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;17&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;18&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;19&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;20&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;21&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;22&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;23&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;24&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;25&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;26&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;27&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;28&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;29&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;30&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;31&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;32&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;33&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;34&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;35&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;36&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;37&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;38&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;39&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;40&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;41&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;42&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;43&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;44&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;45&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;46&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;47&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;48&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;49&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;50&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;51&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;52&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; style=&quot;box-sizing: inherit; padding: 0.5em 0.75em; vertical-align: top; text-align: left; border-style: none; border-color: initial; border-top-width: initial; border-right-width: initial; border-bottom-width: 0px; border-left-width: initial;&quot;&gt;&lt;pre style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 0px; padding: 0px; -webkit-font-smoothing: auto; font-family: &amp;quot;Source Code Pro&amp;quot;, monospace, &amp;quot;Microsoft YaHei&amp;quot;; background-color: transparent; color: inherit; font-size: 0.85em; overflow: visible; overflow-wrap: normal; max-width: 100%;&quot;&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;import&lt;/span&gt; * &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;as&lt;/span&gt; parser &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;@babel/parser&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;import&lt;/span&gt; * &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;as&lt;/span&gt; t &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;@babel/types&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;import&lt;/span&gt; * &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;as&lt;/span&gt; generator &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;@babel/generator&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;import&lt;/span&gt; traverse &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;@babel/traverse&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;import&lt;/span&gt; * &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;as&lt;/span&gt; fs &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;fs&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;wtofile&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;path: string, flags: string, code: string&lt;/span&gt;): &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;void&lt;/span&gt; {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;const&lt;/span&gt; fd = fs.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; display: inherit; margin: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;openSync&lt;/span&gt;(path, flags);&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;fs.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; display: inherit; margin: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;writeSync&lt;/span&gt;(fd, code);&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;fs.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; display: inherit; margin: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;closeSync&lt;/span&gt;(fd);&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;run&lt;/span&gt;(&lt;span class=&quot;hljs-params&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;loader_path: string, out_path: string, modular_path: string&lt;/span&gt;): &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;void&lt;/span&gt; {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;// 读取加载器文件&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;js_code&lt;/span&gt;: string = fs.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; display: inherit; margin: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;readFileSync&lt;/span&gt;(loader_path, {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-attr&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;encoding&lt;/span&gt;: &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;});&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;// 将代码转化为 AST 语法树&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;const&lt;/span&gt; loader_ast = parser.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; display: inherit; margin: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;parse&lt;/span&gt;(js_code);&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;// 获取加载器代码&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;loader_body&lt;/span&gt;: any; &lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;// 注意：这里暂时将 loader_body 的类型设置为 any&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;if&lt;/span&gt; (loader_ast.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;program&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;].&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;expression&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;type&lt;/span&gt; === &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;#39;UnaryExpression&amp;#39;&lt;/span&gt;) {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;loader_body = loader_ast.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;program&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;].&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;expression&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;argument&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;callee&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;} &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;else&lt;/span&gt; {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;loader_body = loader_ast.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;program&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;].&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;expression&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;callee&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;export_function&lt;/span&gt;: string | &lt;span class=&quot;hljs-literal&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;null&lt;/span&gt; = &lt;span class=&quot;hljs-literal&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;// 遍历 AST 查找导出函数&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; display: inherit; margin: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;traverse&lt;/span&gt;(loader_ast, {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;title class_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;FunctionDeclaration&lt;/span&gt;(&lt;span class=&quot;hljs-attr&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;path&lt;/span&gt;: any) {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;if&lt;/span&gt; (path.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;toString&lt;/span&gt;().&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;includes&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;exports:&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp; export_function === &lt;span class=&quot;hljs-literal&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;null&lt;/span&gt;) {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;export_function = path.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;node&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;id&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;name&lt;/span&gt;;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;});&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;//中间省略 20240321 个字。。。&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;// 导入加载器中的函数体&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;loader_arguments&lt;/span&gt;: any; &lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;// 注意：这里暂时将 loader_arguments 的类型设置为 any&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;if&lt;/span&gt; (loader_ast.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;program&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;].&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;expression&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;type&lt;/span&gt; === &lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;#39;UnaryExpression&amp;#39;&lt;/span&gt;) {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;loader_arguments = loader_ast.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;program&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;].&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;expression&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;argument&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;arguments&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;];&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;} &lt;span class=&quot;hljs-keyword&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B294BB;&quot;&gt;else&lt;/span&gt; {&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;loader_arguments = loader_ast.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;program&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;].&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;expression&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;arguments&lt;/span&gt;[&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;];&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;hljs-comment&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #969896;&quot;&gt;// 在全局范围声明导出函数变量&lt;/span&gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt; &amp;nbsp; &amp;nbsp;loader_ast.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;program&lt;/span&gt;.&lt;span class=&quot;hljs-property&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit;&quot;&gt;body&lt;/span&gt;.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;splice&lt;/span&gt;(&lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #DE935F;&quot;&gt;0&lt;/span&gt;, t.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;variableDeclaration&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;var&amp;quot;&lt;/span&gt;, [t.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;variableDeclarator&lt;/span&gt;(t.&lt;span class=&quot;title function_&quot; style=&quot;box-sizing: inherit; font: inherit; word-break: break-word; color: #363636; margin: inherit; display: inherit; padding: inherit; background: inherit; height: inherit; text-align: inherit; vertical-align: inherit; min-width: inherit; border-radius: inherit;&quot;&gt;identifier&lt;/span&gt;(&lt;span class=&quot;hljs-string&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; color: #B5BD68;&quot;&gt;&amp;quot;export_function&amp;quot;&lt;/span&gt;))]));&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;span class=&quot;line&quot; style=&quot;box-sizing: inherit; font-style: inherit; font-weight: inherit; line-height: 1.5rem;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;box-sizing: inherit;&quot;/&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;将此转化器保存为 reverseAst.ts（个人习惯，倾向于使用 Typescript），然后使用 tsc 编译成 reverseAst.js，然后把 webpack 的加载器和我们跟踪的 JS 文件从拼多多服务器上下载下来，然后使用我们写的这个脚本开始提取，这样就可以提取 webpack 打包的代码了。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154522178297832298644.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154522178297832298644.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;成功输出 prot.js 文件。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154522178297832254247.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154522178297832254247.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;然后回到第二个问题，怎么提取那个产生 Anti_Content 的函数片段，答案就是无解，只能自己一行行看。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832198121.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154521178297832198121.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在 prot.js 中向上查找，找 oe 是怎么来的，a 方法是怎么来的，这里就不细说了，只能靠你自己悟了。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154523178297832340297.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154523178297832340297.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;可以看到 oe 是 r.n(mt) 来的，然后 mt 又是 r(“fbeZ”) 来的，先找到 fbeZ，如图：&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154523178297832321865.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154523178297832321865.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;一行行找到以后，你就可以编写自己的自己的代码了，当然你还需要补全浏览器环境才行（不提供源码，只提供思路）。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154523178297832337687.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154523178297832337687.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;然后编写代码片段。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154524178297832411813.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154524178297832411813.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;最后执行，大功告成。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154524178297832483169.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154524178297832483169.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;然后附加到 postman 请求一下。&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a class=&quot;gallery-item&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154524178297832429341.png&quot; style=&quot;box-sizing: inherit; color: rgb(50, 115, 220); cursor: pointer;&quot;&gt;&lt;img src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702154524178297832429341.png&quot; style=&quot;box-sizing: inherit; height: auto; padding: 10px 40px; display: block; margin-left: auto; margin-right: auto; border-radius: 4px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: inherit; margin-top: 0px; margin-bottom: 0px; padding: 0px; color: rgb(74, 74, 74); font-family: Ubuntu, Roboto, &amp;quot;Open Sans&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, sans-serif; font-size: 15.4px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;请求成功响应，没有附加 Anti_Content 的请求是无法通过拼多多服务器的校验的，会返回 Error。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 15:44:38 +0800</pubDate></item><item><title>Easy Virtual Display 在win中轻松创建支持多种分辨率和刷新率的虚拟显示器，可用于远程控制或显卡欺骗。</title><link>https://kinber.cn/post/6687.html</link><description>&lt;blockquote style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); color: var(--fgColor-muted,var(--color-fg-muted)); border-left: .25em solid var(--borderColor-default,var(--color-border-default)); padding-right: 1em; padding-left: 1em; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;Effortlessly create virtual displays in Windows, capable of supporting various resolutions and refresh rates, suitable for remote control or graphics card spoofing.在win中轻松创建支持多种分辨率和刷新率的虚拟显示器，可用于远程控制或显卡欺骗。&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;在 Windows 上通过简洁的原生桌面应用添加、移除和管理虚拟显示器——无需命令行，也不需要 Parsec 账号。&lt;/p&gt;&lt;/blockquote&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Easy Virtual Display 是一款 Windows 桌面应用，让你通过友好的界面安装并驱动一块&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;虚拟显示驱动&lt;/span&gt;。虚拟显示器在系统看来就像一块真实存在、却没有物理连接的显示器——非常适合无头服务器与 GPU 主机、远程桌面与串流、为笔记本扩展额外的屏幕空间，或测试多显示器布局。&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;本项目基于&amp;nbsp;&lt;a href=&quot;https://github.com/nomi-san/parsec-vdd&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;nomi-san/parsec-vdd&lt;/a&gt;&amp;nbsp;的早期概念发展而来。&lt;/p&gt;&lt;blockquote style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); color: var(--fgColor-muted,var(--color-fg-muted)); border-left: .25em solid var(--borderColor-default,var(--color-border-default)); padding-right: 1em; padding-left: 1em; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;&quot;&gt;? 预构建的安装包可在&amp;nbsp;&lt;a href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/releases&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;Releases&lt;/a&gt;&amp;nbsp;页面下载。&lt;/p&gt;&lt;/blockquote&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;功能亮点&lt;/h2&gt;&lt;a id=&quot;user-content-功能亮点&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 功能亮点&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E5%8A%9F%E8%83%BD%E4%BA%AE%E7%82%B9&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); padding-left: 2em; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;一键安装驱动&lt;/span&gt;&amp;nbsp;—— 驱动已随应用内置，UAC 提权后一键安装，无需另行下载。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;随处增删显示器&lt;/span&gt;&amp;nbsp;—— 在主窗口或系统托盘中操作，最多可创建 8 块虚拟显示器。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;逐屏精细控制&lt;/span&gt;&amp;nbsp;—— 为每块虚拟显示器分别设置分辨率、刷新率和方向（横向 / 纵向 / 翻转）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;自定义分辨率模式&lt;/span&gt;&amp;nbsp;—— 最多可定义 5 组驱动对外提供的自定义模式。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;指定 GPU&lt;/span&gt;&amp;nbsp;—— 将虚拟显示器绑定到指定的父级 GPU（自动 / NVIDIA / AMD）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;状态一目了然&lt;/span&gt;&amp;nbsp;—— 驱动状态、驱动版本、最大显示器数量以及当前活动显示器数。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;贴心的行为设置&lt;/span&gt;&amp;nbsp;—— 开机自启、关闭到托盘、启动即最小化、显示器活动时&lt;em style=&quot;box-sizing: border-box;&quot;&gt;保持屏幕常亮&lt;/em&gt;，以及主显示器断开时自动顶上的&lt;em style=&quot;box-sizing: border-box;&quot;&gt;兜底显示器&lt;/em&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;精致的体验&lt;/span&gt;&amp;nbsp;—— 浅色 / 深色 / 跟随系统主题，界面支持 English / 简体中文。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;工作原理&lt;/h2&gt;&lt;a id=&quot;user-content-工作原理&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 工作原理&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Easy Virtual Display 由三个协同工作的层次组成：&lt;/p&gt;&lt;p&gt;&lt;markdown-accessiblity-table data-catalyst=&quot;&quot; style=&quot;box-sizing: border-box; display: block; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;/markdown-accessiblity-table&gt;&lt;/p&gt;&lt;table width=&quot;NaN&quot;&gt;&lt;thead style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box; background-color: var(--bgColor-default,var(--color-canvas-default)); border-top: 1px solid var(--borderColor-muted,var(--color-border-muted));&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; font-weight: var(--base-text-weight-semibold,600); border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;层次&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; font-weight: var(--base-text-weight-semibold,600); border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;技术&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; padding: 6px 13px; font-weight: var(--base-text-weight-semibold,600); border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;职责&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box; background-color: var(--bgColor-default,var(--color-canvas-default)); border-top: 1px solid var(--borderColor-muted,var(--color-border-muted));&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600); margin-bottom: 0px;&quot;&gt;外壳&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;Tauri 2（Rust）+ 系统 WebView2&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;窗口、系统托盘、系统集成（自启、防休眠、兜底显示器）、驱动生命周期与权限提升。&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-top: 1px solid var(--borderColor-muted,var(--color-border-muted));&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600); margin-bottom: 0px;&quot;&gt;渲染层&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;React 19 + TypeScript（Vite）&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;桌面界面——TanStack Query、react-hook-form + Zod、Tailwind CSS、Radix 组件与 i18next。&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; background-color: var(--bgColor-default,var(--color-canvas-default)); border-top: 1px solid var(--borderColor-muted,var(--color-border-muted));&quot;&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600); margin-bottom: 0px;&quot;&gt;原生宿主&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;.NET（C#）&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; padding: 6px 13px; border: 1px solid var(--borderColor-default,var(--color-border-default));&quot;&gt;通过&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;DeviceIoControl&lt;/code&gt;&amp;nbsp;/ SetupAPI / CfgMgr32 与虚拟显示驱动通信，并经由 stdio JSON-RPC 协议暴露给外壳。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; tab-size: var(--tab-size-preference); white-space-collapse: break-spaces; background-color: var(--bgColor-neutral-muted,var(--color-neutral-muted)); border-radius: 6px; margin: 0px; padding: 0.2em 0.4em;&quot;&gt;src/shared&lt;/code&gt;&amp;nbsp;中共享的 TypeScript 契约让渲染层与外壳保持严格同步。需要提权的操作（安装/卸载驱动、写入自定义模式）会被路由到专门的提权宿主调用——主程序本身始终以最小权限运行，绝不多取一分。&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;项目结构&lt;/h2&gt;&lt;a id=&quot;user-content-项目结构&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 项目结构&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); justify-content: space-between; display: flex; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; overflow: auto !important; position: relative !important;&quot;&gt;&lt;pre class=&quot;notranslate&quot; style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto;&quot;&gt;src/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;React&amp;nbsp;渲染层&amp;nbsp;+&amp;nbsp;共享&amp;nbsp;TypeScript&amp;nbsp;契约
&amp;nbsp;&amp;nbsp;renderer/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UI&amp;nbsp;组件、hooks、国际化
&amp;nbsp;&amp;nbsp;shared/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;契约、IPC、语言包（en、zh-CN）
src-tauri/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tauri（Rust）外壳——命令、托盘、系统边界
native/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.NET&amp;nbsp;宿主&amp;nbsp;+&amp;nbsp;虚拟显示控制核心
&amp;nbsp;&amp;nbsp;EasyVirtualDisplay.Host/&amp;nbsp;&amp;nbsp;&amp;nbsp;stdio&amp;nbsp;JSON-RPC&amp;nbsp;宿主与管理员&amp;nbsp;CLI
&amp;nbsp;&amp;nbsp;EasyVirtualDisplay.Vdd/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;驱动互操作（DeviceIoControl&amp;nbsp;/&amp;nbsp;SetupAPI）
vendor/parsec-vdd/&amp;nbsp;&amp;nbsp;&amp;nbsp;内置的虚拟显示驱动安装包&lt;/pre&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;src/                 React 渲染层 + 共享 TypeScript 契约
  renderer/          UI 组件、hooks、国际化
  shared/            契约、IPC、语言包（en、zh-CN）
src-tauri/           Tauri（Rust）外壳——命令、托盘、系统边界
native/              .NET 宿主 + 虚拟显示控制核心
  EasyVirtualDisplay.Host/   stdio JSON-RPC 宿主与管理员 CLI
  EasyVirtualDisplay.Vdd/    驱动互操作（DeviceIoControl / SetupAPI）
vendor/parsec-vdd/   内置的虚拟显示驱动安装包&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;快速开始&lt;/h2&gt;&lt;a id=&quot;user-content-快速开始&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 快速开始&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;环境要求&lt;/h3&gt;&lt;a id=&quot;user-content-环境要求&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 环境要求&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); padding-left: 2em; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;Windows&lt;/span&gt;（驱动与打包仅支持 Windows）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;Node.js&lt;/span&gt;&amp;nbsp;与&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;npm&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;Rust&lt;/span&gt;&amp;nbsp;工具链（stable）—— 用于 Tauri 外壳&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;.NET SDK&lt;/span&gt;&amp;nbsp;—— 用于原生宿主&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;安装依赖&lt;/h3&gt;&lt;a id=&quot;user-content-安装依赖&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 安装依赖&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); justify-content: space-between; display: flex; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; overflow: auto !important; position: relative !important;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;npm&amp;nbsp;install&lt;/pre&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;npm install&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;开发模式运行&lt;/h3&gt;&lt;a id=&quot;user-content-开发模式运行&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 开发模式运行&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E5%BC%80%E5%8F%91%E6%A8%A1%E5%BC%8F%E8%BF%90%E8%A1%8C&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); justify-content: space-between; display: flex; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; overflow: auto !important; position: relative !important;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;npm&amp;nbsp;run&amp;nbsp;tauri:dev&lt;/pre&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;npm run tauri:dev&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;检查&lt;/h3&gt;&lt;a id=&quot;user-content-检查&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 检查&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E6%A3%80%E6%9F%A5&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); justify-content: space-between; display: flex; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; overflow: auto !important; position: relative !important;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;npm&amp;nbsp;run&amp;nbsp;typecheck
npm&amp;nbsp;run&amp;nbsp;test&lt;/pre&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;npm run typecheck
npm run test&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h3 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-size: 1.25em; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25;&quot;&gt;构建 Windows 安装包&lt;/h3&gt;&lt;a id=&quot;user-content-构建-windows-安装包&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 构建 Windows 安装包&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E6%9E%84%E5%BB%BA-windows-%E5%AE%89%E8%A3%85%E5%8C%85&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 12.5px; left: -28px; transform: translateY(-50%);&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); justify-content: space-between; display: flex; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; overflow: auto !important; position: relative !important;&quot;&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: var(--fontStack-monospace,ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; tab-size: var(--tab-size-preference); overflow-wrap: normal; padding: var(--base-size-16); color: var(--fgColor-default,var(--color-fg-default)); background-color: var(--bgColor-muted,var(--color-canvas-subtle)); border-radius: 6px; line-height: 1.45; overflow: auto; word-break: normal; min-height: 52px;&quot;&gt;npm&amp;nbsp;run&amp;nbsp;tauri:build&lt;/pre&gt;&lt;clipboard-copy aria-label=&quot;Copy code to clipboard&quot; class=&quot;ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center&quot; data-copy-feedback=&quot;Copied!&quot; data-tooltip-direction=&quot;w&quot; value=&quot;npm run tauri:build&quot; tabindex=&quot;0&quot; role=&quot;button&quot; style=&quot;box-sizing: border-box; font-size: 14px; font-weight: var(--base-text-weight-medium,500); text-wrap: nowrap; vertical-align: middle; cursor: pointer; user-select: none; appearance: none; border: 0px; border-radius: 6px; line-height: 20px; position: relative; color: var(--fgColor-accent,var(--color-accent-fg)); box-shadow: none; transition: color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, background-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, box-shadow 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s, border-color 80ms cubic-bezier(0.33, 1, 0.68, 1) 0s; width: var(--control-small-size,28px); height: var(--control-small-size,28px); margin: var(--base-size-8,8px) !important; padding: 0px !important; display: flex !important; justify-content: center !important; align-items: center !important;&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; data-view-component=&quot;true&quot; class=&quot;octicon octicon-copy js-clipboard-copy-icon&quot;&gt;&lt;path d=&quot;M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/clipboard-copy&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;该命令会发布 .NET 宿主，并生成一个 NSIS 安装包，其中打包了渲染层、Rust 外壳与驱动。&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;仓库&lt;/h2&gt;&lt;a id=&quot;user-content-仓库&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 仓库&quot; href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display/blob/main/README.zh-CN.md#%E4%BB%93%E5%BA%93&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 1; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul dir=&quot;auto&quot; style=&quot;box-sizing: border-box; padding-left: 2em; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;GitHub：&lt;a href=&quot;https://github.com/KtzeAbyss/Easy-Virtual-Display&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;https://github.com/KtzeAbyss/Easy-Virtual-Display&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;https://github.com/lingme/Zonx-Virtual-Display&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 15:39:07 +0800</pubDate></item><item><title>Sunshine+Moonlight+ParsecVDisplay实现Android平板成为Windows电脑的副屏</title><link>https://kinber.cn/post/6686.html</link><description>&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255); margin-top: 0px !important;&quot;&gt;&lt;h1 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-right: 0px; margin-bottom: var(--base-size-16); margin-left: 0px; font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em; margin-top: 0px !important;&quot;&gt;Applications_of_Sunshine_and_Moonlight&lt;/h1&gt;&lt;a id=&quot;user-content-applications_of_sunshine_and_moonlight&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: Applications_of_Sunshine_and_Moonlight&quot; href=&quot;https://github.com/AASWEETBOY/Applications_of_Sunshine_and_Moonlight#applications_of_sunshine_and_moonlight&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 25.2px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;Sunshine+Moonlight+ParsecVDisplay实现&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;Android平板&lt;/span&gt;成为&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;Windows电脑&lt;/span&gt;的副屏（&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;平板与电脑在局域网内&lt;/span&gt;）&lt;/p&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600);&quot;&gt;本教程写于2025/11/13(Sunshine：Version 2025.924.154138、Moonlight：v12.1、ParsecVDisplay：v0.45)&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;参考教程&lt;/h2&gt;&lt;a id=&quot;user-content-参考教程&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 参考教程&quot; href=&quot;https://github.com/AASWEETBOY/Applications_of_Sunshine_and_Moonlight#%E5%8F%82%E8%80%83%E6%95%99%E7%A8%8B&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;p dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: var(--base-size-16); color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a href=&quot;https://blog.csdn.net/wwiyou/article/details/147354084&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;sunshine+moonlight+ParsecVDisplay实现平板成为电脑的第二屏幕&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;第一步：下载并安装相关软件&lt;/h2&gt;&lt;a id=&quot;user-content-第一步下载并安装相关软件&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 第一步：下载并安装相关软件&quot; href=&quot;https://github.com/AASWEETBOY/Applications_of_Sunshine_and_Moonlight#%E7%AC%AC%E4%B8%80%E6%AD%A5%E4%B8%8B%E8%BD%BD%E5%B9%B6%E5%AE%89%E8%A3%85%E7%9B%B8%E5%85%B3%E8%BD%AF%E4%BB%B6&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ol dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); padding-left: 2em; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/LizardByte/Sunshine/releases&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;SUNSHINE串流工具服务端&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/moonlight-stream/moonlight-android/releases&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;MOONLIGHT串流工具客户端&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/nomi-san/parsec-vdd/releases&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;ParsecVDisplay虚拟显示器驱动&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; position: relative; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;h2 tabindex=&quot;-1&quot; class=&quot;heading-element&quot; dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-top: var(--base-size-24); margin-bottom: var(--base-size-16); font-weight: var(--base-text-weight-semibold,600); line-height: 1.25; border-bottom: 1px solid var(--borderColor-muted,var(--color-border-muted)); padding-bottom: 0.3em;&quot;&gt;第二步：设置相关软件&lt;/h2&gt;&lt;a id=&quot;user-content-第二步设置相关软件&quot; class=&quot;anchor&quot; aria-label=&quot;Permalink: 第二步：设置相关软件&quot; href=&quot;https://github.com/AASWEETBOY/Applications_of_Sunshine_and_Moonlight#%E7%AC%AC%E4%BA%8C%E6%AD%A5%E8%AE%BE%E7%BD%AE%E7%9B%B8%E5%85%B3%E8%BD%AF%E4%BB%B6&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; float: left; padding-right: var(--base-size-4); margin: auto; line-height: 1; text-underline-offset: 0.2rem; border-radius: var(--borderRadius-medium); opacity: 0; justify-content: center; align-items: center; width: 28px; height: 28px; display: flex; position: absolute; top: 19px; left: -28px; transform: translateY(calc(-50% - 0.3rem));&quot;&gt;&lt;svg data-component=&quot;Octicon&quot; class=&quot;octicon octicon-link&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ol dir=&quot;auto&quot; style=&quot;box-sizing: border-box; margin-bottom: var(--base-size-16); padding-left: 2em; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;安装好Sunshine，鼠标双击主程序。初次打开，默认直接打开浏览器访问其web后台localhost地址（若不小心关闭了网站，请在托盘鼠标右键点击sunshine图标，再点击open sunshine也可进入sunshine网页端后台）。仅初次打开：需设置登陆密码，然后再输入自己设置的账户名与密码登录后台。以后打开，直接默认登陆后台。&lt;br style=&quot;box-sizing: border-box;&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153825178297790581328.png&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem;&quot;&gt;&lt;img width=&quot;425&quot; height=&quot;202&quot; title=&quot;在托盘鼠标右键点击sunshine图标，再点击open sunshine即可进入sunshine网页端后台&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153825178297790581328.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 202px; aspect-ratio: 425 / 202; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box;&quot;/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;2. 设置本地化语言，保存并应用（可选）&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153825178297790515649.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;936&quot; height=&quot;455&quot; title=&quot;设置本地化语言&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153825178297790515649.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 455px; aspect-ratio: 936 / 455; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;3. 请确保平板和电脑连接了同一WiFi（此WiFi必须没有AP隔离，所以本教程排除校园网用户），再打开Moonlight软件，此时检测到可连接的电脑设备。若没有，请点击加号，输入已安装sunshine软件的电脑的ip地址，试试是否能连接上。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153825178297790595313.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;639&quot; height=&quot;322&quot; title=&quot;手动加入要串流的电脑设备&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153825178297790595313.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 322px; aspect-ratio: 639 / 322; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;4. 连接上后，点击电脑设备，点击第一个desktop按钮。首次连接，输入连接的PIN码，即可连接成功。平板和电脑都显示电脑画面，并且平板也可以操作电脑。（到此步，完成基本的&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600); color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;复制屏幕&lt;/span&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;的效果，而&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600); color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;非副屏之效果&lt;/span&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;）&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153825178297790548951.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;651&quot; height=&quot;281&quot; title=&quot;点击Desktop按钮&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153825178297790548951.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 281px; aspect-ratio: 651 / 281; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;5. 打开ParsecVDisplay，设置特定分辨率——点击Custom Display Modes，根据平板的分辨率对应设置slot1的数值，再点击Apply，关闭重启程序&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153826178297790695959.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;967&quot; height=&quot;533&quot; title=&quot;设置特定的分辨率&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153826178297790695959.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 533px; aspect-ratio: 967 / 533; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;6. 接上一步，新建并设置对应的虚拟显示器，并记住其名称（图中示例为\\.\DISPLAY8）&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153826178297790672182.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;962&quot; height=&quot;527&quot; title=&quot;新建虚拟显示器&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153826178297790672182.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 527px; aspect-ratio: 962 / 527; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153827178297790786288.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;577&quot; height=&quot;506&quot; title=&quot;选择对应的分辨率与刷新率（以我的平板2560*1600@60Hz为例）&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153827178297790786288.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 506px; aspect-ratio: 577 / 506; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;7. 回到sunshine的后台，在图中位置（配置-Audio/Video-config.output_name_windows）把名称输入，并取消勾选“安装 Steam 音频驱动程序”与“流音频”两项（保证副屏的声音走电脑端，避免副屏播放视频无声），保存并应用。&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153828178297790887134.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;542&quot; height=&quot;813&quot; title=&quot;配置-Audio/Video的相关设置&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153828178297790887134.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 813px; aspect-ratio: 542 / 813; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;8. 打开&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600); color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;电脑的设置&lt;/span&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;，必须设置添加的虚拟显示器为主显示器，屏幕设置为扩展模式（设置为“扩展这些显示器”）&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153828178297790882833.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;857&quot; height=&quot;636&quot; title=&quot;电脑上需做的必要设置&quot; alt=&quot;image&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153828178297790882833.png&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 636px; aspect-ratio: 857 / 636; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;9. 打开Moonlight软件首页左侧栏中的设置，完成对视频分辨率的设置（设置为“本地”分辨率）、帧数（例如为“60帧”，与自己先前设置的刷新率一致）、码率（拉到最高即可）、帧速调节（设置为“优先最低延迟”即可）&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153828178297790815292.jpg&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); color: var(--fgColor-accent,var(--color-accent-fg)); text-decoration-line: underline; text-underline-offset: 0.2rem; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap;&quot;&gt;&lt;img width=&quot;2000&quot; height=&quot;1192&quot; title=&quot;设置客户端接收的分辨率为本地分辨率&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260702153828178297790815292.jpg&quot; class=&quot;js-gh-image-fallback&quot; style=&quot;box-sizing: content-box; border-style: none; height: auto; max-height: 1192px; aspect-ratio: 2000 / 1192; background-color: var(--bgColor-muted); border-radius: 6px;&quot;/&gt;&lt;/a&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;10. 完成以上步骤，再点击Moonlight软件串流列表中的可连接的电脑设备，点击Desktop，即可&lt;/span&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: var(--base-text-weight-semibold,600); color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;使平板变为副屏&lt;/span&gt;&lt;span style=&quot;color: #1F2328; font-family: &amp;quot;Mona Sans VF&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/AASWEETBOY/Applications_of_Sunshine_and_Moonlight&quot; _src=&quot;https://github.com/AASWEETBOY/Applications_of_Sunshine_and_Moonlight&quot;&gt;https://github.com/AASWEETBOY/Applications_of_Sunshine_and_Moonlight&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 15:37:58 +0800</pubDate></item><item><title>WL-007：华为 S5700/S5735S 交换机 SSH 配置与 V600R024 实战避坑指南——解决 Permission denied 无法登录，全网通用解决指南</title><link>https://kinber.cn/post/6684.html</link><description>&lt;p style=&quot;visibility: visible&quot;&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px;font-weight: bold;visibility: visible&quot;&gt;还在用 Telnet 吗？信息安全不允许！&lt;/span&gt;&lt;/span&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px;font-weight: bold;visibility: visible&quot;&gt;用SSH 连不上？一文读懂加密算法协商原理，从此打通华为/华三/Cisco，&lt;/span&gt;&lt;/span&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px;font-weight: bold;visibility: visible&quot;&gt;SSH 密钥交换（Kex）原理详解与全网通用解决指南&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote style=&quot;visibility: visible&quot;&gt;&lt;p style=&quot;visibility: visible&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;visibility: visible&quot;&gt;&lt;strong style=&quot;visibility: visible&quot;&gt;适用型号&lt;/strong&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible&quot;&gt;：S5735S-L24P4S-A3（V600R024C10SPC500）&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;visibility: visible&quot;&gt;&lt;strong style=&quot;visibility: visible&quot;&gt;核心价值&lt;/strong&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible&quot;&gt;：解决&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;visibility: visible&quot;&gt;Permission denied&lt;/code&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible&quot;&gt;和&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;visibility: visible&quot;&gt;Connection refused&lt;/code&gt;&lt;span leaf=&quot;&quot; style=&quot;visibility: visible&quot;&gt;顽疾。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5);visibility: visible&quot;/&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center;visibility: visible&quot; nodeleaf=&quot;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100004741&quot; data-ratio=&quot;0.5710267229254571&quot; data-s=&quot;300,640&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110844_10081.png&quot; data-type=&quot;png&quot; data-w=&quot;711&quot; type=&quot;block&quot; data-original-style=&quot;null&quot; data-index=&quot;3&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110844_10081.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782867331836&quot; data-report-img-idx=&quot;1&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center;visibility: visible&quot; nodeleaf=&quot;&quot;&gt;&lt;img class=&quot;rich_pages wxw-img&quot; data-aistatus=&quot;1&quot; data-imgfileid=&quot;100004715&quot; data-ratio=&quot;0.17777777777777778&quot; data-s=&quot;300,640&quot; data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110846_89345.png&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-original-style=&quot;null&quot; data-index=&quot;4&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110846_89345.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782867331837&quot; data-report-img-idx=&quot;0&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px&quot;&gt;一、前言：为什么你按教程配也连不上？&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;line-height: 1.6em&quot;&gt;&lt;span leaf=&quot;&quot;&gt;很多朋友反馈：照着教程敲命令，SSH 就是连不上，报错&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 1.6em&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Authentication failPermission denied, please try again. &amp;nbsp; Authentication failed.或 Authentication failAuthentication failAuthentication fail &amp;nbsp; &amp;nbsp;Connection closing...Socket close.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;&lt;span leaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110847_86944.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.31840796019900497&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;402&quot; type=&quot;block&quot; data-imgfileid=&quot;100004744&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;5&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110847_86944.png&quot; _width=&quot;402px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 402px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154032&quot; data-report-img-idx=&quot;10&quot; data-fail=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110848_36100.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.5818639798488665&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;397&quot; type=&quot;block&quot; data-imgfileid=&quot;100004745&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;6&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110848_36100.png&quot; _width=&quot;397px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 397px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154032&quot; data-report-img-idx=&quot;9&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;根本原因&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：华为 V600R024 版本（YunShan OS）增强了安全性，新增了&lt;/span&gt;&lt;strong&gt;强制绑定源接口&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;和&lt;/span&gt;&lt;strong&gt;服务类型校验，管理员密码首次登录修改密码等，&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;老教程没提及，所以必败。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;本文基于&amp;nbsp;&lt;/span&gt;&lt;strong&gt;S5735S-L24P4S-A3&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;真机整理，专治各种 SSH 连不上。&lt;/span&gt;&lt;/p&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px&quot;&gt;二、核心原理：SSH 登录的“三层结构”&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;把 SSH 登录想象成&lt;/span&gt;&lt;strong&gt;进一栋大楼&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;，三层缺一不可：&lt;/span&gt;&lt;/p&gt;&lt;table width=&quot;528&quot;&gt;&lt;thead&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot; class=&quot;firstRow&quot;&gt;&lt;th data-colwidth=&quot;86&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;层级&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;th data-colwidth=&quot;128&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;比喻&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;th data-colwidth=&quot;199&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;华为配置&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;th data-colwidth=&quot;115&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;不配的后果&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;86&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;第一层：门卫&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;128&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;决定访客从哪进&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;199&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh server-source&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;115&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;找不到门（Refused）&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;86&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;第二层：大门&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;128&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;允许什么方式进&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;199&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;stelnet server enable&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;115&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;门是关着的&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;86&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;第三层：门禁&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;128&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;验证身份与权限&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;199&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;local-user&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;+&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh user&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;115&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;有门也进不去（Denied）&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;?&amp;nbsp;&lt;/span&gt;&lt;strong&gt;李工大白话&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;local-user&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;是&lt;/span&gt;&lt;strong&gt;户口本&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;（你是谁）；&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;ssh user&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;是&lt;/span&gt;&lt;strong&gt;通行证&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;（你能不能用 SSH）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;两者必须同时存在！&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;h2 style=&quot;font-variant-numeric: normal;font-variant-east-asian: normal;font-variant-alternates: normal;font-kerning: auto;font-optical-sizing: auto;font-feature-settings: normal;font-variation-settings: normal;font-variant-position: normal;font-stretch: normal;font-size: 22px;line-height: 32px;font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;margin: 32px 0px 16px;color: rgb(15, 17, 21);text-wrap: wrap;background-color: rgb(255, 255, 255)&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot;&gt;三、配置前的准备工作&lt;/span&gt;&lt;/h2&gt;&lt;h3 style=&quot;font-variant-numeric: normal;font-variant-east-asian: normal;font-variant-alternates: normal;font-kerning: auto;font-optical-sizing: auto;font-feature-settings: normal;font-variation-settings: normal;font-variant-position: normal;font-stretch: normal;font-size: 20px;line-height: 30px;font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;margin: 32px 0px 16px;color: rgb(15, 17, 21);text-wrap: wrap;background-color: rgb(255, 255, 255)&quot;&gt;&lt;span leaf=&quot;&quot;&gt;2.1 确认管理 IP&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;margin-top: 16px;margin-bottom: 16px;color: rgb(15, 17, 21);font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;font-size: 16px;text-wrap: wrap;background-color: rgb(255, 255, 255)&quot;&gt;&lt;span leaf=&quot;&quot;&gt;首先确认你的交换机管理 IP 是什么。本文示例中，管理 IP 配置在&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-weight: 600&quot;&gt;Vlanif99&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;上，地址为&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;font-variant-numeric: normal;font-variant-east-asian: normal;font-variant-alternates: normal;font-variant-position: normal;font-stretch: 100%;line-height: 22px;font-optical-sizing: auto;font-kerning: auto;font-feature-settings: normal;font-variation-settings: normal;font-family: Menlo, Monaco, Consolas, &amp;#39;Cascadia Mono&amp;#39;, &amp;#39;Ubuntu Mono&amp;#39;, &amp;#39;DejaVu Sans Mono&amp;#39;, &amp;#39;Liberation Mono&amp;#39;, &amp;#39;JetBrains Mono&amp;#39;, &amp;#39;Fira Code&amp;#39;, Cousine, &amp;#39;Roboto Mono&amp;#39;, &amp;#39;Courier New&amp;#39;, Courier, sans-serif, system-ui;background-color: rgb(235, 238, 242);border-radius: 6px;align-items: center;padding: 0px 5px;display: inline-flex;font-size: 0.875em !important&quot;&gt;&lt;span leaf=&quot;&quot;&gt;10.10.10.20/24&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;kotlin&quot;&gt;display&amp;nbsp;ip&amp;nbsp;interface&amp;nbsp;brief&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #0F1115;font-family: Menlo, Monaco, Consolas, &amp;#39;Cascadia Mono&amp;#39;, &amp;#39;Ubuntu Mono&amp;#39;, &amp;#39;DejaVu Sans Mono&amp;#39;, &amp;#39;Liberation Mono&amp;#39;, &amp;#39;JetBrains Mono&amp;#39;, &amp;#39;Fira Code&amp;#39;, Cousine, &amp;#39;Roboto Mono&amp;#39;, &amp;#39;Courier New&amp;#39;, Courier, sans-serif, system-ui;margin-left: 8px;font-size: 12px;line-height: 18px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;找到你的管理 VLAN 接口，确认 IP 地址已配置且状态为&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;font-variant-numeric: normal;font-variant-east-asian: normal;font-variant-alternates: normal;font-variant-position: normal;font-stretch: 100%;line-height: 22px;font-optical-sizing: auto;font-kerning: auto;font-feature-settings: normal;font-variation-settings: normal;font-family: Menlo, Monaco, Consolas, &amp;#39;Cascadia Mono&amp;#39;, &amp;#39;Ubuntu Mono&amp;#39;, &amp;#39;DejaVu Sans Mono&amp;#39;, &amp;#39;Liberation Mono&amp;#39;, &amp;#39;JetBrains Mono&amp;#39;, &amp;#39;Fira Code&amp;#39;, Cousine, &amp;#39;Roboto Mono&amp;#39;, &amp;#39;Courier New&amp;#39;, Courier, sans-serif, system-ui;background-color: rgb(235, 238, 242);border-radius: 6px;align-items: center;padding: 0px 5px;display: inline-flex;font-size: 0.875em !important&quot;&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110849_91177.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.545816733067729&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;502&quot; type=&quot;block&quot; data-imgfileid=&quot;100004718&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;7&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110849_91177.png&quot; _width=&quot;502px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 502px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154076&quot; data-report-img-idx=&quot;5&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;font-variant-numeric: normal;font-variant-east-asian: normal;font-variant-alternates: normal;font-kerning: auto;font-optical-sizing: auto;font-feature-settings: normal;font-variation-settings: normal;font-variant-position: normal;font-stretch: normal;font-size: 20px;line-height: 30px;font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;margin: 32px 0px 16px;color: rgb(15, 17, 21);text-wrap: wrap;background-color: rgb(255, 255, 255)&quot;&gt;&lt;span leaf=&quot;&quot;&gt;2.2 确认软件版本&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;css&quot;&gt;display&amp;nbsp;version&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre style=&quot;font-variant-numeric: normal;font-variant-east-asian: normal;font-variant-alternates: normal;font-kerning: auto;font-optical-sizing: auto;font-feature-settings: normal;font-variation-settings: normal;font-variant-position: normal;font-stretch: normal;font-size: 13px;line-height: 22px;font-family: Menlo, Monaco, Consolas, &amp;#39;Cascadia Mono&amp;#39;, &amp;#39;Ubuntu Mono&amp;#39;, &amp;#39;DejaVu Sans Mono&amp;#39;, &amp;#39;Liberation Mono&amp;#39;, &amp;#39;JetBrains Mono&amp;#39;, &amp;#39;Fira Code&amp;#39;, Cousine, &amp;#39;Roboto Mono&amp;#39;, &amp;#39;Courier New&amp;#39;, Courier, sans-serif, system-ui;overflow: auto;text-wrap: wrap;padding: 16px;margin-top: 0px !important;margin-bottom: 0px !important&quot;&gt;如果输出中包含&amp;nbsp;V600R023C10&amp;nbsp;或&amp;nbsp;V600R024C10，本文完全适用。&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110850_75766.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.5891783567134269&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;499&quot; type=&quot;block&quot; data-imgfileid=&quot;100004717&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;8&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110850_75766.png&quot; _width=&quot;499px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 499px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154093&quot; data-report-img-idx=&quot;8&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;font-variant-numeric: normal;font-variant-east-asian: normal;font-variant-alternates: normal;font-kerning: auto;font-optical-sizing: auto;font-feature-settings: normal;font-variation-settings: normal;font-variant-position: normal;font-stretch: normal;font-size: 20px;line-height: 30px;font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;margin: 32px 0px 16px;color: rgb(15, 17, 21);text-wrap: wrap;background-color: rgb(255, 255, 255)&quot;&gt;&lt;span leaf=&quot;&quot;&gt;2.3 准备工具&lt;/span&gt;&lt;/h3&gt;&lt;ul style=&quot;margin-top: 16px;margin-bottom: 16px;padding-left: 18px;color: rgb(15, 17, 21);font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;font-size: 16px;text-wrap: wrap;background-color: rgb(255, 255, 255)&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;margin-bottom: 0px;margin-top: 0px !important&quot;&gt;&lt;span style=&quot;font-weight: 600&quot;&gt;Console 线&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;：用于首次配置，这是最安全的方式&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-bottom: 0px;margin-top: 0px !important&quot;&gt;&lt;span style=&quot;font-weight: 600&quot;&gt;SSH 客户端&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;：Xshell、PuTTY、或者 Linux/Mac 自带的&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;box-sizing: border-box;font-variant-numeric: normal;font-variant-east-asian: normal;font-variant-alternates: normal;font-variant-position: normal;font-stretch: 100%;line-height: 22px;font-optical-sizing: auto;font-kerning: auto;font-feature-settings: normal;font-variation-settings: normal;font-family: Menlo, Monaco, Consolas, &amp;#39;Cascadia Mono&amp;#39;, &amp;#39;Ubuntu Mono&amp;#39;, &amp;#39;DejaVu Sans Mono&amp;#39;, &amp;#39;Liberation Mono&amp;#39;, &amp;#39;JetBrains Mono&amp;#39;, &amp;#39;Fira Code&amp;#39;, Cousine, &amp;#39;Roboto Mono&amp;#39;, &amp;#39;Courier New&amp;#39;, Courier, sans-serif, system-ui;background-color: rgb(235, 238, 242);border-radius: 6px;align-items: center;padding: 0px 5px;display: inline-flex;font-size: 0.875em !important&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;命令&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-bottom: 0px;margin-top: 0px !important&quot;&gt;&lt;span style=&quot;font-weight: 600&quot;&gt;网线&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;：将电脑连接到交换机所在网络&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style=&quot;border-left-width: 1.11111px;border-left-color: rgb(173, 178, 184);margin-top: 16px;margin-bottom: 0px;padding-left: 14px;color: rgb(15, 17, 21);font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;font-size: 16px;text-wrap: wrap;background-color: rgb(255, 255, 255)&quot;&gt;&lt;p style=&quot;margin-top: 0px !important;margin-bottom: 0px !important&quot;&gt;&lt;span leaf=&quot;&quot;&gt;⚠️&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-weight: 600&quot;&gt;重要提醒&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;：配置 SSH 之前，请确保你手边有一根 Console 线。如果 SSH 配置失败，Console 是唯一的“救生通道”。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110851_18023.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.34584450402144773&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;373&quot; type=&quot;block&quot; data-imgfileid=&quot;100004719&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;9&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110851_18023.png&quot; _width=&quot;373px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 373px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154093&quot; data-report-img-idx=&quot;6&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110852_17638.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.6846011131725418&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;539&quot; type=&quot;block&quot; data-imgfileid=&quot;100004720&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;10&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110852_17638.png&quot; _width=&quot;539px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 539px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154109&quot; data-report-img-idx=&quot;4&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px&quot;&gt;四、详细配置步骤（复制即用）&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;假设管理 IP 在&amp;nbsp;&lt;/span&gt;&lt;code&gt;Vlanif99&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;（&lt;/span&gt;&lt;code&gt;10.10.10.20&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;），用户名为&amp;nbsp;&lt;/span&gt;&lt;code&gt;sshadmin&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;sql&quot;&gt;system-view&lt;/pre&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;1. 生成本地密钥（回车默认3072位，SSH加密的基础）&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;sql&quot;&gt;rsa&amp;nbsp;local-key-pair&amp;nbsp;create&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110853_57102.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.40310077519379844&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;387&quot; type=&quot;block&quot; data-imgfileid=&quot;100004721&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;11&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110853_57102.png&quot; _width=&quot;387px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 387px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154125&quot; data-report-img-idx=&quot;7&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;2. 开 SSH 服务&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;bash&quot;&gt;stelnet&amp;nbsp;server&amp;nbsp;enable&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110854_15735.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.253125&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;320&quot; type=&quot;block&quot; data-imgfileid=&quot;100004722&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;12&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110854_15735.png&quot; _width=&quot;320px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 320px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154125&quot; data-report-img-idx=&quot;2&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;3.&amp;nbsp;&lt;/span&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px;font-weight: bold&quot;&gt;【关键】&lt;/span&gt;&lt;/span&gt;&lt;code&gt;&lt;span leaf=&quot;&quot; data-pm-slice=&quot;1 1 [&amp;quot;para&amp;quot;,{&amp;quot;tagName&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;attributes&amp;quot;:{},&amp;quot;namespaceURI&amp;quot;:&amp;quot;&amp;quot;},&amp;quot;node&amp;quot;,{&amp;quot;tagName&amp;quot;:&amp;quot;code&amp;quot;,&amp;quot;attributes&amp;quot;:{&amp;quot;class&amp;quot;:&amp;quot;hyc-common-markdown__code__inline&amp;quot;},&amp;quot;namespaceURI&amp;quot;:&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;}]&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px;font-weight: bold&quot;&gt;⚠️ 指定 SSH 监听接口（最容易遗漏的一步）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px;font-weight: bold&quot;&gt;（V600R024 强制要求）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 16px;margin-bottom: 16px;color: rgb(15, 17, 21);font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;font-size: 16px;text-wrap: wrap;background-color: rgb(255, 255, 255)&quot;&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;V600R024 版本出于安全考虑，&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: 600&quot;&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;默认不响应任何接口的 SSH 请求&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;。你必须要明确告诉它：“从哪个接口接收 SSH 连接”。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 16px;margin-bottom: 16px;color: rgb(15, 17, 21);font-family: quote-cjk-patch, Inter, system-ui, -apple-system, BlinkMacSystemFont, &amp;#39;Segoe UI&amp;#39;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;#39;Open Sans&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, sans-serif;font-size: 16px;text-wrap: wrap;background-color: rgb(255, 255, 255)&quot;&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;如果你使用 Vlanif99 作为管理接口：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;css&quot;&gt;ssh&amp;nbsp;server-source&amp;nbsp;-i&amp;nbsp;Vlanif99&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110855_90967.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.20059880239520958&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;334&quot; type=&quot;block&quot; data-imgfileid=&quot;100004723&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;13&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110855_90967.png&quot; _width=&quot;334px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 334px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154141&quot; data-report-img-idx=&quot;3&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #0F1115;font-family: Menlo, Monaco, Consolas, &amp;#39;Cascadia Mono&amp;#39;, &amp;#39;Ubuntu Mono&amp;#39;, &amp;#39;DejaVu Sans Mono&amp;#39;, &amp;#39;Liberation Mono&amp;#39;, &amp;#39;JetBrains Mono&amp;#39;, &amp;#39;Fira Code&amp;#39;, Cousine, &amp;#39;Roboto Mono&amp;#39;, &amp;#39;Courier New&amp;#39;, Courier, sans-serif, system-ui;margin-left: 8px;font-size: 12px;line-height: 18px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;如果你想让 SSH 在所有接口上都响应（&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: 600&quot;&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;不推荐用于生产环境&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 17px&quot;&gt;）：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;css&quot;&gt;ssh&amp;nbsp;server-source&amp;nbsp;all-interface&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;⚠️ 警告：这一步如果不配置，无论其他配置多么完美，SSH 都连不上！这是 V600R024 版本与旧版本最大的区别。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section&gt;&lt;code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;4. 配置 VTY 通道允许 SSH 接入（登录通道）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;apache&quot;&gt;user-interface&amp;nbsp;vty&amp;nbsp;0&amp;nbsp;4&amp;nbsp;
authentication-mode&amp;nbsp;aaa&amp;nbsp;
protocol&amp;nbsp;inbound&amp;nbsp;ssh&amp;nbsp;&amp;nbsp;&amp;nbsp;
#&amp;nbsp;只许&amp;nbsp;SSH，禁&amp;nbsp;Telnet&amp;nbsp;
quit&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110856_81952.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.3236151603498542&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;343&quot; type=&quot;block&quot; data-imgfileid=&quot;100004724&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;14&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110856_81952.png&quot; _width=&quot;343px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 343px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154161&quot; data-report-img-idx=&quot;13&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;5. 建户口本（AAA 本地用户）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;sql&quot;&gt;aaa&amp;nbsp;
local-user&amp;nbsp;sshadmin&amp;nbsp;password&amp;nbsp;irreversible-cipher&amp;nbsp;Admin@2024&amp;nbsp;
local-user&amp;nbsp;sshadmin&amp;nbsp;service-type&amp;nbsp;ssh&amp;nbsp;&amp;nbsp;&amp;nbsp;
#&amp;nbsp;【关键】绑定&amp;nbsp;SSH&amp;nbsp;权限&amp;nbsp;
local-user&amp;nbsp;sshadmin&amp;nbsp;privilege&amp;nbsp;level&amp;nbsp;3&amp;nbsp;&amp;nbsp;
#&amp;nbsp;3&amp;nbsp;是最高权限&amp;nbsp;
local-user&amp;nbsp;sshadmin&amp;nbsp;password-force-change&amp;nbsp;disable&amp;nbsp;
#&amp;nbsp;关首次改密&amp;nbsp;quit&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110856_59462.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.1259259259259259&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100004725&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;15&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110856_59462.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154161&quot; data-report-img-idx=&quot;12&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;6. 【关键】办通行证（SSH 用户）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;typescript&quot;&gt;ssh&amp;nbsp;user&amp;nbsp;sshadmin&amp;nbsp;authentication-type&amp;nbsp;password
ssh&amp;nbsp;user&amp;nbsp;sshadmin&amp;nbsp;service-type&amp;nbsp;shh
quit&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110858_22343.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.18344519015659955&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;447&quot; type=&quot;block&quot; data-imgfileid=&quot;100004726&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;16&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110858_22343.png&quot; _width=&quot;447px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 447px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154176&quot; data-report-img-idx=&quot;11&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;7. 配置算法兼容性（不一定你能遇到，遇到了就说明你是一个念旧，重感情的人，不接受反驳！?）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;section&gt;&lt;code&gt;&lt;span style=&quot;color: #222222;font-family: &amp;#39;Microsoft YaHei&amp;#39;, &amp;#39;Segoe UI&amp;#39;, system-ui, Roboto, &amp;#39;Noto Sans SC&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, Arial, sans-serif;font-size: 16px;background-color: #FFFFFF;float: none;display: inline !important&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span style=&quot;float: none;display: inline !important&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot;&gt;简单来说，&lt;/span&gt;&lt;/span&gt;&lt;span leaf=&quot;&quot;&gt;客户端和刚才配置好的华为设备在“加密语言”上没对上号。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;粉丝错提示：&lt;/span&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110859_50297.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.5618408437200384&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1043&quot; type=&quot;block&quot; data-imgfileid=&quot;100004749&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;17&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110859_50297.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154176&quot; data-report-img-idx=&quot;20&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;code&gt;&lt;span style=&quot;color: #222222;font-family: &amp;#39;Microsoft YaHei&amp;#39;, &amp;#39;Segoe UI&amp;#39;, system-ui, Roboto, &amp;#39;Noto Sans SC&amp;#39;, &amp;#39;Helvetica Neue&amp;#39;, Arial, sans-serif;font-size: 16px;background-color: #FFFFFF;float: none;display: inline !important&quot; data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span leaf=&quot;&quot;&gt;我用CRT老版本测试提示：&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110901_48057.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.6904109589041096&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;365&quot; type=&quot;block&quot; data-imgfileid=&quot;100004750&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;18&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110901_48057.png&quot; _width=&quot;365px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 365px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154193&quot; data-report-img-idx=&quot;17&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110902_34687.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.22357723577235772&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;984&quot; type=&quot;block&quot; data-imgfileid=&quot;100004746&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;19&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110902_34687.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154193&quot; data-report-img-idx=&quot;14&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;查看老CRT客户的支持的算法：&lt;/span&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110904_29006.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.9563794983642312&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;917&quot; type=&quot;block&quot; data-imgfileid=&quot;100004747&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;20&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110904_29006.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154193&quot; data-report-img-idx=&quot;15&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;华为交换机支持的算法：&lt;/span&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110906_50270.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.4726962457337884&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;586&quot; type=&quot;block&quot; data-imgfileid=&quot;100004748&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;21&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110906_50270.png&quot; _width=&quot;586px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 586px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154209&quot; data-report-img-idx=&quot;16&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;如果遇到也不慌：&lt;/span&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;方案一：推荐升级新版本（只要有对应算法支持即可）&lt;/span&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;方案二：更换其他支持的版本我开始测试的是Xshell8.0版本正常（本文开始就是用的Xshell8.0），能用的原因算法都有。&lt;/span&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110907_34532.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.7838983050847458&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;944&quot; type=&quot;block&quot; data-imgfileid=&quot;100004752&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;22&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110907_34532.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154225&quot; data-report-img-idx=&quot;23&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;方案三：华为设备开启兼容模式（临时救急）&lt;/span&gt;&lt;/section&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;cs&quot;&gt;[Huawei-PoE]ssh&amp;nbsp;server&amp;nbsp;key-exchange&amp;nbsp;dh_group14_sha1&amp;nbsp;Warning:&amp;nbsp;Insecure&amp;nbsp;key&amp;nbsp;exchange&amp;nbsp;algorithm&amp;nbsp;(dh_group14_sha1)&amp;nbsp;is&amp;nbsp;enabled.&amp;nbsp;Disabling&amp;nbsp;it&amp;nbsp;is&amp;nbsp;recommended.[Huawei-PoE]&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;添加后在测试就可以&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110908_31946.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.14907407407407408&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100004751&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;23&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110908_31946.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154241&quot; data-report-img-idx=&quot;18&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;h3&gt;&lt;span leaf=&quot;&quot;&gt;? 扩展阅读：为什么老版 SecureCRT 连不上新设备？（SSH 的“暗号”之争）&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;很多运维朋友会遇到一个诡异的现象：明明账号密码都对，Xshell 秒连，但老版本的 &lt;span class=&quot;&quot; link-id=&quot;link-1782867331592-0.0031562670335940624&quot;&gt;SecureCRT&lt;/span&gt; 却死活连不上，甚至直接报错。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;其实，这是一场关于“加密暗号”的博弈。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110909_34743.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.4739084132055378&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;939&quot; type=&quot;block&quot; data-imgfileid=&quot;100004753&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;24&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110909_34743.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154259&quot; data-report-img-idx=&quot;19&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h4&gt;&lt;span leaf=&quot;&quot;&gt;1. Server 与 Client：谁在跟谁对暗号？&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;在 SSH 连接里，两个角色分工明确：&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;ssh server（门卫大爷）&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：管“别人怎么连进来”。当你的电脑（Xshell/CRT）去连交换机时，交换机就是 Server。门卫大爷手里有一张&lt;/span&gt;&lt;strong&gt;“允许通行的暗号清单”&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;，只有对上清单里的暗号，才放你进去。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;ssh client（外交官）&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：管“这台设备怎么连出去”。当你在交换机上敲命令去连别的设备时，这台交换机才变成 Client。外交官手里也有一张&lt;/span&gt;&lt;strong&gt;“我习惯用的暗号清单”&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;划重点&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：你用电脑连交换机，只看&amp;nbsp;&lt;/span&gt;&lt;strong&gt;ssh server&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;的配置；&lt;/span&gt;&lt;strong&gt;ssh client&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;&amp;nbsp;的配置根本不影响你连入设备。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;&lt;span leaf=&quot;&quot;&gt;2. 为什么 Xshell 行，老版 CRT 不行？&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;这就好比两代人聊天：&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Xshell 是“年轻人”&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：它精通最新的加密语言（如&amp;nbsp;&lt;/span&gt;&lt;code&gt;curve25519&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;、&lt;/span&gt;&lt;code&gt;group16&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;）。它去敲交换机的门说：“我们用最新的 SHA256 暗号聊吧？” 交换机一看清单，自己也支持，于是握手成功。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;老版 SecureCRT 是“老年人”&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：它的知识库停留在十年前，只懂老旧的加密语言（如&amp;nbsp;&lt;/span&gt;&lt;code&gt;dh_group14_sha1&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;）。它去敲门说：“我们用&amp;nbsp;&lt;/span&gt;&lt;code&gt;group14&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;聊吧？” 交换机（默认开启了高安全标准）一听：“不行，这暗号太老了，有安全风险，我不认识！” 于是直接拒之门外。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;&lt;span leaf=&quot;&quot;&gt;3. 如何解决？让门卫大爷“向下兼容”&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;既然老版 CRT 学不会新暗号，我们只好给交换机的“门卫大爷”（ssh server）的清单里，加上老暗号。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;在华为设备命令行输入：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;sql&quot;&gt;system-view
ssh&amp;nbsp;server&amp;nbsp;key-exchange&amp;nbsp;dh_group14_sha1&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;这条命令的意思是：&lt;/span&gt;&lt;strong&gt;&lt;span leaf=&quot;&quot;&gt;“如果有老古董客户端想用&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span leaf=&quot;&quot;&gt;group14&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;连我，虽然不太安全，但也放行吧。”&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;配置好之后，老版 SecureCRT 再去敲门，双方终于“对上暗号”了，连接自然成功！&lt;/span&gt;&lt;/p&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;p&gt;&lt;strong&gt;? 运维小贴士（安全建议）：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;虽然“向下兼容”能解决眼前的燃眉之急，但&amp;nbsp;&lt;/span&gt;&lt;code&gt;dh_group14_sha1&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;确实存在安全风险（易受 Logjam 攻击）。如果条件允许，&lt;/span&gt;&lt;strong&gt;强烈建议将 SecureCRT 升级到 8.0 以上版本&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;，或者直接换用免费且强大的&amp;nbsp;&lt;/span&gt;&lt;strong&gt;MobaXterm&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;，从根源上解决问题！&lt;/span&gt;&lt;/p&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;h3&gt;&lt;span leaf=&quot;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section&gt;&lt;code&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;8. 保存（别忘记保存，没有保存重启这些配置全没有了）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/section&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;&quot;&gt;save&lt;/pre&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110910_65789.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.2049586776859504&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;605&quot; type=&quot;block&quot; data-imgfileid=&quot;100004727&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;25&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110910_65789.png&quot; _width=&quot;605px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 605px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154344&quot; data-report-img-idx=&quot;22&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;⚠️ 密码复杂度：V600R024 强制要求大小写+数字+特殊字符（如 Admin@2024）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;⚠️ 用户名长度：本地用户名必须 ≥ 6 位，admin不可用，请用 sshadmin。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px&quot;&gt;五、验证配置（排错必看）&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span leaf=&quot;&quot;&gt;1. 看 SSH 服务状态&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;css&quot;&gt;display&amp;nbsp;ssh&amp;nbsp;server&amp;nbsp;status&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;重点看&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：&lt;/span&gt;&lt;code&gt;STELNET IPv4 server : Enable&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110911_67389.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.9405034324942791&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;437&quot; type=&quot;block&quot; data-imgfileid=&quot;100004728&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;26&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110911_67389.png&quot; _width=&quot;437px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 437px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154344&quot; data-report-img-idx=&quot;21&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3&gt;&lt;span leaf=&quot;&quot;&gt;2. 看户口本（AuthMask 必须为 S）&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;sql&quot;&gt;display&amp;nbsp;local-user&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;table width=&quot;355&quot;&gt;&lt;thead&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot; class=&quot;firstRow&quot;&gt;&lt;th data-colwidth=&quot;125&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;AuthMask&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;th data-colwidth=&quot;123&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;含义&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;th data-colwidth=&quot;107&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;能否登录&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;125&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;S&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;123&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;已绑定 SSH&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;107&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;✅ 能&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;125&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;-&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;123&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;未绑定服务&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;107&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;❌ 不能&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110912_83409.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.3009009009009009&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;555&quot; type=&quot;block&quot; data-imgfileid=&quot;100004729&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;27&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110912_83409.png&quot; _width=&quot;555px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 555px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154394&quot; data-report-img-idx=&quot;24&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3&gt;&lt;span leaf=&quot;&quot;&gt;3. 看通行证&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;css&quot;&gt;display&amp;nbsp;ssh&amp;nbsp;user-information&amp;nbsp;sshadmin&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;重点看&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：&lt;/span&gt;&lt;code&gt;Service type : stelnet&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110913_58860.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.44471153846153844&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;416&quot; type=&quot;block&quot; data-imgfileid=&quot;100004730&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;28&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110913_58860.png&quot; _width=&quot;416px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 416px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154558&quot; data-report-img-idx=&quot;25&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;4.登录测试（成功）：&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110914_49354.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;1.0818363273453093&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;501&quot; type=&quot;block&quot; data-imgfileid=&quot;100004733&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;29&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110914_49354.png&quot; _width=&quot;501px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 501px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154593&quot; data-report-img-idx=&quot;26&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110915_82381.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.18703703703703703&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;1080&quot; type=&quot;block&quot; data-imgfileid=&quot;100004732&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;30&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110915_82381.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154642&quot; data-report-img-idx=&quot;27&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px&quot;&gt;六、常见问题排雷（速查表）&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot; class=&quot;firstRow&quot;&gt;&lt;th data-colwidth=&quot;116&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;报错现象&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;th data-colwidth=&quot;141&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;核心原因&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;th style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;急救命令&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;116&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Connection refused&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;141&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;没配&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh server-source&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh server-source -i Vlanif99&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;116&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Permission denied&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;141&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;户口本缺&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;service-type ssh&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;local-user sshadmin service-type ssh&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;116&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;Permission denied&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;141&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;没办通行证&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh user sshadmin service-type stelnet&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;116&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;连上秒断&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;141&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;用户名长度不够&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;改用 ≥6 位用户名&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;116&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;提示改密码&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;141&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;首次登录策略&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;local-user ... password-force-change disable&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;116&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;突然连不上&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td data-colwidth=&quot;141&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;IP 被阻断&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh server ip-block disable&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span leaf=&quot;&quot;&gt;排查顺序（黄金流程）&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;section&gt;&lt;p&gt;&lt;strong&gt;1. Ping&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：网络通不通？&lt;/span&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110916_91196.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.45131086142322097&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;534&quot; type=&quot;block&quot; data-imgfileid=&quot;100004735&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;31&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110916_91196.png&quot; _width=&quot;534px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 534px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154676&quot; data-report-img-idx=&quot;28&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;p&gt;&lt;strong&gt;2. Source&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：&lt;/span&gt;&lt;code&gt;display current | include ssh server-source&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110917_63023.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.2251655629139073&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;453&quot; type=&quot;block&quot; data-imgfileid=&quot;100004734&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;32&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110917_63023.png&quot; _width=&quot;453px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 453px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154958&quot; data-report-img-idx=&quot;29&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;p&gt;&lt;strong&gt;3. AuthMask&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：&lt;/span&gt;&lt;code&gt;display local-user&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;看是不是&amp;nbsp;&lt;/span&gt;&lt;code&gt;S&lt;/code&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110918_25723.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.27906976744186046&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;645&quot; type=&quot;block&quot; data-imgfileid=&quot;100004736&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;33&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110918_25723.png&quot; _width=&quot;645px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 645px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154958&quot; data-report-img-idx=&quot;30&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;p&gt;&lt;strong&gt;4. Pass&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;：&lt;/span&gt;&lt;code&gt;display ssh user-information&lt;/code&gt;&lt;/p&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110919_13070.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.46958637469586373&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;411&quot; type=&quot;block&quot; data-imgfileid=&quot;100004737&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;34&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110919_13070.png&quot; _width=&quot;411px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 411px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875154992&quot; data-report-img-idx=&quot;31&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;p&gt;&lt;code&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;5. IP被阻断&amp;nbsp;&lt;/span&gt;：display ssh server ip-block list&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;section style=&quot;text-align: center&quot; nodeleaf=&quot;&quot;&gt;&lt;img data-src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110920_78177.png&quot; class=&quot;rich_pages wxw-img&quot; data-ratio=&quot;0.16878612716763006&quot; data-s=&quot;300,640&quot; data-type=&quot;png&quot; data-w=&quot;865&quot; type=&quot;block&quot; data-imgfileid=&quot;100004731&quot; data-aistatus=&quot;1&quot; data-original-style=&quot;null&quot; data-index=&quot;35&quot; src=&quot;https://kinber.cn/zb_users/upload/2026/07/20260701110920_78177.png&quot; _width=&quot;677px&quot; style=&quot;height: auto !important;visibility: visible !important;width: 677px !important&quot; alt=&quot;图片&quot; data-before-load-time=&quot;1782875155324&quot; data-report-img-idx=&quot;32&quot; data-fail=&quot;0&quot;/&gt;&lt;/section&gt;&lt;section&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-weight: bold&quot;&gt;关闭后就没有阻塞了：（等时间完了自动取消，也可以关闭自行选择。）&lt;/span&gt;&lt;/span&gt;&lt;/section&gt;&lt;section class=&quot;code-snippet__fix code-snippet__js&quot;&gt;&lt;ul class=&quot;code-snippet__line-index code-snippet__js list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre data-lang=&quot;cs&quot;&gt;[Huawei-PoE]ssh&amp;nbsp;server&amp;nbsp;ip-block&amp;nbsp;disable&amp;nbsp;
Warning:&amp;nbsp;It&amp;nbsp;is&amp;nbsp;not&amp;nbsp;recommended&amp;nbsp;to&amp;nbsp;disable&amp;nbsp;IP&amp;nbsp;block&amp;nbsp;feature.&amp;nbsp;This&amp;nbsp;operation&amp;nbsp;may&amp;nbsp;result&amp;nbsp;in&amp;nbsp;system&amp;nbsp;becoming&amp;nbsp;vulnerable&amp;nbsp;to&amp;nbsp;security&amp;nbsp;threats.
[Huawei-PoE]display&amp;nbsp;ssh&amp;nbsp;server&amp;nbsp;ip-block&amp;nbsp;list&lt;/pre&gt;&lt;/section&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;h2&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px&quot;&gt;七、总结&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot; class=&quot;firstRow&quot;&gt;&lt;th data-colwidth=&quot;100&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;关键点&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;th style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;一句话记住&lt;/span&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;100&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;新版本特性&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;V600R024&amp;nbsp;&lt;/span&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;必须&lt;/strong&gt;&lt;span leaf=&quot;&quot;&gt;配&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh server-source&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;100&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;两个账户&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;local-user&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;（户口本）+&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;ssh user&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;（通行证）。&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;100&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;权限绑定&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;户口本里必须包含&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 2px 4px&quot;&gt;&lt;span leaf=&quot;&quot;&gt;service-type ssh&lt;/span&gt;&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;&lt;td data-colwidth=&quot;100&quot; style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;strong style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 0px&quot;&gt;密码策略&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;border-collapse: collapse;border-spacing: 0px;padding: 10.7143px 12.8571px 10.7143px 0px;border-color: rgb(224, 224, 224)&quot;&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;复杂度要高，用户名要长（≥6位）。&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr style=&quot;border-style: solid;border-right-width: 0px;border-bottom-width: 0px;border-left-width: 0px;border-color: rgba(0, 0, 0, 0.1);transform-origin: 0px 0px;transform: scale(1, 0.5)&quot;/&gt;&lt;p&gt;&lt;strong&gt;&lt;span leaf=&quot;&quot;&gt;&lt;span textstyle=&quot;&quot; style=&quot;font-size: 20px&quot;&gt;互动话题：&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;你们配华为 SSH，最常被哪一步卡住？&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;忘了&amp;nbsp;&lt;/span&gt;&lt;code&gt;ssh server-source&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;local-user&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;没绑服务&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;密码不符合复杂度&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;用户名&amp;nbsp;&lt;/span&gt;&lt;code&gt;admin&lt;/code&gt;&lt;span leaf=&quot;&quot;&gt;不能用&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span leaf=&quot;&quot;&gt;首次必须更改密码&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 11:05:46 +0800</pubDate></item></channel></rss>