<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>小森的数字空间</title>
  
  <subtitle>// 安全 · AI · 成长</subtitle>
  <link href="https://sanshisanfight.github.io/atom.xml" rel="self"/>
  
  <link href="https://sanshisanfight.github.io/"/>
  <updated>2026-05-17T05:18:54.627Z</updated>
  <id>https://sanshisanfight.github.io/</id>
  
  <author>
    <name>小森</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>SDH/OTN 业务承载技术问答手册</title>
    <link href="https://sanshisanfight.github.io/2026/05/17/SDH-OTN%E4%B8%9A%E5%8A%A1%E6%89%BF%E8%BD%BD%E6%8A%80%E6%9C%AF%E9%97%AE%E7%AD%94%E6%89%8B%E5%86%8C/"/>
    <id>https://sanshisanfight.github.io/2026/05/17/SDH-OTN%E4%B8%9A%E5%8A%A1%E6%89%BF%E8%BD%BD%E6%8A%80%E6%9C%AF%E9%97%AE%E7%AD%94%E6%89%8B%E5%86%8C/</id>
    <published>2026-05-17T05:00:00.000Z</published>
    <updated>2026-05-17T05:18:54.627Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>📘 <strong>适用场景</strong>：华为 OSN1800V + EGS4 板卡运维与学习</p><p>本文以问答形式系统梳理 SDH&#x2F;OTN 业务承载核心概念，从 EoS&#x2F;EoO 区别到虚级联、交叉连接，逐一拆解。</p></blockquote><hr><h2 id="Q1：EoS-业务和-EoO-业务有什么区别？"><a href="#Q1：EoS-业务和-EoO-业务有什么区别？" class="headerlink" title="Q1：EoS 业务和 EoO 业务有什么区别？"></a>Q1：EoS 业务和 EoO 业务有什么区别？</h2><table><thead><tr><th>对比项</th><th><strong>EoS（Ethernet over SDH）</strong></th><th><strong>EoO（Ethernet over OTN）</strong></th></tr></thead><tbody><tr><td>全称</td><td>以太网 over 同步数字体系</td><td>以太网 over 光传送网</td></tr><tr><td>底层承载</td><td>SDH 网络</td><td>OTN 网络</td></tr><tr><td>封装映射</td><td>以太网帧 → <strong>VC（虚容器）</strong> → STM-N</td><td>以太网帧 → <strong>ODUk</strong> → OTUk</td></tr><tr><td>交叉颗粒</td><td>VC-12 &#x2F; VC-3 &#x2F; VC-4</td><td>ODU0 &#x2F; ODU1 &#x2F; ODU2 &#x2F; ODU3 &#x2F; ODU4 &#x2F; ODUflex</td></tr><tr><td>线路侧信号</td><td>STM-N（如 STM-1&#x2F;4&#x2F;16&#x2F;64）</td><td>OTUk（如 OTU1&#x2F;2&#x2F;3&#x2F;4）</td></tr><tr><td>带宽粒度</td><td>固定小颗粒（2M &#x2F; 48M &#x2F; 155M）</td><td>大颗粒（1.25G &#x2F; 2.5G &#x2F; 10G &#x2F; 40G &#x2F; 100G）</td></tr><tr><td>时延性能</td><td>相对较高（映射层级多）</td><td>相对较低，大颗粒业务优势明显</td></tr><tr><td>典型应用</td><td>传统 SDH 网络、小颗粒业务（&lt;100M）</td><td>OTN 网络、大颗粒业务（&gt;100M）、专线入云</td></tr></tbody></table><blockquote><p>💡 <strong>一句话</strong>：EoS 走 SDH 的 VC 通道，EoO 走 OTN 的 ODUk 通道，两者底层承载网络完全不同。</p></blockquote><hr><h2 id="Q2：什么是”大颗粒业务”？”带宽颗粒”指的是什么？"><a href="#Q2：什么是”大颗粒业务”？”带宽颗粒”指的是什么？" class="headerlink" title="Q2：什么是”大颗粒业务”？”带宽颗粒”指的是什么？"></a>Q2：什么是”大颗粒业务”？”带宽颗粒”指的是什么？</h2><p><strong>“颗粒”</strong> 是通信网络中的形象化比喻，指的是<strong>传输网络中用于调度、分配和交叉连接的最小带宽单元</strong>。就像沙子的颗粒大小决定了沙漏的精度，带宽颗粒决定了网络资源分配的最小精度。</p><table><thead><tr><th>技术体制</th><th>典型带宽颗粒</th><th>颗粒大小</th></tr></thead><tbody><tr><td><strong>SDH</strong></td><td>VC-12（2M）、VC-3（48M）、VC-4（155M）</td><td>🔹 小颗粒</td></tr><tr><td><strong>OTN</strong></td><td>ODU0（1.25G）、ODU1（2.5G）、ODU2（10G）、ODU3（40G）、ODU4（100G）</td><td>🔷 大颗粒</td></tr></tbody></table><ul><li><strong>大颗粒业务</strong>：带宽需求 ≥ GE（1G）级别，如 10GE 数据中心互联、视频回传、云计算专线</li><li><strong>小颗粒业务</strong>：带宽需求 &lt; GE 级别，如 E1（2M）、10M&#x2F;100M 以太网、金融专线</li></ul><blockquote><p>💡 <strong>为什么 OTN 被称为”大颗粒”技术？</strong> OTN 的最小颗粒 ODU0（1.25G）就已经比 SDH 的最大颗粒 VC-4（155M）还要大得多。</p></blockquote><hr><h2 id="Q3：ODU-的全称是什么？"><a href="#Q3：ODU-的全称是什么？" class="headerlink" title="Q3：ODU 的全称是什么？"></a>Q3：ODU 的全称是什么？</h2><p><strong>ODU &#x3D; Optical channel Data Unit</strong>，即<strong>光通道数据单元</strong>。</p><p>在 OTN 分层结构中的位置：</p><table><thead><tr><th>层级</th><th>全称</th><th>功能</th></tr></thead><tbody><tr><td><strong>OTUk</strong></td><td>Optical channel Transport Unit-k</td><td>承载 ODUk，加入 FEC 开销，用于线路传输</td></tr><tr><td><strong>ODUk</strong></td><td><strong>Optical channel Data Unit-k</strong></td><td><strong>承载客户信号，提供端到端连接、监控和保护</strong></td></tr><tr><td><strong>OPUk</strong></td><td>Optical channel Payload Unit-k</td><td>映射客户信号（如以太网、SDH 等）</td></tr></tbody></table><p>ODUk 速率标准：</p><table><thead><tr><th>类型</th><th>速率</th><th>对应客户信号</th></tr></thead><tbody><tr><td>ODU0</td><td>1.25 Gb&#x2F;s</td><td>GE</td></tr><tr><td>ODU1</td><td>2.5 Gb&#x2F;s</td><td>STM-16 &#x2F; OC-48</td></tr><tr><td>ODU2</td><td>10 Gb&#x2F;s</td><td>STM-64 &#x2F; 10GE</td></tr><tr><td>ODU3</td><td>40 Gb&#x2F;s</td><td>STM-256 &#x2F; 40GE</td></tr><tr><td>ODU4</td><td>100 Gb&#x2F;s</td><td>100GE</td></tr><tr><td>ODUflex</td><td>可变速率</td><td>灵活带宽业务</td></tr></tbody></table><hr><h2 id="Q4：华为-OSN1800V-上的-EGS4-板卡是什么？"><a href="#Q4：华为-OSN1800V-上的-EGS4-板卡是什么？" class="headerlink" title="Q4：华为 OSN1800V 上的 EGS4 板卡是什么？"></a>Q4：华为 OSN1800V 上的 EGS4 板卡是什么？</h2><p><strong>EGS4 &#x3D; 四路交换式千兆以太网处理板</strong>（4-port Gigabit Ethernet Switching Processing Board）</p><h3 id="硬件规格"><a href="#硬件规格" class="headerlink" title="硬件规格"></a>硬件规格</h3><table><thead><tr><th>项目</th><th>规格</th></tr></thead><tbody><tr><td>接口数量</td><td>4 路 GE 接口</td></tr><tr><td>接口类型</td><td>SFP 光口 + 可选 SFP 电口</td></tr><tr><td>最大上行带宽</td><td>2.5 Gbit&#x2F;s</td></tr><tr><td>映射方式</td><td>VC-12、VC-3、VC-4 及虚级联</td></tr><tr><td>封装格式</td><td>HDLC、LAPS、GFP-F</td></tr><tr><td>VCTrunk 数量</td><td>64 个</td></tr></tbody></table><h3 id="✅-能承载的业务"><a href="#✅-能承载的业务" class="headerlink" title="✅ 能承载的业务"></a>✅ 能承载的业务</h3><ul><li>EPL &#x2F; EVPL &#x2F; EPLAN &#x2F; EVPLAN</li><li>链路聚合（LAG&#x2F;DLAG）</li><li>组播业务（IGMP Snooping）</li><li>同步以太时钟 &#x2F; LCAS 带宽动态调整 &#x2F; LPT 链路保护</li></ul><h3 id="❌-不能承载的业务"><a href="#❌-不能承载的业务" class="headerlink" title="❌ 不能承载的业务"></a>❌ 不能承载的业务</h3><table><thead><tr><th>不支持</th><th>说明</th></tr></thead><tbody><tr><td>MPLS</td><td>不支持标签交换</td></tr><tr><td>1588v2 时间同步</td><td>不支持精确时间协议</td></tr><tr><td>10GE 及以上</td><td>最大仅支持 GE 速率</td></tr><tr><td><strong>OTN 业务（EoO）</strong></td><td>只能映射到 SDH 的 VC，<strong>不能直接映射到 ODUk</strong></td></tr><tr><td>OSU &#x2F; CPRI &#x2F; SAN</td><td>不支持光业务单元、无线前传、存储网络</td></tr></tbody></table><blockquote><p>⚠️ <strong>核心限制</strong>：EGS4 是 <strong>SDH 平面板卡（EoS）</strong>，不能做 OTN 业务。</p></blockquote><hr><h2 id="Q5：什么是”映射客户信号”？"><a href="#Q5：什么是”映射客户信号”？" class="headerlink" title="Q5：什么是”映射客户信号”？"></a>Q5：什么是”映射客户信号”？</h2><p><strong>“映射”</strong> 就是把一种格式的信号装进另一种格式的容器里，就像把不同形状的物品装进标准规格的快递箱。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">客户侧 GE 口 → 以太网帧 → [封装 GFP-F/HDLC/LAPS] → 映射到 VC 虚容器 → SDH 网络</span><br></pre></td></tr></table></figure><table><thead><tr><th>原因</th><th>说明</th></tr></thead><tbody><tr><td><strong>统一传输</strong></td><td>以太网是分组交换，SDH 是时分复用，两者格式不同，需要”翻译”</td></tr><tr><td><strong>标准化</strong></td><td>SDH 网络只认 VC 容器，任何业务都必须变成 VC 才能传输</td></tr><tr><td><strong>隔离保护</strong></td><td>映射到不同 VC 中，业务之间物理隔离，互不干扰</td></tr><tr><td><strong>带宽分配</strong></td><td>通过 VC 数量灵活分配带宽（如 1×VC-4&#x3D;155M，4×VC-4&#x3D;622M）</td></tr></tbody></table><hr><h2 id="Q6：VCTrunk-是什么？和-VC-有什么区别？"><a href="#Q6：VCTrunk-是什么？和-VC-有什么区别？" class="headerlink" title="Q6：VCTrunk 是什么？和 VC 有什么区别？"></a>Q6：VCTrunk 是什么？和 VC 有什么区别？</h2><p><strong>VCTrunk &#x3D; Virtual Container Trunk（虚容器中继&#x2F;汇聚）</strong></p><p>它是 EGS4 等以太网处理板上的<strong>逻辑通道</strong>，用于把封装后的以太网数据映射到 SDH 的 VC 虚容器中。</p><table><thead><tr><th>概念</th><th>类比</th><th>本质</th><th>存在位置</th></tr></thead><tbody><tr><td><strong>VC</strong></td><td>集装箱</td><td>物理传输容器</td><td>整个 SDH 网络</td></tr><tr><td><strong>VCTrunk</strong></td><td>传送带</td><td>逻辑通道</td><td>仅在 EGS4 等以太网板卡上</td></tr></tbody></table><p>VCTrunk 关键特性：</p><ul><li>EGS4 支持 <strong>64 个</strong> VCTrunk</li><li>每个 VCTrunk 可绑定 1<del>504 个 VC-12，或 1</del>48 个 VC-3，或 1~16 个 VC-4</li><li>支持 LCAS 动态调整 + 虚级联</li></ul><blockquote><p>💡 <strong>为什么这样设计？</strong> GE 端口是物理接口，VCTrunk 是逻辑通道，两者解耦后可以灵活组合。64 个 VCTrunk 可以承载 64 条独立以太网专线，共享 4 个 GE 物理端口。</p></blockquote><hr><h2 id="Q7：虚级联是什么？"><a href="#Q7：虚级联是什么？" class="headerlink" title="Q7：虚级联是什么？"></a>Q7：虚级联是什么？</h2><h3 id="问题背景"><a href="#问题背景" class="headerlink" title="问题背景"></a>问题背景</h3><p>SDH 的 VC 容器规格固定（VC-4&#x3D;155M, VC-3&#x3D;48M, VC-12&#x3D;2M），但客户业务带宽是任意的（如 GE&#x3D;1000M，不是 155M 的整数倍）。</p><h3 id="解决思路"><a href="#解决思路" class="headerlink" title="解决思路"></a>解决思路</h3><blockquote><p><strong>把多个小的、不连续的 VC 容器”虚拟”绑在一起，组成一个逻辑上的大管道。</strong></p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">需要承载 1000M 业务（约 7×VC-4=1085M）</span><br><span class="line"></span><br><span class="line">传统级联：需要 7 个连续的 VC-4 ❌ 很难找到</span><br><span class="line">虚级联：  VC-4 #3 + VC-4 #12 + VC-4 #25 ... ✅ 不连续也能绑定</span><br></pre></td></tr></table></figure><table><thead><tr><th>机制</th><th>作用</th></tr></thead><tbody><tr><td>发送端</td><td>把数据流拆分，分别装进不同 VC，打上 MFI 和 SQ</td></tr><tr><td>传输路径</td><td>各个 VC 可走不同物理路径（时延可能不同）</td></tr><tr><td>接收端</td><td>根据 MFI 和 SQ 重新排序、重组，恢复原始数据流</td></tr><tr><td>LCAS</td><td>动态增减绑定的 VC 数量，带宽平滑调整</td></tr></tbody></table><hr><h2 id="Q8：交叉连接是什么？"><a href="#Q8：交叉连接是什么？" class="headerlink" title="Q8：交叉连接是什么？"></a>Q8：交叉连接是什么？</h2><blockquote><p><strong>SDH 交叉连接是整个 SDH 网络中进行的，不是单指某块板卡或某台设备。</strong></p></blockquote><p>更准确地说：<strong>交叉连接是每台 SDH 设备内部的功能，多台设备的交叉连接串联起来，形成端到端的网络级连接。</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">某台 SDH 设备内部：</span><br><span class="line"></span><br><span class="line">   东向光口 ──┐</span><br><span class="line">   西向光口 ──┼──→ 【交叉连接矩阵】──→ 北向光口</span><br><span class="line">   南向光口 ──┘         ↑↓</span><br><span class="line">                    本地支路板（EGS4）</span><br></pre></td></tr></table></figure><p>端到端的业务需要<strong>多台设备</strong>配合：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">站点 A（EGS4）→ 交叉 → STM-16 → 站点 B（交叉）→ STM-16 → 站点 C（交叉）→ EGS4</span><br></pre></td></tr></table></figure><blockquote><p>💡 每台设备只做自己这一段”交换”，多台设备串联起来，就形成了端到端的 VC 通道。</p></blockquote><hr><h2 id="Q9：什么是支路板？EGS4-是支路板吗？"><a href="#Q9：什么是支路板？EGS4-是支路板吗？" class="headerlink" title="Q9：什么是支路板？EGS4 是支路板吗？"></a>Q9：什么是支路板？EGS4 是支路板吗？</h2><table><thead><tr><th>板卡类型</th><th>方向</th><th>功能</th><th>典型例子</th></tr></thead><tbody><tr><td><strong>支路板</strong></td><td>南向（面向客户）</td><td>接入客户业务信号</td><td>EGS4、PD1、PQ1</td></tr><tr><td><strong>线路板</strong></td><td>东西向（面向传输网络）</td><td>承载 STM-N，连接其他设备</td><td>SL16、SL64</td></tr><tr><td><strong>交叉板</strong></td><td>内部</td><td>VC 交叉连接、设备控制</td><td>XCS、SCC</td></tr></tbody></table><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">STM-64（线路侧大容量）</span><br><span class="line">    ↓ 解复用</span><br><span class="line">STM-16 → STM-4 → STM-1 → VC-4（支路信号从这里&quot;分支&quot;出来）</span><br></pre></td></tr></table></figure><ul><li><strong>线路板</strong> &#x3D; 干流（承载大容量的 STM-N）</li><li><strong>支路板</strong> &#x3D; 支流（把干流中的 VC 提取出来，交给客户使用）</li></ul><p><strong>EGS4 是支路板</strong>，面向客户侧（南向），是客户业务进入传输网的”大门”。</p><hr><h2 id="Q10：EPL-EVPL-EPLAN-EVPLAN-有什么区别？"><a href="#Q10：EPL-EVPL-EPLAN-EVPLAN-有什么区别？" class="headerlink" title="Q10：EPL &#x2F; EVPL &#x2F; EPLAN &#x2F; EVPLAN 有什么区别？"></a>Q10：EPL &#x2F; EVPL &#x2F; EPLAN &#x2F; EVPLAN 有什么区别？</h2><p>这是 <strong>MEF（城域以太网论坛）</strong> 定义的四种标准以太网业务类型，核心区别在于<strong>隔离方式</strong>和<strong>拓扑结构</strong>。</p><table><thead><tr><th>业务类型</th><th>全称</th><th>隔离方式</th><th>拓扑</th><th>通俗解释</th></tr></thead><tbody><tr><td><strong>EPL</strong></td><td>Ethernet Private Line</td><td>端口隔离</td><td>点对点</td><td>物理专线：两个端口直连，像一根光纤拉过去</td></tr><tr><td><strong>EVPL</strong></td><td>Ethernet Virtual Private Line</td><td>VLAN 隔离</td><td>点对点</td><td>虚拟专线：同一端口不同 VLAN 走不同通道</td></tr><tr><td><strong>EPLAN</strong></td><td>Ethernet Private LAN</td><td>端口隔离</td><td>多点互通</td><td>专用局域网：多个端口组成一个 LAN</td></tr><tr><td><strong>EVPLAN</strong></td><td>Ethernet Virtual Private LAN</td><td>VLAN 隔离</td><td>多点互通</td><td>虚拟局域网：同一端口不同 VLAN 组成不同 LAN</td></tr></tbody></table><p><strong>选择场景</strong>：</p><table><thead><tr><th>场景</th><th>推荐</th></tr></thead><tbody><tr><td>两站点点对点互联，要求完全透明</td><td>EPL</td></tr><tr><td>一个站点有多个客户，需要隔离</td><td>EVPL</td></tr><tr><td>多站点组成内网，需要互通</td><td>EPLAN</td></tr><tr><td>多客户共享接入，各自独立局域网</td><td>EVPLAN</td></tr></tbody></table><hr><h2 id="📎-附录：完整数据流向"><a href="#📎-附录：完整数据流向" class="headerlink" title="📎 附录：完整数据流向"></a>📎 附录：完整数据流向</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│           客户侧设备（交换机）             │</span><br><span class="line">│              发送以太网帧                  │</span><br><span class="line">└─────────────────┬───────────────────────┘</span><br><span class="line">                  ↓</span><br><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│           EGS4 板卡 GE 端口              │</span><br><span class="line">│         （支路板 - 南向接入）              │</span><br><span class="line">└─────────────────┬───────────────────────┘</span><br><span class="line">                  ↓</span><br><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│         封装（GFP-F / HDLC / LAPS）      │</span><br><span class="line">│      把以太网帧变成适合 SDH 传输的格式     │</span><br><span class="line">└─────────────────┬───────────────────────┘</span><br><span class="line">                  ↓</span><br><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│              VCTrunk                    │</span><br><span class="line">│    【逻辑通道】绑定多个 VC 虚容器          │</span><br><span class="line">└─────────────────┬───────────────────────┘</span><br><span class="line">                  ↓</span><br><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│         映射到 VC 虚容器                  │</span><br><span class="line">│    【物理容器】通过虚级联组成逻辑大管道     │</span><br><span class="line">└─────────────────┬───────────────────────┘</span><br><span class="line">                  ↓</span><br><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│           SDH 交叉连接矩阵                 │</span><br><span class="line">│         【设备内部】VC 调度、路由          │</span><br><span class="line">└─────────────────┬───────────────────────┘</span><br><span class="line">                  ↓</span><br><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│           STM-N 线路传输                  │</span><br><span class="line">│         【线路板 - 东西向】光纤传输        │</span><br><span class="line">└─────────────────┬───────────────────────┘</span><br><span class="line">                  ↓</span><br><span class="line">         （经过多个站点交叉连接串联）</span><br><span class="line">                  ↓</span><br><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│           对端站点反向流程                 │</span><br><span class="line">│  线路板 → 交叉 → VCTrunk → 解封装 → GE 口  │</span><br><span class="line">└─────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><hr><h2 id="📎-关键概念速查表"><a href="#📎-关键概念速查表" class="headerlink" title="📎 关键概念速查表"></a>📎 关键概念速查表</h2><table><thead><tr><th>概念</th><th>一句话解释</th></tr></thead><tbody><tr><td><strong>EoS vs EoO</strong></td><td>EoS 走 SDH&#x2F;VC，EoO 走 OTN&#x2F;ODUk</td></tr><tr><td><strong>大&#x2F;小颗粒</strong></td><td>≥1G 叫大颗粒，&lt;1G 叫小颗粒</td></tr><tr><td><strong>ODU</strong></td><td>光通道数据单元，OTN 中的调度单元</td></tr><tr><td><strong>映射</strong></td><td>把以太网帧装进 SDH 的 VC 快递箱</td></tr><tr><td><strong>VC</strong></td><td>SDH 网络中的”集装箱”，物理运输单元</td></tr><tr><td><strong>VCTrunk</strong></td><td>EGS4 板卡上的”传送带”，逻辑通道</td></tr><tr><td><strong>虚级联</strong></td><td>多个不连续小箱子拼成逻辑大箱子</td></tr><tr><td><strong>交叉连接</strong></td><td>每个中转站内部的”分拣系统”</td></tr><tr><td><strong>支路板</strong></td><td>面向客户的”大门”（南向）</td></tr><tr><td><strong>线路板</strong></td><td>面向传输网络的”干线”（东西向）</td></tr><tr><td><strong>EPL&#x2F;EVPL</strong></td><td>点对点专线，区别在于独占端口还是共享端口+VLAN</td></tr><tr><td><strong>EPLAN&#x2F;EVPLAN</strong></td><td>多点局域网，区别同上</td></tr></tbody></table><hr><p><em>适用场景：华为 OSN1800V + EGS4 板卡运维与学习</em></p>]]></content>
    
    
    <summary type="html">基于华为 OSN1800V + EGS4 板卡场景，系统梳理 SDH/OTN 业务承载核心概念：EoS vs EoO、ODU、VCTrunk、虚级联、交叉连接、支路板、EPL/EVPL 等</summary>
    
    
    
    <category term="ICT" scheme="https://sanshisanfight.github.io/categories/ICT/"/>
    
    <category term="传输网络" scheme="https://sanshisanfight.github.io/categories/ICT/%E4%BC%A0%E8%BE%93%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="SDH" scheme="https://sanshisanfight.github.io/tags/SDH/"/>
    
    <category term="OTN" scheme="https://sanshisanfight.github.io/tags/OTN/"/>
    
    <category term="EGS4" scheme="https://sanshisanfight.github.io/tags/EGS4/"/>
    
    <category term="OSN1800V" scheme="https://sanshisanfight.github.io/tags/OSN1800V/"/>
    
    <category term="华为" scheme="https://sanshisanfight.github.io/tags/%E5%8D%8E%E4%B8%BA/"/>
    
    <category term="光传输" scheme="https://sanshisanfight.github.io/tags/%E5%85%89%E4%BC%A0%E8%BE%93/"/>
    
    <category term="VCTrunk" scheme="https://sanshisanfight.github.io/tags/VCTrunk/"/>
    
    <category term="虚级联" scheme="https://sanshisanfight.github.io/tags/%E8%99%9A%E7%BA%A7%E8%81%94/"/>
    
  </entry>
  
  <entry>
    <title>正则提取到多线程爆破：CTF实战全记录</title>
    <link href="https://sanshisanfight.github.io/2026/04/06/%E6%AD%A3%E5%88%99%E6%8F%90%E5%8F%96%E5%88%B0%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%88%86%E7%A0%B4-CTF%E5%AE%9E%E6%88%98%E5%85%A8%E8%AE%B0%E5%BD%95/"/>
    <id>https://sanshisanfight.github.io/2026/04/06/%E6%AD%A3%E5%88%99%E6%8F%90%E5%8F%96%E5%88%B0%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%88%86%E7%A0%B4-CTF%E5%AE%9E%E6%88%98%E5%85%A8%E8%AE%B0%E5%BD%95/</id>
    <published>2026-04-06T11:00:00.000Z</published>
    <updated>2026-04-06T11:14:27.578Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>继 Day1 掌握 requests 基础、Session 会话保持和简单爆破脚本后，Day2 重点突破 CTF 实战核心技能，整合所有知识点，写出可直接用于靶机&#x2F;CTF 的全自动解题脚本。全程实战导向，零基础友好。</p></blockquote><hr><h2 id="一、今日学习目标"><a href="#一、今日学习目标" class="headerlink" title="一、今日学习目标"></a>一、今日学习目标</h2><ol><li>掌握正则表达式（re 库），实现 CTF 中 flag 的自动提取</li><li>掌握 base64 编码&#x2F;解码，应对靶机中加密的 flag</li><li>掌握多线程爆破原理与实现，将爆破速度提升 10 倍以上</li><li>整合 Day1 + Day2 所有知识点，编写全自动 CTF 解题脚本（爆破 → 登录 → 提取 flag → 解码）</li></ol><hr><h2 id="二、核心知识点详解"><a href="#二、核心知识点详解" class="headerlink" title="二、核心知识点详解"></a>二、核心知识点详解</h2><h3 id="1-正则表达式-re-——-CTF-flag-提取神器"><a href="#1-正则表达式-re-——-CTF-flag-提取神器" class="headerlink" title="1. 正则表达式 re —— CTF flag 提取神器"></a>1. 正则表达式 re —— CTF flag 提取神器</h3><p><strong>核心作用：</strong> 在杂乱的网页源码、接口返回内容中，精准提取 <code>flag&#123;xxx&#125;</code> 格式的 flag，无需手动查找，实现自动化提取，是 CTF 解题必备技能。</p><h4 id="万能模板（直接复制用）"><a href="#万能模板（直接复制用）" class="headerlink" title="万能模板（直接复制用）"></a>万能模板（直接复制用）</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 模拟靶机返回的网页内容</span></span><br><span class="line">html = <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">&lt;html&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">ajsdf823kf&amp;*#$</span></span><br><span class="line"><span class="string">flag&#123;this_is_really_hard_flag_abc789&#125;</span></span><br><span class="line"><span class="string">kjdfh2983rhdkfn</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 万能正则，匹配 flag&#123;...&#125; 格式</span></span><br><span class="line">flag_list = re.findall(<span class="string">r&#x27;flag\&#123;.*?\&#125;&#x27;</span>, html, re.S)</span><br><span class="line"><span class="keyword">if</span> flag_list:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;提取到flag：&quot;</span>, flag_list[<span class="number">0</span>])  <span class="comment"># 输出：flag&#123;this_is_really_hard_flag_abc789&#125;</span></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;未找到flag&quot;</span>)</span><br></pre></td></tr></table></figure><h4 id="关键参数说明"><a href="#关键参数说明" class="headerlink" title="关键参数说明"></a>关键参数说明</h4><table><thead><tr><th>参数</th><th>含义</th></tr></thead><tbody><tr><td><code>r&#39;flag\&#123;.*?\&#125;&#39;</code></td><td>正则核心：<code>flag\&#123;</code> 匹配开头，<code>.*?</code> 非贪婪匹配中间内容，<code>\&#125;</code> 匹配结尾</td></tr><tr><td><code>re.S</code></td><td>跨行匹配，解决 flag 被换行隔开的问题，<strong>实战必加</strong></td></tr><tr><td><code>re.findall()</code></td><td>返回所有匹配结果的列表，取 <code>[0]</code> 获取第一个</td></tr></tbody></table><blockquote><p>💡 <strong>为什么用 <code>.*?</code> 非贪婪匹配？</strong> 如果页面有多个 flag，贪婪匹配 <code>.*</code> 会把第一个 <code>&#123;</code> 到最后一个 <code>&#125;</code> 全部吃掉，导致提取错误。非贪婪 <code>.*?</code> 遇到第一个 <code>&#125;</code> 就停止，精准提取每一个 flag。</p></blockquote><hr><h3 id="2-base64-编码-解码-——-靶机高频加密考点"><a href="#2-base64-编码-解码-——-靶机高频加密考点" class="headerlink" title="2. base64 编码&#x2F;解码 —— 靶机高频加密考点"></a>2. base64 编码&#x2F;解码 —— 靶机高频加密考点</h3><p>CTF 中约 <strong>30%</strong> 的 flag 会进行 base64 加密，需用 Python 自动解码，无需手动借助在线工具。</p><h4 id="核心代码（必背模板）"><a href="#核心代码（必背模板）" class="headerlink" title="核心代码（必背模板）"></a>核心代码（必背模板）</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. base64 解码（实战常用：密文 → 明文flag）</span></span><br><span class="line">b64_str = <span class="string">&quot;ZmxhZ3tiYXNlNjRfZGVjb2RlX3N1Y2Nlc3N9&quot;</span>  <span class="comment"># 模拟加密后的flag</span></span><br><span class="line">real_flag = base64.b64decode(b64_str).decode()</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;解码后flag：&quot;</span>, real_flag)  <span class="comment"># 输出：flag&#123;base64_decode_success&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. base64 编码（了解即可：明文 → 密文）</span></span><br><span class="line">plain_text = <span class="string">&quot;flag&#123;test_base64_encode&#125;&quot;</span></span><br><span class="line">b64_encode = base64.b64encode(plain_text.encode()).decode()</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;编码后：&quot;</span>, b64_encode)</span><br></pre></td></tr></table></figure><h4 id="关键说明"><a href="#关键说明" class="headerlink" title="关键说明"></a>关键说明</h4><ul><li><code>b64decode(b64_str)</code>：解码 base64 字符串，返回<strong>字节流</strong></li><li><code>.decode()</code>：将字节流转为字符串，避免输出 <code>b&#39;...&#39;</code> 格式</li><li>编码时需先 <code>.encode()</code> 将字符串转为字节流，再进行 base64 编码</li></ul><blockquote><p>💡 <strong>快速识别 base64：</strong> 字符串只包含 <code>A-Z a-z 0-9 + / =</code>，且长度是 4 的倍数，大概率是 base64 编码。</p></blockquote><hr><h3 id="3-多线程爆破-——-速度提升-10-倍的核心"><a href="#3-多线程爆破-——-速度提升-10-倍的核心" class="headerlink" title="3. 多线程爆破 —— 速度提升 10 倍的核心"></a>3. 多线程爆破 —— 速度提升 10 倍的核心</h3><p>Day1 的单线程爆破效率极低，多线程可同时尝试多个密码，速度直接提升 <strong>10~100 倍</strong>。核心使用 <code>ThreadPoolExecutor</code>（Python 自带，无需额外安装）。</p><h4 id="多线程爆破实战代码"><a href="#多线程爆破实战代码" class="headerlink" title="多线程爆破实战代码"></a>多线程爆破实战代码</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> concurrent.futures <span class="keyword">import</span> ThreadPoolExecutor</span><br><span class="line"></span><br><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 单个密码测试函数</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">check_pwd</span>(<span class="params">pwd</span>):</span><br><span class="line">    url = <span class="string">&quot;https://httpbin.org/post&quot;</span>  <span class="comment"># 模拟登录接口</span></span><br><span class="line">    data = &#123;<span class="string">&quot;username&quot;</span>: <span class="string">&quot;admin&quot;</span>, <span class="string">&quot;password&quot;</span>: pwd&#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        resp = requests.post(url, data=data, headers=headers, timeout=<span class="number">2</span>)</span><br><span class="line">        resp_json = resp.json()</span><br><span class="line">        <span class="comment"># 登录成功判断（根据靶机实际情况修改）</span></span><br><span class="line">        <span class="keyword">if</span> resp_json.get(<span class="string">&quot;form&quot;</span>, &#123;&#125;).get(<span class="string">&quot;password&quot;</span>) == <span class="string">&quot;test123&quot;</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">f&quot;✅ 爆破成功！正确密码：<span class="subst">&#123;pwd&#125;</span>&quot;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">f&quot;❌ 错误密码：<span class="subst">&#123;pwd&#125;</span>&quot;</span></span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">f&quot;⚠️  请求超时：<span class="subst">&#123;pwd&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 密码字典（实战可从文件读取）</span></span><br><span class="line">pwd_list = [<span class="string">&quot;123456&quot;</span>, <span class="string">&quot;admin&quot;</span>, <span class="string">&quot;root&quot;</span>, <span class="string">&quot;test123&quot;</span>, <span class="string">&quot;password&quot;</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 多线程执行（max_workers=10，同时尝试10个密码）</span></span><br><span class="line"><span class="keyword">with</span> ThreadPoolExecutor(max_workers=<span class="number">10</span>) <span class="keyword">as</span> executor:</span><br><span class="line">    results = executor.<span class="built_in">map</span>(check_pwd, pwd_list)</span><br><span class="line">    <span class="keyword">for</span> res <span class="keyword">in</span> results:</span><br><span class="line">        <span class="built_in">print</span>(res)</span><br></pre></td></tr></table></figure><h4 id="关键参数说明-1"><a href="#关键参数说明-1" class="headerlink" title="关键参数说明"></a>关键参数说明</h4><table><thead><tr><th>参数</th><th>说明</th></tr></thead><tbody><tr><td><code>max_workers=10</code></td><td>同时运行 10 个线程，可根据电脑性能调整（5~20 为宜）</td></tr><tr><td><code>executor.map(函数, 列表)</code></td><td>将列表每个元素传入函数，多线程并行执行</td></tr><tr><td><code>try...except</code></td><td>避免单个请求超时&#x2F;失败导致整个脚本崩溃</td></tr></tbody></table><hr><h3 id="4-终极实战：全自动-CTF-一把梭脚本"><a href="#4-终极实战：全自动-CTF-一把梭脚本" class="headerlink" title="4. 终极实战：全自动 CTF 一把梭脚本"></a>4. 终极实战：全自动 CTF 一把梭脚本</h3><p>整合 Day1 + Day2 所有知识点，实现：</p><p><strong>多线程爆破密码 → Session 保持登录 → 访问 flag 页面 → 正则提取 flag → base64 自动解码 → 输出真实 flag</strong></p><p>复制即可跑，直接用于靶机&#x2F;CTF 解题。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">from</span> concurrent.futures <span class="keyword">import</span> ThreadPoolExecutor</span><br><span class="line"><span class="keyword">import</span> threading</span><br><span class="line"></span><br><span class="line"><span class="comment"># 线程锁：防止多线程同时打印输出混乱</span></span><br><span class="line">lock = threading.Lock()</span><br><span class="line"></span><br><span class="line"><span class="comment"># ====================== 靶机配置区（自行修改） ======================</span></span><br><span class="line">LOGIN_URL    = <span class="string">&quot;https://httpbin.org/post&quot;</span>  <span class="comment"># 登录接口</span></span><br><span class="line">FLAG_URL     = <span class="string">&quot;https://httpbin.org/get&quot;</span>   <span class="comment"># flag 页面接口</span></span><br><span class="line">USER         = <span class="string">&quot;admin&quot;</span>                     <span class="comment"># 目标账号</span></span><br><span class="line">PASSWD_LIST  = [<span class="string">&quot;123456&quot;</span>, <span class="string">&quot;admin&quot;</span>, <span class="string">&quot;root&quot;</span>, <span class="string">&quot;test123&quot;</span>, <span class="string">&quot;password&quot;</span>, <span class="string">&quot;123123&quot;</span>]  <span class="comment"># 密码字典</span></span><br><span class="line"></span><br><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment"># ======================================================================</span></span><br><span class="line"></span><br><span class="line">success_pwd = <span class="literal">None</span>          <span class="comment"># 存储爆破成功的密码</span></span><br><span class="line">session = requests.Session()  <span class="comment"># 会话保持，登录后不掉线</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 单密码测试函数</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">try_pwd</span>(<span class="params">pwd</span>):</span><br><span class="line">    <span class="keyword">global</span> success_pwd</span><br><span class="line">    <span class="keyword">if</span> success_pwd:  <span class="comment"># 已找到正确密码，直接跳过</span></span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        data = &#123;<span class="string">&quot;username&quot;</span>: USER, <span class="string">&quot;password&quot;</span>: pwd&#125;</span><br><span class="line">        resp = session.post(LOGIN_URL, data=data, headers=headers, timeout=<span class="number">3</span>)</span><br><span class="line">        resp_json = resp.json()</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 登录成功判断（靶机需根据实际返回内容修改）</span></span><br><span class="line">        <span class="keyword">if</span> resp_json.get(<span class="string">&quot;form&quot;</span>, &#123;&#125;).get(<span class="string">&quot;password&quot;</span>) == <span class="string">&quot;test123&quot;</span>:</span><br><span class="line">            <span class="keyword">with</span> lock:</span><br><span class="line">                success_pwd = pwd</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;\n[+] 爆破成功！密码：<span class="subst">&#123;pwd&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 多线程爆破密码</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">burst_password</span>():</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;[*] 开始多线程密码爆破...&quot;</span>)</span><br><span class="line">    <span class="keyword">with</span> ThreadPoolExecutor(max_workers=<span class="number">10</span>) <span class="keyword">as</span> executor:</span><br><span class="line">        executor.<span class="built_in">map</span>(try_pwd, PASSWD_LIST)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取并解析 flag（提取 + 自动解码）</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_flag</span>():</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;\n[*] 登录成功，开始获取 Flag...&quot;</span>)</span><br><span class="line">    resp = session.get(FLAG_URL, headers=headers)</span><br><span class="line">    html = resp.text</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 1. 先提取明文 flag</span></span><br><span class="line">    flag = re.findall(<span class="string">r&#x27;flag\&#123;.*?\&#125;&#x27;</span>, html, re.S)</span><br><span class="line">    <span class="keyword">if</span> flag:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[+] 找到明文 Flag：&quot;</span>, flag[<span class="number">0</span>])</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 2. 若未找到明文，尝试提取 base64 并解码</span></span><br><span class="line">    b64_list = re.findall(<span class="string">r&#x27;[A-Za-z0-9+/=]&#123;20,&#125;&#x27;</span>, html)</span><br><span class="line">    <span class="keyword">if</span> b64_list:</span><br><span class="line">        b64_str = b64_list[<span class="number">0</span>]</span><br><span class="line">        real_flag = base64.b64decode(b64_str).decode()</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[+] Base64 解码成功：&quot;</span>, real_flag)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;[-] 未找到 Flag，请检查正则或 flag 格式&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 主流程</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    burst_password()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> success_pwd:</span><br><span class="line">        get_flag()</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;\n[-] 爆破失败，密码字典中无正确密码&quot;</span>)</span><br></pre></td></tr></table></figure><hr><h2 id="三、今日学习总结"><a href="#三、今日学习总结" class="headerlink" title="三、今日学习总结"></a>三、今日学习总结</h2><p>Day2 重点突破了 CTF 实战中的核心技能，从正则提取 flag、base64 解码，到多线程爆破，最终整合所有知识点，写出全自动解题脚本，实现了「一把梭」解题。</p><table><thead><tr><th>技能</th><th>掌握情况</th></tr></thead><tbody><tr><td>正则表达式 re</td><td>✅ flag 自动提取，适配各种藏 flag 场景</td></tr><tr><td>base64 编解码</td><td>✅ 应对靶机加密 flag，无需手动解码</td></tr><tr><td>多线程爆破</td><td>✅ ThreadPoolExecutor 使用，速度提升 10 倍+</td></tr><tr><td>全自动脚本</td><td>✅ 整合所有知识点，直接用于 CTF&#x2F;靶机实战</td></tr></tbody></table><hr><h2 id="四、下一步学习计划"><a href="#四、下一步学习计划" class="headerlink" title="四、下一步学习计划"></a>四、下一步学习计划</h2><ol><li><strong>文件读取</strong>：实现从本地文件加载超大密码字典</li><li><strong>正则进阶</strong>：应对更复杂的 flag 格式（带特殊符号、嵌套加密）</li><li><strong>Burp Suite 联动</strong>：精准定位脚本问题，调试更高效</li><li><strong>靶机实战</strong>：刷题优化脚本，适配不同场景</li></ol><hr><blockquote><p>本文为个人学习记录，仅用于技术交流。请勿用于非法用途，遵守网络安全相关法律法规。</p></blockquote>]]></content>
    
    
    <summary type="html">继Day1掌握requests基础后，Day2重点突破正则提取flag、base64解码、多线程爆破，整合写出CTF全自动一把梭脚本</summary>
    
    
    
    <category term="Python" scheme="https://sanshisanfight.github.io/categories/Python/"/>
    
    <category term="网络安全" scheme="https://sanshisanfight.github.io/categories/Python/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/"/>
    
    
    <category term="Python" scheme="https://sanshisanfight.github.io/tags/Python/"/>
    
    <category term="暴力破解" scheme="https://sanshisanfight.github.io/tags/%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3/"/>
    
    <category term="CTF" scheme="https://sanshisanfight.github.io/tags/CTF/"/>
    
    <category term="正则表达式" scheme="https://sanshisanfight.github.io/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"/>
    
    <category term="base64" scheme="https://sanshisanfight.github.io/tags/base64/"/>
    
    <category term="多线程" scheme="https://sanshisanfight.github.io/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/"/>
    
    <category term="渗透测试" scheme="https://sanshisanfight.github.io/tags/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/"/>
    
  </entry>
  
  <entry>
    <title>Python requests 库入门到精通——从零学习全记录</title>
    <link href="https://sanshisanfight.github.io/2026/04/05/Python-requests%E5%BA%93%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/"/>
    <id>https://sanshisanfight.github.io/2026/04/05/Python-requests%E5%BA%93%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/</id>
    <published>2026-04-05T07:10:00.000Z</published>
    <updated>2026-04-05T07:11:14.521Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文从基础语法到实战脚本，带你掌握目录扫描、暴力破解、自动登录等渗透测试必备技能。适合入门者系统学习，也适合作为速查手册。</p></blockquote><hr><h2 id="一、学习目标"><a href="#一、学习目标" class="headerlink" title="一、学习目标"></a>一、学习目标</h2><p>掌握 <code>requests</code> 库语法，理解 HTTP 协议基础，能够编写<strong>目录扫描、暴力破解、自动登录</strong>等渗透&#x2F;CTF 辅助脚本，为后续实战打基础。</p><hr><h2 id="二、核心知识速查"><a href="#二、核心知识速查" class="headerlink" title="二、核心知识速查"></a>二、核心知识速查</h2><h3 id="1-requests-基础：GET-POST-请求"><a href="#1-requests-基础：GET-POST-请求" class="headerlink" title="1. requests 基础：GET&#x2F;POST 请求"></a>1. requests 基础：GET&#x2F;POST 请求</h3><h4 id="基础语法"><a href="#基础语法" class="headerlink" title="基础语法"></a>基础语法</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line"><span class="comment"># 标准请求头（伪装Chrome浏览器，避免被反爬）</span></span><br><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># GET 请求（获取资源，参数拼接到URL末尾，用params传）</span></span><br><span class="line">resp_get = requests.get(<span class="string">&quot;https://httpbin.org/get&quot;</span>, headers=headers, timeout=<span class="number">3</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># POST 请求（提交数据，参数放在请求体里，用data传）</span></span><br><span class="line">data = &#123;<span class="string">&quot;username&quot;</span>: <span class="string">&quot;admin&quot;</span>, <span class="string">&quot;password&quot;</span>: <span class="string">&quot;test123&quot;</span>&#125;</span><br><span class="line">resp_post = requests.post(<span class="string">&quot;https://httpbin.org/post&quot;</span>, headers=headers, data=data, timeout=<span class="number">3</span>)</span><br></pre></td></tr></table></figure><h4 id="关键参数对比"><a href="#关键参数对比" class="headerlink" title="关键参数对比"></a>关键参数对比</h4><table><thead><tr><th>参数</th><th>适用请求</th><th>数据位置</th><th>典型用途</th></tr></thead><tbody><tr><td><code>params</code></td><td>GET</td><td>URL 末尾（<code>?key=value</code>）</td><td>传递查询参数、翻页</td></tr><tr><td><code>data</code></td><td>POST</td><td>请求体（Body）</td><td>提交登录表单、业务数据</td></tr><tr><td><code>json</code></td><td>POST</td><td>请求体</td><td>传 JSON 格式接口数据</td></tr></tbody></table><h4 id="响应对象常用属性"><a href="#响应对象常用属性" class="headerlink" title="响应对象常用属性"></a>响应对象常用属性</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">resp.status_code  <span class="comment"># HTTP 状态码（200成功/404不存在/403无权/302重定向）</span></span><br><span class="line">resp.text          <span class="comment"># 响应数据（字符串），适合HTML/文本</span></span><br><span class="line">resp.json()        <span class="comment"># 响应数据（JSON 转 Python 字典），适合接口/JSON返回</span></span><br><span class="line">resp.encoding      <span class="comment"># 查看或设置编码：resp.encoding = &quot;utf-8&quot;</span></span><br></pre></td></tr></table></figure><hr><h3 id="2-请求头-headers：为什么要加？怎么写？"><a href="#2-请求头-headers：为什么要加？怎么写？" class="headerlink" title="2. 请求头 headers：为什么要加？怎么写？"></a>2. 请求头 headers：为什么要加？怎么写？</h3><h4 id="为什么重要"><a href="#为什么重要" class="headerlink" title="为什么重要"></a>为什么重要</h4><p><strong>伪装成真实浏览器，避免被目标网站&#x2F;WAF识别为Python脚本从而拒绝访问（返回403无法获取数据）。</strong></p><h4 id="标准写法（直接复制用）"><a href="#标准写法（直接复制用）" class="headerlink" title="标准写法（直接复制用）"></a>标准写法（直接复制用）</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li><p><code>User-Agent</code>：浏览器标识字段，90%情况只需要这一个字段</p></li><li><p>其他请求头可选：<code>Accept</code>、<code>Referer</code> 等，按需添加</p></li></ul><h4 id="User-Agent-解析"><a href="#User-Agent-解析" class="headerlink" title="User-Agent 解析"></a>User-Agent 解析</h4><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36</span><br></pre></td></tr></table></figure><ul><li><code>Mozilla/5.0</code>：历史遗留，表示兼容 Mozilla</li><li><code>(Windows NT 10.0; Win64; x64)</code>：系统信息，伪装 Windows 10 64位</li><li><code>AppleWebKit/537.36</code>：浏览器渲染引擎</li><li><code>Chrome/130.0.0.0</code>：Chrome 浏览器版本号，伪装最新版</li></ul><hr><h3 id="3-Session-会话对象：自动登录的核心"><a href="#3-Session-会话对象：自动登录的核心" class="headerlink" title="3. Session 会话对象：自动登录的核心"></a>3. Session 会话对象：自动登录的核心</h3><h4 id="核心原理"><a href="#核心原理" class="headerlink" title="核心原理"></a>核心原理</h4><p>HTTP 协议是<strong>无状态</strong>的，默认记不住用户登录状态。<code>Session</code> 模块可以<strong>自动管理Cookie</strong>，保持登录状态跨请求传递（登录后访问其他页面不用重新登录）。</p><h4 id="标准用法"><a href="#标准用法" class="headerlink" title="标准用法"></a>标准用法</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 创建会话对象（循环外创建一次，全程复用）</span></span><br><span class="line">s = requests.Session()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 用会话发请求（代替全局requests.post/get）</span></span><br><span class="line">login_data = &#123;<span class="string">&quot;username&quot;</span>: <span class="string">&quot;admin&quot;</span>, <span class="string">&quot;password&quot;</span>: <span class="string">&quot;test123&quot;</span>&#125;</span><br><span class="line">s.post(<span class="string">&quot;https://httpbin.org/post&quot;</span>, headers=headers, data=login_data)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 后续请求自动携带Cookie，保持登录状态</span></span><br><span class="line">flag_resp = s.get(<span class="string">&quot;https://httpbin.org/get&quot;</span>, headers=headers)</span><br></pre></td></tr></table></figure><h4 id="关键注意事项"><a href="#关键注意事项" class="headerlink" title="关键注意事项"></a>关键注意事项</h4><ul><li>必须用 <code>s.post()</code> &#x2F; <code>s.get()</code>，不能混用全局 <code>requests.post()</code>，否则 Session 失效</li><li>会话对象循环外创建，避免每次新建会话浪费资源</li><li>典型用途：自动登录、爆破后保持状态、访问需要权限的页面（如flag页）</li></ul><hr><h3 id="4-循环-异常处理：健壮脚本的核心"><a href="#4-循环-异常处理：健壮脚本的核心" class="headerlink" title="4. 循环 + 异常处理：健壮脚本的核心"></a>4. 循环 + 异常处理：健壮脚本的核心</h3><h4 id="for-循环：批量执行"><a href="#for-循环：批量执行" class="headerlink" title="for 循环：批量执行"></a>for 循环：批量执行</h4><p><strong>用途：遍历列表批量执行相同操作（目录扫描、暴力破解的核心模式）</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 目录扫描示例</span></span><br><span class="line">path_list = [<span class="string">&quot;get&quot;</span>, <span class="string">&quot;post&quot;</span>, <span class="string">&quot;headers&quot;</span>, <span class="string">&quot;ip&quot;</span>, <span class="string">&quot;cookies&quot;</span>]</span><br><span class="line"><span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line">    url = <span class="string">f&quot;https://httpbin.org/<span class="subst">&#123;path&#125;</span>&quot;</span>  <span class="comment"># f-string 格式化字符串拼接URL</span></span><br><span class="line">    <span class="built_in">print</span>(url)</span><br></pre></td></tr></table></figure><h4 id="f-string-格式化字符串"><a href="#f-string-格式化字符串" class="headerlink" title="f-string 格式化字符串"></a>f-string 格式化字符串</h4><p><strong>用途：在字符串中直接嵌入变量，避免繁琐拼接，清晰易读</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">TARGET = <span class="string">&quot;https://httpbin.org&quot;</span></span><br><span class="line">path = <span class="string">&quot;get&quot;</span></span><br><span class="line">url = <span class="string">f&quot;<span class="subst">&#123;TARGET&#125;</span>/<span class="subst">&#123;path&#125;</span>&quot;</span>  <span class="comment"># 自动拼接为 &quot;https://httpbin.org/get&quot;</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;[+] <span class="subst">&#123;url&#125;</span> -&gt; 状态码: <span class="subst">&#123;resp.status_code&#125;</span>&quot;</span>)  <span class="comment"># 格式化输出日志</span></span><br></pre></td></tr></table></figure><h4 id="try…except-异常处理：脚本稳定运行的关键"><a href="#try…except-异常处理：脚本稳定运行的关键" class="headerlink" title="try…except 异常处理：脚本稳定运行的关键"></a>try…except 异常处理：脚本稳定运行的关键</h4><p><strong>用途：捕获网络异常，避免单个请求失败导致整个脚本直接终止，保证批量任务稳定执行</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    resp = requests.get(url, headers=headers, timeout=<span class="number">3</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[+] <span class="subst">&#123;url&#125;</span> -&gt; 状态码: <span class="subst">&#123;resp.status_code&#125;</span>&quot;</span>)</span><br><span class="line"><span class="keyword">except</span> requests.exceptions.Timeout:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[-] <span class="subst">&#123;url&#125;</span> -&gt; 请求超时&quot;</span>)</span><br><span class="line"><span class="keyword">except</span> requests.exceptions.ConnectionError:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[-] <span class="subst">&#123;url&#125;</span> -&gt; 连接失败&quot;</span>)</span><br><span class="line"><span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[-] <span class="subst">&#123;url&#125;</span> -&gt; 未知错误: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br></pre></td></tr></table></figure><hr><h3 id="5-resp-json-：JSON-响应处理"><a href="#5-resp-json-：JSON-响应处理" class="headerlink" title="5. resp.json()：JSON 响应处理"></a>5. resp.json()：JSON 响应处理</h3><h4 id="核心作用"><a href="#核心作用" class="headerlink" title="核心作用"></a>核心作用</h4><p>把服务器返回的 <strong>JSON 字符串</strong> 转为 <strong>Python 字典</strong>，可以直接取值，适合接口、JSON格式返回的场景。</p><h4 id="标准用法-1"><a href="#标准用法-1" class="headerlink" title="标准用法"></a>标准用法</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">resp = requests.post(<span class="string">&quot;https://httpbin.org/post&quot;</span>, data=&#123;<span class="string">&quot;username&quot;</span>: <span class="string">&quot;admin&quot;</span>&#125;)</span><br><span class="line"><span class="comment"># JSON转字典</span></span><br><span class="line">resp_json = resp.json()</span><br><span class="line"><span class="comment"># 取值两种方式</span></span><br><span class="line">username = resp_json[<span class="string">&quot;form&quot;</span>][<span class="string">&quot;username&quot;</span>]  <span class="comment"># 直接取值（键不存在会报错）</span></span><br><span class="line">username = resp_json.get(<span class="string">&quot;form&quot;</span>, &#123;&#125;).get(<span class="string">&quot;username&quot;</span>)  <span class="comment"># 安全取值（键不存在返回None）</span></span><br></pre></td></tr></table></figure><h4 id="与-resp-text-的区别"><a href="#与-resp-text-的区别" class="headerlink" title="与 resp.text 的区别"></a>与 resp.text 的区别</h4><table><thead><tr><th>方法</th><th>返回类型</th><th>能否直接取值</th><th>适用场景</th></tr></thead><tbody><tr><td><code>resp.text</code></td><td>字符串</td><td>❌ 不能</td><td>HTML页面、文本内容</td></tr><tr><td><code>resp.json()</code></td><td>字典</td><td>✅ 能</td><td>JSON接口、数据返回</td></tr></tbody></table><hr><h2 id="三、实战脚本：直接复制可用"><a href="#三、实战脚本：直接复制可用" class="headerlink" title="三、实战脚本：直接复制可用"></a>三、实战脚本：直接复制可用</h2><h3 id="1-目录扫描脚本：批量扫描网站路径"><a href="#1-目录扫描脚本：批量扫描网站路径" class="headerlink" title="1. 目录扫描脚本：批量扫描网站路径"></a>1. 目录扫描脚本：批量扫描网站路径</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">TARGET = <span class="string">&quot;https://httpbin.org&quot;</span></span><br><span class="line"><span class="comment"># 待扫描路径列表（实战可从字典文件读取）</span></span><br><span class="line">PATH_LIST = [<span class="string">&quot;get&quot;</span>, <span class="string">&quot;post&quot;</span>, <span class="string">&quot;headers&quot;</span>, <span class="string">&quot;ip&quot;</span>, <span class="string">&quot;cookies&quot;</span>]</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;[*] 开始扫描 <span class="subst">&#123;TARGET&#125;</span> 目录...\n&quot;</span>)</span><br><span class="line"><span class="keyword">for</span> path <span class="keyword">in</span> PATH_LIST:</span><br><span class="line">    url = <span class="string">f&quot;<span class="subst">&#123;TARGET&#125;</span>/<span class="subst">&#123;path&#125;</span>&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        resp = requests.get(url, headers=headers, timeout=<span class="number">3</span>)</span><br><span class="line">        <span class="comment"># 过滤404，只输出有效路径</span></span><br><span class="line">        <span class="keyword">if</span> resp.status_code != <span class="number">404</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[+] <span class="subst">&#123;url&#125;</span> -&gt; 状态码: <span class="subst">&#123;resp.status_code&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] <span class="subst">&#123;url&#125;</span> -&gt; 请求失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;\n[*] 扫描完成！&quot;</span>)</span><br></pre></td></tr></table></figure><hr><h3 id="2-密码爆破脚本：登录尝试-自动拿flag"><a href="#2-密码爆破脚本：登录尝试-自动拿flag" class="headerlink" title="2. 密码爆破脚本：登录尝试 + 自动拿flag"></a>2. 密码爆破脚本：登录尝试 + 自动拿flag</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">LOGIN_URL = <span class="string">&quot;https://httpbin.org/post&quot;</span></span><br><span class="line">USERNAME = <span class="string">&quot;admin&quot;</span></span><br><span class="line"><span class="comment"># 密码字典（实战可从文件读取）</span></span><br><span class="line">PASSWORD_LIST = [<span class="string">&quot;123456&quot;</span>, <span class="string">&quot;password&quot;</span>, <span class="string">&quot;admin&quot;</span>, <span class="string">&quot;root&quot;</span>, <span class="string">&quot;test123&quot;</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建会话对象，保持登录状态</span></span><br><span class="line">session = requests.Session()</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;[*] 开始爆破用户: <span class="subst">&#123;USERNAME&#125;</span> 密码...\n&quot;</span>)</span><br><span class="line"><span class="keyword">for</span> pwd <span class="keyword">in</span> PASSWORD_LIST:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[*] 正在尝试密码: <span class="subst">&#123;pwd&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        data = &#123;<span class="string">&quot;username&quot;</span>: USERNAME, <span class="string">&quot;password&quot;</span>: pwd&#125;</span><br><span class="line">        resp = session.post(LOGIN_URL, headers=headers, data=data, timeout=<span class="number">3</span>)</span><br><span class="line">        resp_json = resp.json()</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 登录成功判断（实战需改为页面特征如&quot;登录成功&quot;等）</span></span><br><span class="line">        <span class="keyword">if</span> (resp_json.get(<span class="string">&quot;form&quot;</span>, &#123;&#125;).get(<span class="string">&quot;username&quot;</span>) == USERNAME </span><br><span class="line">            <span class="keyword">and</span> resp_json.get(<span class="string">&quot;form&quot;</span>, &#123;&#125;).get(<span class="string">&quot;password&quot;</span>) == <span class="string">&quot;test123&quot;</span>):</span><br><span class="line">            </span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;\n✅ 爆破成功！用户: <span class="subst">&#123;USERNAME&#125;</span> 密码: <span class="subst">&#123;pwd&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="comment"># 登录成功后访问flag页面</span></span><br><span class="line">            flag_resp = session.get(<span class="string">&quot;https://httpbin.org/get&quot;</span>, headers=headers, timeout=<span class="number">3</span>)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[+] 获取Flag成功！状态码: <span class="subst">&#123;flag_resp.status_code&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">except</span> requests.exceptions.Timeout:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] <span class="subst">&#123;LOGIN_URL&#125;</span> -&gt; 请求超时，密码: <span class="subst">&#123;pwd&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> requests.exceptions.ConnectionError:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] <span class="subst">&#123;LOGIN_URL&#125;</span> -&gt; 连接失败，密码: <span class="subst">&#123;pwd&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] <span class="subst">&#123;LOGIN_URL&#125;</span> -&gt; 请求失败，错误信息: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>，密码: <span class="subst">&#123;pwd&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;\n[*] 爆破完成！&quot;</span>)</span><br></pre></td></tr></table></figure><hr><h2 id="四、常见错误-速查指南"><a href="#四、常见错误-速查指南" class="headerlink" title="四、常见错误 &amp; 速查指南"></a>四、常见错误 &amp; 速查指南</h2><h3 id="1-高频错误清单"><a href="#1-高频错误清单" class="headerlink" title="1. 高频错误清单"></a>1. 高频错误清单</h3><table><thead><tr><th>错误</th><th>原因</th><th>解决方法</th></tr></thead><tbody><tr><td><code>AttributeError: &#39;function&#39; object has no attribute &#39;text&#39;</code></td><td>把 <code>get</code> 写成了会话对象，或未调用函数就访问响应</td><td>检查是否对响应对象 <code>resp</code> 操作，而不是对 <code>s</code></td></tr><tr><td><code>Expecting value</code> JSON解析错误</td><td>对GET接口用POST，或响应不是JSON</td><td>检查请求方法（登录用 <code>POST</code>），确认接口返回格式</td></tr><tr><td>登录后无法访问flag页面</td><td>未用Session，混用了全局 <code>requests.post()</code></td><td>改用 <code>session.post()</code>，全程复用同一个会话</td></tr><tr><td>字典传值失败（字符串格式）</td><td>字典值未加引号，或变量名错误</td><td>检查引号，如 <code>&quot;username&quot;: USERNAME</code></td></tr><tr><td>脚本一遇到错误就崩</td><td>未加异常处理</td><td>加全局 <code>try...except</code> 捕获所有异常</td></tr></tbody></table><h3 id="2-实战速查"><a href="#2-实战速查" class="headerlink" title="2. 实战速查"></a>2. 实战速查</h3><ul><li>所有请求必须加 <code>timeout</code> 参数，避免脚本卡死</li><li>登录脚本要用 <code>POST</code>，不要误用 <code>GET</code> 请求</li><li><code>Session</code> 循环外创建，避免每次新建会话</li><li>字典传值要加引号，字符串变量要加引号</li><li>生产脚本必须加异常处理，保证稳定性</li></ul><hr><h2 id="五、学习总结-下一步计划"><a href="#五、学习总结-下一步计划" class="headerlink" title="五、学习总结 &amp; 下一步计划"></a>五、学习总结 &amp; 下一步计划</h2><h3 id="1-今日收获总结"><a href="#1-今日收获总结" class="headerlink" title="1. 今日收获总结"></a>1. 今日收获总结</h3><p>✅ <code>requests</code> 库基础语法：GET&#x2F;POST、headers、timeout、响应处理</p><p>✅ <code>Session</code> 会话对象原理与用法</p><p>✅ <code>for</code> 循环、<code>f-string</code>、<code>try...except</code> 编写脚本核心</p><p>✅ 目录扫描、密码爆破实战脚本编写</p><p>✅ 常见脚本错误排查与速查</p><h3 id="2-下一步学习方向"><a href="#2-下一步学习方向" class="headerlink" title="2. 下一步学习方向"></a>2. 下一步学习方向</h3><ol><li><strong>多线程加速</strong>：给扫描&#x2F;爆破脚本加多线程，速度提升 10 倍+</li><li><strong>编写自动拿flag脚本</strong>：结合正则提取flag，自动解码 base64&#x2F;hex</li><li><strong>Burp Suite 插件开发</strong>：用 Python 写 Burp 插件，定制化抓包分析</li><li><strong>高级 requests 用法</strong>：文件上传、代理设置、SSL证书验证、会话持久化</li></ol><hr><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>从零到一，系统梳理了 requests 库的核心语法与实战脚本。掌握了这些，你就能编写自己的渗透辅助脚本了！</p><blockquote><p>本文为学习记录，仅供技术交流学习使用，请勿用于非法用途。网络安全法律法规红线不可逾越。</p></blockquote>]]></content>
    
    
    <summary type="html">从零开始学习 Python requests 库，掌握目录扫描、暴力破解、自动登录等渗透测试必备技能</summary>
    
    
    
    <category term="Python" scheme="https://sanshisanfight.github.io/categories/Python/"/>
    
    <category term="网络安全" scheme="https://sanshisanfight.github.io/categories/Python/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/"/>
    
    
    <category term="Python" scheme="https://sanshisanfight.github.io/tags/Python/"/>
    
    <category term="requests" scheme="https://sanshisanfight.github.io/tags/requests/"/>
    
    <category term="HTTP" scheme="https://sanshisanfight.github.io/tags/HTTP/"/>
    
    <category term="目录扫描" scheme="https://sanshisanfight.github.io/tags/%E7%9B%AE%E5%BD%95%E6%89%AB%E6%8F%8F/"/>
    
    <category term="暴力破解" scheme="https://sanshisanfight.github.io/tags/%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3/"/>
    
    <category term="CTF" scheme="https://sanshisanfight.github.io/tags/CTF/"/>
    
  </entry>
  
  <entry>
    <title>用 iPhone 拍出电影感</title>
    <link href="https://sanshisanfight.github.io/2026/03/22/%E7%94%A8iPhone%E6%8B%8D%E5%87%BA%E7%94%B5%E5%BD%B1%E6%84%9F/"/>
    <id>https://sanshisanfight.github.io/2026/03/22/%E7%94%A8iPhone%E6%8B%8D%E5%87%BA%E7%94%B5%E5%BD%B1%E6%84%9F/</id>
    <published>2026-03-22T13:55:00.000Z</published>
    <updated>2026-03-25T06:14:13.609Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>一部 iPhone，加上正确的技巧，就能拍出电影质感的画面。本文系统梳理曝光控制、白平衡调整、升格降格应用等核心知识点。</p><p><strong>资料来源：</strong> <a href="https://www.bilibili.com/video/BV1Cm4y1F7Dx">影视飓风</a> 课程学习笔记</p></blockquote><h2 id="一、掌握曝光"><a href="#一、掌握曝光" class="headerlink" title="一、掌握曝光"></a>一、掌握曝光</h2><h3 id="曝光三要素"><a href="#曝光三要素" class="headerlink" title="曝光三要素"></a>曝光三要素</h3><p>光圈、ISO、快门 —— 经典曝光三角。</p><p>但手机没有物理光圈可调，所以核心就是 <strong>ISO</strong> 和 <strong>快门</strong> 两个参数。</p><p><strong>快门速度经验法则：</strong></p><table><thead><tr><th>帧率</th><th>推荐快门</th></tr></thead><tbody><tr><td>30fps</td><td>1&#x2F;60s</td></tr><tr><td>60fps</td><td>1&#x2F;120s</td></tr></tbody></table><p>一般控制在帧率的 <strong>两倍分之一</strong>。</p><p><img src="https://cdn.jsdelivr.net/gh/sanshisanfight/sanshisanfight.github.io@main/img/image-20260322173249807.png" alt="曝光参数示意"></p><p><img src="https://cdn.jsdelivr.net/gh/sanshisanfight/sanshisanfight.github.io@main/img/image-20260322173310367.png" alt="相机界面"></p><h3 id="自动曝光-vs-手动曝光"><a href="#自动曝光-vs-手动曝光" class="headerlink" title="自动曝光 vs 手动曝光"></a>自动曝光 vs 手动曝光</h3><p>不要依赖眼睛判断，要学会用工具判断是否过曝&#x2F;欠曝。</p><p><strong>直方图是关键：</strong></p><p><img src="https://cdn.jsdelivr.net/gh/sanshisanfight/sanshisanfight.github.io@main/img/image-20260322173552085.png" alt="直方图示意"></p><p><strong>曝光原则：</strong></p><ul><li>尽可能在不过曝的情况下，往右边曝光（ETTR 原则）</li><li>斑马纹控制在 <strong>80% 以下</strong></li><li>室内日光容易曝光正常</li><li>逆光场景如果调整不过来，说明已超过 iPhone 极限，需要取舍</li></ul><h3 id="强光场景的处理"><a href="#强光场景的处理" class="headerlink" title="强光场景的处理"></a>强光场景的处理</h3><p><strong>场景：</strong> 强日光 + 30fps</p><p>理论快门 1&#x2F;60s，ISO 400 时画面一片白（严重过曝）。</p><p><strong>解决方案优先级：</strong></p><ol><li>先降 ISO 到最低</li><li>如果还过曝 → 牺牲动态模糊，提高快门到 1&#x2F;2000s<ul><li>代价：画面不够顺滑</li></ul></li><li>如果快门和 ISO 都动不了 → <strong>ND 滤镜</strong>（削减光强，不影响偏色）</li></ol><h3 id="不同光线环境策略"><a href="#不同光线环境策略" class="headerlink" title="不同光线环境策略"></a>不同光线环境策略</h3><table><thead><tr><th>场景</th><th>策略</th></tr></thead><tbody><tr><td>Golden Hour</td><td>不希望太多过曝，也不希望全部欠曝，平衡取舍</td></tr><tr><td>室内夜晚</td><td>快门 1&#x2F;60s，ISO 100 可能欠曝，可提升到 1600，再高噪点明显</td></tr><tr><td>静态物体</td><td>可降一档曝光，降低 ISO 减少噪点</td></tr></tbody></table><hr><h2 id="二、掌握画面的颜色-——-白平衡与色调"><a href="#二、掌握画面的颜色-——-白平衡与色调" class="headerlink" title="二、掌握画面的颜色 —— 白平衡与色调"></a>二、掌握画面的颜色 —— 白平衡与色调</h2><h3 id="什么是色温？"><a href="#什么是色温？" class="headerlink" title="什么是色温？"></a>什么是色温？</h3><p><strong>色温</strong> 描述光的冷暖，单位是开尔文（K）。</p><table><thead><tr><th>光源</th><th>色温</th></tr></thead><tbody><tr><td>火柴燃烧</td><td>~1700K</td></tr><tr><td>日出&#x2F;日落</td><td>~1850K</td></tr><tr><td>正午阳光</td><td>5500-6000K</td></tr><tr><td>阴天</td><td>~6500K</td></tr><tr><td>晴朗蓝天</td><td>10000K+</td></tr></tbody></table><p><img src="https://cdn.jsdelivr.net/gh/sanshisanfight/sanshisanfight.github.io@main/img/image-20260322181931408.png" alt="色温示意"></p><p><img src="https://cdn.jsdelivr.net/gh/sanshisanfight/sanshisanfight.github.io@main/img/image-20260322182111154.png" alt="色温对比"></p><h3 id="白平衡的作用"><a href="#白平衡的作用" class="headerlink" title="白平衡的作用"></a>白平衡的作用</h3><p>告诉相机当前环境的色温 K 值，把物体颜色校正回本来的样子。</p><p><strong>校正标准：</strong> 白色校正回纯白，灰色校正回灰色。</p><p>这个过程叫 <strong>「对白」</strong>。</p><h3 id="白平衡与色温的关系"><a href="#白平衡与色温的关系" class="headerlink" title="白平衡与色温的关系"></a>白平衡与色温的关系</h3><p>可以理解成天平：</p><ul><li><strong>白平衡 K &lt; 环境色温</strong> → 认为拍摄暖色 → 加冷校正</li><li><strong>白平衡 K &gt; 环境色温</strong> → 认为拍摄冷色 → 加黄校正</li></ul><p><strong>实操建议：</strong></p><ul><li>不建议一直开自动白平衡（会因不同物体持续变化）</li><li>先让自动跑完，再精调</li></ul><h3 id="色调修正"><a href="#色调修正" class="headerlink" title="色调修正"></a>色调修正</h3><p>如果画面总是偏品红或偏绿，用 <strong>色调-色偏</strong> 来修正。</p><p><strong>核心原则：</strong> 前期正确曝光 + 正确白平衡，后期再调整想要的效果。</p><hr><h2 id="三、拍摄技巧-——-升格与降格"><a href="#三、拍摄技巧-——-升格与降格" class="headerlink" title="三、拍摄技巧 —— 升格与降格"></a>三、拍摄技巧 —— 升格与降格</h2><h3 id="升格镜头（慢动作）"><a href="#升格镜头（慢动作）" class="headerlink" title="升格镜头（慢动作）"></a>升格镜头（慢动作）</h3><p><strong>为什么叫升格？</strong> 帧率提升，播放时间拉长。</p><p><strong>设置技巧：</strong></p><ol><li>快门速度控制在帧率两倍左右</li><li>拍摄 120fps 慢动作 → 快门靠近 1&#x2F;240s</li><li><strong>小技巧：</strong> 把快门改成角度模式，设为 180°，自动换算</li></ol><p><img src="https://cdn.jsdelivr.net/gh/sanshisanfight/sanshisanfight.github.io@main/img/image-20260322193959133.png" alt="升格设置"></p><p><strong>操作步骤：</strong></p><ol><li>设置 30fps 基准帧率</li><li>点击 OFF SPEED</li><li>帧率变成两个：左边拍摄帧率，右边播放帧率</li><li>拍摄 5 秒 → 播放变成 4 倍时长</li></ol><p><img src="https://cdn.jsdelivr.net/gh/sanshisanfight/sanshisanfight.github.io@main/img/image-20260322194201978.png" alt="帧率设置"></p><h3 id="降格镜头（延时摄影）"><a href="#降格镜头（延时摄影）" class="headerlink" title="降格镜头（延时摄影）"></a>降格镜头（延时摄影）</h3><p>适合拍摄云流动、车流、日出日落等场景。</p><p><img src="https://cdn.jsdelivr.net/gh/sanshisanfight/sanshisanfight.github.io@main/img/image-20260322215537406.png" alt="降格设置"></p><hr><h2 id="四、调色的魅力"><a href="#四、调色的魅力" class="headerlink" title="四、调色的魅力"></a>四、调色的魅力</h2><h3 id="调色流程"><a href="#调色流程" class="headerlink" title="调色流程"></a>调色流程</h3><ol><li><strong>一级调色</strong>：亮度、色相、饱和度</li><li><strong>二级调色</strong>：Log 画面手动还原</li><li><strong>Log 调色全流程</strong></li></ol><h3 id="一级调色要点"><a href="#一级调色要点" class="headerlink" title="一级调色要点"></a>一级调色要点</h3><p><strong>色轮</strong> 可以调整：</p><ul><li>亮度</li><li>色相</li><li>饱和度</li></ul><p><strong>练习：对白</strong></p><p>环境色温 4000K，相机白平衡 7000K → 校正到正确颜色。</p><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><table><thead><tr><th>模块</th><th>核心要点</th></tr></thead><tbody><tr><td>曝光</td><td>ISO + 快门，直方图判断，ETTR 原则</td></tr><tr><td>白平衡</td><td>理解色温，先自动再精调</td></tr><tr><td>升格</td><td>快门 &#x3D; 帧率 × 2，角度模式 180°</td></tr><tr><td>降格</td><td>延时摄影，适合大范围运动场景</td></tr><tr><td>调色</td><td>一级校正，二级风格化</td></tr></tbody></table><blockquote><p>曝光和白平衡没有标准答案，多拍多练，找到自己的风格。</p></blockquote><hr><p><em>本文为学习笔记整理，持续更新中。</em></p>]]></content>
    
    
    <summary type="html">掌握曝光、白平衡、升格降格技巧，用 iPhone 拍出电影质感的视频</summary>
    
    
    
    <category term="摄影" scheme="https://sanshisanfight.github.io/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="iPhone" scheme="https://sanshisanfight.github.io/tags/iPhone/"/>
    
    <category term="摄影" scheme="https://sanshisanfight.github.io/tags/%E6%91%84%E5%BD%B1/"/>
    
    <category term="电影感" scheme="https://sanshisanfight.github.io/tags/%E7%94%B5%E5%BD%B1%E6%84%9F/"/>
    
    <category term="曝光" scheme="https://sanshisanfight.github.io/tags/%E6%9B%9D%E5%85%89/"/>
    
    <category term="调色" scheme="https://sanshisanfight.github.io/tags/%E8%B0%83%E8%89%B2/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://sanshisanfight.github.io/2025/08/11/hello-world/"/>
    <id>https://sanshisanfight.github.io/2025/08/11/hello-world/</id>
    <published>2025-08-10T17:35:32.062Z</published>
    <updated>2025-08-10T17:35:32.063Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    
  </entry>
  
</feed>
