<?xml version="1.0" encoding="utf-8"?>
<search> 
  
  
    
    <entry>
      <title>13_Hexo-操作记录</title>
      <link href="/posts/db7b8b04.html"/>
      <url>/posts/db7b8b04.html</url>
      
        <content type="html"><![CDATA[<h2 id="01-Giscus-评论系统">01. Giscus 评论系统<a class="header-anchor" href="#01-Giscus-评论系统"></a></h2><p>博客弃用 Twikoo，改用 Giscus 进行评论</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://butterfly.js.org/posts/4aa8abbe/#%E8%A9%95%E8%AB%96">butterfly</a></p></li><li class="lvl-3"><p><a href="https://github.com/NX-Official/NX-Official.github.io/discussions">Nick Xu</a></p></li></ol><p>网址：<a href="https://giscus.app/zh-CN">https://giscus.app/zh-CN</a></p><p><s>Discussion 分类选择 <code>General</code></s></p><p>Discussion 分类选择 <code>Announcements</code>，填写信息后获取 <code>repo_id</code>、<code>category_id</code></p><p>需注意 Giscus 不支持最新评论，详见 <a href="https://butterfly.js.org/posts/4aa8abbe/#Aside">butterfly</a></p><p>引入的 cdn 资源为 <a href="https://giscus.app/client.js">https://giscus.app/client.js</a> ，暂未找到第三方 npm cdn。可自建 Giscus，参考 <a href="https://github.com/xaoxuu/giscus/discussions/3#discussioncomment-7990318">xaoxuu</a></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><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"># Giscus</span></span><br><span class="line"><span class="comment"># https://giscus.app/</span></span><br><span class="line"><span class="attr">giscus:</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">xx/xx</span></span><br><span class="line">  <span class="attr">repo_id:</span> <span class="string">xx</span></span><br><span class="line">  <span class="attr">category_id:</span> <span class="string">xx</span></span><br><span class="line">  <span class="attr">theme:</span></span><br><span class="line">    <span class="attr">light:</span> <span class="string">light</span></span><br><span class="line">    <span class="attr">dark:</span> <span class="string">dark</span></span><br><span class="line">  <span class="attr">option:</span></span><br><span class="line">    <span class="attr">data-category:</span> <span class="string">Announcements</span></span><br><span class="line">    <span class="attr">data-input-position:</span> <span class="string">top</span></span><br><span class="line">    <span class="attr">data-lang:</span> <span class="string">zh-CN</span></span><br><span class="line">    <span class="attr">data-loading:</span> <span class="string">lazy</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>其它参考</p><ol><li class="lvl-3"><p>自建 Giscus，未使用 <a href="https://github.com/xaoxuu/giscus/discussions/3#discussioncomment-7990318">xaoxuu</a></p></li><li class="lvl-3"><p><a href="https://github.com/eallion/eallion.com/discussions">https://github.com/eallion/eallion.com/discussions</a></p></li><li class="lvl-3"><p><a href="https://github.com/xaoxuu/blog-comments/discussions">https://github.com/xaoxuu/blog-comments/discussions</a></p></li></ol>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>12_Hexo-GitHub Actions 发布博客静态资源至 NPM</title>
      <link href="/posts/8d01af11.html"/>
      <url>/posts/8d01af11.html</url>
      
        <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>将博客静态文件上传至 github，通过 github action 自动发包至 npm，使用 <a href="https://npmmirror.com/">npmmirror</a> cdn</p><h2 id="npm-命令">npm 命令<a class="header-anchor" href="#npm-命令"></a></h2><p>网址: <a href="https://www.npmjs.com/">https://www.npmjs.com/</a></p><p><strong>切换源</strong></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"># https://blog.anheyu.com/posts/sdxhu.html#npm-镜像</span></span><br><span class="line"></span><br><span class="line">npm config <span class="built_in">set</span> registry http://registry.npmmirror.com</span><br><span class="line"><span class="comment"># 切回源</span></span><br><span class="line">npm config <span class="built_in">set</span> registry https://registry.npmjs.org/</span><br></pre></td></tr></table></figure><p><strong>添加本地 npm 用户</strong></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"># 仅第一次使用需要添加用户，之后会提示你输入你的npm账号密码以及注册邮箱</span></span><br><span class="line">npm adduser</span><br><span class="line"><span class="comment"># 非第一次使用直接登录即可，之后会提示你输入你的npm账号密码以及注册邮箱</span></span><br><span class="line">npm login</span><br></pre></td></tr></table></figure><p><strong>初始化</strong></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">npm init</span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2024/image/202403242339716.jpg" alt="image-20240324233905199" style="zoom: 50%;" /><p><strong>发布</strong></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">npm publish</span><br></pre></td></tr></table></figure><p><strong>生成 npm token</strong></p><p>npm 官网 =&gt; 头像 =&gt; Access Tokens =&gt; Generate New Token =&gt; 勾选 Automation</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2024/image/202403242343688.jpg" alt="image-20240324234307284" style="zoom: 33%;" /><p>github 仓库新增 <code>NPM_TOKEN</code> 的 secrets</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2024/image/202403250021463.jpg" alt="image-20240325002106180" style="zoom: 25%;" /><h2 id="示例">示例<a class="header-anchor" href="#示例"></a></h2><h3 id="package-json">package.json<a class="header-anchor" href="#package-json"></a></h3><p><code>scripts/generate_package_json.js</code>，生成 public/package.json</p><figure class="highlight javascript"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// 生成 public/.package.json</span></span><br><span class="line"><span class="comment">// https://blog.anheyu.com/posts/72ea.html</span></span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">generator</span>.<span class="title function_">register</span>(<span class="string">&#x27;npmpackagejson&#x27;</span>, <span class="keyword">function</span>(<span class="params">locals</span>)&#123;</span><br><span class="line"><span class="comment">// Object</span></span><br><span class="line"><span class="keyword">return</span> &#123;</span><br><span class="line"><span class="attr">path</span>: <span class="string">&#x27;/package.json&#x27;</span>,</span><br><span class="line"><span class="attr">data</span>: <span class="string">`&#123;</span></span><br><span class="line"><span class="string">  &quot;name&quot;: &quot;mycpen-blog&quot;,</span></span><br><span class="line"><span class="string">  &quot;version&quot;: &quot;0.0.0&quot;,</span></span><br><span class="line"><span class="string">  &quot;description&quot;: &quot;mycpen blog static file&quot;,</span></span><br><span class="line"><span class="string">  &quot;main&quot;: &quot;index.js&quot;,</span></span><br><span class="line"><span class="string">  &quot;directories&quot;: &#123;</span></span><br><span class="line"><span class="string">    &quot;lib&quot;: &quot;lib&quot;</span></span><br><span class="line"><span class="string">  &#125;,</span></span><br><span class="line"><span class="string">  &quot;scripts&quot;: &#123;</span></span><br><span class="line"><span class="string">    &quot;test&quot;: &quot;echo \\&quot;Error: no test specified\\&quot; &amp;&amp; exit 1&quot;</span></span><br><span class="line"><span class="string">  &#125;,</span></span><br><span class="line"><span class="string">  &quot;repository&quot;: &#123;</span></span><br><span class="line"><span class="string">    &quot;type&quot;: &quot;git&quot;,</span></span><br><span class="line"><span class="string">    &quot;url&quot;: &quot;git+https://github.com/mycpen/blog.git&quot;</span></span><br><span class="line"><span class="string">  &#125;,</span></span><br><span class="line"><span class="string">  &quot;author&quot;: &quot;mycpen&quot;,</span></span><br><span class="line"><span class="string">  &quot;license&quot;: &quot;ISC&quot;,</span></span><br><span class="line"><span class="string">  &quot;bugs&quot;: &#123;</span></span><br><span class="line"><span class="string">    &quot;url&quot;: &quot;https://github.com/mycpen/blog/issues&quot;</span></span><br><span class="line"><span class="string">  &#125;,</span></span><br><span class="line"><span class="string">  &quot;homepage&quot;: &quot;https://github.com/mycpen/blog#readme&quot;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">`</span>&#125;;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="npm-push">npm push<a class="header-anchor" href="#npm-push"></a></h3><p><code>scripts/npmpublish.js</code>，生成 public/.github/workflows/autopublish.yml</p><figure class="highlight javascript"><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="comment">// 生成 public/.github/workflows/autopublish.yml</span></span><br><span class="line"><span class="comment">// 推送静态资源至 npm</span></span><br><span class="line"><span class="comment">// https://akilar.top/posts/e82444a6/#具体操作步骤</span></span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">generator</span>.<span class="title function_">register</span>(<span class="string">&#x27;npmpush&#x27;</span>, <span class="keyword">function</span>(<span class="params">locals</span>)&#123;</span><br><span class="line">  <span class="comment">// Object</span></span><br><span class="line">  <span class="keyword">return</span> &#123;</span><br><span class="line">    <span class="attr">path</span>: <span class="string">&#x27;/.github/workflows/autopublish.yml&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: <span class="string">`name: Node.js Package</span></span><br><span class="line"><span class="string"># 监测分支，2020年10月后github新建仓库默认分支改为main，记得更改</span></span><br><span class="line"><span class="string">on:</span></span><br><span class="line"><span class="string">  push:</span></span><br><span class="line"><span class="string">    branches:</span></span><br><span class="line"><span class="string">      - main</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">jobs:</span></span><br><span class="line"><span class="string">  publish-npm:</span></span><br><span class="line"><span class="string">    runs-on: ubuntu-latest</span></span><br><span class="line"><span class="string">    steps:</span></span><br><span class="line"><span class="string">      - uses: actions/checkout@v2</span></span><br><span class="line"><span class="string">      - uses: actions/setup-node@v1</span></span><br><span class="line"><span class="string">        with:</span></span><br><span class="line"><span class="string">          node-version: &quot;18.x&quot;</span></span><br><span class="line"><span class="string">          registry-url: https://registry.npmjs.org/</span></span><br><span class="line"><span class="string">      - run: npm publish</span></span><br><span class="line"><span class="string">        env:</span></span><br><span class="line"><span class="string">          NODE_AUTH_TOKEN: `</span>+ <span class="string">&#x27;$&#123;&#123;secrets.npm_token&#125;&#125;&#x27;</span> + <span class="string">`</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">      - name: Wait for 3 minutes</span></span><br><span class="line"><span class="string">        run: sleep 180 # 等待 3 分钟，单位为秒</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">      - name: Sync package from npm to npmmirror</span></span><br><span class="line"><span class="string">        run: |</span></span><br><span class="line"><span class="string">          npm install -g cnpm --registry=https://registry.npmmirror.com</span></span><br><span class="line"><span class="string">          cnpm sync mycpen-blog</span></span><br><span class="line"><span class="string">`</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="npmignore">.npmignore<a class="header-anchor" href="#npmignore"></a></h3><p><code>scripts/npmignore.js</code>，生成 public/.npmignore。目的 不提交 .html 这类文件至 npm</p><figure class="highlight javascript"><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">// 生成 public/.npmignore</span></span><br><span class="line"><span class="comment">// https://akilar.top/posts/e82444a6/</span></span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">generator</span>.<span class="title function_">register</span>(<span class="string">&#x27;npmignore&#x27;</span>, <span class="keyword">function</span>(<span class="params">locals</span>)&#123;</span><br><span class="line"><span class="comment">// Object</span></span><br><span class="line"><span class="keyword">return</span> &#123;</span><br><span class="line"><span class="attr">path</span>: <span class="string">&#x27;/.npmignore&#x27;</span>,</span><br><span class="line"><span class="attr">data</span>: <span class="string">`**/*.html</span></span><br><span class="line"><span class="string">.github/</span></span><br><span class="line"><span class="string">download/</span></span><br><span class="line"><span class="string">ads.txt</span></span><br><span class="line"><span class="string">CNAME</span></span><br><span class="line"><span class="string">robots.txt</span></span><br><span class="line"><span class="string">`</span>&#125;;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="change-version">change version<a class="header-anchor" href="#change-version"></a></h3><p><code>.github/replace-localfile-url.py</code>，修改 public/package.json version</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考  https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数：search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result, search_fileType_list</span>):</span><br><span class="line">    <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line">    all_file = os.listdir(search_path)</span><br><span class="line">    <span class="comment"># 对于每一个文件</span></span><br><span class="line">    <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line">        <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line">        <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line">            <span class="comment"># 递归查找</span></span><br><span class="line">            search(search_path + each_file + <span class="string">&#x27;/&#x27;</span>, search_result, search_fileType_list)</span><br><span class="line">        <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> search_fileType_list:</span><br><span class="line">                <span class="keyword">if</span> re.findall(<span class="string">f&#x27;.*\\<span class="subst">&#123;i&#125;</span>$&#x27;</span>, each_file) == [each_file]:</span><br><span class="line">                    search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i &#x27;s/old_str/new_str/&#x27;</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径，replace_old_str 要替换的字符，replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;r&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f1: </span><br><span class="line">        content = f1.read()</span><br><span class="line">        f1.close()</span><br><span class="line">        t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;w&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f2:</span><br><span class="line">        f2.write(t)</span><br><span class="line">    f2.close()</span><br><span class="line"></span><br><span class="line"><span class="comment"># ==================================================================</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># npm time version | npm_converted_time</span></span><br><span class="line"><span class="comment"># ------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># 将数字和字母对应关系定义为字典</span></span><br><span class="line">npm_num_mapping = &#123;</span><br><span class="line">    <span class="string">&#x27;0&#x27;</span>: [<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;u&#x27;</span>], <span class="string">&#x27;1&#x27;</span>: [<span class="string">&#x27;c&#x27;</span>, <span class="string">&#x27;d&#x27;</span>, <span class="string">&#x27;v&#x27;</span>], <span class="string">&#x27;2&#x27;</span>: [<span class="string">&#x27;e&#x27;</span>, <span class="string">&#x27;f&#x27;</span>, <span class="string">&#x27;w&#x27;</span>], <span class="string">&#x27;3&#x27;</span>: [<span class="string">&#x27;g&#x27;</span>, <span class="string">&#x27;h&#x27;</span>, <span class="string">&#x27;x&#x27;</span>],</span><br><span class="line">    <span class="string">&#x27;4&#x27;</span>: [<span class="string">&#x27;i&#x27;</span>, <span class="string">&#x27;j&#x27;</span>, <span class="string">&#x27;y&#x27;</span>], <span class="string">&#x27;5&#x27;</span>: [<span class="string">&#x27;k&#x27;</span>, <span class="string">&#x27;l&#x27;</span>, <span class="string">&#x27;z&#x27;</span>], <span class="string">&#x27;6&#x27;</span>: [<span class="string">&#x27;m&#x27;</span>, <span class="string">&#x27;n&#x27;</span>], <span class="string">&#x27;7&#x27;</span>: [<span class="string">&#x27;o&#x27;</span>, <span class="string">&#x27;p&#x27;</span>],</span><br><span class="line">    <span class="string">&#x27;8&#x27;</span>: [<span class="string">&#x27;q&#x27;</span>, <span class="string">&#x27;r&#x27;</span>], <span class="string">&#x27;9&#x27;</span>: [<span class="string">&#x27;s&#x27;</span>, <span class="string">&#x27;t&#x27;</span>]</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment"># 当前时间</span></span><br><span class="line">npm_now = datetime.now()</span><br><span class="line"><span class="comment"># 格式化当前时间为指定格式 2403230741</span></span><br><span class="line">npm_formatted_time = npm_now.strftime(<span class="string">&quot;%y%m%d%H%M&quot;</span>)</span><br><span class="line"><span class="comment"># 数字替换为随机映射字母   ejugfhupjv</span></span><br><span class="line">npm_converted_time = <span class="string">&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> char <span class="keyword">in</span> npm_formatted_time:</span><br><span class="line">    <span class="keyword">if</span> char.isdigit():</span><br><span class="line">        npm_converted_time += <span class="string">&#x27;&#x27;</span>.join(random.choice(npm_num_mapping[char]) <span class="keyword">if</span> char <span class="keyword">in</span> npm_num_mapping <span class="keyword">else</span> char)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        npm_converted_time += char</span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 package.json 0.0.0</span></span><br><span class="line">result_npmPackageJson = [<span class="string">&#x27;./public/package.json&#x27;</span>]</span><br><span class="line">old_npmPackageJson_version = <span class="string">&#x27;0.0.0&#x27;</span></span><br><span class="line">new_npmPackageJson_version = <span class="string">f&#x27;0.0.0-<span class="subst">&#123;npm_converted_time&#125;</span>&#x27;</span></span><br><span class="line">count = <span class="number">0</span></span><br><span class="line"><span class="comment"># json</span></span><br><span class="line"><span class="keyword">for</span> file_name <span class="keyword">in</span> result_npmPackageJson:</span><br><span class="line">    replace(file_name, old_npmPackageJson_version, new_npmPackageJson_version)</span><br><span class="line">    count += <span class="number">1</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;&#123;&#125; done  &#123;&#125;&quot;</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><code>.github/workflows/autodeploy.yml</code>，执行上方 py 脚本 <code>- name: Replace localFile URL</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Auto</span> <span class="string">deploy</span></span><br><span class="line"><span class="comment"># 当有改动推送到master分支时，启动Action</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">检查分支</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">ref:</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">szenius/set-timezone@v1.0</span> <span class="comment"># 设置执行环境的时区</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">timezoneLinux:</span> <span class="string">&quot;Asia/Shanghai&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Node</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v1</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&quot;18.x&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Hexo</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          export TZ=&#x27;Asia/Shanghai&#x27;</span></span><br><span class="line"><span class="string">          npm install hexo-cli -g</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">缓存</span> <span class="string">Hexo</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">cache</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">node_modules</span></span><br><span class="line">          <span class="attr">key:</span> <span class="string">$&#123;&#123;runner.OS&#125;&#125;-$&#123;&#123;hashFiles(&#x27;**/package-lock.json&#x27;)&#125;&#125;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装依赖</span></span><br><span class="line">        <span class="attr">if:</span> <span class="string">steps.cache.outputs.cache-hit</span> <span class="type">!=</span> <span class="string">&#x27;true&#x27;</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          npm install gulp-cli -g #全局安装gulp</span></span><br><span class="line"><span class="string">          npm install --save</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Generate</span> <span class="string">static</span> <span class="string">file</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          hexo clean ; hexo generate ; gulp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">up</span> <span class="string">Python</span> <span class="number">3.10</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-python@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">python-version:</span> <span class="string">&quot;3.10&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          python -m pip install --upgrade pip</span></span><br><span class="line"><span class="string">          pip install requests</span></span><br><span class="line"><span class="string"></span>      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Replace</span> <span class="string">imageBed</span> <span class="string">URL</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          python .github/replace-imgbed-url-v2.py</span></span><br><span class="line"><span class="string"></span>      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Replace</span> <span class="string">localFile</span> <span class="string">URL</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          python .github/replace-localfile-url.py</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Delete</span> <span class="string">static</span> <span class="string">file</span> <span class="string">repository</span> <span class="string">tags</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          mkdir tmp_mycpen</span></span><br><span class="line"><span class="string">          cd tmp_mycpen</span></span><br><span class="line"><span class="string">          git clone https://github.com/mycpen/blog.git</span></span><br><span class="line"><span class="string">          cd blog</span></span><br><span class="line"><span class="string">          git push --force --quiet &quot;https://mycpen:$&#123;&#123; secrets.GH_TOKEN &#125;&#125;@github.com/mycpen/blog.git&quot; --delete $(git tag -l)</span></span><br><span class="line"><span class="string">          cd ../..</span></span><br><span class="line"><span class="string">          rm -rf tmp_mycpen</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">static</span> <span class="string">file</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          cd ./public</span></span><br><span class="line"><span class="string">          git init</span></span><br><span class="line"><span class="string">          git config --global user.email &#x27;github-actions[bot]@users.noreply.github.com&#x27;</span></span><br><span class="line"><span class="string">          git config --global user.name &#x27;github-actions[bot]&#x27;</span></span><br><span class="line"><span class="string">          git add .</span></span><br><span class="line"><span class="string">          git commit -m &quot;$(date +&#x27;%Y/%m/%d&#x27;)&quot;</span></span><br><span class="line"><span class="string">          tag_name=$(date +&#x27;%y.%m.%d&#x27;)</span></span><br><span class="line"><span class="string">          git tag $tag_name</span></span><br><span class="line"><span class="string">          git push --force --quiet &quot;https://mycpen:$&#123;&#123; secrets.GH_TOKEN &#125;&#125;@github.com/mycpen/blog.git&quot; $tag_name</span></span><br><span class="line"><span class="string">          git push --force --quiet &quot;https://mycpen:$&#123;&#123; secrets.GH_TOKEN &#125;&#125;@github.com/mycpen/blog.git&quot; master:main</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Purge</span> <span class="string">JSD</span> <span class="string">cache</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          jsd_purge_urls=(&quot;https://purge.jsdelivr.net/gh/mycpen/blog/&quot; &quot;https://purge.jsdelivr.net/gh/mycpen/blog@latest/&quot; &quot;https://purge.jsdelivr.net/gh/mycpen/blog@main/&quot;)</span></span><br><span class="line"><span class="string">          for url in &quot;$&#123;jsd_purge_urls[@]&#125;&quot;; do curl -s $url; done</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">推送百度</span> <span class="string">url</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          hexo deploy</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Delete</span> <span class="string">workflow</span> <span class="string">runs</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">Mattraks/delete-workflow-runs@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GH_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">repository:</span> <span class="string">$&#123;&#123;</span> <span class="string">github.repository</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">retain_days:</span> <span class="number">30</span></span><br><span class="line">          <span class="attr">keep_minimum_runs:</span> <span class="number">6</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="参考">参考<a class="header-anchor" href="#参考"></a></h2><ol><li class="lvl-3"><p><a href="https://akilar.top/posts/e82444a6/">akilar | github-action推送博客部署仓库至NPM</a></p></li><li class="lvl-3"><p><a href="https://akilar.top/posts/3e956346/">akilar | npm图床</a></p></li><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/b228.html">安知鱼 | hexo博客工作流CI</a></p></li><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/72ea.html">安知鱼 | npm图床</a></p></li><li class="lvl-3"><p><a href="https://www.cnblogs.com/index-html/p/npm-upload.html#%E6%97%A0%E7%8A%B6%E6%80%81">EtherDream | 文件一键上传到 NPM</a></p></li><li class="lvl-3"><p><a href="https://npmmirror.com/">npmmirror | 同步模块 cnpm sync cnpmcore</a></p></li><li class="lvl-3"><p><a href="https://github.com/ChenYFan/CyanBlog/blob/main/prescripts/pkgpublish.js">github | CyanBlog/pkgpublish.js</a></p></li></ol>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> GitHub </tag>
            
            <tag> NPM </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>06_转载-自我提升的8个好习惯</title>
      <link href="/posts/85a8374a.html"/>
      <url>/posts/85a8374a.html</url>
      
        <content type="html"><![CDATA[<p>原文：<a href="https://blog.zhuxu.xyz/archives/343/">https://blog.zhuxu.xyz/archives/343/</a></p><table><thead><tr><th colspan="2">自我提升的8个好习惯</th></tr></thead><tbody><tr><td>学习新技能</td><td>学会和自己比较</td></tr><tr><td>培养一个兴趣爱好</td><td>每天早起半小时</td></tr><tr><td>不过度透支自己</td><td>反省自己</td></tr><tr><td>保持阅读</td><td>保持好的心态</td></tr></tbody></table><h2 id="1-学习新技能">1. 学习新技能<a class="header-anchor" href="#1-学习新技能"></a></h2><p>  很多人其实不敢承认，自己害怕接受新事物、学习新技能。不是因为畏惧艰难，而是不想改变旧有的思考方式。</p><p>  然而这个时代变化飞快，唯有不断提升自己，才能跟上时代的步伐。时间对每个人都是公平的，日日精进不懈怠，才能遇见更好的自己。</p><h2 id="2-学会和自己比较">2. 学会和自己比较<a class="header-anchor" href="#2-学会和自己比较"></a></h2><p>  这个世界上，有多少人就有多少种生活方式、多少种人生目标。不要拿别人的长处，否定自己的短处，也不要羡慕别人拥有的，放大自己没有的，更不要在比较中迷失自我，忽略自己的幸福。</p><p>  人各有各的活法，没什么好比较的，当你想明白这一点，自然就能静下心来。</p><h2 id="3-培养一个兴趣爱好">3. 培养一个兴趣爱好<a class="header-anchor" href="#3-培养一个兴趣爱好"></a></h2><p>  人若有自己的兴趣爱好，生活会呈现出另一番景象。悲伤失落时，投入到兴趣中，情绪就有了排解的出口。烦躁不安时，做点喜欢的事，也会忘记烦恼、渐渐开心起来。</p><p>  一旦有了精神食粮，你会变得越来越欣赏自己，身体自然也会充满无限力量。</p><h2 id="4-每天早起半小时">4. 每天早起半小时<a class="header-anchor" href="#4-每天早起半小时"></a></h2><p>  经常听到有人说，想要自律，但不知道从何做起。那你可以尝试从每天早起30分钟开始。</p><p>  早起，意味着你有比别人更充足的时间，去准备一天的工作和生活。更重要的是，早起会让你拥有人生的掌控感，找到自己生活的节奏。早起看似是一件微不足道的小事，但在日复一日的坚持后，你会发现人生已悄然改变。</p><h2 id="5-不过度透支自己">5. 不过度透支自己<a class="header-anchor" href="#5-不过度透支自己"></a></h2><p>  很多人往往意识不到健康的重要性，总以为自己是金刚不坏之身，于是通宵熬夜、暴饮暴食，肆无忌惮地透支身体。时间久了，生活将不得不按下暂停键，用来弥补这些毫无节制的消耗。</p><p>  按时吃饭、早睡早起、坚持运动，只有对自己的身体好，身体才会给你更好的回馈。只有拥有了健康，你才能去创造更精彩的人生。</p><h2 id="6-反省自己">6. 反省自己<a class="header-anchor" href="#6-反省自己"></a></h2><p>  一个人的优秀，离不开不断的复盘和总结。每天睡觉前，可以花15分钟对这一天的经历做个简单的复盘和总结。</p><p>  哪些地方没有做好，哪些地方还可以做得更好……在这个过程中，及时总结经验、改正错误，才能在人生的道路上行稳致远。</p><h2 id="7-保持阅读">7. 保持阅读<a class="header-anchor" href="#7-保持阅读"></a></h2><p>  阅读对一个人的重要性，不只在于习得新知识，更在于它能帮助我们保持深度思考的能力，继而获得更快的成长。</p><p>  有空时，记得多读书。读书是为自己的心注入更多光亮的过程。我们所读过的每一本书，都将引领我们走向更美好的明天。</p><h2 id="8-保持好的心态">8. 保持好的心态<a class="header-anchor" href="#8-保持好的心态"></a></h2><p>  我们在生活中常常要去面对各种未知、困境和麻烦，心态不好的人会觉得这是一场磨难，而心态好的人则会把它当成一场历练。</p><p>  很多时候，心态决定了人生的状态。我们不能决定生活中会发生什么，但可以决定自己以什么样的心态应对。 保持良好的心态，才能拥有美好的未来。</p><blockquote><p>来源：十点读书 | 作者：小嗲 | 主播：赵文龙</p></blockquote>]]></content>
      
      
      <categories>
          
          <category> 转载 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 转载 </tag>
            
            <tag> 习惯 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>05_转载-延寿指南-反向面试-文档写作规范</title>
      <link href="/posts/285c50ae.html"/>
      <url>/posts/285c50ae.html</url>
      
        <content type="html"><![CDATA[<h2 id="程序员延寿指南">程序员延寿指南<a class="header-anchor" href="#程序员延寿指南"></a></h2><p>原文：<a href="https://github.com/geekan/HowToLiveLonger">https://github.com/geekan/HowToLiveLonger</a><br>issue：<a href="https://github.com/geekan/HowToLiveLonger/issues/143">https://github.com/geekan/HowToLiveLonger/issues/143</a></p><p>最佳操作包括：</p><ol><li class="lvl-3"><p>饮食方面：多吃蔬果和白肉，少吃蛋黄和超加工食物；中量碳水、多吃植物蛋白；多吃辣和坚果；少喝或不喝甜味饮料，喝咖啡、茶和牛奶；戒酒或每周饮酒量不超过100g。</p></li><li class="lvl-3"><p>运动方面：每周进行3次45分钟的挥拍运动。</p></li><li class="lvl-3"><p>日常生活方面：每天刷牙，睡眠时间为7小时，最好在22-24点间睡觉。</p></li><li class="lvl-3"><p>其他方面：保持健康体重，不吸烟，晒太阳，服用二甲双胍、复合维生素、亚精胺和葡萄糖胺等药物。</p></li></ol><p>以上操作可以降低全因死亡率，增加预期寿命，从而稳健地活得更久。但是需要注意，各个变量之间并不符合独立同分布假设，变量之间的实际影响也并不明确，因此需要谨慎实践。</p><h2 id="反向面试">反向面试<a class="header-anchor" href="#反向面试"></a></h2><p>原文：<a href="https://github.com/yifeikong/reverse-interview-zh">https://github.com/yifeikong/reverse-interview-zh</a></p><p>预期使用方式</p><ul class="lvl-0"><li class="lvl-2"><p>检查一下哪些问题你感兴趣</p></li><li class="lvl-2"><p>检查一下哪些是你可以自己在网上找到答案的</p></li><li class="lvl-2"><p>找不到的话就向面试官提问</p></li></ul><p>绝对不要想把这个列表里的每个问题都问一遍。（尊重面试官的时间，而且你可以通过查找已经发布的答案来显示<br>你的主动性）</p><p>请记住事情总是灵活的，组织的结构调整也会经常发生。拥有一个 bug 追踪系统并不会保证高效处理 bug。<br>CI/CD （持续集成系统） 也不一定保证交付时间会很短。</p><p><strong>职责</strong></p><ul class="lvl-0"><li class="lvl-2"><p>On-call （电话值班）的计划或者规定是什么？值班或者遇到问题加班时候有加班费吗？</p></li><li class="lvl-2"><p>我的日常工作是什么？</p></li><li class="lvl-2"><p>有给我设定的特定目标吗？</p></li><li class="lvl-2"><p>团队里面初级和高级工程师的比例是多少？（有计划改变吗）</p></li><li class="lvl-2"><p>入职培训 (onboarding) 会是什么样的？</p></li><li class="lvl-2"><p>每个开发者有多大的自由来做出决定？</p></li><li class="lvl-2"><p>在你看来，这个工作做到什么程度算成功？</p></li><li class="lvl-2"><p>你期望我在最初的一个月 / 三个月能够完成什么？</p></li><li class="lvl-2"><p>试用期结束的时候，你会怎么样衡量我的绩效？</p></li><li class="lvl-2"><p>自己单独的开发活动和按部就班工作的比例大概是怎样的？</p></li><li class="lvl-2"><p>一个典型的一天或者一周的工作是怎样安排的？</p></li><li class="lvl-2"><p>对我的申请你有什么疑虑么？</p></li><li class="lvl-2"><p>在这份工作上，我将会和谁紧密合作？</p></li><li class="lvl-2"><p>我的直接上级他们的上级都是什么样的管理风格？（事无巨细还是着眼宏观）</p></li><li class="lvl-2"><p>我在这个岗位上应该如何发展？会有哪些机会？</p></li><li class="lvl-2"><p>每天预期 / 核心工作时间是多少小时？</p></li><li class="lvl-2"><p>我入职的岗位是新增还是接替之前离职的同事？（是否有技术债需要还）？(zh)</p></li><li class="lvl-2"><p>入职之后在哪个项目组，项目是新成立还是已有的？(zh)</p></li></ul><p><strong>技术</strong></p><ul class="lvl-0"><li class="lvl-2"><p>公司常用的技术栈是什么？</p></li><li class="lvl-2"><p>你们怎么使用源码控制系统？</p></li><li class="lvl-2"><p>你们怎么测试代码？</p></li><li class="lvl-2"><p>你们怎么追踪 bug?</p></li><li class="lvl-2"><p>你们怎样监控项目？</p></li><li class="lvl-2"><p>你们怎么集成和部署代码改动？是使用持续集成和持续部署吗 (CI/CD)？</p></li><li class="lvl-2"><p>你们的基础设施搭建在版本管理系统里吗？或者是代码化的吗？</p></li><li class="lvl-2"><p>从计划到完成一项任务的工作流是什么样的？</p></li><li class="lvl-2"><p>你们如何准备故障恢复？</p></li><li class="lvl-2"><p>有标准的开发环境吗？是强制的吗？</p></li><li class="lvl-2"><p>你们需要花费多长时间来给产品搭建一个本地测试环境？（分钟 / 小时 / 天）</p></li><li class="lvl-2"><p>你们需要花费多长时间来响应代码或者依赖中的安全问题？</p></li><li class="lvl-2"><p>所有的开发者都可以使用他们电脑的本地管理员权限吗？</p></li><li class="lvl-2"><p>介绍一下你们的技术原则或者展望。</p></li><li class="lvl-2"><p>你们的代码有开发文档吗？有没有单独的供消费者阅读的文档？</p></li><li class="lvl-2"><p>你们有更高层次的文档吗？比如说 ER 图，数据库范式</p></li><li class="lvl-2"><p>你们使用静态代码分析吗？</p></li><li class="lvl-2"><p>你们如何管理内部和外部的数字资产？</p></li><li class="lvl-2"><p>你们如何管理依赖？</p></li><li class="lvl-2"><p>公司是否有技术分享交流活动？有的话，多久一次呢？(zh)</p></li><li class="lvl-2"><p>你们的数据库是怎么进行版本控制的？(zh)</p></li><li class="lvl-2"><p>业务需求有没有文档记录？是如何记录的？(zh)</p></li></ul><p><strong>团队</strong></p><ul class="lvl-0"><li class="lvl-2"><p>工作是怎么组织的？</p></li><li class="lvl-2"><p>团队内 / 团队间的交流通常是怎样的？</p></li><li class="lvl-2"><p>你们使用什么工具来做项目组织？你的实际体会是什么？</p></li><li class="lvl-2"><p>如果遇到不同的意见怎样处理？</p></li><li class="lvl-2"><p>谁来设定优先级 / 计划？</p></li><li class="lvl-2"><p>如果团队没能赶上预期发布日期怎么办？</p></li><li class="lvl-2"><p>每周都会开什么类型的会议？</p></li><li class="lvl-2"><p>会有定期的和上级的一对一谈话吗？</p></li><li class="lvl-2"><p>产品 / 服务的规划是什么样的？（n 周一发布 / 持续部署 / 多个发布流 / …)</p></li><li class="lvl-2"><p>生产环境发生事故了怎么办？是否有不批评人而分析问题的文化？</p></li><li class="lvl-2"><p>有没有一些团队正在经历还尚待解决的挑战？</p></li><li class="lvl-2"><p>你们如何跟踪进度？</p></li><li class="lvl-2"><p>预期和目标是如何设定的？谁来设定？</p></li><li class="lvl-2"><p>Code Review 如何实施？</p></li><li class="lvl-2"><p>给我介绍下团队里一个典型的 sprint</p></li><li class="lvl-2"><p>你们如何平衡技术和商业目标？</p></li><li class="lvl-2"><p>你们如何共享知识？</p></li><li class="lvl-2"><p>团队有多大？</p></li><li class="lvl-2"><p>公司技术团队的架构和人员组成？(zh)</p></li><li class="lvl-2"><p>团队内开发、产品、运营哪一方是需求的主要提出方？哪一方更强势？(zh)</p></li></ul><p><strong>问未来的同事</strong></p><ul class="lvl-0"><li class="lvl-2"><p>开发者倾向于从哪里学习？</p></li><li class="lvl-2"><p>你对在这里工作最满意的地方是？</p></li><li class="lvl-2"><p>最不满意的呢？</p></li><li class="lvl-2"><p>如果可以的话，你想改变哪里？</p></li><li class="lvl-2"><p>团队最老的成员在这里多久了？</p></li><li class="lvl-2"><p>在小团队中，有没有出现成员性格互相冲突的情况？最后是如何解决的？</p></li></ul><p><strong>公司</strong></p><ul class="lvl-0"><li class="lvl-2"><p>公司为什么在招人？（产品发展 / 新产品 / 波动…)</p></li><li class="lvl-2"><p>有没有会议 / 旅行预算？使用的规定是什么？</p></li><li class="lvl-2"><p>晋升流程是怎样的？要求 / 预期是怎样沟通的？</p></li><li class="lvl-2"><p>绩效评估流程是怎样的？</p></li><li class="lvl-2"><p>技术和管理两条职业路径是分开的吗？</p></li><li class="lvl-2"><p>对于多元化招聘的现状或者观点是什么？</p></li><li class="lvl-2"><p>有公司级别的学习资源吗？比如电子书订阅或者在线课程？</p></li><li class="lvl-2"><p>有获取证书的预算吗？</p></li><li class="lvl-2"><p>公司的成熟度如何？（早期寻找方向 / 有内容的工作 / 维护中 / …)</p></li><li class="lvl-2"><p>我可以为开源项目做贡献吗？是否需要审批？</p></li><li class="lvl-2"><p>你认为公司未来五年或者十年会发展成什么样子？</p></li><li class="lvl-2"><p>公司的大多数员工是如何看待整洁代码的？</p></li><li class="lvl-2"><p>你上次注意到有人成长是什么时候？他们在哪方面成长了？</p></li><li class="lvl-2"><p>在这里成功的定义是什么？如何衡量成功？</p></li><li class="lvl-2"><p>有体育活动或者团建么？</p></li><li class="lvl-2"><p>有内部的黑客马拉松活动吗？</p></li><li class="lvl-2"><p>公司支持开源项目吗？</p></li><li class="lvl-2"><p>有竞业限制或者保密协议需要签吗？</p></li><li class="lvl-2"><p>你们认为公司文化中的空白是什么？</p></li><li class="lvl-2"><p>能够跟我说一公司处于不良情况，以及如何处理的故事吗？</p></li><li class="lvl-2"><p>您在这工作了多久了？您觉得体验如何？(zh)</p></li><li class="lvl-2"><p>大家为什么会喜欢这里？(zh)</p></li><li class="lvl-2"><p>公司的调薪制度是如何的？(zh)</p></li></ul><p><strong>社会问题</strong></p><ul class="lvl-0"><li class="lvl-2"><p>你们关于多元化招聘什么看法？</p></li><li class="lvl-2"><p>你们的公司文化如何？你认为有什么空白么？</p></li><li class="lvl-2"><p>这里的工作生活平衡地怎么样？</p></li><li class="lvl-2"><p>公司对气候变化有什么态度吗？</p></li></ul><p><strong>冲突</strong></p><ul class="lvl-0"><li class="lvl-2"><p>不同的意见如何处理？</p></li><li class="lvl-2"><p>如果被退回了会怎样？（“这个在预计的时间内做不完”）</p></li><li class="lvl-2"><p>当团队有压力并且在超负荷工作的时候怎么处理？</p></li><li class="lvl-2"><p>如果有人注意到了在流程或者技术等其他方面又改进的地方，怎么办？</p></li><li class="lvl-2"><p>当管理层的预期和工程师的绩效之间有差距的时候如何处理？</p></li><li class="lvl-2"><p>能给我讲一个公司深处有毒环境以及如何处理的故事吗？</p></li><li class="lvl-2"><p>如果在公司内你的同事因涉嫌性侵犯他人而被调查，请问你会如何处理？</p></li><li class="lvl-2"><p>假设我自己很不幸是在公司内被性侵的受害者，在公司内部有没有争取合法权益的渠道？</p></li></ul><p><strong>商业</strong></p><ul class="lvl-0"><li class="lvl-2"><p>你们现在盈利吗？</p></li><li class="lvl-2"><p>如果没有的话，还需要多久？</p></li><li class="lvl-2"><p>公司的资金来源是什么？谁影响或者制定高层计划或方向？</p></li><li class="lvl-2"><p>你们如何挣钱？</p></li><li class="lvl-2"><p>什么阻止了你们挣更多的钱？</p></li><li class="lvl-2"><p>公司未来一年的增长计划怎样？五年呢？</p></li><li class="lvl-2"><p>你们认为什么是你们的竞争优势？</p></li><li class="lvl-2"><p>你们的竞争优势是什么？</p></li><li class="lvl-2"><p>公司未来的商业规划是怎样的？有上市的计划吗？(zh)</p></li></ul><p><strong>远程工作</strong></p><ul class="lvl-0"><li class="lvl-2"><p>远程工作和办公室工作的比例是多少？</p></li><li class="lvl-2"><p>公司提供硬件吗？更新计划如何？</p></li><li class="lvl-2"><p>使用自己的硬件办公可以吗？现在有政策吗？</p></li><li class="lvl-2"><p>额外的附件和家具可以通过公司购买吗？这方面是否有预算？</p></li><li class="lvl-2"><p>有共享办公或者上网的预算吗？</p></li><li class="lvl-2"><p>多久需要去一次办公室？</p></li><li class="lvl-2"><p>公司的会议室是否一直是视频会议就绪的？</p></li></ul><p><strong>办公室布局</strong></p><ul class="lvl-0"><li class="lvl-2"><p>办公室的布局如何？（开放的 / 小隔间 / 独立办公室）</p></li><li class="lvl-2"><p>有没有支持 / 市场 / 或者其他需要大量打电话的团队在我的团队旁边办公？</p></li></ul><p><strong>终极问题</strong></p><ul class="lvl-0"><li class="lvl-2"><p>该职位为何会空缺？</p></li><li class="lvl-2"><p>公司如何保证人才不流失？</p></li><li class="lvl-2"><p>这份工作 / 团队 / 公司最好和最坏的方面是？</p></li><li class="lvl-2"><p>你最开始为什么选择了这家公司？</p></li><li class="lvl-2"><p>你为什么留在这家公司？</p></li></ul><p><strong>待遇</strong></p><ul class="lvl-0"><li class="lvl-2"><p>如果有奖金计划的话，奖金如何分配？</p></li><li class="lvl-2"><p>如果有奖金计划的话，过去的几年里通常会发百分之多少的奖金？</p></li><li class="lvl-2"><p>有五险一金(zh)/401k(us)或者其他退休养老金等福利吗？</p></li><li class="lvl-2"><p>五险一金中，补充公积金一般交多少比例？/401k一般交多少比例？我可以自己选择这一比例吗？</p></li><li class="lvl-2"><p>有什么医疗保险吗？如果有的话何时开始？</p></li><li class="lvl-2"><p>有额外商业保险吗？例如人寿保险和额外的养老/医疗保险？</p></li><li class="lvl-2"><p>更换工作地点，公司付费吗？</p></li></ul><p><strong>休假</strong></p><ul class="lvl-0"><li class="lvl-2"><p>带薪休假时间有多久？</p></li><li class="lvl-2"><p>病假和事假是分开的还是一起算？</p></li><li class="lvl-2"><p>我可以提前使用假期时间吗？也就是说应休假期是负的？</p></li><li class="lvl-2"><p>假期的更新策略是什么样的？也就是说未休的假期能否滚入下一周期</p></li><li class="lvl-2"><p>照顾小孩的政策如何？</p></li><li class="lvl-2"><p>无薪休假政策是什么样的？</p></li><li class="lvl-2"><p>学术性休假政策是怎么样的？</p></li></ul><h2 id="技术文档写作规范">技术文档写作规范<a class="header-anchor" href="#技术文档写作规范"></a></h2><p>摘自 <a href="https://www.forvs.com/231.html">https://www.forvs.com/231.html</a></p><p>作者 <a href="https://github.com/ruanyf/document-style-guide">https://github.com/ruanyf/document-style-guide</a></p><h3 id="标题">标题<a class="header-anchor" href="#标题"></a></h3><h4 id="层级">层级<a class="header-anchor" href="#层级"></a></h4><p>标题分为四级。</p><ul class="lvl-0"><li class="lvl-2"><p>一级标题：文章的标题</p></li><li class="lvl-2"><p>二级标题：文章主要部分的大标题</p></li><li class="lvl-2"><p>三级标题：二级标题下面一级的小标题</p></li><li class="lvl-2"><p>四级标题：三级标题下面某一方面的小标题</p></li></ul><p>下面是示例。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># 一级标题</span><br><span class="line"></span><br><span class="line">## 二级标题</span><br><span class="line"></span><br><span class="line">### 三级标题</span><br><span class="line"></span><br><span class="line">#### 四级标题</span><br></pre></td></tr></table></figure><h4 id="原则">原则<a class="header-anchor" href="#原则"></a></h4><p>（1）一级标题下，不能直接出现三级标题。</p><p>示例：下面的文章结构，缺少二级标题。</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"></span><br><span class="line">### 三级标题</span><br></pre></td></tr></table></figure><p>（2）标题要避免孤立编号（即同级标题只有一个）。</p><p>示例：下面的文章结构，<code>二级标题 A</code>只包含一个三级标题，完全可以省略<code>三级标题 A</code>。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">## 二级标题 A</span><br><span class="line"></span><br><span class="line">### 三级标题 A</span><br><span class="line"></span><br><span class="line">## 二级标题 B</span><br></pre></td></tr></table></figure><p>（3）下级标题不重复上一级标题的名字。</p><p>示例：下面的文章结构，二级标题与下属的三级标题同名，建议避免。</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"></span><br><span class="line">### 概述</span><br></pre></td></tr></table></figure><p>（4）谨慎使用四级标题，尽量避免出现，保持层级的简单，防止出现过于复杂的章节。</p><p>如果三级标题下有并列性的内容，建议只使用项目列表（Item list）。</p><p>示例：下面的结构二要好于结构一。结构一适用的场景，主要是较长篇幅的内容。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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><br><span class="line"></span><br><span class="line">### 三级标题</span><br><span class="line"></span><br><span class="line">#### 四级标题 A</span><br><span class="line"></span><br><span class="line">#### 四级标题 B</span><br><span class="line"></span><br><span class="line">#### 四级标题 C</span><br><span class="line"></span><br><span class="line">结构二</span><br><span class="line"></span><br><span class="line">### 三级标题</span><br><span class="line"></span><br><span class="line">**（1）A**</span><br><span class="line"></span><br><span class="line">**（2）B**</span><br><span class="line"></span><br><span class="line">**（3）C**</span><br></pre></td></tr></table></figure><hr><h3 id="文本">文本<a class="header-anchor" href="#文本"></a></h3><h4 id="字间距">字间距<a class="header-anchor" href="#字间距"></a></h4><p>（1）全角中文字符与半角英文字符之间，应有一个半角空格。</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">错误：本文介绍如何快速启动Windows系统。</span><br><span class="line"> </span><br><span class="line">正确：本文介绍如何快速启动 Windows 系统。</span><br></pre></td></tr></table></figure><p>（2）全角中文字符与半角阿拉伯数字之间，有没有半角空格都可，但必须保证风格统一，不能两种风格混杂。</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">正确：2011年5月15日，我订购了5台笔记本电脑与10台平板电脑。</span><br><span class="line"> </span><br><span class="line">正确：2011 年 5 月 15 日，我订购了 5 台笔记本电脑与 10 台平板电脑。</span><br></pre></td></tr></table></figure><p>半角的百分号，视同阿拉伯数字。</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">正确：今年我国经济增长率是6.5%。</span><br><span class="line"> </span><br><span class="line">正确：今年我国经济增长率是 6.5%。</span><br></pre></td></tr></table></figure><p>（3）英文单位若不翻译，单位前的阿拉伯数字与单位符号之间，应留出适当的空隙。</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">例1：一部容量为 16 GB 的智能手机</span><br><span class="line"> </span><br><span class="line">例2：1 h = 60 min = 3,600 s</span><br></pre></td></tr></table></figure><p>（4）半角英文字符和半角阿拉伯数字，与全角标点符号之间不留空格。</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">错误：他的电脑是 MacBook Air 。</span><br><span class="line"> </span><br><span class="line">正确：他的电脑是 MacBook Air。</span><br></pre></td></tr></table></figure><h4 id="句子">句子<a class="header-anchor" href="#句子"></a></h4><p>（1）避免使用长句。</p><p>不包含任何标点符号的单个句子，或者以逗号分隔的句子构件，长度尽量保持在 20 个字以内；20～29 个字的句子，可以接受；30～39 个字的句子，语义必须明确，才能接受；多于 40 个字的句子，任何情况下都不能接受。</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"> </span><br><span class="line">正确：本产品适用于多种体系结构。无论是由一台服务器（单一节点结构），还是由多台服务器（并行处理结构）进行动作控制，均可以使用本产品。</span><br></pre></td></tr></table></figure><p>逗号分割的长句，总长度不应该超过 100 字或者正文的 3 行。</p><p>（2）尽量使用简单句和并列句，避免使用复合句。</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"> </span><br><span class="line">复合句：那个昨天生病的人没有参加会议。</span><br></pre></td></tr></table></figure><p>（3）同样一个意思，尽量使用肯定句表达，不使用否定句表达。</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"> </span><br><span class="line">正确：请确认装置的电源已关闭。</span><br></pre></td></tr></table></figure><p>（4）避免使用双重否定句。</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"> </span><br><span class="line">正确：用户必须拥有删除权限，才能删除此文件。</span><br></pre></td></tr></table></figure><h4 id="写作风格">写作风格<a class="header-anchor" href="#写作风格"></a></h4><p>（1）尽量不使用被动语态，改为使用主动语态。</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"> </span><br><span class="line">正确：假如尚未安装这个软件，</span><br></pre></td></tr></table></figure><p>（2）不使用非正式的语言风格。</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">错误：Lady Gaga 的演唱会真是酷毙了，从没看过这么给力的表演！！！</span><br><span class="line"> </span><br><span class="line">正确：无法参加本次活动，我深感遗憾。</span><br></pre></td></tr></table></figure><p>（3）不使用冷僻、生造或者文言文的词语，而要使用现代汉语的常用表达方式。</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"> </span><br><span class="line">正确：这是仅有的两种快速启动的方法。</span><br></pre></td></tr></table></figure><p>（4）用对“的”、“地”、“得”。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">她露出了开心的笑容。</span><br><span class="line">（形容词＋的＋名词）</span><br><span class="line"> </span><br><span class="line">她开心地笑了。</span><br><span class="line">（副词＋地＋动词）</span><br><span class="line"> </span><br><span class="line">她笑得很开心。</span><br><span class="line">（动词＋得＋副词）</span><br></pre></td></tr></table></figure><p>（5）使用代词时（比如“其”、“该”、“此”、“这”等词），必须明确指代的内容，保证只有一个含义。</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"> </span><br><span class="line">正确：从管理系统可以监视两个系统：中继系统和受中继系统直接控制的分配系统。</span><br></pre></td></tr></table></figure><p>（6）名词前不要使用过多的形容词。</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"> </span><br><span class="line">正确：此设备必须在技师的指导下使用，且指导技师必须接受过由本公司举办的正式设备培训。</span><br></pre></td></tr></table></figure><h4 id="英文处理">英文处理<a class="header-anchor" href="#英文处理"></a></h4><p>（1）英文原文如果使用了复数形式，翻译成中文时，应该将其还原为单数形式。</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">英文：⋯information stored in random access memory (RAMs)⋯</span><br><span class="line"> </span><br><span class="line">中文：……存储在随机存取存储器（RAM）里的信息……</span><br></pre></td></tr></table></figure><p>（2）外文缩写可以使用半角圆点(<code>.</code>)表示缩写。</p><figure class="highlight plaintext"><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">U.S.A.</span><br><span class="line">Apple, Inc.</span><br></pre></td></tr></table></figure><p>（3）表示中文时，英文省略号（<code>⋯</code>）应改为中文省略号（<code>……</code>）。</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">英文：5 minutes later⋯</span><br><span class="line"> </span><br><span class="line">中文：5 分钟过去了……</span><br></pre></td></tr></table></figure><p>（4）英文书名或电影名改用中文表达时，双引号应改为书名号。</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">英文：He published an article entitled &quot;The Future of the Aviation&quot;.</span><br><span class="line"> </span><br><span class="line">中文：他发表了一篇名为《航空业的未来》的文章。</span><br></pre></td></tr></table></figure><p>（5）第一次出现英文词汇时，在括号中给出中文标注。此后再次出现时，直接使用英文缩写即可。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">IOC（International Olympic Committee，国际奥林匹克委员会）。这样定义后，便可以直接使用“IOC”了。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>（6）专有名词中每个词第一个字母均应大写，非专有名词则不需要大写。</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">“American Association of Physicists in Medicine”（美国医学物理学家协会）是专有名词，需要大写。</span><br><span class="line"> </span><br><span class="line">“online transaction processing”（在线事务处理）不是专有名词，不应大写。</span><br></pre></td></tr></table></figure><hr><h3 id="段落">段落<a class="header-anchor" href="#段落"></a></h3><h4 id="原则-2">原则<a class="header-anchor" href="#原则-2"></a></h4><ul class="lvl-0"><li class="lvl-2"><p>一个段落只能有一个主题，或一个中心句子。</p></li><li class="lvl-2"><p>段落的中心句子放在段首，对全段内容进行概述。后面陈述的句子为核心句服务。</p></li><li class="lvl-2"><p>一个段落的长度不能超过七行，最佳段落长度小于等于四行。</p></li><li class="lvl-2"><p>段落的句子语气要使用陈述和肯定语气，避免使用感叹语气。</p></li><li class="lvl-2"><p>段落之间使用一个空行隔开。</p></li><li class="lvl-2"><p>段落开头不要留出空白字符。</p></li></ul><h4 id="引用">引用<a class="header-anchor" href="#引用"></a></h4><p>引用第三方内容时，应注明出处。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">One man’s constant is another man’s variable. — Alan Perlis</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>如果是全篇转载，请在全文开头显著位置注明作者和出处，并链接至原文。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">本文转载自 WikiQuote</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>使用外部图片时，必须在图片下方或文末标明来源。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">本文部分图片来自 Wikipedia</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><hr><h3 id="数值">数值<a class="header-anchor" href="#数值"></a></h3><h4 id="半角数字">半角数字<a class="header-anchor" href="#半角数字"></a></h4><p>阿拉伯数字一律使用半角形式，不得使用全角形式。</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"> </span><br><span class="line">正确：这件商品的价格是 1000 元。</span><br></pre></td></tr></table></figure><h4 id="千分号">千分号<a class="header-anchor" href="#千分号"></a></h4><p>数值为千位以上，应添加千分号（半角逗号）。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">XXX 公司的实收资本为 ￥1,258,000 人民币。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>对于 4 位的数值，千分号是选用的，比如<code>1000</code>和<code>1,000</code>都可以接受。对于 4 位以上的数值，应添加千分号。</p><h4 id="货币">货币<a class="header-anchor" href="#货币"></a></h4><p>货币应为阿拉伯数字，并在数字前写出货币符号，或在数字后写出货币中文名称。</p><figure class="highlight plaintext"><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">$1,000</span><br><span class="line">1,000 美元</span><br></pre></td></tr></table></figure><p>英文的货币名称，建议参考国际标准 <a href="https://en.wikipedia.org/wiki/ISO_4217">ISO 4217</a>。</p><h4 id="数值范围">数值范围<a class="header-anchor" href="#数值范围"></a></h4><p>表示数值范围时，用波浪线（<code>～</code>）或一字线（<code>—</code>）连接。参见《标点符号》一节的“连接号”部分。</p><p>带有单位或百分号时，两个数字建议都要加上单位或百分号。</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">132 kg～234 kg</span><br><span class="line"> </span><br><span class="line">67%～89%</span><br></pre></td></tr></table></figure><h4 id="变化程度的表示法">变化程度的表示法<a class="header-anchor" href="#变化程度的表示法"></a></h4><p>数字的增加要使用“增加了”、“增加到”。“了”表示增量，“到”表示定量。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">增加到过去的两倍</span><br><span class="line">（过去为一，现在为二）</span><br><span class="line"> </span><br><span class="line">增加了两倍</span><br><span class="line">（过去为一，现在为三）</span><br></pre></td></tr></table></figure><p>数字的减少要使用“降低了”、“降低到”。“了”表示增量，“到”表示定量。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">降低到百分之八十</span><br><span class="line">（定额是一百，现在是八十）</span><br><span class="line"> </span><br><span class="line">降低了百分之八十</span><br><span class="line">（原来是一百，现在是二十）</span><br></pre></td></tr></table></figure><p>不能用“降低 N 倍”或“减少 N 倍”的表示法，要用“降低百分之几”或“减少百分之几”。因为减少（或降低）一倍表示数值原来为一百，现在等于零。</p><hr><h3 id="标点符号">标点符号<a class="header-anchor" href="#标点符号"></a></h3><h4 id="原则-3">原则<a class="header-anchor" href="#原则-3"></a></h4><p>（1）中文语句的标点符号，均应该采取全角符号，这样可以与全角文字保持视觉的一致。</p><p>（2）如果整句为英文，则该句使用英文/半角标点。</p><p>（3）句号、问号、叹号、逗号、顿号、分号和冒号不得出现在一行之首。</p><p>（4）点号（句号、逗号、顿号、分号、冒号）不得出现在标题的末尾，而标号（引号、括号、破折号、省略号、书名号、着重号、间隔号、叹号、问号）可以。</p><h4 id="句号">句号<a class="header-anchor" href="#句号"></a></h4><p>（1）中文语句的结尾处应该用全角句号（<code>。</code>）。</p><p>（2）句子末尾用括号加注时，句号应在括号之外。</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">错误：关于文件的输出，请参照第 1.3 节（见第 26 页。）</span><br><span class="line"> </span><br><span class="line">正确：关于文件的输出，请参照第 1.3 节（见第 26 页）。</span><br></pre></td></tr></table></figure><h4 id="逗号">逗号<a class="header-anchor" href="#逗号"></a></h4><p>（1）逗号（<code>，</code>）表示句子内部的一般性停顿。</p><p>（2）注意避免“一逗到底”，即整个段落除了结尾，全部停顿都使用逗号。</p><h4 id="顿号">顿号<a class="header-anchor" href="#顿号"></a></h4><p>（1）句子内部的并列词，应该用全角顿号(<code>、</code>) 分隔，而不用逗号，即使并列词是英语也是如此。</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">错误：我最欣赏的科技公司有 Google, Facebook, 腾讯, 阿里和百度等。</span><br><span class="line"> </span><br><span class="line">正确：我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。</span><br></pre></td></tr></table></figure><p>（2）英文句子中，并列词语之间使用半角逗号（<code>,</code>）分隔。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句：Microsoft Office includes Word, Excel, PowerPoint, Outlook and other components.</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>（3）中文句子内部的并列词，最后一个尽量使用（<code>和</code>）来连接，使句子读起来更加连贯，下面两个句子都可以，第二个更优。</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">正确：我最欣赏的科技公司有 Google、Facebook、腾讯、阿里，以及百度等。</span><br><span class="line"> </span><br><span class="line">正确：我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。</span><br></pre></td></tr></table></figure><h4 id="分号">分号<a class="header-anchor" href="#分号"></a></h4><p>（1）分号（<code>；</code>）表示复句内部并列分句之间的停顿。</p><h4 id="引号">引号<a class="header-anchor" href="#引号"></a></h4><p>（1）引用时，应该使用全角双引号（<code>“ ”</code>），注意前后双引号不同。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句：许多人都认为客户服务的核心是“友好”和“专业”。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>（2）引号里面还要用引号时，外面一层用双引号，里面一层用单引号（<code>‘ ’</code>），注意前后单引号不同。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句：鲍勃解释道：“我要放音乐，可萨利说，‘不行！’。”</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><h4 id="括号">括号<a class="header-anchor" href="#括号"></a></h4><p>（1）补充说明时，使用全角圆括号（<code>（）</code>），括号前后不加空格。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句：请确认所有的连接（电缆和接插件）均安装牢固。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>（2）几种括号的中英文名称。</p><table><thead><tr><th></th><th>英文</th><th>中文</th></tr></thead><tbody><tr><td><code>&#123; &#125;</code></td><td>braces 或 curly brackets</td><td>大括号</td></tr><tr><td>``</td><td>square brackets 或 brackets</td><td>方括号</td></tr><tr><td><code>&lt; &gt;</code></td><td>angled brackets</td><td>尖括号</td></tr><tr><td><code>( )</code></td><td>parentheses</td><td>圆括号</td></tr></tbody></table><h4 id="冒号">冒号<a class="header-anchor" href="#冒号"></a></h4><p>（1）全角冒号（<code>：</code>）常用在需要解释的词语后边，引出解释和说明。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句：请确认以下几项内容：时间、地点、活动名称和来宾数量。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>（2）表示时间时，应使用半角冒号（<code>:</code>）。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句：早上 8:00</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><h4 id="省略号">省略号<a class="header-anchor" href="#省略号"></a></h4><p>（1）省略号（<code>……</code>）表示语句未完、或者语气的不连续。</p><p>（2）省略号占两个汉字空间、包含六个省略点，不要使用<code>。。。</code>或<code>...</code>等非标准形式。</p><p>（3）省略号不应与“等”这个词一起使用。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">错误：我们为会餐准备了香蕉、苹果、梨…等各色水果。</span><br><span class="line"> </span><br><span class="line">正确：我们为会餐准备了各色水果，有香蕉、苹果、梨……</span><br><span class="line"> </span><br><span class="line">正确：我们为会餐准备了香蕉、苹果、梨等各色水果。</span><br></pre></td></tr></table></figure><h4 id="感叹号">感叹号<a class="header-anchor" href="#感叹号"></a></h4><p>（1）应该使用平静的语气叙述，尽量避免使用感叹号（<code>！</code>）。</p><p>（2）不得多个感叹号连用，比如<code>！！</code>和<code>!!!</code>。</p><h4 id="破折号">破折号<a class="header-anchor" href="#破折号"></a></h4><p>（1）破折号<code>————</code>一般用于进一步解释。</p><p>（2）破折号应占两个汉字的位置。如果破折号本身只占一个汉字的位置，那么前后应该留出一个半角空格。</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"> </span><br><span class="line">例句：直觉 —— 尽管它并不总是可靠的 —— 告诉我，这事可能出了些问题。</span><br></pre></td></tr></table></figure><h4 id="连接号">连接号<a class="header-anchor" href="#连接号"></a></h4><p>（1）连接号用于连接两个类似的词。</p><p>（2）以下场合应该使用直线连接号（<code>-</code>），占一个半角字符的位置。</p><ul class="lvl-0"><li class="lvl-2"><p>两个名词的复合</p></li><li class="lvl-2"><p>图表编号</p></li></ul><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"> </span><br><span class="line">例句：图 1-1</span><br></pre></td></tr></table></figure><p>（3）数值范围（例如日期、时间或数字）应该使用波浪连接号（<code>～</code>）或一字号（<code>—</code>），占一个全角字符的位置。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句：2009 年～2011 年</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>注意，波浪连接号前后两个值都建议加上单位。</p><p>（4）波浪连接号也可以用汉字“至”代替。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">例句：周围温度：-20 °C 至 -10 °C</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> </span><br></pre></td></tr></table></figure><hr><h3 id="文档体系">文档体系<a class="header-anchor" href="#文档体系"></a></h3><h4 id="结构">结构<a class="header-anchor" href="#结构"></a></h4><p>软件手册是一部完整的书，建议采用下面的结构。</p><ul class="lvl-0"><li class="lvl-2"><p><strong>简介</strong>（Introduction）： [必备] [文件] 提供对产品和文档本身的总体的、扼要的说明</p></li><li class="lvl-2"><p><strong>快速上手</strong>（Getting Started）：[可选] [文件] 如何最快速地使用产品</p></li><li class="lvl-2"><p>入门篇</p><p>（Basics）： [必备] [目录] 又称”使用篇“，提供初级的使用教程</p><ul class="lvl-2"><li class="lvl-4"><p><strong>环境准备</strong>（Prerequisite）：[必备] [文件] 软件使用需要满足的前置条件</p></li><li class="lvl-4"><p><strong>安装</strong>（Installation）：[可选] [文件] 软件的安装方法</p></li><li class="lvl-4"><p><strong>设置</strong>（Configuration）：[必备] [文件] 软件的设置</p></li></ul></li><li class="lvl-2"><p><strong>进阶篇</strong>（Advanced)：[可选] [目录] 又称”开发篇“，提供中高级的开发教程</p></li><li class="lvl-2"><p><strong>API</strong>（Reference）：[可选] [目录|文件] 软件 API 的逐一介绍</p></li><li class="lvl-2"><p><strong>FAQ</strong>：[可选] [文件] 常见问题解答</p></li><li class="lvl-2"><p>附录</p><p>（Appendix）：[可选] [目录] 不属于教程本身、但对阅读教程有帮助的内容</p><ul class="lvl-2"><li class="lvl-4"><p><strong>Glossary</strong>：[可选] [文件] 名词解释</p></li><li class="lvl-4"><p><strong>Recipes</strong>：[可选] [文件] 最佳实践</p></li><li class="lvl-4"><p><strong>Troubleshooting</strong>：[可选] [文件] 故障处理</p></li><li class="lvl-4"><p><strong>ChangeLog</strong>：[可选] [文件] 版本说明</p></li><li class="lvl-4"><p><strong>Feedback</strong>：[可选] [文件] 反馈方式</p></li></ul></li></ul><p>下面是两个真实范例，可参考。</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://redux.js.org/introduction/getting-started">Redux 手册</a></p></li><li class="lvl-2"><p><a href="http://flight-manual.atom.io/">Atom 手册</a></p></li></ul><h4 id="文件名">文件名<a class="header-anchor" href="#文件名"></a></h4><p>文档的文件名不得含有空格。</p><p>文件名必须使用半角字符，不得使用全角字符。这也意味着，中文不能用于文件名。</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">错误：名词解释.md</span><br><span class="line"> </span><br><span class="line">正确：glossary.md</span><br></pre></td></tr></table></figure><p>文件名建议只使用小写字母，不使用大写字母。</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">错误：TroubleShooting.md</span><br><span class="line"> </span><br><span class="line">正确：troubleshooting.md </span><br></pre></td></tr></table></figure><p>为了醒目，某些说明文件的文件名，可以使用大写字母，比如<code>README</code>、<code>LICENSE</code>。</p><p>文件名包含多个单词时，单词之间建议使用半角的连词线（<code>-</code>）分隔。</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">不佳：advanced_usage.md</span><br><span class="line"> </span><br><span class="line">正确：advanced-usage.md</span><br></pre></td></tr></table></figure><hr><h3 id="参考链接">参考链接<a class="header-anchor" href="#参考链接"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://www.taodocs.com/p-51273.html">产品手册中文写作规范</a>, by 华为</p></li><li class="lvl-2"><p><a href="http://guide.daocloud.io/dcs/%E5%86%99%E4%BD%9C%E8%A7%84%E8%8C%83%E5%92%8C%E6%A0%BC%E5%BC%8F%E8%A7%84%E8%8C%83-9153803.html">写作规范和格式规范</a>, by DaoCloud</p></li><li class="lvl-2"><p><a href="http://www.hitachi-tc.co.jp/company/thesis/thesis.pdf">技术写作技巧在日汉翻译中的应用</a>, by 刘方</p></li><li class="lvl-2"><p><a href="https://www.lengoo.de/documents/styleguides/lengoo_styleguide_ZH.pdf">简体中文规范指南</a>, by lengoo</p></li><li class="lvl-2"><p><a href="https://open.leancloud.cn/copywriting-style-guide.html">文档风格指南</a>, by LeanCloud</p></li><li class="lvl-2"><p><a href="https://docs.google.com/document/d/1R8lMCPf6zCD5KEA8ekZ5knK77iw9J-vJ6vEopPemqZM/edit">豌豆荚文案风格指南</a>, by 豌豆荚</p></li><li class="lvl-2"><p><a href="https://github.com/sparanoid/chinese-copywriting-guidelines">中文文案排版指北</a>, by sparanoid</p></li><li class="lvl-2"><p><a href="http://w3c.github.io/clreq/">中文排版需求</a>, by W3C</p></li><li class="lvl-2"><p><a href="http://www.ruanyifeng.com/blog/2017/02/filename-should-be-lowercase.html">为什么文件名要小写？</a>, by 阮一峰</p></li><li class="lvl-2"><p><a href="https://developers.google.com/style/">Google Developer Documentation Style Guide</a>, by Google</p></li><li class="lvl-2"><p><a href="http://www.moe.gov.cn/ewebeditor/uploadfile/2015/01/13/20150113091154536.pdf">出版物上数字用法的规定（国家标准GBT15835－2011）</a></p></li><li class="lvl-2"><p><a href="https://zh.wikisource.org/zh-hans/GB_3100-1993_%E5%9B%BD%E9%99%85%E5%8D%95%E4%BD%8D%E5%88%B6%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8">GB 3100-1993 国际单位制及其应用</a></p></li></ul>]]></content>
      
      
      <categories>
          
          <category> 转载 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> GitHub </tag>
            
            <tag> 转载 </tag>
            
            <tag> 学习 </tag>
            
            <tag> 习惯 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>04_转载-提问的智慧</title>
      <link href="/posts/beb8baf2.html"/>
      <url>/posts/beb8baf2.html</url>
      
        <content type="html"><![CDATA[<p>具体版权见原文。原文：<a href="https://github.com/tvvocold/How-To-Ask-Questions-The-Smart-Way">https://github.com/tvvocold/How-To-Ask-Questions-The-Smart-Way</a></p><h3 id="弃权申明">弃权申明<a class="header-anchor" href="#弃权申明"></a></h3><p>许多项目的网站在如何取得帮助的部分链接了本文，这没有关系，也正是我们想要的。但如果你是该项目生成此链接的网管，请在链接附近显著位置注明：我们不提供该项目的服务支持！</p><p>我们已经领教了没有此说明带来的痛苦，我们将不停地被一些白痴纠缠，他们认为既然我们发布了本文，那么我们就有责任解决世上所有的技术问题。</p><p>如果你是因为需要帮助正在阅读本文，然后就带着可以直接从作者那取得帮助的印象离开，那么 你 就不幸成了我们所说的白痴之一。 别向 我们 提问，我们不会理睬的。 我们只是在这教你如何从那些真正懂得你软硬件问题的人那里取得帮助，但 99.9％ 的时间我们不会是那些人。除非你非常地 确定 本文的作者是你遇到问题方面的专家，请不要打搅，这样大家都更开心一点。</p><h3 id="引言">引言<a class="header-anchor" href="#引言"></a></h3><p>在 黑客 的世界里，你所提技术问题的解答很大程度上取决于你提问的方式与解决此问题的难度，本文将教你如何提问才更有可能得到满意的答复。</p><p>开源程序的应用已经很广，你通常可以从其他更有经验的用户而不是黑客那里得到解答。这是好事，他们一般对新手常有的毛病更容忍一点。然尔，使用我们推荐的方法，象对待黑客那样对待这些有经验的用户，通常能最有效地得到问题的解答。</p><p>第一件需要明白的事是黑客喜欢难题和激发思考的好问题。假如不是这样，我们也不会写本文了。如果你能提出一个有趣的问题让我们咀嚼玩味，我们会感激你。好问题是种激励与礼物，帮助我们发展认知，揭示没有注意或想到的问题。在黑客中，“好问题！” 是非常热烈而真挚的赞许。</p><p>此外，黑客还有遇到简单问题就表现出敌视或傲慢的名声。有时，我们看起来还对新手和愚蠢的家伙有条件反射式的无礼，但事情并不真是这样。</p><p>我们只是毫无歉意地敌视那些提问前不愿思考、不做自己家庭作业的人。这种人就象时间无底洞──他们只知道索取，不愿意付出，他们浪费了时间，这些时间本可用于其它更有趣的问题或更值得回答的人。我们将这种人叫做 “失败者（loser）” （由于历史原因，我们有时将“loser”拼写为“lusers” 。）</p><p>我们意识到许多人只是想使用我们写的软件，他们对学习技术细节没有兴趣。对大多数人而言，计算机只是种工具，是种达到目的的手段而已。他们有自己的生活并且有更要紧的事要做，我们承认这点，也从不指望每个人都对这些让我们着迷的技术问题感兴趣。不过，我们回答问题的风格是为了适应那些真正对此有兴趣并愿意主动参与解决问题的人，这一点不会变，也不该变。如果连这都变了，我们就会在自己能做得最好的事情上不再那么犀利。</p><p>我们（大多数）是自愿者， 从自己繁忙的生活中抽时间来回答问题，有时会力不从心。因此，我们会毫不留情地滤除问题，特别是那些看起来象是失败者提的，以便更有效地把回答问题的时间留给那些胜利者。</p><p>如果你认为这种态度令人反感、以施惠者自居或傲慢自大，请检查你的假设，我们并未要求你屈服──事实上，假如你做了该做的努力，我们中的大多数将非常乐意平等地与你交流，并欢迎你接纳我们的文化。试图去帮助那些不愿自救的人对我们简直没有效率。不懂没有关系，但愚蠢地做事不行。</p><p>所以，你不必在技术上很在行才能吸引我们的注意，但你 必须 表现出能引导你在行的姿态──机 敏、有想法、善于观察、乐于主动参与问题的解决。如果你做不到这些使你与众不同的事情，我们建议你付钱跟别人签商业服务合同，而不是要求黑客无偿帮助。</p><p>如果你决定向我们求助，你不会想成为一名失败者，你也不想被看成一个失败者。得到快速有效回答的最好方法是使提问者看起来象个聪明、自信和有想法的人，并且暗示只是碰巧在某一特别问题上需要帮助。</p><p>（欢迎对本文指正，可以将建议发至 <a href="mailto:esr@thyrsus.com">esr@thyrsus.com</a> 或 <a href="mailto:respond-auto@linuxmafia.com">respond-auto@linuxmafia.com</a>。 请注意，本文不想成为一般性的 网络礼仪 指南，我一般会拒绝那些与引出技术论坛中有用的回答不特别相关的建议。）</p><h3 id="提问前">提问前<a class="header-anchor" href="#提问前"></a></h3><p>在通过电邮、新闻组或论坛提技术问题以前，做以下事情：</p><ul class="lvl-0"><li class="lvl-2"><p>尝试在你准备提问论坛的历史文档中搜索答案</p></li><li class="lvl-2"><p>尝试搜索互联网以找到答案</p></li><li class="lvl-2"><p>尝试阅读手册以找到答案</p></li><li class="lvl-2"><p>尝试阅读“常见问题文档”（FAQ）以找到答案</p></li><li class="lvl-2"><p>尝试自己检查或试验以找到答案</p></li><li class="lvl-2"><p>尝试请教懂行的朋友以找到答案</p></li><li class="lvl-2"><p>如果你是程序员，尝试阅读源代码以找到答案</p></li></ul><p>提问时，请先表明你已做了上述事情，这将有助于建立你不是寄生虫与浪费别人时间的印象。最好再表述你从中 学到的东西 ，我们喜欢回答那些表现出能从答案中学习的人。</p><p>运用某些策略，比如用谷歌（Google）搜索你遇到的各种错误提示（既搜索 谷歌论坛，也搜索网页）， 这样很可能直接就找到了解决问题的文档或邮件列表线索。 即使没有结果，在邮件列表或新闻组寻求帮助时提一句“我在谷歌中搜过下列句子但没有找到什么有用的东西” 也是件好事，至少它表明了搜索引擎不能提供哪些帮助。将搜索关键词与你的问题及可能的解决方案联系起来，还有助于引导其他有类似问题的人。</p><p>别着急，不要指望几秒钟的谷歌搜索就能解决一个复杂的问题。读一下常见问题文档。在向专家提问之前，先向后靠靠放松一下，再思考一下问题。相信我们，他们能从你的提问看出你做了多少阅读与思考，如果你是有备而来，将更有可能得到解答。不要将所有问题一股脑抛出，只因你的第一次搜索没有结果（或者结果太多）。</p><p>认真地思考，准备好你的问题。轻率的提问只能得到轻率的回答，或者压根没有。在提问时，你越是表现出在此前做过思考与努力去解决自己的问题，你越有可能得到真正的帮助。</p><p>注意别提错问题。如果提问基于错误的假设，某黑客多半会一边想 “愚蠢的问题……”，一边按将错就错的答案回复你，并且希望这种只是得到你自己“问的问题”而非真正所需的解答，给你一个教训。</p><p>永远不要假设你 有资格 得到解答。你没有这种资格，毕竟你没有为此服务付费。如果你能够提出有内容、有趣和激励思考的问题──那种毫无疑问能够向社区贡献经验，而不仅仅是消极地要求从别人那获取知识的问题，你将“挣到”答案。</p><p>另一方面，表明你有能力也乐意参与问题的解决是个很好的开端。“有没有人能指个方向？”，我这还差点什么？”，“我应该查哪个网站？”，通常要比 “请给出我可以用的完整步骤”更容易得到回复，因为你表明了只要有人能指个方向，你就很乐意完成剩下的过程。</p><h3 id="提问时">提问时<a class="header-anchor" href="#提问时"></a></h3><h4 id="仔细挑选论坛">仔细挑选论坛<a class="header-anchor" href="#仔细挑选论坛"></a></h4><p>要对在哪提问留心，如果你做了下述事情，多半会被一笔勾销或被看成“失败者”：</p><ul class="lvl-0"><li class="lvl-2"><p>张贴与论坛主题无关的问题</p></li><li class="lvl-2"><p>在面向高级技术问题的论坛上张贴肤浅的问题，或者反之。</p></li><li class="lvl-2"><p>在太多不同的新闻组同时张贴</p></li><li class="lvl-2"><p>给既非熟人也没有义务解决你问题的人发送你私人的电邮</p></li></ul><p>为保护通信的渠道不被无关的东西淹没，黑客会除掉那些没有找对地方的问题，你不会想让这种事落到自己头上的。</p><p>因此，第一步是找对论坛。谷歌和其它搜索引擎还是你的朋友，可以用它们搜索你遇到困难的软硬件问题最相关的项目网站。那里通常都有项目的常见问题（FAQ）、邮件列表及文档的链接。如果你的努力（包括 阅读 FAQ）都没有结果，这些邮件列表就是最后能取得帮助的地方。项目的网站也许还有报告Bug的流程或链接，如果是这样，去看看。</p><p>向陌生的人或论坛发送邮件极有可能是在冒险。譬如，不要假设一个内容丰富的网页的作者想充当你的免费顾问，不要对你的问题是否会受到欢迎做太乐观的估计──如果你不确定，向别处发或者压根别发。</p><p>在选择论坛、新闻组或邮件列表时，别太相信名字，先看看 FAQ 或者许可书以明确你的问题是否切题。发贴前先翻翻已有的帖子，这样可以让你感受一下那里行事的方式。事实上，张贴前在新闻组或邮件列表的历史文档中搜索与你问题相关的关键词是个极好的主意，也许就找到答案了。即使没有，也能帮助你归纳出更好的问题。</p><p>别象机关枪似的一次性“扫射”所有的帮助渠道，这就象大喊大叫一样会令人不快，温柔地一个一个来。</p><p>弄懂主题！最典型的错误之一是在某种致立于跨平台可移植的语言、库或工具的论坛中提关于 Unix 或 Windows 操作系统程序接口的问题。如果你不明白为什么这是大错，最好在搞清楚概念前什么也别问。</p><p>一般来说，在仔细挑选的公共论坛中提问比在私有论坛中提同样的问题更容易得到有用的回答。有几个道理支持这点，一是看潜在的回复者有多少，二是看论坛的参与者有多少，黑客更愿回答能启发多数人的问题。</p><p>可以理解，老练的黑客和一些流行软件的作者正在承受过多的不当消息。就象那根最后压垮骆驼背的稻草一样，你的加入也有可能使情况走向极端──已经好几次了，一些流行软件的作者退出了对自己软件的支持，因为伴随而来的涌入其私人邮箱的垃圾邮件变得无法忍受。</p><h4 id="面向新手的论坛和互联网中继聊天（IRC）通常响应最快">面向新手的论坛和互联网中继聊天（IRC）通常响应最快<a class="header-anchor" href="#面向新手的论坛和互联网中继聊天（IRC）通常响应最快"></a></h4><p>本地的用户组织或者你所用的 Linux 发行版也许正在宣传新手取得帮助的论坛或 IRC 通道（在一些非英语国家，新手论坛很可能还是邮件列表），这些地方是开始提问的好去处，特别是当你觉得遇到的也许只是相对简单或者很普通的问题时。经过宣传的 IRC 通道是公开邀请提问的地方，通常可以得到实时的回复。</p><p>事实上，如果出问题的程序来自某发行版（这很常见），最好先去该发行版的论坛或邮件列表中提问，再到程序本身的项目论坛或邮件列表，（否则）该项目的黑客可能仅仅回复“用 我们的 代码”。</p><p>在任何论坛发贴以前，先看看有没有搜索功能。如果有，就试着用问题的几个关键词搜索一下，也许就有帮助。如果在此之前你已做过全面的网页搜索（你应该这样去做），还是再搜索一下论坛，搜索引擎有可能没来得及索引此论坛的全部内容。</p><p>通过论坛或 IRC 通道提供项目的用户支持有增长的趋势，电子邮件交流则更多地为项目开发者保留。所以先在论坛或 IRC 中寻求与该项目相关的帮助。</p><h4 id="第二步，使用项目的邮件列表">第二步，使用项目的邮件列表<a class="header-anchor" href="#第二步，使用项目的邮件列表"></a></h4><p>当某个项目存在开发者邮件列表时，要向列表而不是其中的个别成员提问，即使你确信他能最好地回答你的问题。查一查项目的文档和主页，找到项目的邮件列表并使用它。采用这种办法有几个很好的理由：</p><ul class="lvl-0"><li class="lvl-2"><p>向个别开发者提的问题（如果）足够好，也将对整个项目组有益。相反，如果你认为自己的问题对整个项目组来说太愚蠢，这也不能成为骚扰个别开发者的理由。</p></li><li class="lvl-2"><p>向列表提问可以分散开发者的负担，个别开发者（尤其是项目领导）也许太忙以至于没法回答你的问题。</p></li><li class="lvl-2"><p>大多数邮件列表都要存档，那些存档将被搜索引擎索引，如果你向列表提问并得到解答，将来其它人可以通过网页搜索找到你的问题和答案，也就不用再次发问了。</p></li><li class="lvl-2"><p>如果某些问题经常被问到，开发者可以利用此信息改进文档或软件本身，以使其更清楚。如果只是私下提问，就没有人能看到最常见问题的完整场景。</p></li></ul><p>如果一个项目既有 “用户” 也有“开发者”（或 “黑客”）邮件列表或论坛，而你又不摆弄那些代码，向“用户”列表或论坛提问。不要假设自己会在开发者列表中受到欢迎，那些人多半会遭受你的噪音干扰。</p><p>然尔，如果你 确信 你的问题不一般，而且在“用户” 列表或论坛中几天都没有回复，可以试试“开发者”列表或论坛。建议你在张贴前最好先暗暗地观察几天,至少看看最近几天保存的帖子,以了解那的行事方式（事实上这是参与任何私有或半私有列表的好主意）</p><p>如果你找不到一个项目的邮件列表，而只能查到项目维护者的地址，只管向其发信。即便在这种情况下，也别假设（项目）邮件列表不存在。在你的电子邮件中陈述你已经试过但没有找到合适的邮件列表，也提及你不反对将自己的邮件转发给他人（许多人认为，即使没什么秘密，私人电子邮件也不应该被公开。通过允许将你的电子邮件转发他人，你给了相应人员处置你邮件的选择）。</p><h4 id="使用有意义且明确的主题">使用有意义且明确的主题<a class="header-anchor" href="#使用有意义且明确的主题"></a></h4><p>在邮件列表、新闻组或论坛中，主题是你在五十个或更少的字以内吸引有资格专家注意的黄金机会，不要用诸如 “请帮我” （更别提大写的 “请帮我！！！！”，这种主题的消息会被条件反射式地删掉）之类的唠叨浪费机会。不要用你痛苦的深度来打动我们，相反，要在这点空间中使用超级简明扼要的问题描述。</p><p>使用主题的好惯例是“对象──偏差”（式的描述），许多技术支持组织就是这样做的。在“对象”部分指明是哪一个或哪一组东西有问题，在“偏差”部分则描述与期望的行为不一致的地方。</p><p>愚蠢：</p><blockquote><p>救命啊！我的笔记本视频工作不正常！</p></blockquote><p>明智：</p><blockquote><p><a href="http://X.org">X.org</a> 6.8.1 扭曲鼠标光标，MV1005 型号的某显卡芯片组</p></blockquote><p>更明智：</p><blockquote><p>使用 MV1005 型号的某显卡芯片组在 <a href="http://X.org">X.org</a> 6.8.1 的鼠标光标被扭曲</p></blockquote><p>编写 “对象──偏差”式描述的过程有助于你组织对问题的细致思考。是什么被影响了？仅仅是鼠标光标或者还有其它图形？只在 <a href="http://X.org">X.org</a> 中出现？或只是在其 6.8.1 版中？是针对某显卡芯片组？或者只是其中的 MV1005 型号？一个黑客只需描一眼就能够立即明白什么是你遇到的问题，什么是你自己的问题。</p><p>更一般地，想象一下在一个只显示主题的文档索引中查找。让你的主题更好地反映问题，可以使下一个搜索类似问题的人能够在文档中直接就找到答案的线索，而不用再次发贴提问。</p><p>如果你想在回复中提问，确保改变主题以表明你是在问一个问题，一个主题象 <code>Re: 测试</code> 或者 <code>Re: 新Bug</code> 的消息不太可能引起足够的注意。同时，将回复中与新主题不甚相关的引用内容尽量删除。</p><p>对于列表消息，不要直接点击回复（按钮）来开始一个全新的线索，这将限制你的观众。有些邮件阅读程序，比如 mutt，允许用户按线索排序并通过折叠线索来隐藏消息，这样做的人永远看不到你发的消息。</p><p>仅仅改变主题还不够。mutt 和其它一些邮件阅读程序还要检查邮件头主题以外的其它信息，以便为其指定线索，所以宁可发一个全新的邮件。</p><p>在论坛，因为消息与特定的线索紧密结合，并且通常在线索之外不可见，好的提问方式略有不同，通过回复提问并不要紧。不是所有论坛都允许在回复中出现分离的主题，而且这样做了基本上没有人会去看。不过，通过回复提问本身就是令人怀疑的做法，因为它们只会被正在查看该线索的人读到。所以，除非你 只想 在该线索当前活跃的人群中提问，还是另起炉灶比较好。</p><h4 id="使问题容易回复">使问题容易回复<a class="header-anchor" href="#使问题容易回复"></a></h4><p>以<code>请向……回复</code>来结束问题多半会使你得不到回答。如果你觉得花几秒钟在邮件客户端设置一下回复地址都麻烦，我们也觉得花几秒钟考虑你的问题更麻烦。如果你的邮件客户端程序不支持这样做，换个好点的；如果是操作系统不支持所有这种邮件客户端程序，也换个好点的。</p><p>在论坛，要求通过电子邮件回复是完全无礼的，除非你确信回复的信息也许是敏感的（而且有人会为了某些未知的原因，只让你而不是整个论坛知道答案）。如果你只是想在有人回复线索时得到电子邮件提醒，可以要求论坛发送。几乎所有论坛都支持诸如<code>留意本线索</code>、<code>有回复发送邮件</code>等功能。</p><h4 id="用清晰、语法、拼写正确的语句书写">用清晰、语法、拼写正确的语句书写<a class="header-anchor" href="#用清晰、语法、拼写正确的语句书写"></a></h4><p>经验告诉我们，粗心与草率的作者通常也粗心与草率地思考和编程（我敢打赌）。为这些粗心与草率的思考者回答问题没有什么好处，我们宁可将时间花在其它地方。</p><p>清楚、良好地表达你的问题非常重要。如果你觉得这样做麻烦，我们也觉得注意（你的问题）麻烦。花点额外的精力斟酌一下字句，用不着太僵硬与正式──事实上，黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它 必须 很准确，而且有迹象表明你是在思考和关注问题。</p><p>正确地拼写、使用标点和大小写，不要将 <code>its</code> 混淆为 <code>it's</code>，<code>loose</code> 搞成 <code>lose</code> 或者将 “discrete” 弄成 “discreet”。不要全部用大写，这会被视为无礼的大声嚷嚷 （全部小写也好不到哪去，因为不易阅读。Alan Cox [注：著名黑客，Linux 内核的重要参与者] 也许可以这样做，但你不行。）</p><p>一般而言，如果你写得象个半文盲似的傻子，多半得不到理睬。也不要使用即时通讯中的简写，如将 <code>you</code> 简化为 <code>u</code> 会使你看起来象一个为了节约二次击键的半文盲式的傻子。更糟的是，如果象个小孩似地鬼画桃符那绝对是在找死，可以肯定没人会理你（或者最多是给你一大堆指责与挖苦）。</p><p>如果在非母语论坛提问，你的拼写与语法错误会得到有限的宽容，但懒惰完全不会被容忍（是的，我们通常看得出其中的差别）。同时，除非你知道回复者使用的语言，请使用英语书写。繁忙的黑客一般会直接删除用他们看不懂语言写的消息。在互联网上英语是工作语言，用英语书写可以将你的问题不被阅读就被直接删除的可能性降到最低。</p><p>如果你用英语书写但它是你的第二语言，最好提醒潜在的回复者语言上可能的困难以便绕过这个问题，比如：</p><ul class="lvl-0"><li class="lvl-2"><p>英语不是我的母语，请谅解拼写错误。</p></li><li class="lvl-2"><p>如果您使用某某语言，请电邮/私聊我，也许我需要您的协助翻译我的问题。</p></li><li class="lvl-2"><p>对于这个技术术语本身我很熟悉，但对于它的一些俚语或习惯表达方式就不太明白了。</p></li><li class="lvl-2"><p>我已经同时用某某语及英语提问，如果您使用两者之一回复，我很乐意翻译。</p></li></ul><h4 id="使用易于读取且标准的文件格式发送问题">使用易于读取且标准的文件格式发送问题<a class="header-anchor" href="#使用易于读取且标准的文件格式发送问题"></a></h4><p>如果你人为地将问题搞得难以阅读，它多半会被忽略，人们更愿读易懂的问题，所以：</p><ul class="lvl-0"><li class="lvl-2"><p>使用纯文本而不是 HTML（超文本标注语言）（ 关闭HTML 并不难）</p></li><li class="lvl-2"><p>使用 MIME（多用途互联网邮件扩展）附件通常没有问题，前提是真正有内容（譬如附带的源文件或补丁），而不仅仅是邮件客户端程序生成的模板（譬如只是消息内容的拷贝）。</p></li><li class="lvl-2"><p>不要发送整段只是单行句子但多次折回的邮件（这使得回复部分内容非常困难）。设想你的读者是在80个字符宽的文本终端阅读邮件，设置你的行折回点小于 80 列。</p></li><li class="lvl-2"><p>但是，也 不要 用任何固定列折回数据（譬如日志文件拷贝或会话记录）。数据应该原样包含，使回复者确信他们看到的是与你看到的一样的东西。</p></li><li class="lvl-2"><p>在英语论坛中，不要使用’Quoted-Printable’ MIME 编码发送消息。这种编码对于张贴非 ASCII 语言可能是必须的，但很多邮件程序并不支持。当它们分断时，那些文本中四处散布的 “=20”符号既难看也分散注意力，甚至有可能破坏内容的语意。</p></li><li class="lvl-2"><p>永远不要 指望黑客们阅读使用封闭的专用格式编写的文档，诸如微软公司的 Word 或 Excel 文件等。大多数黑客对此的反应就象有人将还在冒热气的猪粪倒在你门口时你的反应一样。即使他们能够处理，也很厌恶这么做。</p></li><li class="lvl-2"><p>如果你从使用视窗的电脑发送电子邮件，关闭问题颇多的微软“聪明引用”功能（在“工具” -&gt; “自动纠正选项”的“输入时自动格式化”下去掉聪明引用的选框），以免在你的邮件中到处散布垃圾字符。</p></li><li class="lvl-2"><p>在论坛，勿滥用“表情符号”和“HTML”功能(当它们提供时)。一两个表情符号通常没有问题，但花哨的彩色文本倾向于使人认为你是个无能之辈。过滥地使用表情符号、色彩和字体会使你看来象个傻笑的小姑娘。这通常不是个好主意，除非你只是对性而不是有用的回复更有兴趣。</p></li><li class="lvl-2"><p>如果你使用图形用户界面的邮件客户端程序(如网景公司的 Messenger、微软公司的 Outlook 或者其它类似的)，注意它们的缺省配置不一定满足这些要求。大多数这类程序有基于菜单的<code>查看源码</code>命令，用它来检查发送文件夹中的消息，以确保发送的是没有多余杂质的纯文本文件。</p></li></ul><h4 id="描述问题应准确且有内容">描述问题应准确且有内容<a class="header-anchor" href="#描述问题应准确且有内容"></a></h4><ul class="lvl-0"><li class="lvl-2"><p>仔细、清楚地描述问题的症状</p></li><li class="lvl-2"><p>描述问题发生的环境(主机、操作系统、应用程序，任何相关的)，提供销售商的发行版和版本号（如：“Fedora Core 7”、“Slackware 9.1”等）</p></li><li class="lvl-2"><p>描述提问前做过的研究及其理解。</p></li><li class="lvl-2"><p>描述提问前为确定问题而采取的诊断步骤。</p></li><li class="lvl-2"><p>描述最近对计算机或软件配置的任何相关改变。</p></li><li class="lvl-2"><p>如果可能，提供在可控环境下重现问题的方法。</p></li><li class="lvl-2"><p>尽最大努力预测黑客会提到的问题，并提前备好答案。</p></li></ul><p>如果你认为是代码有问题，向黑客提供在可控环境下重现问题的方法尤其重要。当你这么做时，得到有用且及时回复的可能性将大大增加。</p><p><a href="http://www.chiark.greenend.org.uk/%7Esgtatham/">西蒙.泰瑟姆（Simon Tatham）</a>写过一篇《<a href="http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-tw.html">如何有效报告Bug》</a>的文章，我强烈推荐各位阅读。</p><h4 id="量不在多，精炼则灵">量不在多，精炼则灵<a class="header-anchor" href="#量不在多，精炼则灵"></a></h4><p>你应该（写得）精炼且有内容，简单地将一大堆代码或数据罗列在求助消息中达不到目的。如果你有一个很大且复杂的测试样例让程序崩溃，尝试将其裁剪得越小越好。</p><p>至少有三个理由支持这点。第一，让别人看到你在努力简化问题使你更有可能得到回复。第二，简化问题使你更有可能得到 <code>有用的</code> 回复。第三，在提纯Bug报告的过程中，你可能自己就找到了解决办法或权宜之计。</p><h4 id="别急于宣称找到Bug">别急于宣称找到Bug<a class="header-anchor" href="#别急于宣称找到Bug"></a></h4><p>当你在一个软件中遇到问题，除非你 非常、非常 的有根据，不要动辄声称找到了Bug。提示：除非你能提供解决问题的源代码补丁，或者对前一版本的回归测试表现出不正确的行为，否则你都多半不够完全确信。对于网页和文档也如此，如果你（声称）发现了文档的“Bug”，你应该能提供相应位置的替代文本。</p><p>记住，还有许多其它用户并未经历你遇到的问题，否则你在阅读文档或搜索网页时就应该发现了（[你在报怨前已经做了这些，是吧 ？](#你在报怨前已经做了这些，是吧 ？)）。这也意味着很有可能是你弄错了而不是软件本身有问题。</p><p>编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了Bug，也就置疑了他们的能力，即使你是对的，也有可能会使其中的部分人感到不快。（此外，）在主题中嚷嚷“Bug”也是特别不老练的。</p><p>提问时，即使你私下非常确信已经发现一个真正的Bug，最好写得象是 你 做错了什么。如果真的有Bug，你会在回复中看到这点。这样做的话，如果真有虫子，维护者就会向你道歉，这总比你弄砸了然后欠别人一个道歉要强。</p><h4 id="低声下气代替不了做自己的家庭作业">低声下气代替不了做自己的家庭作业<a class="header-anchor" href="#低声下气代替不了做自己的家庭作业"></a></h4><p>有些人明白他们不应该粗鲁或傲慢地行事并要求得到答复，但他们退到相反的低声下气的极端：“我知道我只是个可怜的新丁，一个失败者，但……”。这既使人困扰，也没有用，当伴随着对实际问题含糊的描述时还特别令人反感。</p><p>别用低级灵长类动物的办法浪费你我的时间，相反，尽可能清楚地描述背景情况和你的问题，这比低声下气更好地摆正了你的位置。</p><p>有时，论坛设有单独的初学者提问版面，如果你真的认为遇到了肤浅的问题，到那去就是了，但一样别低声下气。</p><h4 id="描述问题症状而不是猜测">描述问题症状而不是猜测<a class="header-anchor" href="#描述问题症状而不是猜测"></a></h4><p>告诉黑客是什么导致了问题是没用的（如果你的诊断理论是了不起的东西，你还会向别人咨询求助吗？）。所以，确保只是告诉他们问题的原始症状，而不是你的解释和理论，让他们来解释和诊断。如果你认为陈述自己的猜测很重要，应清楚地说明这只是你的猜测并描述为什么它们不起作用。</p><p>愚蠢：</p><blockquote><p>我在编译内核时接连遇到 SIG11 错误，怀疑主板上的某根电路丝断了，找到它们的最好办法是什么？</p></blockquote><p>明智：</p><blockquote><p>我组装的电脑（K6/233 CPU、FIC-PA2007 主板[威盛 Apollo VP2 芯片组]、Corsair PC133 SDRAM 256Mb 内存）最近在开机 20 分钟左右、做内核编译时频繁地报 SIG11 错，但在头 20 分钟内从不出问题。重启动不会复位时钟，但整夜关机会。更换所有内存未解决问题，相关的典型编译会话日志附后。</p></blockquote><p>由于以上这点许多人似乎难以掌握，这里有句话可以提醒你：“所有的诊断专家都来自密苏里州”。美国国务院的官方座右铭则是“让我看看”（出自国会议员威勒德.D.范迪弗［Willard D. Vandiver］在1899年时的讲话：“我来自一个出产玉米、棉花、牛蒡和民主党人的国家，滔滔雄辩既不能说服我，也不会让我满意。我来自密苏里州，你必须让我看看。”）针对诊断者而言，这并不是怀疑，而只是一种真实而有用的需求，以便让他们看到与你看到的原始证据尽可能一致的东西，而不是你的猜测与总结。（所以，）让我们看看。</p><h4 id="按时间先后罗列问题症状">按时间先后罗列问题症状<a class="header-anchor" href="#按时间先后罗列问题症状"></a></h4><p>刚出问题之前发生的事情通常包含有解决问题最有效的线索。所以，记录中应准确地描述你、电脑和软件在崩溃前都做了什么。在命令行处理的情况下，有会话日志（如运行脚本工具生成的）并引用相关的若干（如20）行记录会非常有帮助。</p><p>如果崩溃的程序有诊断选项（如-v详述开关），试着选择这些能在记录中增加排错信息的选项。记住，“多”不等于“好”。试着选取适当的排错级别以便提供有用的信息而不是将阅读者淹没在垃圾中。</p><p>如果你的记录很长（如超过四段），在开头简述问题随后按时间先后罗列详细过程也许更有用。这样，黑客在读你的记录时就知道该注意哪些内容了。</p><h4 id="描述目标而不是过程">描述目标而不是过程<a class="header-anchor" href="#描述目标而不是过程"></a></h4><p>如果你想弄清楚如何做某事（而不是报告一个Bug），在开头就描述你的目标，然后才陈述遇到问题的特定步骤。</p><p>经常出现这种情况，寻求技术帮助的人在脑袋里有个更高层次的目标，他们在自以为能达到目标的特定道路上被卡住了，然后跑来问该怎么走，但没有意识到这条路本身有问题，结果要费很大的劲才能通过。</p><p>愚蠢：</p><blockquote><p>我怎样才能让某图形程序的颜色拾取器取得十六进制的 RGB 值？</p></blockquote><p>明智：</p><blockquote><p>我正试着用自己选定数值的颜色替换一幅图片的色表，我现在知道的唯一方法是编辑每个表槽，但却无法让某图形程序的颜色拾取器取得十六进制的 RGB 值。</p></blockquote><p>第二种提法是明智的，它使得建议采用更合适的工具以完成任务的回复成为可能。</p><h4 id="别要求私下回复电邮">别要求私下回复电邮<a class="header-anchor" href="#别要求私下回复电邮"></a></h4><p>黑客们认为问题的解决过程应该公开、透明，此过程中如果更有才能的人注意到不完整或者不当之处，最初的回复才能够、也应该被纠正。同时，作为回复者也因为能力和学识被其它同行看到而得到某种回报。</p><p>当你要求私下回复时，此过程和回报都被中止。别这样做，让 回复者 来决定是否私下回答──如果他真这么做了，通常是因为他认为问题编写太差或者太肤浅，以至于对其它人毫无意义。</p><p>对这条规则存在一条有限的例外，如果你确信提问可能会引来大量雷同的回复时，那么“向我发电邮，我将为论坛归纳这些回复”将是神奇的句子。试着将邮件列表或新闻组从洪水般雷同的回复中解救出来是非常有礼貌的──但你必须信守诺言。</p><h4 id="提问应明确">提问应明确<a class="header-anchor" href="#提问应明确"></a></h4><p>漫无边际的问题通常也被视为没有明确限制的时间无底洞。最有可能给你有用答案的人通常也是最忙的人（假如只是因为他们承担了太多工作的话），这些人对于没有止境的时间无底洞极其敏感，所以他们也倾向于讨厌那些漫无边际的问题。</p><p>如果你明确了想让回复者做的事（如指点方向、发送代码、检查补丁或其它），你更有可能得到有用的回复。（因为）这样可以让他们集中精力并间接地设定了他们为帮助你需要花费的时间和精力上限，这很好。</p><p>要想理解专家生活的世界，可以这样设想：那里有丰富的专长资源但稀缺的响应时间。你暗中要求他们奉献的时间越少，你越有可能从这些真正懂行也真正很忙的专家那里得到解答。</p><p>所以限定你的问题以使专家回答时需要付出的时间最少──这通常与简化问题还不太一样。举个例，“请问可否指点一下哪有好一点的 X 解释？”通常要比“请解释一下 X”明智。如果你的代码不运行了，通常请别人看看哪有问题比叫他们帮你改正更明智。</p><h4 id="关于代码的问题">关于代码的问题<a class="header-anchor" href="#关于代码的问题"></a></h4><p>别要求他人给你出问题的代码排错而不提及应该从何入手。张贴几百行的代码，然后说一声“它不能运行”会让你得不到理睬。只贴几十行代码，然后说一句“在第七行以后，本应该显示<x>，但实际出现的是<y>”非常有可能让你得到回复。</p><p>最精确描述代码问题的方法是提供一个能展示问题的最小测试样例。什么是最小测试样例？它是对问题的展现，只需要刚好能够重现非预期行为的代码即可。如何生成一个最小测试样例？如果你知道哪一行或哪一段代码会产生问题，将其复制并提供刚好够用的外围支撑代码以构成一个完整的样例（够用是指源码刚好能被编译器、解释器或任何处理它的程序所接受）。如果你不能将问题缩小到特定的段落，复制源码并去除那些与问题无关的代码段。你能提供的最小测试样例越小越好（参见 量不在多，精炼则灵 ）。</p><p>生成一个非常小的最小测试样例并不总是可能，但尽力去做是很好的锻练，这有可能帮助你找到需要自己解决的问题。即使你找不到，黑客们喜欢看到你努力过，这将使他们更合作。</p><p>如果你只是想让别人帮忙审一下代码，在最开头就要说出来，并且一定要提到你认为哪一部分特别需要关注以及为什么。</p><h4 id="别张贴家庭作业式问题">别张贴家庭作业式问题<a class="header-anchor" href="#别张贴家庭作业式问题"></a></h4><p>黑客们善于发现“家庭作业”式的问题。我们中的大多数人已经做了自己的家庭作业，那是该 你 做的，以便从中学到东西。问一下提示没有关系，但不是要求完整的解决方案。</p><p>如果你怀疑自己碰到了一个家庭作业式的问题，但仍然无法解决，试试在用户组、论坛或（作为最后一招）在项目的“用户”邮件列表或论坛中提问。尽管黑客们 会 看出来，一些老用户也许仍会给你提示。</p><h4 id="删除无意义的要求">删除无意义的要求<a class="header-anchor" href="#删除无意义的要求"></a></h4><p>抵制这种诱惑，即在求助消息末尾加上诸如“有人能帮我吗？”或“有没有答案？”之类在语义上毫无意义的东西。第一，如果问题描述还不完整，这些附加的东西最多也只能是多余的。第二，因为它们是多余的，黑客们会认为这些东西烦人──就很有可能用逻辑上无误但打发人的回复，诸如“是的，你可以得到帮助”和“不，没有给你的帮助”。</p><p>一般来说，避免提“是或否”类型的问题，除非你想得到 “是或否”类型的回答。</p><h4 id="不要把问题标记为“紧急”，即使对你而言的确如此">不要把问题标记为“紧急”，即使对你而言的确如此<a class="header-anchor" href="#不要把问题标记为“紧急”，即使对你而言的确如此"></a></h4><p>这是你的问题，不要我们的。宣称“紧急”极有可能事与愿违：大多数黑客会直接删除这种消息，他们认为这是无礼和自私地企图得到即时与特殊的关照。而且“紧急”或其它有类似含义的主题有可能触发垃圾过滤规则，潜在的回复者可能永远看不到你的问题！</p><p>有一点点局部的例外，如果你是在一些知名度很高、会使黑客们激动的地方使用程序，也许值得这样去做。在这种情况下，如果你有期限压力，也很有礼貌地提到这点，人们也许会有足够的兴趣快一点回答。</p><p>当然，这是非常冒险的，因为黑客们对什么是令人激动的标准多半与你的不同。譬如从国际空间站这样张贴没有问题，但代表感觉良好的慈善或政治原因这样做几乎肯定不行。事实上，张贴诸如“紧急：帮我救救这个毛绒绒的小海豹！”肯定会被黑客回避或光火，即使他们认为毛绒绒的小海豹很重要。</p><p>如果你觉得这不可思议，再把剩下的内容多读几遍，直到弄懂了再发贴也不迟。</p><h4 id="礼貌总是有益的">礼貌总是有益的<a class="header-anchor" href="#礼貌总是有益的"></a></h4><p>礼貌一点，使用 <code>请</code> 和 <code>谢谢你的关注</code> 或者 <code>谢谢你的关照</code>，让别人明白你感谢他们无偿花时间帮助你。</p><p>坦率地讲，这一点没有语法正确、文字清晰、准确、有内容和避免使用专用格式重要（同时也不能替代它们）。黑客们一般宁可读有点唐突但技术鲜明的Bug报告，而不是那种有礼但含糊的报告。（如果这点让你不解，记住我们是按问题能教我们什么来评价它的）</p><p>然尔，如果你已经谈清楚了技术问题，客气一点肯定会增加你得到有用回复的机会。</p><p>（我们必须指出，本文唯一受到一些老黑客认真反对的地方是以前曾经推荐过的“提前谢了”，一些黑客认为这隐含着事后不用再感谢任何人的暗示。我们的建议是要么先说 <code>提前谢了</code>，事后 再 对回复者表示感谢，要么换种方式表达，譬如用 <code>谢谢你的关注</code> 或 <code>谢谢你的关照</code>）。</p><h4 id="问题解决后追加一条简要说明">问题解决后追加一条简要说明<a class="header-anchor" href="#问题解决后追加一条简要说明"></a></h4><p>问题解决后向所有帮助过的人追加一条消息，让他们知道问题是如何解决的并再次感谢。如果问题在邮件列表或新闻组中受到广泛关注，在那里追加此消息比较恰当。</p><p>最理想的方式是向最初提问的线索回复此消息，并在主题中包含 <code>已解决</code>、<code>已搞定</code> 或其它同等含义的明显标记。在人来人往的邮件列表里，一个看见线索 <code>问题 X</code> 和 <code>问题 X-已解决</code> 的潜在回复者就明白不用再浪费时间了（除非他个人觉得“问题 X”有趣），因此可以利用此时间去解决其它问题。</p><p>追加的消息用不着太长或太复杂，一句简单的“你好──是网线坏了！谢谢大家──比尔”就比什么都没有要强。事实上，除非解决问题的技术真正高深，一条简短而亲切的总结比长篇大论要好。说明是什么行动解决了问题，用不着重演整个排错的故事。</p><p>对于有深度的问题，张贴排错历史的摘要是恰当的。描述问题的最终状态，说明是什么解决了问题，在此之后 才指明可以避免的弯路。应避免的弯路部分应放在正确的解决方案和其它总结材料之后，而不要将此消息搞成侦探推理小说。列出那些帮助过你的名字，那样你会交到朋友的。</p><p>除了有礼貌、有内容以外，这种类型的追帖将帮助其他人在邮件列表、新闻组或论坛文档中搜索到真正解决你问题的方案，从而也让他们受益。</p><p>最后，此类追帖还让每位参与协助的人因问题的解决而产生一种满足感。如果你自己不是技术专家或黑客，相信我们，这种感觉对于你寻求帮助的老手和专家是非常重要的。问题叙述到最后不知所终总是令人沮丧的，黑客们痒痒地渴望它们被解决。<code>挠痒痒</code> 为你挣到的信誉将对你下次再次张贴提问非常非常的有帮助。</p><p>考虑一下怎样才能避免他人将来也遇到类似的问题，问问自己编一份文档或 FAQ 补丁会不会有帮助，如果是的话就将补丁发给维护者。</p><p>在黑客中，这种良好的后继行动实际上比传统的礼貌更重要，也是你善待他人而赢得声誉的方式，这是非常有价值的财富。</p><h3 id="如何解读回答">如何解读回答<a class="header-anchor" href="#如何解读回答"></a></h3><h4 id="“读读该死的手册”（RTFM）和“搜搜该死的网络”（STFW）：如何明白你已完全搞砸">“读读该死的手册”（RTFM）和“搜搜该死的网络”（STFW）：如何明白你已完全搞砸<a class="header-anchor" href="#“读读该死的手册”（RTFM）和“搜搜该死的网络”（STFW）：如何明白你已完全搞砸"></a></h4><p>有一个古老而神圣的传统：如果你收到 <code>读读该死的手册</code>（RTFM） 的回复，发信人认为你应该去“读读该死的手册”。他或她多半是对的，去读一下吧。</p><p>“读读该死的手册”（RTFM）有个年轻一点的亲戚，如果你收到“搜搜该死的网络”（STFW）的回复，发信人认为你应该“搜搜该死的网络”。那人多半也是对的，去搜一下吧。(更温和一点的说法是“<a href="http://lmgtfy.com/">谷歌是你的朋友！</a>”)</p><p>在论坛，你也可能被要求去搜索论坛的文档。事实上，有人甚至可能热心地为你提供以前解决此问题的线索。但不要依赖这种关照，提问前应该先搜索一下文档。</p><p>通常，叫你搜索的人已经打开了能解决你问题的手册或网页，正在一边看一边敲键盘。这些回复意味着他认为：</p><ul class="lvl-0"><li class="lvl-2"><p>第一，你要的信息很容易找到。</p></li><li class="lvl-2"><p>第二，自已找要比别人喂到嘴里能学得更多。</p></li></ul><p>你不应该觉得这样就被冒犯了，按黑客的标准，回复者没有不理你就是在向你表示某种尊敬，你反而应该感谢他热切地想帮助你。</p><h4 id="如果还不明白……">如果还不明白……<a class="header-anchor" href="#如果还不明白……"></a></h4><p>如果你看不懂回答，不要马上回复一个要求说明的消息，先试试那些最初提问时用过的相同工具（如手册、FAQ、网页、懂行的朋友等）试着搞懂回答。如果还是需要说明，展现你已经明白的。</p><p>譬如，假如我告诉你：“看起来象是某输入项有问题，你需要清除它”，接着是个 不好 的回帖：“什么是某输入项？”。而这是一个 很好 的跟帖：“是的，我读了手册，某某输入项只在 -z 和 -p 开关中被提到，但都没有涉及到如何清除它们，你指的是哪一个还是我弄错了什么？”</p><h4 id="对待无礼">对待无礼<a class="header-anchor" href="#对待无礼"></a></h4><p>很多黑客圈子中看似无礼的行为并不是存心冒犯。相反，它是直接了当、一针见血式的交流风格，这种风格对于更关注解决问题而不是使别人感觉舒服而混乱的人是很自然的。</p><p>如果你觉得被冒犯了，试着平静地反应。如果有人真的做了过格的事，邮件列表、新闻组或论坛中的前辈多半会招呼他。如果这 没有 发生而你却光火了，那么你发火对象的言语可能在黑客社区中看起来是正常的，而 你 将被视为有错的一方，这将伤害到你获取信息或帮助的机会。</p><p>另一方面，你会偶而真的碰到无礼和无聊的言行。与上述相反，对真正的冒犯者狠狠地打击、用犀利的语言将其驳得体无完肤都是可以接受的。然尔，在行事之前一定要非常非常的有根据。纠正无礼的言论与开始一场毫无意义的口水战仅一线之隔，黑客们自己莽撞地越线的情况并不鲜见。如果你是新手或外来者，避开这种莽撞的机会并不高。如果你想得到的是信息而不是消磨时光，这时最好不要把手放在键盘上以免冒险。</p><p>（有些人断言很多黑客都有轻度的自闭症或阿斯伯格综合症，缺少用于润滑人类社会“正常”交往所需的脑电路。这既可能是真也可能是假。如果你自己不是黑客，兴许你认为我们脑袋有问题还能帮助你应付我们的古怪行为。只管这么干好了，我们不在乎。我们 喜欢 现在这个样子，并且一般都对病号标记有站得住脚的怀疑。）</p><p>在下一节，我们会谈到另一个问题，当 你 行为不当时会受到的“冒犯”。</p><h3 id="别象失败者那样反应">别象失败者那样反应<a class="header-anchor" href="#别象失败者那样反应"></a></h3><p>在黑客社区的论坛中有那么几次你可能会搞砸──以本文描述或类似的方式。你会被示众是如何搞砸的，也许言语中还会带点颜色。</p><p>这种事发生以后，你能做的最糟糕的事莫过于哀嚎你的遭遇、宣称被口头攻击、要求道歉、高声尖叫、憋闷气、威胁诉诸法律、向其雇主报怨、忘了关马桶盖等等。相反，你该这样去做：</p><p>熬过去，这很正常。事实上，它是有益健康与恰当的。</p><p>社区的标准不会自己维持，它们是通过参与者积极而 公开 地执行来维持的。不要哭嚎所有的批评都应该通过私下的邮件传送，这不是事情运作的方式。当有人评论你的一个说法有误或者提出不同看法时，坚持声称受到个人攻击也毫无益处，这些都是失败者的态度。</p><p>也有其它的黑客论坛，受过高礼节要求的误导，禁止参与者张贴任何对别人帖子挑毛病的消息，并声称“如果你不想帮助用户就闭嘴”。有思路的参与者纷纷离开的结果只会使它们变成了毫无意义的唠叨与无用的技术论坛。</p><p>是夸张的“友谊”（以上述方式）还是有用？挑一个。</p><p>记着：当黑客说你搞砸了，并且(无论多么刺耳地)告诉你别再这样做时，他正在为关心你和他的社区而行动。对他而言，不理你并将你从他的生活中滤除要容易得多。如果你无法做到感谢，至少要有点尊严，别大声哀嚎，也别因为自己是个有戏剧性超级敏感的灵魂和自以为有资格的新来者，就指望别人象对待脆弱的洋娃娃那样对你。</p><p>有时候，即使你没有搞砸（或者只是别人想象你搞砸了）， 有些人也会无缘无故地攻击你本人。在这种情况下，报怨倒是 真的 会把问题搞砸。</p><p>这些找茬者要么是毫无办法但自以为是专家的不中用家伙，要么就是测试你是否真会搞砸的心理专家。其它读者要么不理睬，要么用自己的方式对付他们。这些找茬者在给自己找麻烦，这点你不用操心。</p><p>也别让自己卷入口水战，大多数口水战最好不要理睬──当然，是在你核实它们只是口水战、没有指出你搞砸的地方，而且没有巧妙地将问题真正的答案藏于其中之后（这也是可能的）。</p><h3 id="提问禁忌">提问禁忌<a class="header-anchor" href="#提问禁忌"></a></h3><p>下面是些典型的愚蠢问题和黑客不回答它们时的想法。</p><p>问：我到哪可以找到某程序或 X 资源？</p><p>问：我怎样用 X 做 Y？</p><p>问：如何配置我的 shell 提示？</p><p>问：我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 文档转为 TeX 格式吗？</p><p>问：我的{程序、配置、SQL 语句}不运行了</p><p>问：我的视窗电脑出问题了，你能帮忙吗？</p><p>问：我的程序不运行了，我认为系统工具X有问题</p><p>问：我安装 Linux 或 X 遇到困难，你能帮忙吗？</p><p>问：我如何才能破解超级用户口令/盗取通道操作员的特权/查看某人的电子邮件？</p><hr><p>问：</p><blockquote><p>我到哪可以找到某程序或 X 资源？</p></blockquote><p>答：</p><blockquote><p>在我找到它的同样地方，笨旦──在网页搜索引擎上。上帝啊，难道还有人不知道如何使用 谷歌 吗？</p></blockquote><p>问：</p><blockquote><p>我怎样用 X 做 Y？</p></blockquote><p>答：</p><blockquote><p>如果你想解决的是 Y，提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知，也对要解决的 Y 问题糊涂，还被特定形势禁锢了思维。等他们把问题弄好再说。</p></blockquote><p>问：</p><blockquote><p>如何配置我的 shell 提示？</p></blockquote><p>答：</p><blockquote><p>如果你有足够的智慧提这个问题，你也该有足够的智慧去 “读读该死的手册”（RTFM），然后自己去找出来。</p></blockquote><p>问：</p><blockquote><p>我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 文档转为 TeX 格式吗？</p></blockquote><p>答：</p><blockquote><p>试试就知道了。如果你试过，你既知道了答案，又不用浪费我的时间了。</p></blockquote><p>问：</p><blockquote><p>我的{程序、配置、SQL 语句}不运行了</p></blockquote><p>答：</p><blockquote><p>这不是一个问题，我也没有兴趣去猜你有什么问题──我有更要紧的事要做。看到这种东西，我的反应一般如下：</p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>你还有什么补充吗？</p></li><li class="lvl-2"><p>噢，太糟了，希望你能搞定。</p></li><li class="lvl-2"><p>这跟我究竟有什么关系？</p></li></ul><p>问：</p><blockquote><p>我的视窗电脑出问题了，你能帮忙吗？</p></blockquote><p>答：</p><blockquote><p>是的，把视窗垃圾删了，装个象 Linux 或 BSD 的开源操作系统吧。</p></blockquote><p>注意：如果程序有官方的视窗版或者与视窗有交互(如 Samba)，你 可以 问与视窗相关的问题，只是别对问题是由视窗操作系统而不是程序本身造成的回复感到惊讶，因为视窗一般来说太差，这种说法一般都成立。</p><p>问：</p><blockquote><p>我的程序不运行了，我认为系统工具 X 有问题</p></blockquote><p>答：</p><blockquote><p>你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与库文件有明显缺陷的人，更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据，当你这样声称时，你必须有清楚而详尽的缺陷说明文档作后盾。</p></blockquote><p>问：</p><blockquote><p>我安装 Linux 或 X 遇到困难，你能帮忙吗？</p></blockquote><p>答：</p><blockquote><p>不行，我需要亲手操作你的电脑才能帮你排错，去向当地的 Linux 用户组寻求方便的帮助（你可以在 这里 找到用户组列表）</p></blockquote><p>注意：如果安装问题与某 Linux 发行版有关，在针对 它 的邮件列表、论坛或本地用户组织中提问也许是恰当的。此时，应描述问题的准确细节。在此之前，先用 “linux”和 所有 被怀疑的硬件 [作关键词] 仔细搜索。</p><p>问：</p><blockquote><p>我如何才能破解超级用户口令/盗取通道操作员的特权/查看某人的电子邮件？</p></blockquote><p>答：</p><blockquote><p>想做这种事情说明你是个卑劣的家伙，想让黑客教你做这种事情说明你是个白痴。</p></blockquote><h4 id="好问题与坏问题">好问题与坏问题<a class="header-anchor" href="#好问题与坏问题"></a></h4><p>最后，我将通过举例来演示提问的智慧。同样的问题两种提法，一种愚蠢，另一种明智。</p><p>愚蠢：我在哪能找到关于 Foonly Flurbamatic 设备的东西？</p><blockquote><p>这个问题在乞求得到 “搜搜该死的网络”（STFW） 式的回复。</p></blockquote><p>明智： 我用谷歌搜索过“Foonly Flurbamatic 2600”，但没有找到什么有用的，有谁知道在哪能找到这种设备的编程信息？</p><blockquote><p>这个人已经搜索过网络了，而且听起来他可能真的遇到了问题。</p></blockquote><p>愚蠢： 我不能编译某项目的源代码，它为什么这么破？</p><blockquote><p>提问者假设是别人搞砸了，太自大了。</p></blockquote><p>明智： 某项目的源代码不能在某 Linux 6.2 版下编译。我读了常见问题文档，但其中没有与某 Linux 相关的内容。这是编译时的记录，我做错了什么吗？</p><blockquote><p>提问者已经指明了运行环境，读了常见问题文档（FAQ），列出了错误，也没有假设问题是别人的过错，这家伙值得注意。</p></blockquote><p>愚蠢： 我的主板有问题，谁能帮我？</p><blockquote><p>某黑客对此的反应可能是：“是的，还需要帮你拍背和换尿布吗？”，然后是敲下删除键。</p></blockquote><p>明智： 我在 S2464 主板上试过 X、Y 和 Z，当它们都失败后，又试了 A、B 和 C。注意我试 C 时的奇怪症状，显然某某东西正在做某某事情，这不是期望的行为。通常在 Athlon MP 主板上导致某某事情的原因是什么？有谁知道我还能再试点什么以确定问题？</p><blockquote><p>相反地，这个人看来值得回答。他或她展现了解决问题的能力而不是坐等天上掉馅饼。</p></blockquote><p>在最后那个问题中，注意“给我一个回答”与“请帮我看看我还能再做点什么测试以得到启发”之间细微但重要的差别。</p><p>事实上，最后那个问题基本上源于 2001 年 8 月 Linux 内核邮件列表（lkml）上的真实事件，是我（Eric）当时提了那个问题，我发现 Tyan S2462 主板有神秘的死机现象，邮件列表成员给我提供了解决此问题的关键信息。</p><p>通过这种提问方式，我给了别人可以咀嚼玩味的东西。我设法使之对参与者既轻松又有吸引力，也表明了对同行能力的尊敬并邀请他们与我一起协商。通过告诉他们我已经走过的弯路，我还表明了对他们宝贵时间的尊重。</p><p>事后，当我感谢大家并评论这次良好的经历时，一个 Linux 内核邮件列表的成员谈到，他认为我得到答案并不是因为我的名字挂在列表上，而只是因为我正确的提问方式。</p><p>黑客们在某种方面是非常不留情面的精英分子。我想在这事上他是对的，如果我 表现得 象个不劳而获的寄生虫，不管我是谁都会被忽略或斥责。他建议将整个事件作为对其它人提问的指导，这直接导致了本文的编写。</p><h3 id="如果得不到回答">如果得不到回答<a class="header-anchor" href="#如果得不到回答"></a></h3><p>如果得不到回答，请不要认为我们不想帮你，有时只是因为被问到的小组成员的确不知道答案。没有回复不等于不被理睬，当然必须承认从外面很难看出两者的差别。</p><p>一般而言，直接将问题再张贴一次不好，这会被视为毫无意义的骚扰。耐心一点，知道你问题答案的人可能生活在不同的时区，有可能正在睡觉，也有可能你的问题一开始就没有组织好。</p><p>还有其它资源可以寻求帮助，通常是在一些面向新手的资源中。</p><p>有许多在线与本地的用户组织，虽然它们自己不编写任何软件，但是对软件很热心。这些用户组通常因互助和帮助新手而形成。</p><p>还有众多大小商业公司提供签约支持服务，别因为要付点钱才有支持就感到沮丧！毕竟，如果你车子的汽缸垫烧了，你多半还得花钱找个修理店把它弄好。即使软件没花你一分钱，你总不能指望服务支持都是免费的。</p><p>象 Linux 这样流行的软件，每个开发者至少有一万个以上的用户，一个人不可能应付这么多用户的服务要求。记住，即使你必须付费才能得到支持，也比你还得额外花钱买软件要少得多（而且对封闭源代码软件的服务支持与开源软件相比通常还要贵一点，也要差一点）。</p><h3 id="如何更好地回答">如何更好地回答<a class="header-anchor" href="#如何更好地回答"></a></h3><p>态度和善一点。问题带来的压力常使人显得无礼或愚蠢，其实并不是这样。</p><p>对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱，一个真正的新手也许连怎么搜索或在哪找 FAQ 都不知道。</p><p>如果你不确定，一定要说出来！ 一个听起来权威的错误回复比没有还要糟，别因为听起来象个专家好玩就给别人乱指路。要谦虚和诚实，给提问者与同行都树个好榜样。</p><p>如果帮不了忙，别妨碍。 不要在具体步骤上开玩笑，那样也许会毁了用户的安装──有些可怜的呆瓜会把它当成真的指令。</p><p>探索性的反问以引出更多的细节。 如果你做得好，提问者可以学到点东西──你也可以。试试将很差的问题转变成好问题，别忘了我们都曾是新手。</p><p>尽管对那些懒虫报怨一声“读读该死的手册”（RTFM）是正当的，指出文档的位置（即使只是建议做个谷歌关键词搜索）会更好</p><p>如果你决意回答，给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计，应推荐更好的工具，重新组织问题。</p><p>请回答真正的问题！如果提问者已经做了自己该做的研究，并且说明尝试过<code> X，Y，Z，A，B 与 C</code> 都没有得到想要的結果，那么回复 <code>试试 A 或 B</code> 或者给出一个内容为 <code>试一下 X，Y，Z，A，B 或 C</code> 的链接将极其无益！</p><p>帮助你的社区从中学习。当回复一个好问题时，问问自己 <code>如何修改相关文件或 FAQ 文档以免再次解答同样的问题？</code>，接着再向文档维护者发一份补丁。</p><p>如果你是在研究一番后才做出的回答，展现你的技巧而不是直接端出结果。毕竟“授人以鱼，不如授人以渔”。</p><h3 id="相关资源">相关资源<a class="header-anchor" href="#相关资源"></a></h3><p>如果需要个人电脑、Unix 和互联网如何工作的基础知识，参阅 <a href="http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/">Unix 和互联网工作的基本原理</a>。</p><p>当你发布软件或补丁时，试着按 <a href="http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html">软件发布实践</a> 操作。</p><h3 id="鸣谢">鸣谢<a class="header-anchor" href="#鸣谢"></a></h3><p>伊夫林.米切尔（Evelyn Mitchell）贡献了一些愚蠢问题例子并启发了编写<code>如何更好地回答问题</code>这一节，米哈伊尔.罗门迪克（Mikhail Ramendik）贡献了一些特别有价值的建议和改进。</p>]]></content>
      
      
      <categories>
          
          <category> 转载 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> GitHub </tag>
            
            <tag> 转载 </tag>
            
            <tag> 学习 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>03_转载-中文文案排版指北</title>
      <link href="/posts/3e42a4ef.html"/>
      <url>/posts/3e42a4ef.html</url>
      
        <content type="html"><![CDATA[<p>原文：<a href="https://github.com/sparanoid/chinese-copywriting-guidelines/blob/master/README.zh-Hans.md#%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%88%E6%8E%92%E7%89%88%E6%8C%87%E5%8C%97">https://github.com/sparanoid/chinese-copywriting-guidelines</a></p><p>统一中文文案、排版的相关用法，降低团队成员之间的沟通成本，增强网站气质。</p><h2 id="空格">空格<a class="header-anchor" href="#空格"></a></h2><blockquote><p>「有研究显示，打字的时候不喜欢在中文和英文之间加空格的人，感情路都走得很辛苦，有七成的比例会在 34 岁的时候跟自己不爱的人结婚，而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。</p><p>与大家共勉之。」——<a href="https://github.com/vinta/pangu.js">vinta/paranoid-auto-spacing</a></p></blockquote><h3 id="中英文之间需要增加空格">中英文之间需要增加空格<a class="header-anchor" href="#中英文之间需要增加空格"></a></h3><p>正确：</p><blockquote><p>在 LeanCloud 上，数据存储是围绕 <code>AVObject</code> 进行的。</p></blockquote><p>错误：</p><blockquote><p>在LeanCloud上，数据存储是围绕<code>AVObject</code>进行的。</p><p>在 LeanCloud上，数据存储是围绕<code>AVObject</code> 进行的。</p></blockquote><p>完整的正确用法：</p><blockquote><p>在 LeanCloud 上，数据存储是围绕 <code>AVObject</code> 进行的。每个 <code>AVObject</code> 都包含了与 JSON 兼容的 key-value 对应的数据。数据是 schema-free 的，你不需要在每个 <code>AVObject</code> 上提前指定存在哪些键，只要直接设定对应的 key-value 即可。</p></blockquote><p>例外：「豆瓣FM」等产品名词，按照官方所定义的格式书写。</p><h3 id="中文与数字之间需要增加空格">中文与数字之间需要增加空格<a class="header-anchor" href="#中文与数字之间需要增加空格"></a></h3><p>正确：</p><blockquote><p>今天出去买菜花了 5000 元。</p></blockquote><p>错误：</p><blockquote><p>今天出去买菜花了 5000元。</p><p>今天出去买菜花了5000元。</p></blockquote><h3 id="数字与单位之间需要增加空格">数字与单位之间需要增加空格<a class="header-anchor" href="#数字与单位之间需要增加空格"></a></h3><p>正确：</p><blockquote><p>我家的光纤入屋宽带有 10 Gbps，SSD 一共有 20 TB</p></blockquote><p>错误：</p><blockquote><p>我家的光纤入屋宽带有 10Gbps，SSD 一共有 20TB</p></blockquote><p>例外：度数／百分比与数字之间不需要增加空格：</p><p>正确：</p><blockquote><p>角度为 90° 的角，就是直角。</p><p>新 MacBook Pro 有 15% 的 CPU 性能提升。</p></blockquote><p>错误：</p><blockquote><p>角度为 90 ° 的角，就是直角。</p><p>新 MacBook Pro 有 15 % 的 CPU 性能提升。</p></blockquote><h3 id="全角标点与其他字符之间不加空格">全角标点与其他字符之间不加空格<a class="header-anchor" href="#全角标点与其他字符之间不加空格"></a></h3><p>正确：</p><blockquote><p>刚刚买了一部 iPhone，好开心！</p></blockquote><p>错误：</p><blockquote><p>刚刚买了一部 iPhone ，好开心！</p><p>刚刚买了一部 iPhone， 好开心！</p></blockquote><h3 id="用-text-spacing-来挽救？">用 <code>text-spacing</code> 来挽救？<a class="header-anchor" href="#用-text-spacing-来挽救？"></a></h3><p>CSS Text Module Level 4 的 <a href="https://www.w3.org/TR/css-text-4/#text-spacing-property"><code>text-spacing</code></a> 和 Microsoft 的 <a href="https://msdn.microsoft.com/library/ms531164(v=vs.85).aspx"><code>-ms-text-autospace</code></a> 可以实现自动为中英文之间增加空白。不过目前并未普及，另外在其他应用场景，例如 macOS、iOS、Windows 等用户界面目前并不存在这个特性，所以请继续保持随手加空格的习惯。</p><h2 id="标点符号">标点符号<a class="header-anchor" href="#标点符号"></a></h2><h3 id="不重复使用标点符号">不重复使用标点符号<a class="header-anchor" href="#不重复使用标点符号"></a></h3><p>虽然中国大陆的标点符号用法允许重复使用标点符号，但是这么做会破坏句子的美观性。</p><p>正确：</p><blockquote><p>德国队竟然战胜了巴西队！</p><p>她竟然对你说「喵」？！</p></blockquote><p>错误：</p><blockquote><p>德国队竟然战胜了巴西队！！</p><p>德国队竟然战胜了巴西队！！！！！！！！</p><p>她竟然对你说「喵」？？！！</p><p>她竟然对你说「喵」？！？！？？！！</p></blockquote><h2 id="全角和半角">全角和半角<a class="header-anchor" href="#全角和半角"></a></h2><p>不明白什么是全角（全形）与半角（半形）符号？请查看维基百科条目『<a href="https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2">全角和半角</a>』。</p><h3 id="使用全角中文标点">使用全角中文标点<a class="header-anchor" href="#使用全角中文标点"></a></h3><p>正确：</p><blockquote><p>嗨！你知道嘛？今天前台的小妹跟我说「喵」了哎！</p><p>核磁共振成像（NMRI）是什么原理都不知道？JFGI！</p></blockquote><p>错误：</p><blockquote><p>嗨! 你知道嘛? 今天前台的小妹跟我说 “喵” 了哎！</p><p>嗨!你知道嘛?今天前台的小妹跟我说&quot;喵&quot;了哎！</p><p>核磁共振成像 (NMRI) 是什么原理都不知道? JFGI!</p><p>核磁共振成像(NMRI)是什么原理都不知道?JFGI!</p></blockquote><p>例外：中文句子内夹有英文书籍名、报刊名时，不应借用中文书名号，应以英文斜体表示。</p><h3 id="数字使用半角字符">数字使用半角字符<a class="header-anchor" href="#数字使用半角字符"></a></h3><p>正确：</p><blockquote><p>这个蛋糕只卖 1000 元。</p></blockquote><p>错误：</p><blockquote><p>这个蛋糕只卖 １０００ 元。</p></blockquote><p>例外：在设计稿、宣传海报中如出现极少量数字的情形时，为方便文字对齐，是可以使用全角数字的。</p><h3 id="遇到完整的英文整句、特殊名词，其内容使用半角标点">遇到完整的英文整句、特殊名词，其内容使用半角标点<a class="header-anchor" href="#遇到完整的英文整句、特殊名词，其内容使用半角标点"></a></h3><p>正确：</p><blockquote><p>乔布斯那句话是怎么说的？「Stay hungry, stay foolish.」</p><p>推荐你阅读 <em>Hackers &amp; Painters: Big Ideas from the Computer Age</em>，非常地有趣。</p></blockquote><p>错误：</p><blockquote><p>乔布斯那句话是怎么说的？「Stay hungry，stay foolish。」</p><p>推荐你阅读《Hackers＆Painters：Big Ideas from the Computer Age》，非常的有趣。</p></blockquote><h2 id="名词">名词<a class="header-anchor" href="#名词"></a></h2><h3 id="专有名词使用正确的大小写">专有名词使用正确的大小写<a class="header-anchor" href="#专有名词使用正确的大小写"></a></h3><p>大小写相关用法原属于英文书写范畴，不属于本 wiki 讨论内容，在这里只对部分易错用法进行简述。</p><p>正确：</p><blockquote><p>使用 GitHub 登录</p><p>我们的客户有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。</p></blockquote><p>错误：</p><blockquote><p>使用 github 登录</p><p>使用 GITHUB 登录</p><p>使用 Github 登录</p><p>使用 gitHub 登录</p><p>使用 gｲんĤЦ8 登录</p><p>我们的客户有 github、foursquare、microsoft corporation、google、facebook, inc.。</p><p>我们的客户有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。</p><p>我们的客户有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。</p><p>我们的客户有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。</p><p>我们的客户有 gｲんĤЦ8、ｷouЯƧquﾑгє、๓เςг๏ร๏Ŧt ς๏гק๏гคtเ๏ภn、900913、ƒ4ᄃëв๏๏к, IПᄃ.。</p></blockquote><p>注意：当网页中需要配合整体视觉风格而出现全部大写／小写的情形，HTML 中请使用标淮的大小写规范进行书写；并通过 <code>text-transform: uppercase;</code>／<code>text-transform: lowercase;</code> 对表现形式进行定义。</p><h3 id="不要使用不地道的缩写">不要使用不地道的缩写<a class="header-anchor" href="#不要使用不地道的缩写"></a></h3><p>正确：</p><blockquote><p>我们需要一位熟悉 TypeScript、HTML5，至少理解一种框架（如 React、Next.js）的前端开发者。</p></blockquote><p>错误：</p><blockquote><p>我们需要一位熟悉 Ts、h5，至少理解一种框架（如 RJS、nextjs）的 FED。</p></blockquote><h2 id="争议">争议<a class="header-anchor" href="#争议"></a></h2><p>以下用法略带有个人色彩，即：无论是否遵循下述规则，从语法的角度来讲都是<strong>正确</strong>的。</p><h3 id="链接之间增加空格">链接之间增加空格<a class="header-anchor" href="#链接之间增加空格"></a></h3><p>用法：</p><blockquote><p>请 <a href="#">提交一个 issue</a> 并分配给相关同事。</p><p>访问我们网站的最新动态，请 <a href="#">点击这里</a> 进行订阅！</p></blockquote><p>对比用法：</p><blockquote><p>请<a href="#">提交一个 issue</a>并分配给相关同事。</p><p>访问我们网站的最新动态，请<a href="#">点击这里</a>进行订阅！</p></blockquote><h3 id="简体中文使用直角引号">简体中文使用直角引号<a class="header-anchor" href="#简体中文使用直角引号"></a></h3><p>用法：</p><blockquote><p>「老师，『有条不紊』的『紊』是什么意思？」</p></blockquote><p>对比用法：</p><blockquote><p>“老师，‘有条不紊’的‘紊’是什么意思？”</p></blockquote><h2 id="工具">工具<a class="header-anchor" href="#工具"></a></h2><table><thead><tr><th>仓库</th><th>系列</th><th>语言</th></tr></thead><tbody><tr><td><a href="https://github.com/vinta/pangu.js">pangu.js</a></td><td rowspan="9">pangu</td><td>JavaScript</td></tr><tr><td><a href="https://github.com/vinta/pangu">pangu-go</a></td><td>Go</td></tr><tr><td><a href="https://github.com/vinta/pangu.java">pangu.java</a></td><td>Java</td></tr><tr><td><a href="https://github.com/vinta/pangu.py">pangu.py</a></td><td>Python</td></tr><tr><td><a href="https://github.com/dlackty/pangu.rb">pangu.rb</a></td><td>Ruby</td></tr><tr><td><a href="https://github.com/cchlorine/pangu.php">pangu.php</a></td><td>PHP</td></tr><tr><td><a href="https://github.com/hotoo/pangu.vim">pangu.vim</a></td><td>Vim</td></tr><tr><td><a href="https://github.com/serkodev/vue-pangu">vue-pangu</a></td><td>Vue.js (Web Converter)</td></tr><tr><td><a href="https://plugins.jetbrains.com/plugin/19665-pangu">intellij-pangu</a></td><td>Intellij Platform Plugin</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect">autocorrect</a></td><td rowspan="9">autocorrect</td><td>Rust, WASM, CLI tool</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect/tree/main/autocorrect-node">autocorrect-node</a></td><td>Node.js</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect/tree/main/autocorrect-py">autocorrect-py</a></td><td>Python</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect/tree/main/autocorrect-rb">autocorrect-rb</a></td><td>Ruby</td></tr><tr><td><a href="https://github.com/huacnlee/autocorrect/tree/main/autocorrect-java">autocorrect-java</a></td><td>Java</td></tr><tr><td><a href="https://github.com/longbridgeapp/autocorrect">autocorrect-go</a></td><td>Go</td></tr><tr><td><a href="https://github.com/NauxLiu/auto-correct">autocorrect-php</a></td><td>PHP</td></tr><tr><td><a href="https://marketplace.visualstudio.com/items?itemName=huacnlee.autocorrect">autocorrect-vscode</a></td><td>VS Code Extension</td></tr><tr><td><a href="https://plugins.jetbrains.com/plugin/20244-autocorrect">autocorrect-idea-plugin</a></td><td>Intellij Platform Plugin</td></tr><tr><td><a href="https://github.com/jxlwqq/chinese-typesetting">jxlwqq/chinese-typesetting</a></td><td rowspan="6">other</td><td>PHP</td></tr><tr><td><a href="https://github.com/sparanoid/space-lover">sparanoid/space-lover</a></td><td>PHP (WordPress)</td></tr><tr><td><a href="https://github.com/sparanoid/grunt-auto-spacing">sparanoid/grunt-auto-spacing</a></td><td>Node.js (Grunt)</td></tr><tr><td><a href="https://github.com/hjiang/scripts/blob/master/add-space-between-latin-and-cjk">hjiang/scripts/add-space-between-latin-and-cjk</a></td><td rowspan="3">Python</td></tr><tr><td><a href="https://github.com/hustcc/hint">hustcc/hint</a></td></tr><tr><td><a href="https://github.com/n0vad3v/Tekorrect">n0vad3v/Tekorrect</a></td></tr></tbody></table><h2 id="谁在这样做？">谁在这样做？<a class="header-anchor" href="#谁在这样做？"></a></h2><table><thead><tr><th>网站</th><th>文案</th><th>UGC</th></tr></thead><tbody><tr><td><a href="https://www.apple.com/cn/">Apple 中国</a></td><td rowspan="11">是</td><td rowspan="7">N/A</td></tr><tr><td><a href="https://www.apple.com/hk/">Apple 香港</a></td></tr><tr><td><a href="https://www.apple.com/tw/">Apple 台湾</a></td></tr></tr></tr></tr></tr><tr><td><a href="https://www.v2ex.com/">V2EX</a></td><td>是</td></tr><tr><td><a href="https://apple4us.com/">Apple4us</a></td><td>N/A</td></tr><tr><td><a href="https://ruby-china.org/">Ruby China</a></td><td>是</td></tr><tr><td><a href="https://sspai.com/">少数派</a></td><td>N/A</td></tr></tbody></table><h2 id="参考文献">参考文献<a class="header-anchor" href="#参考文献"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><a href="https://www.thoughtco.com/guidelines-for-using-capital-letters-1691724">Guidelines for Using Capital Letters - ThoughtCo.</a></p></li><li class="lvl-2"><p><a href="https://en.wikipedia.org/wiki/Letter_case">Letter case - Wikipedia</a></p></li><li class="lvl-2"><p><a href="https://en.oxforddictionaries.com/grammar/punctuation">Punctuation - Oxford Dictionaries</a></p></li><li class="lvl-2"><p><a href="https://owl.english.purdue.edu/owl/section/1/6/">Punctuation - The Purdue OWL</a></p></li><li class="lvl-2"><p><a href="https://www.wikihow.com/Use-English-Punctuation-Correctly">How to Use English Punctuation Correctly - wikiHow</a></p></li><li class="lvl-2"><p><a href="https://zh.opensuse.org/index.php?title=Help:%E6%A0%BC%E5%BC%8F">格式 - openSUSE</a></p></li><li class="lvl-2"><p><a href="https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2">全形和半形 - 维基百科</a></p></li><li class="lvl-2"><p><a href="https://zh.wikipedia.org/wiki/%E5%BC%95%E8%99%9F">引号 - 维基百科</a></p></li><li class="lvl-2"><p><a href="https://zh.wikipedia.org/wiki/%E7%96%91%E5%95%8F%E9%A9%9A%E5%98%86%E8%99%9F">疑问惊叹号 - 维基百科</a></p></li></ul><h2 id="Forks">Forks<a class="header-anchor" href="#Forks"></a></h2><p>衍生项目的用法可能与本项目存在差异。</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/mzlogin/chinese-copywriting-guidelines">mzlogin/chinese-copywriting-guidelines</a></p></li></ul>]]></content>
      
      
      <categories>
          
          <category> 转载 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> GitHub </tag>
            
            <tag> 转载 </tag>
            
            <tag> 学习 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>11_Hexo-GitHub Actions 自动部署博客</title>
      <link href="/posts/8b765f7a.html"/>
      <url>/posts/8b765f7a.html</url>
      
        <content type="html"><![CDATA[<p>简单记录，步骤潦草</p><h2 id="示例">示例<a class="header-anchor" href="#示例"></a></h2><h3 id="1-gitignore">1. .gitignore<a class="header-anchor" href="#1-gitignore"></a></h3><p>根路径 <code>.gitignore</code> 内容</p><figure class="highlight x86asm"><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="meta">.DS_Store</span></span><br><span class="line">#/Thumbs<span class="number">.</span><span class="built_in">db</span></span><br><span class="line">/<span class="built_in">db</span><span class="number">.</span>json</span><br><span class="line">*.log</span><br><span class="line">node_modules/</span><br><span class="line"><span class="meta">public</span>/</span><br><span class="line"><span class="meta">.deploy</span>*/</span><br><span class="line"><span class="meta">.deploy_git</span>/</span><br><span class="line"><span class="meta">.deploy_git</span>*/</span><br><span class="line"><span class="meta">.idea</span></span><br><span class="line">themes/butterfly/.git</span><br></pre></td></tr></table></figure><h3 id="2-workflows">2. workflows<a class="header-anchor" href="#2-workflows"></a></h3><p>根路径 <code>.github/workflows/autodeploy.yml</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><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Auto</span> <span class="string">deploy</span></span><br><span class="line"><span class="comment"># 当有改动推送到master分支时，启动Action</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">检查分支</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">ref:</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">szenius/set-timezone@v1.0</span> <span class="comment"># 设置执行环境的时区</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">timezoneLinux:</span> <span class="string">&quot;Asia/Shanghai&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Node</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v1</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&quot;18.x&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Hexo</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          export TZ=&#x27;Asia/Shanghai&#x27;</span></span><br><span class="line"><span class="string">          npm install hexo-cli -g</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">缓存</span> <span class="string">Hexo</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">cache</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">node_modules</span></span><br><span class="line">          <span class="attr">key:</span> <span class="string">$&#123;&#123;runner.OS&#125;&#125;-$&#123;&#123;hashFiles(&#x27;**/package-lock.json&#x27;)&#125;&#125;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装依赖</span></span><br><span class="line">        <span class="attr">if:</span> <span class="string">steps.cache.outputs.cache-hit</span> <span class="type">!=</span> <span class="string">&#x27;true&#x27;</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          npm install gulp-cli -g #全局安装gulp</span></span><br><span class="line"><span class="string">          npm install --save</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Generate</span> <span class="string">static</span> <span class="string">file</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          hexo clean ; hexo generate ; gulp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">推送百度</span> <span class="string">url</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          hexo deploy</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">static</span> <span class="string">file</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          cd ./public</span></span><br><span class="line"><span class="string">          git init</span></span><br><span class="line"><span class="string">          git config --global user.email &#x27;github-actions[bot]@users.noreply.github.com&#x27;</span></span><br><span class="line"><span class="string">          git config --global user.name &#x27;github-actions[bot]&#x27;</span></span><br><span class="line"><span class="string">          git add .</span></span><br><span class="line"><span class="string">          git commit -m &quot;$(date +&#x27;%Y/%m/%d&#x27;)&quot;</span></span><br><span class="line"><span class="string">          git push --force --quiet &quot;https://mycpen:$&#123;&#123; secrets.GH_TOKEN &#125;&#125;@github.com/mycpen/blog.git&quot; master:main</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Delete</span> <span class="string">workflow</span> <span class="string">runs</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">Mattraks/delete-workflow-runs@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GH_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">repository:</span> <span class="string">$&#123;&#123;</span> <span class="string">github.repository</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">retain_days:</span> <span class="number">30</span></span><br><span class="line">          <span class="attr">keep_minimum_runs:</span> <span class="number">6</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>Actions Secrets 变量含义</p><table><thead><tr><th style="text-align:left">Secrets 变量</th><th style="text-align:left">释义</th></tr></thead><tbody><tr><td style="text-align:left">GH_TOKEN</td><td style="text-align:left"><a href="https://github.com/settings/tokens">GitHub Token</a></td></tr></tbody></table><h3 id="3-插件">3. 插件<a class="header-anchor" href="#3-插件"></a></h3><p>hexo-baidu-url-submit：<a href="https://github.com/huiwang/hexo-baidu-url-submit">https://github.com/huiwang/hexo-baidu-url-submit</a></p><p>根路径 <code>_config.yml</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><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="comment"># Deployment</span></span><br><span class="line"><span class="comment">## Docs: https://hexo.io/docs/one-command-deployment</span></span><br><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">type:</span> <span class="string">baidu_url_submitter</span> <span class="comment"># 这是新加的百度主动推送</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 百度主动推送</span></span><br><span class="line"><span class="comment"># https://github.com/huiwang/hexo-baidu-url-submit</span></span><br><span class="line"><span class="attr">baidu_url_submit:</span></span><br><span class="line">  <span class="attr">count:</span> <span class="number">1000</span>        <span class="comment"># 提交最新的多少个链接</span></span><br><span class="line">  <span class="attr">host:</span> <span class="string">blog.xxx.com</span>  <span class="comment"># 在百度站长平台中添加的域名</span></span><br><span class="line">  <span class="attr">token:</span> <span class="string">xxxxxx</span>   <span class="comment"># 秘钥</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">baidu_urls.txt</span>   <span class="comment"># 文本文档的地址， 新链接会保存在此文本文档里</span></span><br></pre></td></tr></table></figure><h2 id="参考">参考<a class="header-anchor" href="#参考"></a></h2><ol><li class="lvl-3"><p><a href="https://akilar.top/posts/f752c86d/">Akilar | 使用Github Action实现全自动部署</a></p></li><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/b228.html">安知鱼 | hexo博客工作流CI（一键部署的快乐）</a></p></li><li class="lvl-3"><p><a href="https://github.com/ccknbc-actions/blog-butterfly/tree/master/.github/workflows">CCKNBC | 工作流示例</a></p></li><li class="lvl-3"><p><a href="https://github.com/Mattraks/delete-workflow-runs">https://github.com/Mattraks/delete-workflow-runs</a></p></li><li class="lvl-3"><p><a href="https://github.com/dmego/home.github.io/blob/gh-pages/.github/workflows/auto-bing.yml">https://github.com/dmego/home.github.io/blob/gh-pages/.github/workflows/auto-bing.yml</a></p></li></ol>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> GitHub </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>10_Hexo-GitHub Actions 自动刷新多吉云 CDN 缓存</title>
      <link href="/posts/6f7759e0.html"/>
      <url>/posts/6f7759e0.html</url>
      
        <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>之前一直通过 <a href="https://console.dogecloud.com/cdn/refresh">多吉云控制台</a> 手动刷新博客全站 CDN 缓存，CDN 源站为 Vercel 部署的网址</p><p>由 <a href="https://kmar.top/posts/a427ed12/">空梦：全自动博客部署方案</a> 这篇文章萌生了自动化的念头，且这些 CDN 服务商都提供了相应的 API 文档和代码样例，开箱即用</p><p><s>仓库示例：<a href="https://github.com/mycpen/blog/tree/main/.github">https://github.com/mycpen/blog/tree/main/.github</a></s></p><h2 id="个人示例">个人示例<a class="header-anchor" href="#个人示例"></a></h2><h3 id="1-新增-Workflow-文件">1. 新增 Workflow 文件<a class="header-anchor" href="#1-新增-Workflow-文件"></a></h3><p>以我为例，新增 <code>source/.github/workflows/refresh-dogecloud.yml</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># This workflow will install Python dependencies, run tests and lint with a single version of Python</span></span><br><span class="line"><span class="comment"># For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python</span></span><br><span class="line"></span><br><span class="line"><span class="attr">name:</span> <span class="string">Refresh</span> <span class="string">dogecloud</span> <span class="string">CDN</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v3</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">szenius/set-timezone@v1.0</span> <span class="comment"># 设置执行环境的时区</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">timezoneLinux:</span> <span class="string">&quot;Asia/Shanghai&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">up</span> <span class="string">Python</span> <span class="number">3.10</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-python@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">python-version:</span> <span class="string">&quot;3.10&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Wait</span> <span class="string">for</span> <span class="number">3</span> <span class="string">minutes</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">sleep</span> <span class="number">180</span> <span class="comment"># 等待 3 分钟，单位为秒</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">refresh</span> <span class="string">script</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">            <span class="attr">ACCESS_KEY:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.ACCESS_KEY</span> <span class="string">&#125;&#125;</span></span><br><span class="line">            <span class="attr">SECRET_KEY:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SECRET_KEY</span> <span class="string">&#125;&#125;</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          pip install requests</span></span><br><span class="line"><span class="string">          python .github/refresh-dogecloud.py</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure><h3 id="2-新增-PY-脚本：刷新缓存">2. 新增 PY 脚本：刷新缓存<a class="header-anchor" href="#2-新增-PY-脚本：刷新缓存"></a></h3><p>以我为例，新增 <code>source/.github/refresh-dogecloud.py</code> 文件，内容如下：</p><p>脚本里的 <code>url_list</code> 为需要刷新的目录，需手动修改为自己的。代码来自多吉云 <a href="https://docs.dogecloud.com/cdn/api-access-token?id=python">API 验证</a>、<a href="https://docs.dogecloud.com/cdn/sdk-full-python?id=%e5%88%9b%e5%bb%ba%e5%88%b7%e6%96%b0%e7%9b%ae%e5%bd%95%e4%bb%bb%e5%8a%a1">刷新目录任务</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha1</span><br><span class="line"><span class="keyword">import</span> hmac</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> urllib</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dogecloud_api</span>(<span class="params">api_path, data=&#123;&#125;, json_mode=<span class="literal">False</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    调用多吉云API</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    :param api_path:    调用的 API 接口地址，包含 URL 请求参数 QueryString，例如：/console/vfetch/add.json?url=xxx&amp;a=1&amp;b=2</span></span><br><span class="line"><span class="string">    :param data:        POST 的数据，字典，例如 &#123;&#x27;a&#x27;: 1, &#x27;b&#x27;: 2&#125;，传递此参数表示不是 GET 请求而是 POST 请求</span></span><br><span class="line"><span class="string">    :param json_mode:   数据 data 是否以 JSON 格式请求，默认为 false 则使用表单形式（a=1&amp;b=2）</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    :type api_path: string</span></span><br><span class="line"><span class="string">    :type data: dict</span></span><br><span class="line"><span class="string">    :type json_mode bool</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    :return dict: 返回的数据</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 这里替换为你的多吉云永久 AccessKey 和 SecretKey，可在用户中心 - 密钥管理中查看</span></span><br><span class="line">    <span class="comment"># 请勿在客户端暴露 AccessKey 和 SecretKey，否则恶意用户将获得账号完全控制权</span></span><br><span class="line">    access_key = os.environ[<span class="string">&quot;ACCESS_KEY&quot;</span>]</span><br><span class="line">    secret_key = os.environ[<span class="string">&quot;SECRET_KEY&quot;</span>]</span><br><span class="line"></span><br><span class="line">    body = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    mime = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> json_mode:</span><br><span class="line">        body = json.dumps(data)</span><br><span class="line">        mime = <span class="string">&#x27;application/json&#x27;</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        body = urllib.parse.urlencode(data) <span class="comment"># Python 2 可以直接用 urllib.urlencode</span></span><br><span class="line">        mime = <span class="string">&#x27;application/x-www-form-urlencoded&#x27;</span></span><br><span class="line">    sign_str = api_path + <span class="string">&quot;\n&quot;</span> + body</span><br><span class="line">    signed_data = hmac.new(secret_key.encode(<span class="string">&#x27;utf-8&#x27;</span>), sign_str.encode(<span class="string">&#x27;utf-8&#x27;</span>), sha1)</span><br><span class="line">    sign = signed_data.digest().<span class="built_in">hex</span>()</span><br><span class="line">    authorization = <span class="string">&#x27;TOKEN &#x27;</span> + access_key + <span class="string">&#x27;:&#x27;</span> + sign</span><br><span class="line">    response = requests.post(<span class="string">&#x27;https://api.dogecloud.com&#x27;</span> + api_path, data=body, headers = &#123;</span><br><span class="line">        <span class="string">&#x27;Authorization&#x27;</span>: authorization,</span><br><span class="line">        <span class="string">&#x27;Content-Type&#x27;</span>: mime</span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="keyword">return</span> response.json()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">url_list = [</span><br><span class="line">    <span class="string">&quot;https://cpen.top/&quot;</span>,</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">api = dogecloud_api(<span class="string">&#x27;/cdn/refresh/add.json&#x27;</span>, &#123;</span><br><span class="line">    <span class="string">&#x27;rtype&#x27;</span>: <span class="string">&#x27;path&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;urls&#x27;</span>: json.dumps(url_list)</span><br><span class="line">&#125;)</span><br><span class="line"><span class="keyword">if</span> api[<span class="string">&#x27;code&#x27;</span>] == <span class="number">200</span>:</span><br><span class="line">    <span class="built_in">print</span>(api[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;task_id&#x27;</span>])</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;api failed: &quot;</span> + api[<span class="string">&#x27;msg&#x27;</span>]) <span class="comment"># 失败</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="3-新增-Secrets-变量">3. 新增 Secrets 变量<a class="header-anchor" href="#3-新增-Secrets-变量"></a></h3><p>Actions 新增 2 个 Secrets 变量，<code>ACCESS_KEY</code>、<code>SECRET_KEY</code>，对应的值在 多吉云 <a href="https://console.dogecloud.com/user/keys">用户中心 - 密钥管理</a> 中查看。<a href="https://docs.dogecloud.com/cdn/api-access-token?id=python">link</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305022253516.png" alt="image-20230502225346425" style="zoom: 33%;" /><p>避免因权限问题导致工作流执行失败，也可以设置下 Actions 读写权限</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305022259686.png" alt="image-20230502225900571" style="zoom: 33%;" /><h3 id="4-新增-JS-代码：复制-github">4. 新增 JS 代码：复制 .github<a class="header-anchor" href="#4-新增-JS-代码：复制-github"></a></h3><p>前言：<code>source/.github</code> 这类 . 开头的隐藏文件默认是不会被 hexo generate 渲染生成到 public 目录下的。网上和 ChatGPT 给出的解决办法大多试了（如 <code>skip_render</code>），没有生效，打算直接用 JS 代码将 <code>source/.github</code> 目录复制到 <code>public/.github</code> 目录下。以下代码每次 hexo generate 之后能实现复制的效果</p><p>以我为例，新增 <code>scripts/before_generate.js</code> 文件，内容如下：</p><figure class="highlight javascript"><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="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs-extra&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> path = <span class="built_in">require</span>(<span class="string">&#x27;path&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">copyFolder</span>(<span class="params">source, target</span>) &#123;</span><br><span class="line">  <span class="comment">// Create the target folder if it doesn&#x27;t exist</span></span><br><span class="line">  fs.<span class="title function_">ensureDirSync</span>(target);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Get the list of files in the source folder</span></span><br><span class="line">  <span class="keyword">const</span> files = fs.<span class="title function_">readdirSync</span>(source);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Loop through each file and copy it to the target folder</span></span><br><span class="line">  files.<span class="title function_">forEach</span>(<span class="function">(<span class="params">file</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> sourcePath = path.<span class="title function_">join</span>(source, file);</span><br><span class="line">    <span class="keyword">const</span> targetPath = path.<span class="title function_">join</span>(target, file);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (fs.<span class="title function_">statSync</span>(sourcePath).<span class="title function_">isDirectory</span>()) &#123;</span><br><span class="line">      <span class="comment">// Recursively copy subfolders</span></span><br><span class="line">      <span class="title function_">copyFolder</span>(sourcePath, targetPath);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="comment">// Copy the file</span></span><br><span class="line">      fs.<span class="title function_">copyFileSync</span>(sourcePath, targetPath);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">copyFolder</span>(<span class="string">&#x27;./source/.github&#x27;</span>, <span class="string">&#x27;./public/.github&#x27;</span>);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="5-更新-config-yml-配置">5. 更新 _config.yml 配置<a class="header-anchor" href="#5-更新-config-yml-配置"></a></h3><blockquote><p>当 hexo deploy 将渲染后的静态仓库推送到 Github 时，默认会取消推送 . 开头的隐藏文件，具体如下：</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305022249331.png" alt="image-20230502224949276" style="zoom: 67%;" /></blockquote><p>在 Hexo 配置文件 <code>_config.yml</code> 进行修改，新增 git 部署器 <code>ignore_hidden</code> 配置项，样例如下：</p><figure class="highlight diff"><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"># Deployment</span><br><span class="line">## Docs: https://hexo.io/docs/one-command-deployment</span><br><span class="line">deploy:</span><br><span class="line">  - type: git</span><br><span class="line">    repository: git@github.com:mycpen/blog.git</span><br><span class="line">    branch: main</span><br><span class="line">    commit: Site updated</span><br><span class="line">    message: &quot;&#123;&#123; now(&#x27;YYYY/MM/DD&#x27;) &#125;&#125;&quot;</span><br><span class="line"><span class="addition">+    ignore_hidden: false</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="参考链接">参考链接<a class="header-anchor" href="#参考链接"></a></h2><ol><li class="lvl-3"><p><a href="https://docs.dogecloud.com/cdn/api-access-token?id=python">多吉云：API 验证机制（Python）</a></p></li><li class="lvl-3"><p><a href="https://docs.dogecloud.com/cdn/sdk-full-python?id=%e5%88%9b%e5%bb%ba%e5%88%b7%e6%96%b0%e7%9b%ae%e5%bd%95%e4%bb%bb%e5%8a%a1">多吉云：SDK 文档 - 刷新预热</a></p></li><li class="lvl-3"><p>ChatGPT（deploy.ignore_hidden、js 代码 复制目录、sleep）</p></li></ol>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> GitHub </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>08_Other-GitHub Actions 定时执行脚本，备份又拍云云存储</title>
      <link href="/posts/acb8c062.html"/>
      <url>/posts/acb8c062.html</url>
      
        <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>使用 GitHub Acitons，定时跑 Python FTP 脚本，达到 <a href="https://help.upyun.com/knowledge-base/object_storage_index/">又拍云云存储</a> 与 GitHub 仓库间的备份</p><p>仓库示例：<a href="https://github.com/mycpen/image_bed/tree/main/.github">https://github.com/mycpen/image_bed/tree/main/.github</a></p><h2 id="个人示例">个人示例<a class="header-anchor" href="#个人示例"></a></h2><h3 id="1-新增-Workflow-YML-文件">1. 新增 Workflow YML 文件<a class="header-anchor" href="#1-新增-Workflow-YML-文件"></a></h3><p>复制以下我的 yml 示例；或是按照 <a href="https://blog.csdn.net/weixin_44786530/article/details/127890033">这篇文章</a>，选择想要的 workflow 模板，再自定义修改内容（Actions =&gt; New workflow = Choose a workflow）</p><p>我的文件路径为 <code>.github/workflows/python-app.yml</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><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"># This workflow will install Python dependencies, run tests and lint with a single version of Python</span></span><br><span class="line"><span class="comment"># For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python</span></span><br><span class="line"></span><br><span class="line"><span class="attr">name:</span> <span class="string">Python</span> <span class="string">application</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">&quot;0 17 * * 5&quot;</span> <span class="comment"># 周六 1:00</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v3</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">szenius/set-timezone@v1.0</span> <span class="comment"># 设置执行环境的时区</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">timezoneLinux:</span> <span class="string">&quot;Asia/Shanghai&quot;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">up</span> <span class="string">Python</span> <span class="number">3.10</span></span><br><span class="line">      <span class="attr">uses:</span> <span class="string">actions/setup-python@v3</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">python-version:</span> <span class="string">&quot;3.10&quot;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">sync</span> <span class="string">script</span></span><br><span class="line">      <span class="attr">env:</span></span><br><span class="line">          <span class="attr">UPYUNUSERNAME:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.UPYUNUSERNAME</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">UPYUNPASSWORD:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.UPYUNPASSWORD</span> <span class="string">&#125;&#125;</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">        git config --global user.name $&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;</span></span><br><span class="line"><span class="string">        git config --global user.email $&#123;&#123; secrets.GITHUBEMAIL &#125;&#125;</span></span><br><span class="line"><span class="string">        python .github/ftp.py</span></span><br><span class="line"><span class="string">        bash git.sh</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure><p>参数解释：</p><ul class="lvl-0"><li class="lvl-2"><p><code>cron</code>：定义工作流的时间表（有延迟），为格林尼治时间（UTC），换算为北京时间需在该基础上增加 8 小时，参考：<a href="http://blog.ynxiu.com/aixiu/f9ec3873.html">Actions 中的 cron 格式和设置</a>、<a href="https://blog.csdn.net/u010214511/article/details/127079323">Actions 时区及缓存问题处理</a></p></li><li class="lvl-2"><p><code>UPYUNUSERNAME</code>, <code>UPYUNPASSWORD</code>, <code>GITHUBUSERNAME</code>, <code>GITHUBEMAIL</code>，为自定义的 Secrets 变量</p><table><thead><tr><th>变量名</th><th>释义</th></tr></thead><tbody><tr><td>UPYUNUSERNAME</td><td>又拍云 FTP 用户名，格式「操作员名/服务名」，参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">又拍云视频教程</a>、<a href="https://help.upyun.com/2015/12/28/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8-ftp%e3%80%81api-%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6/">又拍云文档</a></td></tr><tr><td>UPYUNPASSWORD</td><td>又拍云 FTP 密码，参考同上</td></tr><tr><td>GITHUBUSERNAME</td><td>GitHub 账号，如 mycpen</td></tr><tr><td>GITHUBEMAIL</td><td>GitHub 账号绑定的主邮箱</td></tr></tbody></table></li><li class="lvl-2"><p><code>ftp.py</code>：Python 脚本，使用 FTP 同步云存储与仓库的文件内容</p></li><li class="lvl-2"><p><code>git.sh</code>：将本地变更推送至远端的脚本，git add, git commit, git push 这类</p></li></ul><h3 id="2-新增-Secrets-变量">2. 新增 Secrets 变量<a class="header-anchor" href="#2-新增-Secrets-变量"></a></h3><p>新增 4 个 Secrets 变量，UPYUNUSERNAME、UPYUNPASSWORD、GITHUBUSERNAME、GITHUBEMAIL，具体含义同上</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304170942576.png" alt="image-20230417094207479" style="zoom: 33%;" /><h3 id="3-授予-Workflow-读写权限">3. 授予 Workflow 读写权限<a class="header-anchor" href="#3-授予-Workflow-读写权限"></a></h3><p>参考：<a href="https://blog.csdn.net/jj89929665/article/details/129817011">https://blog.csdn.net/jj89929665/article/details/129817011</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304170956642.png" alt="image-20230417095659542" style="zoom:33%;" /><h3 id="4-新建-Python-同步脚本">4. 新建 Python 同步脚本<a class="header-anchor" href="#4-新建-Python-同步脚本"></a></h3><p>脚本内容来自：<a href="https://blog.csdn.net/ouyang_peng/article/details/79271113">Python实现的FTP上传和下载功能</a></p><p>脚本最后的 if 语句中声明了相关路径和参数</p><p>我的脚本路径为 <code>.github/ftp.py</code>，作用是同步仓库 image/ 目录与又拍云云存储 /image/ 目录，内容如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        ftp自动下载、自动上传脚本，可以递归目录操作</span></span><br><span class="line"><span class="string">        作者：欧阳鹏</span></span><br><span class="line"><span class="string">        博客地址：http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string">        参数:</span></span><br><span class="line"><span class="string">                 host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                 port:端口号</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="comment"># print(&quot;__init__()---&gt; host = %s ,port = %s&quot; % (host, port))</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.host = host</span><br><span class="line">        <span class="variable language_">self</span>.port = port</span><br><span class="line">        <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line">        <span class="comment"># 重新设置下编码方式</span></span><br><span class="line">        <span class="comment">#self.ftp.encoding = &#x27;gbk&#x27;</span></span><br><span class="line">        <span class="variable language_">self</span>.ftp.encoding = <span class="string">&#x27;utf8&#x27;</span></span><br><span class="line">        <span class="comment"># 获取脚本路径</span></span><br><span class="line">        path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line">        <span class="comment"># self.log_file = open(path + &quot;/log.txt&quot;, &quot;a&quot;, encoding=&#x27;utf-8&#x27;)</span></span><br><span class="line">        <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string">            参数:</span></span><br><span class="line"><span class="string">                  username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                 password: 密码</span></span><br><span class="line"><span class="string">            &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            timeout = <span class="number">60</span></span><br><span class="line">            socket.setdefaulttimeout(timeout)</span><br><span class="line">            <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line">            <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line">            <span class="comment"># 打开调试级别2，显示详细信息</span></span><br><span class="line">            <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line">            <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line">            <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="variable language_">self</span>.deal_error(<span class="string">&quot;FTP 连接或登录失败 ，错误描述为：%s&quot;</span> % err)</span><br><span class="line">            <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string">             local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_file: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为：%s&quot; % err)</span></span><br><span class="line">            remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            local_file_size = os.path.getsize(local_file)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为：%s&quot; % err)</span></span><br><span class="line">            local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;local_file_size:%d  , remote_file_size:%d&#x27;</span> % (local_file_size, remote_file_size))</span><br><span class="line">        <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line">            <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从ftp下载文件</span></span><br><span class="line"><span class="string">            参数:</span></span><br><span class="line"><span class="string">                local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                remote_file: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&quot;download_file()---&gt; local_path = %s ,remote_path = %s&quot;</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 文件大小相同，无需下载&#x27;</span> % local_file)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;下载文件 %s ... ...&#x27;</span> % local_file)</span><br><span class="line">                buf_size = <span class="number">1024</span></span><br><span class="line">                file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;wb&#x27;</span>)</span><br><span class="line">                <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">&#x27;RETR %s&#x27;</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line">                file_handler.close()</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;下载文件出错，出现异常：%s &#x27;</span> % err)</span><br><span class="line">                <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string">                       参数:</span></span><br><span class="line"><span class="string">                         local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                         remote_path: 远程路径</span></span><br><span class="line"><span class="string">                &quot;&quot;&quot;</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt;  local_path = %s ,remote_path = %s&quot;</span> % (local_path, remote_path))</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录%s不存在，继续...&#x27;</span> % remote_path + <span class="string">&quot; ,具体错误描述为：%s&quot;</span> % err)</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> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录%s不存在，先创建本地目录&#x27;</span> % local_path)</span><br><span class="line">            os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.file_list = []</span><br><span class="line">        <span class="comment"># 方法回调</span></span><br><span class="line">        <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line">        remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录 列表: %s&#x27;</span> % remote_names)</span><br><span class="line">        <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line">            file_type = item[<span class="number">0</span>]</span><br><span class="line">            file_name = item[<span class="number">1</span>]</span><br><span class="line">            local = os.path.join(local_path, file_name)</span><br><span class="line">            <span class="keyword">if</span> file_type == <span class="string">&#x27;d&#x27;</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt; 下载目录： %s&quot;</span> % file_name)</span><br><span class="line">                <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line">            <span class="keyword">elif</span> file_type == <span class="string">&#x27;-&#x27;</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;download_file()---&gt; 下载文件： %s&quot;</span> % file_name)</span><br><span class="line">                <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;返回上层目录 %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string">             local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_path: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 不存在&#x27;</span> % local_file)</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> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;跳过相等的文件: %s&#x27;</span> % local_file)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">        buf_size = <span class="number">1024</span></span><br><span class="line">        file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;rb&#x27;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.storbinary(<span class="string">&#x27;STOR %s&#x27;</span> % remote_file, file_handler, buf_size)</span><br><span class="line">        file_handler.close()</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;上传: %s&#x27;</span> % local_file + <span class="string">&quot;成功!&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_path: 远程路径</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录 %s 不存在&#x27;</span> % local_path)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至远程目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line">        local_name_list = os.listdir(local_path)</span><br><span class="line">        <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line">            src = os.path.join(local_path, local_name)</span><br><span class="line">            <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line">                <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                    <span class="variable language_">self</span>.debug_print(<span class="string">&quot;目录已存在 %s ,具体错误描述为：%s&quot;</span> % (local_name, err))</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传目录： %s&quot;</span> % local_name)</span><br><span class="line">                <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传文件： %s&quot;</span> % local_name)</span><br><span class="line">                <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 退出ftp</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&quot;close()---&gt; FTP退出&quot;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line">        <span class="comment"># self.log_file.close()</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 打印日志</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 处理错误异常</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                e：异常</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        log_str = <span class="string">&#x27;发生错误: %s&#x27;</span> % e</span><br><span class="line">        <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line">        sys.exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 记录日志</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                log_str：日志</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        time_now = time.localtime()</span><br><span class="line">        date_now = time.strftime(<span class="string">&#x27;%Y-%m-%d&#x27;</span>, time_now)</span><br><span class="line">        format_log_str = <span class="string">&quot;%s ---&gt; %s \n &quot;</span> % (date_now, log_str)</span><br><span class="line">        <span class="built_in">print</span>(format_log_str)</span><br><span class="line">        <span class="comment"># self.log_file.write(format_log_str)</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 获取文件列表</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                line：</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line">        <span class="comment"># 去除  . 和  ..</span></span><br><span class="line">        <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;..&#x27;</span>]:</span><br><span class="line">            <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 获取文件名</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                line：</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        pos = line.rfind(<span class="string">&#x27;:&#x27;</span>)</span><br><span class="line">        <span class="keyword">while</span> (line[pos] != <span class="string">&#x27; &#x27;</span>):</span><br><span class="line">            pos += <span class="number">1</span></span><br><span class="line">        <span class="keyword">while</span> (line[pos] == <span class="string">&#x27; &#x27;</span>):</span><br><span class="line">            pos += <span class="number">1</span></span><br><span class="line">        file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line">        <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="comment"># 清除日志</span></span><br><span class="line">    path = os.path.dirname(os.path.realpath(__file__))      <span class="comment"># 脚本路径</span></span><br><span class="line">    <span class="comment"># if os.path.exists(path + &#x27;/log.txt&#x27;):</span></span><br><span class="line">    <span class="comment">#     log_file = path + &#x27;/log.txt &#x27;if os.sep == &quot;/&quot; else path + &#x27;\\&#x27; + &#x27;log.txt&#x27;</span></span><br><span class="line">    <span class="comment">#     subprocess.Popen(f&#x27;rm -rf &#123;log_file&#125;&#x27;, shell=True)</span></span><br><span class="line">    <span class="comment">#     time.sleep(1)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 获取 Actions Secrets 变量</span></span><br><span class="line">    upyunUsername = os.environ[<span class="string">&quot;UPYUNUSERNAME&quot;</span>]</span><br><span class="line">    upyunPassword = os.environ[<span class="string">&quot;UPYUNPASSWORD&quot;</span>]</span><br><span class="line"></span><br><span class="line">    my_ftp = MyFTP(<span class="string">&quot;v0.ftp.upyun.com&quot;</span>)</span><br><span class="line">    my_ftp.login(upyunUsername, upyunPassword)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 下载目录</span></span><br><span class="line">    <span class="comment"># 又拍云云存储 → 本地 image/</span></span><br><span class="line">    <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>:      <span class="comment"># Windows</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>:     <span class="comment"># Unix</span></span><br><span class="line">        my_ftp.download_file_tree(<span class="string">&quot;image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)  <span class="comment"># image/ 仓库目录; /image/ 又拍云云存储目录</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 上传目录</span></span><br><span class="line">    <span class="comment"># 本地 image/ → 又拍云云存储</span></span><br><span class="line">    <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>:</span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>:</span><br><span class="line">        my_ftp.upload_file_tree(<span class="string">&quot;image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)  <span class="comment"># image/ 仓库目录; /image/ 又拍云云存储目录</span></span><br><span class="line">        my_ftp.close()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="5-git-sh-推送变更">5. <a href="http://git.sh">git.sh</a> 推送变更<a class="header-anchor" href="#5-git-sh-推送变更"></a></h3><p>个人习惯将 push 命令写在一个文件里，放在仓库根目录下</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 远端同步至本地</span></span><br><span class="line">git pull</span><br><span class="line"></span><br><span class="line"><span class="comment"># 推送变更</span></span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;<span class="subst">$(date +&#x27;%Y/%m/%d&#x27;)</span>&quot;</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><h2 id="参考文章">参考文章<a class="header-anchor" href="#参考文章"></a></h2><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/sculpta/article/details/106474324">* GitHub Actions 中 python 脚本获取仓库 secrets</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/weixin_44786530/article/details/127890033">* 使用github仓库创建定时任务，定时签到等服务</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/ouyang_peng/article/details/79271113">* Python实现的FTP上传和下载功能</a></p></li><li class="lvl-3"><p><a href="http://akilar.top/posts/f752c86d/">* 使用Github Action实现全自动部署</a></p></li><li class="lvl-3"><p><a href="https://help.upyun.com/2015/12/28/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8-ftp%e3%80%81api-%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6/">* 又拍云：如何使用 FTP、API 上传文件</a></p></li><li class="lvl-3"><p><a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">* 又拍云：创建存储服务和使用 FTP 上传</a></p></li><li class="lvl-3"><p><a href="http://blog.ynxiu.com/aixiu/f9ec3873.html">* Github/Gitlab Actions 中的 cron 格式和设置方法</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/u010214511/article/details/127079323">* Github Actions 执行Python定时任务（时区及缓存问题处理）</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/jj89929665/article/details/129817011">* 运行Github Actions unable to access ‘https://github.com/x/‘: The requested URL returned error: 403</a></p></li><li class="lvl-4"><p><a href="https://docs.github.com/zh/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch">* workflow_dispatch</a></p></li><li class="lvl-4"><p><a href="https://www.ngui.cc/article/show-1024687.html?action=onClick">白嫖github的Action做定时任务</a></p></li><li class="lvl-4"><p><a href="https://www.xiaohongshu.com/explore/62ff387d000000001b01e535">Github+Action实现自动定时推送</a></p></li><li class="lvl-4"><p><a href="https://blog.wandhi.com/pages/bbd4b7/">基于github中action服务的自动化打包部署</a></p></li><li class="lvl-4"><p><a href="https://blog.csdn.net/qq_40748336/article/details/110749375">基于GITHUB ACTION的定时任务，真香！</a></p></li><li class="lvl-4"><p><a href="http://chart.zhenglinglu.cn/pages/f44d2f9ad04ab8d3/">GitHub Actions 定时运行代码：每天定时百度链接推送</a></p></li></ol>]]></content>
      
      
      <categories>
          
          <category> Other </category>
          
      </categories>
      
      
        <tags>
            
            <tag> GitHub </tag>
            
            <tag> Other </tag>
            
            <tag> Python </tag>
            
            <tag> FTP </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>07_Other-文章记录-sshpass</title>
      <link href="/posts/cee83196.html"/>
      <url>/posts/cee83196.html</url>
      
        <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录一些小知识点、工具、文章收藏</p><h2 id="01-链接收藏">01. 链接收藏<a class="header-anchor" href="#01-链接收藏"></a></h2><table><thead><tr><th colspan="3">地址</th></tr></thead><tbody><tr><td><a href="https://tools.liumingye.cn/music/#/">MyFreeMP3</a></td><td><a href="https://www.cnblogs.com/hider/p/11614688.html">Typora入门</a></td><td><a href="https://zhuanlan.zhihu.com/p/193101244">Typora页面美化</a></td></tr><tr><td><a href="https://apps.microsoft.com/store/apps">Microsoft Store</a></td><td><a href="https://github.com/sparanoid/chinese-copywriting-guidelines/blob/master/README.zh-Hans.md">中文文案排版指北</a></td><td><a href="https://blog.csdn.net/m0_37624402/article/details/108960118">Git常见用法总结</a></td></tr><tr><td><a href="https://www.processon.com/">ProcessOn</a></td><td><a href="https://www.nowcoder.com/discuss/353154816606150656">牛客网-面经-运开资料</a></td><td><a href="https://www.cnblogs.com/blogkui/p/12900655.html">JavaScript日期格式化，不足两位数补0</a></td></tr><tr><td><a href="https://molunerfinn.com/my-2019-interview-of-summer-internship/">Molunerfinn 大佬面经</a></td><td><a href="https://akilar.top/posts/f752c86d/#%E9%85%8D%E7%BD%AEGithub-Action">Akilar：Github Action自动部署</a></td><td><a href="https://auto.oldwu.top/">AutoPlan.哔哩升级</a></td></tr><tr><td><a href="https://www.cnblogs.com/xxhxs-21/p/17151813.html">Jetbrains 激活方法</a></td><td><a href="https://mp.weixin.qq.com/cgi-bin/settingpage?t=setting/index&amp;action=index&amp;token=168808346&amp;lang=zh_CN">公众号二维码.下载</a></td><td><a href="https://github.com/RayWangQvQ/BiliBiliToolPro">GitHub: BiliBiliToolPro</a></td></tr><tr><td><a href="https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html">Snipaste JPG 截图格式</a></td><td><a href="https://www.yilantingfeng.site/%e5%ad%a6%e4%b8%9a%e7%9b%b8%e5%85%b3/1503/">倚栏听风.2023计算机保研经历总结</a></td><td><a href="https://blog.zwying.com/archives/93.html">Veen Zhao.南师大.考研</a></td></tr><tr><td><a href="https://github.com/dxhuii/delWeibo">批量删除微博博文</a></td><td><a href="https://xedu.me/">chatgpt账号-key购买</a></td><td><a href="https://blog.zwying.com/archives/121.html">Veen Zhao.南师大.复试</a></td></tr><tr><td><a href="https://not.mcy.cloudns.org/article/example-17">网易云.安卓.dolby_beta.教程</a>、<a href="https://cloud.06dn.com/s/EB2MSp">下载</a>、<a href="https://github.com/nining377/dolby_beta/issues/142">github</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><p>其他：</p><ol><li class="lvl-3"><p><a href="https://blog.cpen.top/posts/583c5c34.html">03_Other-PC端环境记录</a></p></li></ol><p>非技术：</p><table><thead><tr><th colspan="3">地址</th></tr></thead><tbody><tr><td><a href="http://coolshell.cn/articles/20276.html">酷壳：别让自己“墙”了自己</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><p>云服务器：</p><ul class="lvl-0"><li class="lvl-2"><p>阿里云 ECS 99/年，活动期内（活动时间： <mark>2023年10月31日0点0分0秒至2026年3月31日23点59分59秒</mark>。）续费同价，新老用户同享：<a href="https://www.aliyun.com/lowcode/promotion/allinaliyun/99program">https://www.aliyun.com/lowcode/promotion/allinaliyun/99program</a></p></li><li class="lvl-2"><p>阿里云在校学生300无门券/合作高校3折券领取：<a href="https://university.aliyun.com/">https://university.aliyun.com/</a></p></li></ul><h2 id="02-sshpass-非交互登录">02. sshpass 非交互登录<a class="header-anchor" href="#02-sshpass-非交互登录"></a></h2><p>ssh 不能在命令行中指定密码</p><p>sshpass：</p><ol><li class="lvl-3"><p>用于非交互的 ssh 密码验证，允许用 -p 参数指定明文密码</p></li><li class="lvl-3"><p>支持密码从命令行，文件，环境变量中读取</p></li></ol><blockquote><p>Ubuntu 报错 <code>E: Unable to locate package sshpass</code></p><p><code>apt-get update</code> ; sudo apt-get install sshpass</p><p>参考文章：<a href="https://www.cnblogs.com/itsfei/p/15014277.html">ssh快捷登录 sshpass+alias</a></p></blockquote><p>登录脚本（第一次需 SSH 登录）</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">$ <span class="built_in">cat</span> ali.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">sshpass -p 密码 ssh -o ServerAliveinterval=60 root@IP</span><br><span class="line"><span class="comment"># sshpass -p 密码 ssh root@IP</span></span><br><span class="line"></span><br><span class="line">$ <span class="built_in">chmod</span> +x ali.sh</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>-o option =&gt; Can be used to give options in the format used in the configuration file.</p></li><li class="lvl-2"><p><code>ServerAliveinterval=60</code> client每隔60秒发送一次请求给server，然后server响应，从而保持连接（防止连接空闲超时）</p></li></ul><p>定义别名 alias</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">$ <span class="built_in">cat</span> ~/.bashrc</span><br><span class="line"><span class="comment"># User specific aliases and functions</span></span><br><span class="line"><span class="built_in">alias</span> ali=<span class="string">&#x27;bash /home/peng/sh_file/ali.sh&#x27;</span></span><br></pre></td></tr></table></figure><p>参考文章：</p><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/u013288190/article/details/116921994">Shell 脚本 ssh免密码 登录 远程服务器 sshpass用法示例</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/liao392781/article/details/79220395">Shell脚本免密码登录远程服务器（方法一）</a></p></li><li class="lvl-3"><p><a href="https://www.cnblogs.com/itsfei/p/15014277.html">ssh快捷登录 sshpass+alias</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/weixin_48693408/article/details/125961472">Linux – 将自己的shell脚本设置成命令</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/qq_44895681/article/details/124841145">配置SSH服务远程连接空闲超时退出时间（包括SSH无法登录、登录缓慢）</a></p></li></ol><h2 id="03-Xftp-显示隐藏文件">03. Xftp 显示隐藏文件<a class="header-anchor" href="#03-Xftp-显示隐藏文件"></a></h2><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304042240000.png" alt="image-20230404224047926" style="zoom: 33%;" /><p>参考文章：<a href="http://www.nndssk.com/xtjc/287647HVA4sC.html">Xftp显示隐藏文件的方法</a></p><h2 id="04-Github-多账户-SSH-配置">04. Github 多账户 SSH 配置<a class="header-anchor" href="#04-Github-多账户-SSH-配置"></a></h2><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">ssh-keygen -f ~/.ssh/id_rsa_gh -C user_gh@gmail.com</span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2">-b：指定 key 的 bit 数，对于 RSA key 而言，默认是 3072 bits</li><li class="lvl-2">-f：指定 key 的文件名，若需要指定路径，则文件名需要和路径一直，如 ~/.ssh/id_rsa_gh</li><li class="lvl-2">-C：指定新的 comment，即公钥末尾的字符串，一般是邮箱地址，若不指定会是 “username@hostname” 的形式</li><li class="lvl-2">-t：指定私钥类型，一般有 “dsa”, “ecdsa”, “ecdsa-sk”, “ed25519”, “ed25519-sk” 和 “rsa” 等几种，若指定为 rsa 还可以指定签名类型，默认为 “rsa-sha2-512”</li></ul></blockquote><blockquote><p>Github 不同账户，类似配置</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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> ~/.ssh/config</span><br><span class="line">Host github.com</span><br><span class="line">       HostName github.com</span><br><span class="line">       PreferredAuthentications publickey</span><br><span class="line">       IdentityFile ~/.ssh/user1_rsa</span><br><span class="line">       User user1</span><br><span class="line">Host github.com</span><br><span class="line">       HostName github.com</span><br><span class="line">       PreferredAuthentications publickey</span><br><span class="line">       IdentityFile ~/.ssh/user2_rsa</span><br><span class="line">       User user2</span><br><span class="line">------</span><br><span class="line">Host user_gh.github.com</span><br><span class="line">       HostName github.com</span><br><span class="line">       User user_gh</span><br><span class="line">       IdentityFile ~/.ssh/id_rsa_gh</span><br><span class="line">Host github-qileq.com</span><br><span class="line">       HostName github.com</span><br><span class="line">       User qileq</span><br><span class="line">       IdentityFile ~/.ssh/id_rsa_qileq</span><br><span class="line">Host gitlab.com</span><br><span class="line">       HostName gitlab.com</span><br><span class="line">       User user_gl</span><br><span class="line">       IdentityFile ~/.ssh/id_rsa_gl</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2"><p>Host 类型昵称，可以简化登录的输入地址，比如<code>Host ccl</code>,则可以用<code>ssh ccl</code>直接连接</p></li><li class="lvl-2"><p>HostName 表示连接的远程主机地址</p></li><li class="lvl-2"><p>IdentityFile 表示指定私钥文件路径</p></li><li class="lvl-2"><p>Port 指定端口</p></li><li class="lvl-2"><p>User 指定用户名</p></li></ul><p>修改仓库的 git 信息，将仓库配置 url 的 <a href="https://link.zhihu.com/?target=http%3A//github.com">http://github.com</a> 替换为 ssh config 中设置的 Host 值。</p><p>笔者以 <a href="https://link.zhihu.com/?target=https%3A//github.com/qileq/java-roam-guide">java-roam-guide</a> 为例，使用如下两种方式来修改仓库地址：</p><ol><li class="lvl-3"><p>执行命令 git remote set-url origin <a href="mailto:git@github-qileq.com">git@github-qileq.com</a>:qileq/java-roam-guid.git</p></li><li class="lvl-3"><p>将该仓库 .git/config 中的 url = <a href="mailto:git@github.com">git@github.com</a>:qileq/java-roam-guide.git 修改为 url = <a href="mailto:git@github-qileq.com">git@github-qileq.com</a>:qileq/java-roam-guide.git</p></li></ol><p>修改完成后，执行 git remote -v 查看仓库地址是否正确。</p></blockquote><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><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"># 当使用&lt;user1.github.com&gt;替换&lt;github.com&gt;进行访问时，ssh会自动识别为user1</span></span><br><span class="line"><span class="comment"># 配置用户1</span></span><br><span class="line">Host user1.github.com<span class="comment"># 别名，可以随便写一个url。</span></span><br><span class="line">Hostname github.com<span class="comment"># 网站真实的域名，如果是GitHub就不用改了</span></span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/id_rsa_user1<span class="comment"># 指向user1的私钥路径，似乎只能在~/.ssh下，不要随便放</span></span><br><span class="line">User user1<span class="comment"># 填写user1的Github用户名，不过似乎最后获取的还是真实的Github用户名</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置用户2</span></span><br><span class="line">Host user1.github.com</span><br><span class="line">Hostname github.com</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/id_rsa_user2<span class="comment"># 指向user2的私钥路径，似乎只能在~/.ssh下，不要随便放</span></span><br><span class="line">User user2<span class="comment"># 填写user2的GitHub用户名，不过似乎最后获取的还是真实的Github用户名</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>如果是直接使用 <code>git@github.com</code>，那么ssh将自动识别为config列表的第一个用户，可以认为是单用户模式</p><p>由于是多用户，所以在第一次clone一个GitHub地址的时候，需要简单的修改一下对应的域名，此时SSH将可以识别使用哪个用户进行操作，并建立配置记录</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"><span class="comment"># 原始要clone的仓库命令</span></span><br><span class="line">git <span class="built_in">clone</span> git@github.com:oneflyingfish/WebServer_C.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># 对应修改一下&lt;github.com&gt;，user1修改为上面配置的&lt;user1.github.com&gt;即可</span></span><br><span class="line">git <span class="built_in">clone</span> git@user1.github.com:oneflyingfish/WebServer_C.git</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>多用户共用情况下，如果提示设置用户名，一定要设置为<code>局部信息</code>，而不是<code>global</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># git默认提示的命令</span></span><br><span class="line">git config --global user.name <span class="string">&quot;your_name&quot;</span></span><br><span class="line">git config --global user.email <span class="string">&quot;your_eamil&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 我们应该使用的命令</span></span><br><span class="line">git config user.name <span class="string">&quot;your_name&quot;</span></span><br><span class="line">git config user.email <span class="string">&quot;your_eamil&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote><p>参考文章：</p><ol><li class="lvl-3"><p><a href="https://zhuanlan.zhihu.com/p/521768041">* SSH 多账号的配置</a></p></li><li class="lvl-3"><p><a href="https://cloud.tencent.com/developer/article/2121948">ssh config多账户/多域名配置</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/senlin1202/article/details/122081089">SSH Config 使用</a></p></li><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/443e.html">Mac上配置多个SSH</a></p></li><li class="lvl-3"><p><a href="https://oneflyingfish.gitee.io/articles/20c7aea41283/">* 配置SSH keys连接GitHub（支持多用户）</a></p></li><li class="lvl-3"><p><a href="https://happyleecode.gitee.io/2023/04/05/SSH/">解决 Git 同时部署到 GitHub 和 Gitee 时，密钥 SSH 冲突问题</a></p></li></ol><h2 id="05-APICloud-打包网页">05. APICloud 打包网页<a class="header-anchor" href="#05-APICloud-打包网页"></a></h2><p><mark>未成功</mark></p><p><a href="https://www.apicloud.com/portal-web/console">APICloud</a> =&gt; Web App 创建</p><p>图标<a href="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700919.png">https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700919.png</a></p><p>启动页<a href="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700867.png">https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700867.png</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061613612.png" alt="image-20230406161352487" style="zoom:33%;" /><p>安装后的 APP 因无法开启存储空间权限，未能成功（个人原因，<a href="https://www.fomal.cc/">Fomalhaut🥝</a> 的 <a href="https://lskypro.acozycotage.net/Fomalhaut/Fomalhaut.apk">APP</a> 能设置）</p><p>参考教程：<a href="https://naokuoteng.cn/posts/2afd210.html">将网站 / 博客打包成桌面 APP</a>、<a href="https://www.fomal.cc/comments/#9392fccc60784238be439c910336af0b">Fomalhaut🥝.留言</a></p><h2 id="06-Hexo-渲染脚注">06. Hexo 渲染脚注<a class="header-anchor" href="#06-Hexo-渲染脚注"></a></h2><p>下文采用 hexo-renderer-markdown-it 渲染器（渲染脚注效果一般，不打算用脚注了）</p><blockquote><p>尽管标准 Markdown 不支持脚注，但很多 Markdown 变种都支持。一般来说，大多数 Markdown 方言和编辑器支持行内脚注和引用式脚注这两种方式，而后者使用更为普遍（原文：<a href="https://sspai.com/post/77513">在 Markdown 中使用引用式链接和脚注</a>）</p></blockquote><blockquote><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">npm uninstall --save hexo-renderer-marked</span><br><span class="line">npm install --save hexo-renderer-markdown-it</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="attr">markdown:</span></span><br><span class="line">  <span class="attr">plugins:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">markdown-it-footnote</span></span><br></pre></td></tr></table></figure><p>原文：<a href="https://blog.imql.life/2020/01/24/My_HexoBlog_with_NexT(2)/#%E6%9B%B4%E6%8D%A2%E9%BB%98%E8%AE%A4%E7%9A%84-Markdown-%E6%B8%B2%E6%9F%93%E5%99%A8-1">我的博客的诞生（二）</a></p></blockquote><blockquote><figure class="highlight markdown"><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">Here is a footnote reference,[^1] and another.[^longnote]</span><br><span class="line"></span><br><span class="line">[<span class="symbol">^1</span>]: <span class="link">Here is the footnote.</span></span><br><span class="line"></span><br><span class="line">[<span class="symbol">^longnote</span>]: <span class="link">Here&#x27;s one with multiple blocks.</span></span><br><span class="line"></span><br><span class="line"><span class="code">    Subsequent paragraphs are indented to show that they</span></span><br><span class="line"><span class="code">belong to the previous footnote.</span></span><br></pre></td></tr></table></figure><figure class="highlight markdown"><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">Here is an inline note.^[Inlines notes are easier to write, since</span><br><span class="line">you don&#x27;t have to pick an identifier and move down to type the</span><br><span class="line">note.]</span><br></pre></td></tr></table></figure><p>来源：<a href="https://github.com/markdown-it/markdown-it-footnote">markdown-it/markdown-it-footnote</a></p></blockquote><p>个人配置：</p><figure class="highlight diff"><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></pre></td><td class="code"><pre><span class="line"># https://butterfly.js.org/posts/ceeb73f/#Math-%E6%95%B8%E5%AD%B8</span><br><span class="line"># https://www.nickxu.top/2022/04/17/Hexo-Butterfly-建站指南（八）使用-KaTeX-数学公式/</span><br><span class="line"># https://github.com/hexojs/hexo-renderer-markdown-it</span><br><span class="line"># https://ezgx.tk/posts/65320/</span><br><span class="line">markdown:</span><br><span class="line">  preset: &#x27;default&#x27;</span><br><span class="line">  render:</span><br><span class="line">    html: true</span><br><span class="line">    xhtmlOut: false</span><br><span class="line">    langPrefix: &#x27;language-&#x27;</span><br><span class="line">    breaks: true</span><br><span class="line">    linkify: true</span><br><span class="line">    typographer: true</span><br><span class="line">    quotes: &#x27;“”‘’&#x27;</span><br><span class="line">  enable_rules:</span><br><span class="line">  disable_rules:</span><br><span class="line">  plugins:</span><br><span class="line">    - markdown-it-abbr</span><br><span class="line">    # installed external plugins also can be enabled</span><br><span class="line">    - markdown-it-table-of-contents</span><br><span class="line">    - markdown-it-attrs</span><br><span class="line">    # - markdown-it-cjk-breaks</span><br><span class="line">    - markdown-it-container</span><br><span class="line">    - markdown-it-deflist</span><br><span class="line">    - markdown-it-emoji</span><br><span class="line"><span class="addition">+    - markdown-it-footnote</span></span><br><span class="line">    - markdown-it-ins</span><br><span class="line">    - markdown-it-mark</span><br><span class="line">    - markdown-it-sub</span><br><span class="line">    - markdown-it-sup</span><br><span class="line">    - markdown-it-checkbox</span><br><span class="line">    - markdown-it-imsize</span><br><span class="line">    - markdown-it-expandable</span><br><span class="line">    - markdown-it-merge-cells</span><br><span class="line">    - &#x27;@renbaoshuo/markdown-it-katex&#x27;</span><br><span class="line">    # - @iktakahiro/markdown-it-katex</span><br><span class="line">    # - name: &#x27;@neilsustc/markdown-it-katex&#x27;</span><br><span class="line">    #   enable: true</span><br><span class="line">    #   options:</span><br><span class="line">    #     strict: false</span><br><span class="line">    # - markdown-it-toc-and-anchor</span><br><span class="line">    - name: markdown-it-container</span><br><span class="line">      options: success</span><br><span class="line">    - name: markdown-it-container</span><br><span class="line">      options: tips</span><br><span class="line">    - name: markdown-it-container</span><br><span class="line">      options: warning</span><br><span class="line">    - name: markdown-it-container</span><br><span class="line">      options: danger</span><br><span class="line">  anchors:</span><br><span class="line">    level: 1</span><br><span class="line">    collisionSuffix: &#x27;&#x27;</span><br><span class="line">    permalink: false</span><br><span class="line">    permalinkClass: &#x27;header-anchor&#x27;</span><br><span class="line">    permalinkSide: &#x27;left&#x27;</span><br><span class="line">    permalinkSymbol: &#x27;¶&#x27;</span><br><span class="line">    case: 0</span><br><span class="line">    separator: &#x27;-&#x27;</span><br><span class="line">  images:</span><br><span class="line">    lazyload: false</span><br><span class="line">    prepend_root: false</span><br><span class="line">    post_asset: false</span><br></pre></td></tr></table></figure><p>参考文章：</p><ol><li class="lvl-3"><p><a href="https://sspai.com/post/77513">在 Markdown 中使用引用式链接和脚注</a></p></li><li class="lvl-3"><p><a href="https://markdown.com.cn/extended-syntax/footnotes.html">Markdown 脚注</a></p></li><li class="lvl-3"><p><a href="https://blog.meta-code.top/2023/03/21/2023-53/">百里飞洋 Barry-Flynn（得知脚注）</a></p></li><li class="lvl-3"><p><a href="https://github.com/hexojs/hexo-renderer-markdown-it">hexojs/hexo-renderer-markdown-it</a></p></li><li class="lvl-3"><p><a href="https://github.com/markdown-it/markdown-it-footnote">* markdown-it/markdown-it-footnote</a></p></li><li class="lvl-3"><p><a href="https://blog.imql.life/2020/01/24/My_HexoBlog_with_NexT(2)/#%E6%9B%B4%E6%8D%A2%E9%BB%98%E8%AE%A4%E7%9A%84-Markdown-%E6%B8%B2%E6%9F%93%E5%99%A8-1">* 我的博客的诞生（二）</a></p></li></ol><h2 id="07-Base64-加密邮箱-解密">07. Base64 加密邮箱 解密<a class="header-anchor" href="#07-Base64-加密邮箱-解密"></a></h2><p>加密的邮箱地址，使用 base64 加密。在线加密：<a href="https://encode.chahuo.com/">https://encode.chahuo.com/</a></p><p>解密 <code>javascript:decryptEmail(...)</code>，代码示例：<a href="https://www.mycpen.cn/">https://www.mycpen.cn/</a></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;javascript:decryptEmail(&#x27;bXljcGVuQHFxLmNvbQ==&#x27;);&quot;</span> <span class="attr">title</span>=<span class="string">&quot;email&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="08-Word-转-MD（Pandoc）">08. Word 转 MD（Pandoc）<a class="header-anchor" href="#08-Word-转-MD（Pandoc）"></a></h2><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">pandoc -xxx.docx -o xxx.md</span><br></pre></td></tr></table></figure><blockquote><p>一、下载pandoc<br>建议使用msi直接安装，而不是下载安装包直接使用，msi的下载方法：安装方法。</p><p>二、pandoc转换<br>1、cmd进入文件夹<br>打开cmd。<br>转换到文件所在的路径中。d:进入D盘的路径下，CD D:\Program Files\OneDrive\桌面\temp</p><p>2、代码实现</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">pandoc -xxx.docx -o xxx.md <span class="comment"># docx 文件转换为 md 文件</span></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304162143719.png" alt="image-20230416214320662" style="zoom: 33%;" /></blockquote><p>参考文章：<a href="http://www.taodudu.cc/news/show-3860696.html">word文件转md文件</a></p><h2 id="09-GitHub-删除历史记录">09. GitHub 删除历史记录<a class="header-anchor" href="#09-GitHub-删除历史记录"></a></h2><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">git reset &lt;上一步复制到的字符串&gt;</span><br><span class="line">git push -f</span><br></pre></td></tr></table></figure><p>参考文章：<a href="https://blog.csdn.net/sunzequan888/article/details/125738176">GITHUB删除历史记录</a></p><h2 id="10-ChatGPT-API-Key-个人站">10. ChatGPT API Key 个人站<a class="header-anchor" href="#10-ChatGPT-API-Key-个人站"></a></h2><p>项目地址：</p><ol><li class="lvl-3"><p><a href="https://github.com/Chanzhaoyu/chatgpt-web">https://github.com/Chanzhaoyu/chatgpt-web</a></p></li><li class="lvl-3"><p><a href="https://github.com/Yidadaa/ChatGPT-Next-Web">https://github.com/Yidadaa/ChatGPT-Next-Web</a></p></li></ol><p>参考文章：</p><ol><li class="lvl-3"><p><a href="https://www.fomal.cc/posts/74ac8dc8.html">无服务器部署自己的chatGPT</a></p></li></ol><h2 id="11-字符画-consolo-log">11. 字符画 consolo.log()<a class="header-anchor" href="#11-字符画-consolo-log"></a></h2><p><strong>推荐</strong>：<a href="http://patorjk.com/software/taag">http://patorjk.com/software/taag</a></p><p>文字生成字符画：<br><a href="http://patorjk.com/software/taag">http://patorjk.com/software/taag</a><br><a href="http://www.network-science.de/ascii/">http://www.network-science.de/ascii/</a></p><p>图片生成字符画：<br><a href="http://www.degraeve.com/img2txt.php">http://www.degraeve.com/img2txt.php</a><br><a href="http://life.chacuo.net/convertphoto2char">http://life.chacuo.net/convertphoto2char</a></p><p>流程图生成字符画：<br><a href="http://asciiflow.com/">http://asciiflow.com/</a></p><p>VSCode 插件：<br><a href="https://github.com/OBKoro1/koro1FileHeader">https://github.com/OBKoro1/koro1FileHeader</a></p><p>参考：<a href="https://blog.saop.cc/p/c9df/">https://blog.saop.cc/p/c9df/</a></p><h2 id="12-ERR-HTTP2-PROTOCOL-ERROR-关闭-HSTS">12. ERR_HTTP2_PROTOCOL_ERROR 关闭 HSTS<a class="header-anchor" href="#12-ERR-HTTP2-PROTOCOL-ERROR-关闭-HSTS"></a></h2><p>访问网站，偶然性报错：ERR_HTTP2_PROTOCOL_ERROR。试着关闭 HSTS</p><p>CDN HTTPS 配置 关闭 <code>HSTS</code>，<a href="https://console.dogecloud.com/cdn/domain/https?domainId=6667">多吉云个人链接</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191935126.png" alt="image-20230419193555012" style="zoom: 33%;" /><p>以下内容来自 ChatGPT：</p><blockquote><p>问：<code>ERR_HTTP2_PROTOCOL_ERROR 和 HSTS 有什么联系</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191946818.png" alt="image-20230419194615758" style="zoom: 50%;" /><p>问：<code>HSTS 会导致 ERR_HTTP2_PROTOCOL_ERROR 报错吗</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191946462.png" alt="image-20230419194650417" style="zoom: 50%;" /></blockquote><h2 id="13-Clash-Parsers">13. Clash Parsers<a class="header-anchor" href="#13-Clash-Parsers"></a></h2><p>设置 =&gt; 配置 =&gt; 配置文件预处理</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><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">parsers:</span> <span class="comment"># array</span></span><br><span class="line">   <span class="bullet">-</span> <span class="attr">url:</span> <span class="string">https://xxx.xxx/xxx</span></span><br><span class="line">     <span class="attr">yaml:</span></span><br><span class="line">       <span class="attr">prepend-rules:</span></span><br><span class="line">         <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,香港Az-优化3</span></span><br><span class="line">         <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,GLOBAL</span></span><br><span class="line">         <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,DIRECT</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>参考链接：</p><ol><li class="lvl-3"><p><a href="https://docs.cfw.lbyczf.com/contents/parser.html">* Clash for Windows：配置文件预处理</a></p></li><li class="lvl-3"><p><a href="https://zhuanlan.zhihu.com/p/600564111">* Clash利用parsers进行规则预处理</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/u013559309/article/details/129437063">* Clash使用Parser添加自定义规则并防止更新覆盖</a></p></li><li class="lvl-3"><p><a href="https://www.wangpc.cc/software/clash-for-windows-paarsers-rules/">clash for windows自定义规则（不会被更新覆盖）</a></p></li><li class="lvl-3"><p><a href="https://www.zhihu.com/question/507810862">clash for windows如何设置指定IP或者网站才走xx?</a></p></li></ol><h2 id="14-Replit-部署-Typecho-TimePlus">14. Replit 部署 Typecho.TimePlus<a class="header-anchor" href="#14-Replit-部署-Typecho-TimePlus"></a></h2><blockquote><p>步骤：<a href="https://github.com/zhheo/TimePlus/wiki/">https://github.com/zhheo/TimePlus/wiki/</a></p><p>Demo：<a href="https://plog.zhheo.com/">https://plog.zhheo.com/</a></p><p>在 Typecho 后台导航栏点击【撰写】，在自定义字段中填写图片地址。并填写文章标题和内容，即对应为图片的标题和简介。</p></blockquote><p>搭建步骤：</p><ol><li class="lvl-3"><p><a href="https://replit.com/">Replit</a> Create a Repl，环境选 SQLite；参照 <a href="https://github.com/valetzx/typechonreplit">@valetzx/typechonreplit</a> 执行 <code>git clone https://github.com/valetzx/typechonreplit &amp;&amp; mv -b typechonreplit/* ./ &amp;&amp; mv -b typechonreplit/.[^.]* ./ &amp;&amp; rm -rf *~ &amp;&amp; rm -rf typechonreplit</code>；注释 <code>main.sh</code> butterfly 相关行，<code>bash main.sh</code>；Run 运行；设置 Typecho 时选择 SQLite 数据库</p></li><li class="lvl-3"><p>按照 <a href="https://github.com/zhheo/TimePlus/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%B8%8A%E6%89%8B">TimePlus.Wiki</a> 设置，将 <a href="https://github.com/zhheo/TimePlus/releases">Source code</a> 解压上传 Replit Repl 对应路径，按步骤设置</p></li><li class="lvl-3"><p>图片仓库批量获取图片 URL <code>ls ./bj |awk '&#123;print &quot;https://mycpen.gitee.io/cdn2/image/bj/&quot;$1&quot;&quot;&#125;' &gt; C:/Users/Administrator/Desktop/TimePlus.txt</code></p></li><li class="lvl-3"><p>Replit Repl 绑自定义域名，需先 TXT 记录认证（因验证问题无法使用 https）</p></li></ol><p>相关链接：</p><ol><li class="lvl-3"><p><a href="https://github.com/zhheo/TimePlus/wiki/">https://github.com/zhheo/TimePlus/wiki/</a></p></li><li class="lvl-3"><p><a href="https://github.com/zhheo/TimePlus">https://github.com/zhheo/TimePlus</a></p></li><li class="lvl-3"><p><a href="https://github.com/valetzx/typechonreplit">https://github.com/valetzx/typechonreplit</a></p></li><li class="lvl-3"><p><a href="https://blog.zhheo.com/p/bed74f41.html">https://blog.zhheo.com/p/bed74f41.html</a></p></li><li class="lvl-3"><p><a href="https://replit.com/">Replit</a></p></li><li class="lvl-3"><p><a href="https://dns.console.aliyun.com/">阿里云.DNS</a></p></li></ol><h2 id="15-Git-修改提交信息">15. Git 修改提交信息<a class="header-anchor" href="#15-Git-修改提交信息"></a></h2><p><strong>2023-12-13 更新</strong></p><p>使用 <code>git rebase -i HEAD~&lt;n&gt;</code> 修改最近某一次的提交信息，以下来自 chatgpt</p><blockquote><p>当您执行 <code>git rebase -i HEAD~&lt;n&gt;</code> 命令时，会打开一个交互式的编辑器界面，列出最近 <code>&lt;n&gt;</code> 个提交。下面是一个示例，假设您要修改最近的前三次提交的提交信息：</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">pick 1a2b3c4 Commit message 1</span><br><span class="line">pick 5d6e7f8 Commit message 2</span><br><span class="line">pick 9g0h1i2 Commit message 3</span><br></pre></td></tr></table></figure><p>要修改提交信息，将每个提交的行的开头的 <code>pick</code> 改为 <code>reword</code> 或 <code>r</code>，然后保存并关闭编辑器。修改后的示例如下：</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">reword 1a2b3c4 Commit message 1</span><br><span class="line">reword 5d6e7f8 Commit message 2</span><br><span class="line">reword 9g0h1i2 Commit message 3</span><br></pre></td></tr></table></figure><p>保存并关闭编辑器后，Git 会逐个应用这些提交，并在每个提交之前暂停并等待您编辑提交信息。对于每个提交，Git 会打开一个新的编辑器窗口，允许您修改提交信息。完成修改后，保存并关闭编辑器。</p><p>请注意，如果在 rebase 过程中出现冲突，您需要解决冲突并使用 <code>git add</code> 命令将解决后的文件标记为已解决。然后，继续进行 rebase，直到所有提交都被处理完毕。</p><p>完成 rebase 后，您可以使用 <code>git log</code> 命令验证提交信息是否已成功修改。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git log</span><br></pre></td></tr></table></figure><p>如果要将修改的提交信息推送到远程仓库，您需要使用 <code>git push --force</code> 命令，因为您已经修改了历史提交。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push --force</span><br></pre></td></tr></table></figure><p>请确保在进行此操作之前备份您的代码，并与团队成员进行沟通，以免影响其他人的工作。</p></blockquote><hr><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></pre></td><td class="code"><pre><span class="line">git commit --amend</span><br><span class="line">git push --force &lt;remote-name&gt; &lt;branch-name&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305131749192.png" alt="image-20230513174958143" style="zoom: 80%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --oneline</span><br><span class="line">git commit --amend -m <span class="string">&quot;新的提交信息&quot;</span></span><br><span class="line">git push --force origin master</span><br><span class="line"></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305131751216.png" alt="image-20230513175153157" style="zoom: 67%;" /></blockquote><h2 id="16-GitHub-BiliBiliToolPro">16. GitHub: BiliBiliToolPro<a class="header-anchor" href="#16-GitHub-BiliBiliToolPro"></a></h2><p><strong>2024-12-11</strong> 更新至最新版本 <code>V2.1.1</code></p><p>版本 2.1.1，上线时间 2024-05-13</p><p>地址：<a href="https://github.com/RayWangQvQ/BiliBiliToolPro">github</a></p><p>方式：<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/docs/runInLocal.md#3-linux">本地部署-文档-linux</a></p><p>失效项：</p><ol><li class="lvl-3"><p>LiveLottery，天选时刻抽奖，<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/issues/764">issue</a></p></li><li class="lvl-3"><p>LiveFansMedal，直播间挂机，<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/issues/794">issue</a></p></li></ol><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">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/BiliBiliToolPro</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除旧版文件</span></span><br><span class="line">$ <span class="built_in">rm</span> -rf *</span><br><span class="line"></span><br><span class="line">$ wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/2.1.1/bilibili-tool-pro-v2.1.1-linux-x64.zip</span><br><span class="line">$ unzip bilibili-tool-pro-v2.1.1-linux-x64.zip</span><br><span class="line">$ <span class="built_in">cd</span> ./linux-x64/</span><br><span class="line">$ ./Ray.BiliBiliTool.Console --runTasks=Login</span><br><span class="line"></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><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></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line">0 1 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=VipBigPoint &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0 8 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=Daily &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">* */12 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveLottery &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0,20,40 16 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0,20,40 18 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0 20 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveFansMedal &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><p>地址：<a href="https://github.com/RayWangQvQ/BiliBiliToolPro">https://github.com/RayWangQvQ/BiliBiliToolPro</a></p><p><a href="https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/docs/runInLocal.md#3-linux">本地部署</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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/BiliBiliToolPro</span><br><span class="line"></span><br><span class="line">$ wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/1.0.3/bilibili-tool-pro-v1.0.3-linux-x64.zip</span><br><span class="line">$ unzip bilibili-tool-pro-v1.0.3-linux-x64.zip</span><br><span class="line">$ <span class="built_in">cd</span> ./linux-x64/</span><br><span class="line">$ ./Ray.BiliBiliTool.Console --runTasks=Login</span><br><span class="line"></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><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line">0 1 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=VipBigPoint</span><br><span class="line">0 8 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=Daily</span><br><span class="line">* */12 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveLottery</span><br><span class="line">0 16 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched</span><br><span class="line">0 20 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveFansMedal</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="17-GitHub-Compare">17. GitHub Compare<a class="header-anchor" href="#17-GitHub-Compare"></a></h2><p>原文：<a href="https://akilar.top/posts/bbf68ad4/">https://akilar.top/posts/bbf68ad4/</a></p><p>示例：<a href="https://github.com/jerryc127/hexo-theme-butterfly/compare/4.8.5...4.9.0">https://github.com/jerryc127/hexo-theme-butterfly/compare/4.8.5...4.9.0</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202309161502336.png" alt="image-20230916150258235" style="zoom:50%;" /><h2 id="18-new-Date-getFullYear">18. new Date().getFullYear();<a class="header-anchor" href="#18-new-Date-getFullYear"></a></h2><p>JavaScript 获取当前年份</p><figure class="highlight javascript"><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"><span class="keyword">const</span> currentYear = <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">getFullYear</span>();</span><br><span class="line"><span class="keyword">const</span> nextYear = currentYear + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">const</span> newYearTimestamp = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">`<span class="subst">$&#123;nextYear&#125;</span>-01-01 00:00:00`</span>).<span class="title function_">getTime</span>() / <span class="number">1000</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="19-JavaScript-解码-Base64">19. JavaScript 解码 Base64<a class="header-anchor" href="#19-JavaScript-解码-Base64"></a></h2><p>在线加密：<a href="https://encode.chahuo.com/">https://encode.chahuo.com/</a></p><p>以下来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>在 JavaScript 中解码 Base64 编码的数据，你可以使用 <code>atob()</code> 函数。该函数可以将 Base64 编码的字符串解码为原始的文本数据。示例代码如下：</p><figure class="highlight javascript"><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 class="keyword">const</span> base64String = <span class="string">&quot;SGVsbG8gd29ybGQ=&quot;</span>;  <span class="comment">// Base64 编码的字符串</span></span><br><span class="line"><span class="keyword">const</span> decodedString = <span class="title function_">atob</span>(base64String);  <span class="comment">// 解码</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(decodedString);  <span class="comment">// 输出解码后的字符串</span></span><br></pre></td></tr></table></figure><p>在这个例子中，<code>base64String</code> 你要解码Base64编码的字符串。使用<code>atob()</code>函数对它进行解码，然后你就可以处理解码后的原始字符串了。</p></blockquote><h2 id="20-JavaScript-取绝对值">20. JavaScript 取绝对值<a class="header-anchor" href="#20-JavaScript-取绝对值"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>在 JavaScript 中，你可以使用 <code>Math.abs()</code> 函数来获取一个数的绝对值，从而去除负号。例如：</p><figure class="highlight javascript"><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">let</span> num = -<span class="number">5</span>;</span><br><span class="line"><span class="keyword">let</span> absNum = <span class="title class_">Math</span>.<span class="title function_">abs</span>(num);  <span class="comment">// absNum将是5</span></span><br></pre></td></tr></table></figure><p>这样，<code>absNum</code> 将会取得 <code>num</code> 的绝对值，而不考虑其正负。</p></blockquote><h2 id="21-JavaScript-三元运算">21. JavaScript 三元运算<a class="header-anchor" href="#21-JavaScript-三元运算"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>你可以使用条件运算符（三元运算符）来判断 <code>e - now1</code> 是否大于 0，然后决定是否执行 +1。下面是优化后的代码：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> daysDifference = <span class="title class_">Math</span>.<span class="title function_">floor</span>(((e - now1) / <span class="number">1e3</span> / <span class="number">60</span> / <span class="number">60</span> / <span class="number">24</span>) + (e - now1 &gt; <span class="number">0</span> ? <span class="number">1</span> : <span class="number">0</span>));</span><br></pre></td></tr></table></figure><p>这行代码首先计算 <code>(e - now1) / 1e3 / 60 / 60 / 24</code> 得到天数差，然后根据 <code>(e - now1 &gt; 0)</code> 条件判断天数差是否大于 0，如果是则加 1，否则加 0。最后使用 <code>Math.floor</code> 向下取整。</p></blockquote><h2 id="22-Snipaste-截图格式改-JPG">22. Snipaste 截图格式改 JPG<a class="header-anchor" href="#22-Snipaste-截图格式改-JPG"></a></h2><p>参考：<a href="https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html">https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html</a></p><p>右键 → 首选项 → 输出 → 文件名.后缀</p><p>实测大大减少图片体积，500 KB (PNG) → 70KB (JPG)</p><p>仅适用于保存为本地文件，从剪贴板中粘贴到 typora 里还是 PNG 格式的</p><p>本人格式：<code>image-$yyyyMMddHHmmsszzz$.jpg</code>，目的 与 typora 剪贴板 上场时的 alt 命名保持一致</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202310070313815.jpg" alt="image-20231007031301508" style="zoom: 25%;" /><h2 id="23-CSS-视口单位-dvh-svh-lvh">23. CSS 视口单位 dvh, svh, lvh<a class="header-anchor" href="#23-CSS-视口单位-dvh-svh-lvh"></a></h2><p>参考：</p><ol><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/e644.html">https://blog.anheyu.com/posts/e644.html</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/LuckyWinty/article/details/128962918">https://blog.csdn.net/LuckyWinty/article/details/128962918</a></p></li></ol><h2 id="24-CSS-旋转-rotate-90deg">24. CSS 旋转 rotate(90deg)<a class="header-anchor" href="#24-CSS-旋转-rotate-90deg"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p><code>rotate(90deg)</code> 是CSS中的旋转变换指令，用于将元素顺时针旋转90度。这可以应用于任何HTML元素，使其在页面上以指定角度旋转。</p><p>逆时针旋转一个元素90度，<code>rotate(-90deg)</code></p><figure class="highlight css"><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 class="selector-class">.about-page-chicken-soup</span> <span class="selector-tag">details</span><span class="selector-attr">[open]</span>&gt;<span class="selector-tag">summary</span><span class="selector-pseudo">:after</span> &#123;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">90deg</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></blockquote><h2 id="25-Markdown-折叠语法">25. Markdown 折叠语法<a class="header-anchor" href="#25-Markdown-折叠语法"></a></h2><p>参考：<a href="https://blog.csdn.net/ybb_ymm/article/details/128508243">https://blog.csdn.net/ybb_ymm/article/details/128508243</a></p><figure class="highlight markdown"><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="language-xml"><span class="tag">&lt;<span class="name">details</span>&gt;</span></span> </span><br><span class="line"><span class="code">    &lt;summary&gt;指示标题&lt;/summary&gt;</span></span><br><span class="line"><span class="code">    内容</span></span><br><span class="line"><span class="code">&lt;/details&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight markdown"><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="language-xml"><span class="tag">&lt;<span class="name">details</span>&gt;</span></span> </span><br><span class="line"><span class="code">    &lt;summary&gt;展开查看&lt;/summary&gt;</span></span><br><span class="line"><span class="code">    &lt;pre&gt;&lt;code&gt;</span></span><br><span class="line"><span class="code">        此处为代码的块具体内容</span></span><br><span class="line"><span class="code">    &lt;/code&gt;&lt;/pre&gt; </span></span><br><span class="line"><span class="code">&lt;/details&gt;</span></span><br></pre></td></tr></table></figure><h2 id="26-PicGo-图片压缩插件">26. PicGo 图片压缩插件<a class="header-anchor" href="#26-PicGo-图片压缩插件"></a></h2><p>插件名：<a href="https://github.com/liujinpen/picgo-plugin-compress-tinypng">picgo-plugin-compress-tinypng</a></p><p>NPM 包：<a href="https://www.npmjs.com/package/picgo-plugin-tinypng">picgo-plugin-tinypng</a></p><p>TinyPNG</p><ul class="lvl-0"><li class="lvl-2"><p>官网：<a href="https://tinify.cn/">https://tinify.cn/</a></p></li><li class="lvl-2"><p>获取 Key 参考：<a href="https://bearcai.com/index.php/archives/44/">https://bearcai.com/index.php/archives/44/</a><br><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202310070421963.jpg" alt="image-20231007042117896" style="zoom:25%;" /></p></li><li class="lvl-2"><p>Key 限额 500 次/月：<a href="https://tinify.cn/dashboard/api">https://tinify.cn/dashboard/api</a></p></li></ul><p>起因：<a href="https://github.com/juzisang/picgo-plugin-compress">picgo-plugin-compress</a> 长久失修，picgo 2.3.1 报错 <code>TypeError: req.end is not a function</code>。 <a href="https://github.com/juzisang/picgo-plugin-compress/issues/64#issuecomment-1504939740">issue#64</a> 获知此插件</p><h2 id="27-JavaScript-copy-事件">27. JavaScript copy 事件<a class="header-anchor" href="#27-JavaScript-copy-事件"></a></h2><p>来自 ChatGPT</p><p>要检测用户是否复制内容，你可以使用JavaScript中的<code>copy</code>事件来捕获复制操作。你可以将事件监听器绑定到<code>copy</code>事件上，然后在该事件触发时执行相应的操作，以获知用户是否复制了内容。</p><figure class="highlight javascript"><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="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;copy&#x27;</span>, <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span><br><span class="line">    <span class="comment">// 在这里执行你想要的操作，例如记录复制操作或发送数据到服务器</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户复制了内容&#x27;</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><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="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;copy&#x27;</span>, <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span><br><span class="line">    <span class="comment">// 获取复制的内容</span></span><br><span class="line">    <span class="keyword">var</span> copiedText = <span class="variable language_">window</span>.<span class="title function_">getSelection</span>().<span class="title function_">toString</span>().<span class="title function_">trim</span>();</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 检查复制的内容是否为空</span></span><br><span class="line">    <span class="keyword">if</span> (copiedText.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="comment">// 在这里执行你想要的操作，例如记录复制操作或发送数据到服务器</span></span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户复制了内容:&#x27;</span>, copiedText);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="comment">// 复制的内容为空，可以选择不执行任何操作或者执行相应处理</span></span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户尝试复制空内容&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="28-JavaScript-window-onresize">28. JavaScript window.onresize<a class="header-anchor" href="#28-JavaScript-window-onresize"></a></h2><p>来自：ChatGPT</p><p><code>window.onresize</code> 是 JavaScript 中的一个事件处理属性，它用于指定在浏览器窗口大小改变时要执行的函数。当用户调整浏览器窗口的大小时，就会触发 <code>resize</code> 事件，如果你将一个函数分配给 <code>window.onresize</code>，那么这个函数将在窗口大小改变时被调用。</p><p>例如，你可以使用以下方式监听窗口大小改变事件并执行相应的操作：</p><figure class="highlight javascript"><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="variable language_">window</span>.<span class="property">onresize</span> = <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">// 在窗口大小改变时执行的代码</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;窗口大小已改变&quot;</span>);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>这对于创建响应式设计或根据窗口大小进行布局调整等任务非常有用。当窗口大小发生变化时，你可以根据需要更新页面内容、样式或执行其他自定义操作。</p><h2 id="29-Git-指定远端">29. Git 指定远端<a class="header-anchor" href="#29-Git-指定远端"></a></h2><p>参考：<a href="http://www.mobiletrain.org/about/BBS/161969.html">http://www.mobiletrain.org/about/BBS/161969.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></pre></td><td class="code"><pre><span class="line">git remote add origin &lt;远程仓库URL&gt;</span><br><span class="line"></span><br><span class="line">git push &lt;远程仓库别名&gt; &lt;本地分支名&gt;:&lt;远程分支名&gt;</span><br><span class="line"></span><br><span class="line">git push origin master:main</span><br></pre></td></tr></table></figure><h2 id="30-Git-删除文件历史提交记录">30. Git 删除文件历史提交记录<a class="header-anchor" href="#30-Git-删除文件历史提交记录"></a></h2><p>参考：ChatGPT</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">git filter-branch --force --index-filter <span class="string">&#x27;git rm -r --cached --ignore-unmatch node_modules&#x27;</span> --prune-empty --tag-name-filter <span class="built_in">cat</span> -- --all</span><br><span class="line">git <span class="built_in">rm</span> --cached node_modules -r</span><br><span class="line"></span><br><span class="line">git reflog expire --expire=now --all &amp;&amp; git gc --prune=now --aggressive</span><br></pre></td></tr></table></figure><p>ChatGPT 还提供了 <code>git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD</code> 命令删除，运行时间过长，不采用，给出的解释：命令1 使用了 <code>--index-filter</code> 和 <code>--cached</code>，这些参数可以更快地处理 Git 的索引而不需要检查和修改实际的工作树文件</p><blockquote><ol><li class="lvl-3"><p><code>git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD</code>:</p><ul class="lvl-3"><li class="lvl-5">使用 <code>--tree-filter</code> 参数，它会在每个提交上执行指定的 shell 命令。在这种情况下，它会执行 <code>rm -rf node_modules</code> 命令来删除 <code>node_modules</code> 目录。</li><li class="lvl-5">使用 <code>--prune-empty</code> 选项以删除空提交。</li><li class="lvl-5">只作用于当前分支 <code>HEAD</code>。</li></ul></li><li class="lvl-3"><p><code>git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch node_modules' --prune-empty --tag-name-filter cat -- --all</code>:</p><ul class="lvl-3"><li class="lvl-5">使用 <code>--index-filter</code> 参数，它会在 Git 索引上执行指定的命令。在这种情况下，它会执行 <code>git rm -r --cached --ignore-unmatch node_modules</code> 命令，以将 <code>node_modules</code> 从索引中删除。</li><li class="lvl-5">使用 <code>--prune-empty</code> 选项以删除空提交。</li><li class="lvl-5">使用 <code>--tag-name-filter cat</code> 选项，以保留提交的标签（tags）。</li><li class="lvl-5">使用 <code>--all</code> 来指定作用于所有分支。</li></ul></li></ol><hr><p>之前上传 github 时提交了无需提交的 node_modules，如何缩小 .git 的大小</p><p>ChatGPT：要缩小.git目录的大小，可以采取以下步骤：</p><ol><li class="lvl-3"><p>清理历史提交中的node_modules：首先，你需要清理历史提交中的不必要的node_modules目录。你可以使用<code>git filter-branch</code>命令或<code>git filter-repo</code>工具来重写历史提交以删除node_modules。确保在删除之前备份你的仓库，以防发生问题。</p></li><li class="lvl-3"><p>使用.gitignore：在项目根目录下创建一个名为<code>.gitignore</code>的文件，并将<code>node_modules/</code>添加到其中，以确保不再将该目录包括在提交中。</p></li><li class="lvl-3"><p>执行<code>git rm --cached node_modules -r</code>：这将删除当前暂存区中的node_modules目录，但不会删除物理文件。然后，提交这一变更。</p></li><li class="lvl-3"><p>执行<code>git reflog expire --expire=now --all</code>：这将清理Git的reflog，以确保不再保留对不必要历史提交的引用。</p></li><li class="lvl-3"><p>执行<code>git gc --prune=now</code>：这将触发垃圾收集，清理不必要的数据，从而缩小.git目录的大小。</p></li><li class="lvl-3"><p>推送到远程仓库：如果你使用远程仓库（如GitHub），确保将这些更改推送到远程仓库以同步它们。</p></li></ol><p>请注意，这些步骤会修改你的Git历史，因此在执行它们之前务必小心，确保已备份你的仓库数据。</p></blockquote><h2 id="31-洛雪音乐导入三方音源">31. 洛雪音乐导入三方音源<a class="header-anchor" href="#31-洛雪音乐导入三方音源"></a></h2><p>官方源因 TX 警告而报废，详见 issue：<a href="https://github.com/lyswhut/lx-music-desktop/issues/1643">https://github.com/lyswhut/lx-music-desktop/issues/1643</a></p><p>详见 issue：<a href="https://github.com/lyswhut/lx-music-desktop/issues/1649#issuecomment-1774536022">https://github.com/lyswhut/lx-music-desktop/issues/1649#issuecomment-1774536022</a></p><p>仓库：<a href="https://github.com/OneCodeMonkey/music-sources">https://github.com/OneCodeMonkey/music-sources</a></p><h2 id="32-Clash-GUI">32. Clash GUI<a class="header-anchor" href="#32-Clash-GUI"></a></h2><p>起因：<a href="https://github.com/Fndroid/clash_for_windows_pkg">Clash for Windows</a> 删库</p><p>Clash Verge：<a href="https://github.com/zzzgydi/clash-verge/">https://github.com/zzzgydi/clash-verge/</a></p><p>Clash for Android 存档：<a href="https://github.com/Z-Siqi/Clash-for-Windows_Chinese/releases/tag/CFA">https://github.com/Z-Siqi/Clash-for-Windows_Chinese/releases/tag/CFA</a></p><p>Clash for Windows 存档：<a href="https://github.com/Z-Siqi/Clash-for-Windows_Chinese">https://github.com/Z-Siqi/Clash-for-Windows_Chinese</a></p><h2 id="33-GitHub-SSH-超时">33. GitHub SSH 超时<a class="header-anchor" href="#33-GitHub-SSH-超时"></a></h2><p><code>git pull</code> 报超时、<code>ping github.com</code> 报超时</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># git bash 终端</span></span><br><span class="line">vim ~/.ssh/config</span><br></pre></td></tr></table></figure><p>内容如下，第一次 <code>git pull</code> 时输入 <code>yes</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># GitHub Start</span></span><br><span class="line">Host github.com</span><br><span class="line">  Hostname ssh.github.com</span><br><span class="line"><span class="comment"># GitHub End</span></span><br></pre></td></tr></table></figure><p>参考</p><ol><li class="lvl-3"><p><a href="https://blog.ttiee.tech/posts/2024/71e1/">https://blog.ttiee.tech/posts/2024/71e1/</a></p></li><li class="lvl-3"><p><a href="https://ww-rm.github.io/posts/2024/01/17/githubssh-timeout/">https://ww-rm.github.io/posts/2024/01/17/githubssh-timeout/</a></p></li><li class="lvl-3"><p>github <a href="https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port">Using SSH over the HTTPS port</a></p></li><li class="lvl-3"><p>github <a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-githubs-ip-addresses">About GitHub’s IP addresses</a></p></li></ol><h2 id="34-Hexo-隐藏文章">34. Hexo 隐藏文章<a class="header-anchor" href="#34-Hexo-隐藏文章"></a></h2><p>参考：<a href="https://blog.jiejaitt.tech/posts/1c5dc392.html">JIeJaitt | Hexo隐藏文章</a></p><ol><li class="lvl-3"><p><code>Front-Matter</code> 配置 <code>published</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></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">Foo</span></span><br><span class="line"><span class="attr">published:</span> <span class="literal">false</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>存为草稿</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="comment"># 路径 source/_drafts/</span></span><br><span class="line">hexo new draft &lt;title&gt;</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>插件，hexo-hide-posts 等</p></li></ol><p>官方参考</p><ol><li class="lvl-3"><p><a href="https://hexo.io/docs/front-matter#Settings-Their-Default-Values">https://hexo.io/docs/front-matter#Settings-Their-Default-Values</a></p></li><li class="lvl-3"><p><a href="https://hexo.io/zh-cn/docs/writing.html">https://hexo.io/zh-cn/docs/writing.html</a></p></li></ol><h2 id="35-GitHub-2FA">35. GitHub 2FA<a class="header-anchor" href="#35-GitHub-2FA"></a></h2><p>GitHub 2FA 双因素认证</p><p>地址：<a href="https://github.com/settings/security">https://github.com/settings/security</a></p><p>Chrome插件：<a href="https://chromewebstore.google.com/detail/%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%99%A8/bhghoamapcdpbohphigoooaddinpkbai">Authenticator</a></p><p>安卓应用：<a href="https://play.google.com/store/apps/details?id=com.azure.authenticator">Microsoft Authenticator</a></p><p>参考：<a href="https://zhuanlan.zhihu.com/p/657035724">https://zhuanlan.zhihu.com/p/657035724</a></p><h2 id="36-GitHub-B-站粉丝牌助手">36. GitHub: B 站粉丝牌助手<a class="header-anchor" href="#36-GitHub-B-站粉丝牌助手"></a></h2><p>用途：b站粉丝牌升级</p><p>版本：fdc626f，<a href="https://github.com/XiaoMiku01/fansMedalHelper/commits/master/">commits</a>；Nov 11, 2024</p><p>地址：<a href="https://github.com/XiaoMiku01/fansMedalHelper">https://github.com/XiaoMiku01/fansMedalHelper</a></p><p>文档：<a href="https://xiaomiku01.github.io/fansMedalHelperVersion/">https://xiaomiku01.github.io/fansMedalHelperVersion/</a></p><p>服务器部署：<a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html">https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file</span><br><span class="line"></span><br><span class="line">$ git <span class="built_in">clone</span> https://github.com/XiaoMiku01/fansMedalHelper.git</span><br><span class="line">$ <span class="built_in">cd</span> fansMedalHelper</span><br><span class="line"><span class="comment"># $ pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple</span></span><br><span class="line">$ pip3.8 install -r requirements.txt</span><br><span class="line"></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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cp</span> users.example.yaml users.yaml</span><br><span class="line">$ vim users.yaml</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用 <a href="https://github.com/XiaoMiku01/fansMedalHelper/releases/tag/logintool">B站access_key获取工具</a> 管理员身份运行，获取 access_key</p><p>文件 <code>users.yaml</code> 修改项：<code>access_key</code>、<code>SIGNINGROUP: 2</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="comment"># cat users.yaml</span></span><br><span class="line"></span><br><span class="line"><span class="attr">USERS:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">access_key:</span> <span class="string">xxx</span></span><br><span class="line"></span><br><span class="line"><span class="attr">SIGNINGROUP:</span> <span class="number">2</span> <span class="comment"># 应援团签到CD时间,单位秒,默认2秒,设置为0则不签到</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>删除不重要的粉丝牌，减少耗时，<a href="https://link.bilibili.com/p/center/index#/user-center/wearing-center/my-medal">b站链接</a>，参考自 <a href="https://github.com/XiaoMiku01/fansMedalHelper/issues/189#issuecomment-2268357426">issue</a></p><p>使用计划任务每日一点跑程序，参考自 <a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html#%E8%BF%90%E8%A1%8C%E4%B8%BB%E7%A8%8B%E5%BA%8F">文档</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></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"><span class="comment"># B站粉丝牌助手</span></span><br><span class="line"><span class="comment"># https://github.com/XiaoMiku01/fansMedalHelper</span></span><br><span class="line">0 1 * * *  <span class="built_in">cd</span> /root/sh_file/fansMedalHelper; python3.8 main.py &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="37-音乐播放器">37. 音乐播放器<a class="header-anchor" href="#37-音乐播放器"></a></h2><p>吾爱破解：<a href="https://www.52pojie.cn/">https://www.52pojie.cn/</a></p><p>酷我音乐PC：<a href="https://wwc.lanzouy.com/iIepJ0b3wchg">蓝奏云</a></p><h2 id="38-b站-硬核会员">38. b站 硬核会员<a class="header-anchor" href="#38-b站-硬核会员"></a></h2><p>b站 硬核会员答题 油猴脚本</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://github.com/HCLonely/bili-senior-newbie-qa">https://github.com/HCLonely/bili-senior-newbie-qa</a></p></li><li class="lvl-3"><p><a href="https://blog.hclonely.com/posts/c1ef618c/">https://blog.hclonely.com/posts/c1ef618c/</a></p></li></ol><p><strong>安装</strong></p><ol><li class="lvl-3"><p>安装<a href="https://www.tampermonkey.net/index.php">Tampermonkey</a>(建议)或其他脚本管理器；</p></li><li class="lvl-3"><p><a href="https://github.com/HCLonely/bili-senior-newbie-qa/blob/main/bili-senior-newbie-qa.user.js?raw=true">点此安装</a>搜题脚本。</p></li></ol><p><strong>使用</strong></p><ol><li class="lvl-3"><p>手机哔哩哔哩客户端进入答题；</p></li><li class="lvl-3"><p>浏览器登录哔哩哔哩(已登录可跳过此步骤)；</p></li><li class="lvl-3"><p>浏览器打开调试工具(<code>F12</code>), 将浏览器切换为移动设备(<code>Ctrl+Shift+M</code>)；</p></li><li class="lvl-3"><p>在地址栏输入<code>https://www.bilibili.com/h5/senior-newbie/</code>并回车，进入答题，等待网页加载完成；</p></li><li class="lvl-3"><p>启动脚本(<code>Alt+N</code>)；</p><ul class="lvl-2"><li class="lvl-6">加载题库(需要题目完全匹配)：可从本地加载题库(支持<code>txt</code>,<code>doc</code>,<code>docx</code>,<code>xls</code>,<code>xlsx</code>格式)，题库中搜索不到则使用搜索引擎搜索</li><li class="lvl-6">直接运行：使用搜索引擎搜索(支持<code>百度</code>，<code>搜狗</code>，<code>必应</code>，<code>谷歌</code>)</li></ul></li><li class="lvl-3"><p>点击<strong>题目</strong>即可进行搜索。</p></li></ol><p><strong>注意事项</strong></p><ol><li class="lvl-3"><p>使用此脚本时建议关闭其他插件/脚本，避免冲突；</p></li><li class="lvl-3"><p>建议选择<code>文史</code>，<code>知识</code>，<code>音乐</code>等答案比较好搜索判断的类型。</p></li></ol><h2 id="39-npm-cdn">39. npm cdn<a class="header-anchor" href="#39-npm-cdn"></a></h2><ol><li class="lvl-3"><p><a href="https://cdn.jsdelivr.net/npm/">https://cdn.jsdelivr.net/npm/</a></p></li><li class="lvl-3"><p><a href="https://cdn.cbd.int/">https://cdn.cbd.int/</a></p></li><li class="lvl-3"><p><a href="https://cdn.iocdn.cc/npm/">https://cdn.iocdn.cc/npm/</a></p></li><li class="lvl-3"><p><a href="https://open.lightxi.com/unpkg/">https://open.lightxi.com/unpkg/</a></p></li><li class="lvl-3"><p><a href="https://cdn.smartcis.cn/npm/">https://cdn.smartcis.cn/npm/</a></p></li><li class="lvl-3"><p><a href="https://cdn.jsdmirror.com/npm/">https://cdn.jsdmirror.com/npm/</a></p></li><li class="lvl-3"><p><a href="https://s4.zstatic.net/npm/">https://s4.zstatic.net/npm/</a></p></li></ol><p>参考</p><ol><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/fe76.html">https://blog.anheyu.com/posts/fe76.html</a></p></li><li class="lvl-3"><p><a href="https://blog.liushen.fun/posts/260f4f9a/#JSCDN">https://blog.liushen.fun/posts/260f4f9a/#JSCDN</a></p></li></ol><h2 id="40-CentOS-配置-zsh">40. CentOS 配置 zsh<a class="header-anchor" href="#40-CentOS-配置-zsh"></a></h2><p>背景：2025/5/11 更换新云主机 CentOS Stream 9，迁移旧主机配置</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://www.cnblogs.com/jie-fang/p/13437335.html">https://www.cnblogs.com/jie-fang/p/13437335.html</a></p></li></ol><p>别名免密登录：<a href="https://blog.cpen.top/posts/cee83196.html#02-sshpass-%E9%9D%9E%E4%BA%A4%E4%BA%92%E7%99%BB%E5%BD%95">mycpen</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> /etc/hostname</span><br><span class="line">CentOS</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启</span></span><br><span class="line">$ reboot</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>安装 zsh 和 oh-my-zsh，参考 <a href="https://www.cnblogs.com/jie-fang/p/13437335.html">博客园</a></p><ol><li class="lvl-3"><p>查看当前 shell <code>echo $SHELL</code></p></li><li class="lvl-3"><p>安装 zsh <code>yum install -y zsh</code></p></li><li class="lvl-3"><p>查看系统中已经安装的 shell <code>cat /etc/shells</code></p></li><li class="lvl-3"><p>切换 shell <code>chsh -s /bin/zsh</code></p></li><li class="lvl-3"><p>安装 git <code>yum install -y git</code></p></li><li class="lvl-3"><p>安装 oh-my-zsh</p></li></ol><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">sh -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)</span>&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><ol start="7"><li class="lvl-3"><p>修改 oh-my-zsh 主题</p></li></ol><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">$ vim ~/.zshrc</span><br><span class="line">ZSH_THEME=<span class="string">&quot;ys&quot;</span></span><br><span class="line"></span><br><span class="line">$ <span class="built_in">source</span> ~/.zshrc</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>其他配置</p><p>迁移计划任务 crontab 定时脚本 <code>crontab -e</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"><span class="comment"># B站签到投币</span></span><br><span class="line"><span class="comment"># https://github.com/RayWangQvQ/BiliBiliToolPro</span></span><br><span class="line">0 1 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=VipBigPoint &amp;&gt; /dev/null</span><br><span class="line">0 8 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=Daily &amp;&gt; /dev/null</span><br><span class="line"><span class="comment"># * */12 * * *  cd /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveLottery &amp;&gt; /dev/null</span></span><br><span class="line">0,20,40 16 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line">0,20,40 18 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line">0 20 * * *  <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveFansMedal &amp;&gt; /dev/null</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="comment"># B站粉丝牌助手</span></span><br><span class="line"><span class="comment"># https://github.com/XiaoMiku01/fansMedalHelper</span></span><br><span class="line">0 1 * * *  <span class="built_in">cd</span> /root/sh_file/fansMedalHelper; python3 main.py &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>BiliBiliToolPro</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://github.com/RayWangQvQ/BiliBiliToolPro">https://github.com/RayWangQvQ/BiliBiliToolPro</a></p></li><li class="lvl-3"><p><a href="https://blog.cpen.top/posts/cee83196.html#16-GitHub-BiliBiliToolPro">mycpen</a></p></li></ol><p>本地部署：<s>2025/5/11，V2.2.1</s> 2025/5/23，V3.1.0，参考：<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/docs/runInLocal.md#3-linux">github-linux</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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/BiliBiliToolPro</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除旧版文件</span></span><br><span class="line">$ <span class="built_in">rm</span> -rf *</span><br><span class="line"></span><br><span class="line">$ wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/3.1.0/bilibili-tool-pro-v3.1.0-linux-x64.zip</span><br><span class="line">$ unzip bilibili-tool-pro-v3.1.0-linux-x64.zip</span><br><span class="line">$ <span class="built_in">cd</span> ./linux-x64/</span><br><span class="line">$ ./Ray.BiliBiliTool.Console --runTasks=Login</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>fansMedalHelper</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://github.com/XiaoMiku01/fansMedalHelper">https://github.com/XiaoMiku01/fansMedalHelper</a></p></li><li class="lvl-3"><p><a href="https://blog.cpen.top/posts/cee83196.html#36-GitHub-B-%E7%AB%99%E7%B2%89%E4%B8%9D%E7%89%8C%E5%8A%A9%E6%89%8B">mycpen</a></p></li></ol><p>本地部署：2025/5/11，<a href="https://github.com/XiaoMiku01/fansMedalHelper/commits/master/">fdc626f</a> Nov 11, 2024，参考：<a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file</span><br><span class="line"></span><br><span class="line">$ git <span class="built_in">clone</span> https://github.com/XiaoMiku01/fansMedalHelper.git</span><br><span class="line">$ <span class="built_in">cd</span> fansMedalHelper</span><br><span class="line"><span class="comment"># $ pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple</span></span><br><span class="line">$ pip3 install -r requirements.txt</span><br><span class="line"></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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cp</span> users.example.yaml users.yaml</span><br><span class="line">$ vim users.yaml</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用 <a href="https://github.com/XiaoMiku01/fansMedalHelper/releases/tag/logintool">B站access_key获取工具</a> 管理员身份运行，获取 access_key</p><p>文件 <code>users.yaml</code> 修改项：<code>access_key</code>、<code>SIGNINGROUP: 2</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="comment"># cat users.yaml</span></span><br><span class="line"></span><br><span class="line"><span class="attr">USERS:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">access_key:</span> <span class="string">xxx</span></span><br><span class="line"></span><br><span class="line"><span class="attr">SIGNINGROUP:</span> <span class="number">2</span> <span class="comment"># 应援团签到CD时间,单位秒,默认2秒,设置为0则不签到</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用计划任务每日一点跑程序，参考自 <a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html#%E8%BF%90%E8%A1%8C%E4%B8%BB%E7%A8%8B%E5%BA%8F">文档</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></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"><span class="comment"># B站粉丝牌助手</span></span><br><span class="line"><span class="comment"># https://github.com/XiaoMiku01/fansMedalHelper</span></span><br><span class="line">0 1 * * *  <span class="built_in">cd</span> /root/sh_file/fansMedalHelper; python3 main.py &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Other </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Git </tag>
            
            <tag> Hexo </tag>
            
            <tag> SSH </tag>
            
            <tag> Other </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>03_Error-问题记录-winpty-.gitignore</title>
      <link href="/posts/fe8dbc73.html"/>
      <url>/posts/fe8dbc73.html</url>
      
        <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录一些遇到的问题</p><h2 id="01-Python-中文乱码-Git-Bash">01. Python 中文乱码 (Git Bash)<a class="header-anchor" href="#01-Python-中文乱码-Git-Bash"></a></h2><p>win终端正常运行但是在git bash 终端运行py文件中文乱码<br>在python命令前加 <code>winpty</code> 之后则可以正常显示中文</p><blockquote><p>winpty：一个 Windows 软件包，提供类似于 Unix pty-master 的接口，用于与 Windows 控制台程序通信。</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202303310016695.png" alt="image-20230331001601640" style="zoom: 25%;" /></blockquote><p>参考文章：</p><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/sinat_42414027/article/details/127787059">【python中文乱码】git bash终端运行python文件中文乱码的问题</a></p></li><li class="lvl-3"><p><a href="https://github.com/rprichard/winpty">https://github.com/rprichard/winpty</a></p></li></ol><h2 id="02-gitignore-测试规则">02. .gitignore 测试规则<a class="header-anchor" href="#02-gitignore-测试规则"></a></h2><p>.gitignore 配置</p><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">*.a             表示忽略所有 .a 结尾的文件</span><br><span class="line">!lib.a          表示但lib.a除外</span><br><span class="line">doc/*.txt       表示会忽略doc/notes.txt但不包括 doc/server/arch.txt</span><br><span class="line">/TODO           表示仅仅忽略项目根目录下的 TODO 文件，不包括 subdir/TODO</span><br><span class="line">bin/            表示忽略当前路径下的bin文件夹，该文件夹下的所有内容都会被忽略，不忽略 bin 文件</span><br><span class="line">**/foo:         表示忽略/foo,a/foo,a/b/foo等</span><br><span class="line">a/**/b:         表示忽略a/b, a/x/b,a/x/y/b等</span><br><span class="line">*.log:          表示忽略所有 .log 文件</span><br><span class="line">/mtk/           表示过滤整个文件夹</span><br><span class="line">*.zip           表示过滤所有.zip文件</span><br><span class="line">--- 需要注意的是，gitignore还可以指定要将哪些文件添加到版本管理中，如下： ---</span><br><span class="line">!*.zip</span><br><span class="line">!/mtk/one.txt</span><br><span class="line">唯一的区别就是规则开头多了一个感叹号，Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢？</span><br><span class="line">想象一个场景：假如我们只需要管理/mtk/目录中的one.txt文件，</span><br><span class="line">这个目录中的其他文件都不需要管理，那么.gitignore规则应写为：</span><br><span class="line">/mtk/*</span><br><span class="line">!/mtk/one.txt</span><br><span class="line">假设我们只有过滤规则，而没有添加规则，</span><br><span class="line">那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来！</span><br><span class="line">注意上面的/mtk/*不能写为/mtk/，否则父目录被前面的规则排除掉了，</span><br><span class="line">one.txt文件虽然加了!过滤规则，也不会生效！</span><br><span class="line">--- 还有一些规则如下： ---</span><br><span class="line">fd1/*</span><br><span class="line">说明：忽略目录 fd1 下的全部内容；</span><br><span class="line">注意，不管是根目录下的 /fd1/ 目录，还是某个子目录 /child/fd1/ 目录，都会被忽略；</span><br><span class="line">/fd1/*</span><br><span class="line">说明：忽略根目录下的 /fd1/ 目录的全部内容；</span><br><span class="line">------</span><br><span class="line">/*</span><br><span class="line">!.gitignore</span><br><span class="line">!/fw/ </span><br><span class="line">/fw/*</span><br><span class="line">!/fw/bin/</span><br><span class="line">!/fw/sf/</span><br><span class="line">说明：忽略全部内容，但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录；</span><br><span class="line">注意要先对bin/的父目录使用!规则，使其不被排除。</span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote><p><mark>*</mark> .gitignor 忽略规则查看</p><blockquote><p>有时候，确定为什么要忽略特定文件可能会很困难，尤其是当你使用多个.gitignore文件或复杂格式时。这是git check-ignore命令的用处，告诉git显示匹配模式的详细信息。</p><p>例如，要检查为什么忽略www/yarn.lock文件，可以运行：</p><p><code>git check-ignore -v www/yarn.lock</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304041447156.png" alt="image-20230404144757129" style="zoom: 67%;" /></blockquote><p>显示所有被忽略的文件</p><blockquote><p>带有–ignored选项的git status命令显示所有被忽略文件的列表：</p><p><code>git status --ignored</code></p></blockquote><p>参考文章：</p><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/stephenbruce/article/details/127355631">Git忽略提交规则 - .gitignore配置【学习】</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/m0_49448331/article/details/128655710">如何使用.gitignore忽略Git中的文件和目录</a></p></li></ol><h2 id="03-Windows-显示-无Internet">03. Windows 显示&quot;无Internet&quot;<a class="header-anchor" href="#03-Windows-显示-无Internet"></a></h2><p>情况：网络显示 “无Internet”，但是可以上网。以下措施没根本解决，最终用微软诊断工具，重置了 <code>以太网</code> 网络（万能的重装大法）…</p><blockquote><ol><li class="lvl-3"><p>向 <a href="http://dns.msftncsi.com">dns.msftncsi.com</a> 发送 DNS 查找请求，DNS 解析为 131.107.255.255</p></li><li class="lvl-3"><p>请求 <a href="http://www.msftconnecttest.com/connecttest.txt%EF%BC%8C%E5%A6%82%E6%9E%9C%E7%BD%91%E7%BB%9C%E6%AD%A3%E5%B8%B8%EF%BC%8C%E5%88%99%E6%AD%A4%E6%96%87%E4%BB%B6%E6%98%AF%E7%BA%AF%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BB%85%E5%8C%85%E5%90%AB%E6%96%87%E6%9C%AC">http://www.msftconnecttest.com/connecttest.txt，如果网络正常，则此文件是纯文本文件，仅包含文本</a> Microsoft Connect Test</p></li></ol><p>如果过程1不正常，则提示“无法访问Internet”，如果1正常2不正常，则提示需要进行身份验证</p></blockquote><p><mark>以下措施没解决问题</mark></p><p>估计 DHCP 分配的 DNS 服务器（指向网关）有问题，<a href="https://github.com/oldj/SwitchHosts">SwitchHosts</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="comment"># Microsoft</span></span><br><span class="line">dns.msftncsi.com 131.107.255.255</span><br></pre></td></tr></table></figure><p>开机自启 SwitchHosts（Win）：</p><ul class="lvl-0"><li class="lvl-2"><p>快捷方式 复制到 =&gt; C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\</p></li><li class="lvl-2"><p>设置 =&gt; 选项 =&gt; 启动时隐藏 √</p></li></ul><p>参考文章：</p><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/wangpeng246300/article/details/120230220">解决Windows有网络连接但是显示“无Internet”的问题</a></p></li><li class="lvl-3"><p><a href="https://github.com/oldj/SwitchHosts/issues/646#issuecomment-945391940">SwitchHosts/issues/646</a></p></li></ol><h2 id="04-Replit-Repl-ERR-SSL-PROTOCOL-ERROR">04. Replit Repl ERR_SSL_PROTOCOL_ERROR<a class="header-anchor" href="#04-Replit-Repl-ERR-SSL-PROTOCOL-ERROR"></a></h2><p>未解决，绑自定义域名后，未分配 SSL 证书</p><p>Replit 官方论坛：</p><ol><li class="lvl-3"><p><a href="https://ask.replit.com/t/err-ssl-protocol-error-for-all-sites/27775">https://ask.replit.com/t/err-ssl-protocol-error-for-all-sites/27775</a></p></li><li class="lvl-3"><p>问题搜索：<a href="https://ask.replit.com/search?q=ERR_SSL_PROTOCOL_ERROR">https://ask.replit.com/search?q=ERR_SSL_PROTOCOL_ERROR</a></p></li></ol><p>Replit 官方服务状态：</p><ol><li class="lvl-3"><p><a href="https://status.replit.com/notices/ggj8gbnshk50a6yz-ssl-certificates-issues">SSL 证书问题</a></p></li><li class="lvl-3"><p><a href="https://status.replit.com/notices/5pcyvknbltq1mrmg-new-custom-domains-with-deployments-are-experiencing-ssl-errors">部署的新自定义域遇到 SSL 错误</a></p></li></ol><p>临时方案：</p><ol><li class="lvl-3"><p><a href="https://ask.replit.com/t/err-ssl-protocol-error-for-all-sites/27775/4">https://ask.replit.com/t/err-ssl-protocol-error-for-all-sites/27775/4</a></p><blockquote><p>现在，更改“。” 在 url 中的 repl 名称和用户名之间添加到“–”就可以了。</p><p>例如，<a href="https://score-analyzer--enderparakeet.repl.co/">https://score-analyzer–enderparakeet.repl.co/ 3个</a>作品。</p></blockquote></li></ol><p>教程：</p><ol><li class="lvl-3"><p><a href="https://docs.replit.com/tutorials/html-css-js/building-a-nineties-inspired-website#custom-domain">Replit 绑自定义域名（官方）</a></p></li></ol><h2 id="05-Terminal-报错-4294967295">05. Terminal 报错: 4294967295<a class="header-anchor" href="#05-Terminal-报错-4294967295"></a></h2><p>wsl2 报错: <code>[已退出进程，代码为 4294967295 (0xffffffff)]</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 管理员身份 PowerShell</span></span><br><span class="line">netsh winsock reset</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重新打开 terminal，无效则尝试重启后再打开</span></span><br></pre></td></tr></table></figure><p>参考：<a href="https://blog.csdn.net/weixin_53347816/article/details/123637289">打开wsl，显示 [已退出进程，代码为 4294967295] 的解决方案</a></p><p>后记：未根本解决，根本错误 wsl <code>Error: 0x80040326</code>，如下</p><h2 id="06-wsl2-Error-0x80040326">06. wsl2 Error: 0x80040326<a class="header-anchor" href="#06-wsl2-Error-0x80040326"></a></h2><p>无法打开终端，报错：</p><p><code>Error: 0x80040326 Error code: Wsl/Service/0x80040326</code></p><p>解决方法：powershell 管理员模式：<code>wsl --update</code></p><p>参考：</p><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/minibirder/article/details/129863725">https://blog.csdn.net/minibirder/article/details/129863725</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/qq_37932051/article/details/129873314">https://blog.csdn.net/qq_37932051/article/details/129873314</a></p></li></ol><h2 id="07-crond-致-sendmail-大量进程">07. crond 致 sendmail 大量进程<a class="header-anchor" href="#07-crond-致-sendmail-大量进程"></a></h2><p>阿里云服务器监控显示 CPU 长期高负载，原因：<code>定时任务 crond 引发大量 sendmail 进程</code></p><p>参考：</p><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/LQzhang_11/article/details/114323700">https://blog.csdn.net/LQzhang_11/article/details/114323700</a></p></li><li class="lvl-3"><p><a href="https://blog.51cto.com/ning235/2661806">https://blog.51cto.com/ning235/2661806</a></p></li></ol><p>处理方法：</p><ol><li class="lvl-3"><p>cron 后面添加 <code>&amp;&gt; /dev/null</code> 或 <code>&gt; /dev/null 2&gt;&amp;1</code></p></li><li class="lvl-3"><p>禁止 cron 发用户邮件（未操作）</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202309051546612.png" alt=""></p></li></ol><h2 id="08-Netlify-自动转换小写-URI">08. Netlify 自动转换小写 URI<a class="header-anchor" href="#08-Netlify-自动转换小写-URI"></a></h2><p>现象：原 URI <code>/tags/Error/</code> 转为 <code>/tags/error/</code></p><p>解决：配置中取消 <code>Pretty URLs</code> 美化 URL 的功能</p><ul class="lvl-0"><li class="lvl-2"><p><code>Site configuration</code> → <code>Post processing</code> → <code>Pretty URLs</code> → □ <code>Enable Pretty URLs</code></p></li></ul><p>示例：<a href="https://app.netlify.com/sites/mycpen-blog/configuration/deploys#pretty-urls">https://app.netlify.com/sites/mycpen-blog/configuration/deploys#pretty-urls</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202310042038361.png" alt="image-20231004203836279" style="zoom:25%;" /><h2 id="09-pip-command-not-found">09. pip: command not found<a class="header-anchor" href="#09-pip-command-not-found"></a></h2><p>前言：电脑上已装 Python，且在 PATH 内，无法找到 pip 命令</p><p>报错：<code>pip: command not found</code> 或 <code>No module named pip</code></p><p>升级 pip：<code>python -m pip install --upgrade pip</code></p><p>办法：执行 <code>python -m ensurepip</code></p><blockquote><p><strong>来自 chatgpt</strong></p><p>在 Windows 系统上，如果您在运行 <code>python.exe</code> 时遇到 <code>No module named pip</code> 错误，这通常表示在您的 Python 安装中缺少了 <code>pip</code> 模块。<code>pip</code> 是 Python 的包管理工具，通常会随 Python 一起安装。</p><p>您可以按照以下步骤来解决这个问题：</p><ol><li class="lvl-3"><p>检查 Python 安装：</p></li></ol><p>首先，请确保您已经正确安装 Python。您可以在命令提示符下运行以下命令来检查 Python 的版本：</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">python --version</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>检查 <code>pip</code> 是否安装：</p></li></ol><p>在较新版本的 Python 中，<code>pip</code> 已经随 Python 一起安装。您可以尝试运行以下命令来安装 Python 包：</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">python -m ensurepip</span><br></pre></td></tr></table></figure><p>这将安装 <code>pip</code> 模块。如果 <code>pip</code> 已经安装，您可能会看到一条消息指示 <code>Requirement already satisfied</code>.</p><ol start="3"><li class="lvl-3"><p>添加 <code>pip</code> 到系统环境变量：</p></li></ol><p>如果 <code>pip</code> 已正确安装，但仍然无法正常使用，可能是因为 <code>pip</code> 不在系统的环境变量中。您可以手动将 <code>pip</code> 所在的路径添加到系统的 PATH 环境变量中。</p><p>默认情况下，在 Windows 系统上，<code>pip</code> 通常安装在 <code>Scripts</code> 文件夹中。您可以找到该文件夹的路径，然后将其添加到系统的 PATH 环境变量中。</p><ol start="4"><li class="lvl-3"><p>验证 <code>pip</code> 安装：</p></li></ol><p>最后，您可以在命令提示符下运行以下命令来验证 <code>pip</code> 是否安装成功：</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">pip --version</span><br></pre></td></tr></table></figure><p>如果 <code>pip</code> 安装成功，您应该看到 <code>pip</code> 的版本信息，而不再出现 <code>No module named pip</code> 错误。</p><p>通过按照上述步骤操作，您应该能够解决 <code>No module named pip</code> 错误，并成功使用 <code>pip</code> 来管理 Python 包。</p></blockquote><h2 id="10-git-fetch-unshallow">10. git fetch --unshallow<a class="header-anchor" href="#10-git-fetch-unshallow"></a></h2><p>github action 报错 <code>! [remote rejected] main -&gt; main (shallow update not allowed)</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></pre></td><td class="code"><pre><span class="line">remote: Powered by GITEE.COM [GNK-6.4]        </span><br><span class="line">To https://gitee.com/mycpen/image_bed.git</span><br><span class="line"> ! [remote rejected] main -&gt; main (shallow update not allowed)</span><br><span class="line">error: failed to push some refs to <span class="string">&#x27;https://gitee.com/mycpen/image_bed.git&#x27;</span></span><br><span class="line">Error: Process completed with <span class="built_in">exit</span> code 1.</span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2024/image/202405102346367.jpg" alt="image-20240510234628717" style="zoom: 50%;" /><p>解决：<code>git fetch --unshallow</code>，详见 <a href="https://github.com/mycpen/image_bed/blob/main/.github/workflows/sync-gitee.yml">link</a></p><blockquote><p>来自 chatgpt</p><p>这个错误是因为在尝试将代码推送到 Gitee 仓库时，Gitee 不允许进行浅层更新（shallow update）。浅层更新是指仓库中只包含部分历史记录，而不是完整的历史记录。为了解决这个问题，你可以尝试以下方法：</p><ol><li class="lvl-3"><p><strong>完整克隆</strong>：首先，你可以通过完整克隆仓库的方式来获取完整的历史记录，然后再进行推送。在克隆仓库时，不要使用 <code>--depth</code> 参数，这样可以确保克隆完整的历史记录。</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">git <span class="built_in">clone</span> https://gitee.com/mycpen/CDN.git</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p><strong>移除浅层设置后重新克隆</strong>：如果你之前使用了浅层克隆，可以尝试移除浅层设置，然后重新克隆仓库。</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">git fetch --unshallow</span><br><span class="line">git <span class="built_in">clone</span> https://gitee.com/mycpen/CDN.git</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p><strong>强制推送</strong>：如果你已经有本地完整的历史记录，可以尝试使用强制推送来覆盖远程仓库的内容。</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">git push -f origin main</span><br></pre></td></tr></table></figure></li></ol><p>通过以上方法，你应该能够解决 Gitee 仓库不允许浅层更新的问题，并成功将代码推送到 Gitee 仓库中。如果你有任何其他问题或需要进一步帮助，请随时告诉我。</p></blockquote>]]></content>
      
      
      <categories>
          
          <category> Error </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Error </tag>
            
            <tag> Git </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>02_转载-Replit 部署 Memos &amp; Butterfly 基于 Memos 实现清单功能</title>
      <link href="/posts/10d5063.html"/>
      <url>/posts/10d5063.html</url>
      
        <content type="html"><![CDATA[<h2 id="2023-06-01-更新">2023/06/01 更新<a class="header-anchor" href="#2023-06-01-更新"></a></h2><p>最近 Replit 的 Repl 出现回档现象，导致最新变更操作丢失，正如 <a href="https://github.com/valetzx/uptimekumaonreplit#readme">uptimekumaonreplit</a> 仓库管理者提到的 <code>Replit有点拉，似乎会回档，会导致数据库很多对不上。随便用用吧20220430</code>，回档现象我暂未找到解决办法</p><h2 id="参考链接">参考链接<a class="header-anchor" href="#参考链接"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><a href="https://www.iweec.cn/30.htm">Atticus：replit免费部署memos</a>（<code>本文转载</code>）</p></li><li class="lvl-2"><p><a href="https://blog.leonus.cn/2023/memeos.html#%E5%85%AD%E3%80%81%E6%B8%85%E5%8D%95%E5%8A%9F%E8%83%BD">Leonus：基于Memos实现说说和清单功能</a>（<code>本文转载 清单部分</code>）</p></li><li class="lvl-2"><p><a href="https://blog.leonus.cn/2023/photos.html">Leonus：基于memos实现动态相册</a></p></li><li class="lvl-2"><p><a href="https://www.bilibili.com/video/BV1sA411679Q/">Atticus B站视频：replit免费部署memos</a></p></li><li class="lvl-2"><p><a href="https://github.com/usememos/memos">usememos/memos</a></p></li><li class="lvl-2"><p><a href="https://github.com/Atticus6/memos-on-replit">Atticus6/memos-on-replit</a></p></li></ul><p>以下内容全文摘自 <a href="https://www.iweec.cn/30.htm">Atticus</a>、<a href="https://blog.leonus.cn/2023/memeos.html#%E5%85%AD%E3%80%81%E6%B8%85%E5%8D%95%E5%8A%9F%E8%83%BD">Leonus</a> 的文章</p><h2 id="文章1-Atticus：replit免费部署memos">文章1. Atticus：replit免费部署memos<a class="header-anchor" href="#文章1-Atticus：replit免费部署memos"></a></h2><h3 id="部署">部署<a class="header-anchor" href="#部署"></a></h3><p>使用默认项目名称 <code>memos-on-replit</code>，否则会无法部署</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://replit.com/github/Atticus6/memos-on-replit">Run On Replit.io</a></p></li><li class="lvl-2"><p>备用地址：<a href="https://github.com/mycpen/memos-on-replit">https://github.com/mycpen/memos-on-replit</a></p></li></ul><p>语言必须为Go</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302080127653.png" alt="image-20230208012722551" style="zoom:50%;" /><h3 id="许可">许可<a class="header-anchor" href="#许可"></a></h3><p><code>memos-replit</code> 是在 AGPL-3.0 许可下许可的开源软件。</p><h3 id="免责声明">免责声明<a class="header-anchor" href="#免责声明"></a></h3><blockquote><ul class="lvl-1"><li class="lvl-2"><p>本程序为免费开源项目，旨在分享网盘文件，方便下载以及学习golang，使用时请遵守相关法律法规，请勿滥用；</p></li><li class="lvl-2"><p>本程序通过调用官方sdk/接口实现，无破坏官方接口行为；</p></li><li class="lvl-2"><p>本程序仅做302重定向/流量转发，不拦截、存储、篡改任何用户数据；</p></li><li class="lvl-2"><p>在使用本程序之前，你应了解并承担相应的风险，包括但不限于账号被ban，下载限速等，与本程序无关；</p></li><li class="lvl-2"><p>如有侵权，请通过<a href="mailto:a@iweec.cn">邮件</a>与我联系，会及时处理。<a href="https://www.iweec.cn/">@博客</a> · <a href="https://github.com/Atticus6">@GitHub</a> · <a href="https://t.me/+z76QXxWq23U3NTU9">@Telegram群</a></p></li></ul><p>版权属于： atticus<br>本文链接： <a href="https://www.iweec.cn/30.htm">https://www.iweec.cn/30.htm</a></p></blockquote><h2 id="文章2-Leonus：基于Memos实现说说和清单功能">文章2. Leonus：基于Memos实现说说和清单功能<a class="header-anchor" href="#文章2-Leonus：基于Memos实现说说和清单功能"></a></h2><p>相关链接</p><ol><li class="lvl-3"><p><a href="https://blog.leonus.cn/2023/memeos.html#%E5%85%AD%E3%80%81%E6%B8%85%E5%8D%95%E5%8A%9F%E8%83%BD">Leonus：基于Memos实现说说和清单功能</a></p></li><li class="lvl-3"><p><a href="https://blog.leonus.cn/2023/photos.html">Leonus：基于memos实现动态相册</a></p></li></ol><p>以下内容全文摘自 <a href="https://blog.leonus.cn/2023/memeos.html#%E5%85%AD%E3%80%81%E6%B8%85%E5%8D%95%E5%8A%9F%E8%83%BD">Leonus：基于Memos实现说说和清单功能</a> <code>清单功能</code> 部分</p><p><strong>清单功能</strong></p><blockquote><p>再次说明，这一切只是我定的规则而已，你可以随意修改代码来实现你想实现的效果。</p></blockquote><h3 id="实现">实现<a class="header-anchor" href="#实现"></a></h3><p>还是先使用<code>hexo n page xxx</code>创建页面。<br>然后粘贴如下代码并按照注释修改内容。</p><figure class="highlight markdown"><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span></span><br><span class="line">/* 页面初始化 <span class="emphasis">*/</span></span><br><span class="line"><span class="emphasis">div#page &#123;</span></span><br><span class="line"><span class="emphasis">    background: none;</span></span><br><span class="line"><span class="emphasis">    border: 0;</span></span><br><span class="line"><span class="emphasis">    padding: 0;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis">[data-theme=dark] #twikoo .tk-content,</span></span><br><span class="line"><span class="emphasis">#twikoo .tk-content &#123;</span></span><br><span class="line"><span class="emphasis">    padding: 0;</span></span><br><span class="line"><span class="emphasis">    background: transparent;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">.tk-comments-container&gt;.tk-comment,</span></span><br><span class="line"><span class="emphasis">.tk-submit:nth-child(1)&#123;</span></span><br><span class="line"><span class="emphasis">    background: var(--card-bg);</span></span><br><span class="line"><span class="emphasis">    border: 1px rgba(188, 188, 188, 0.8) solid;</span></span><br><span class="line"><span class="emphasis">    box-shadow: 0 5px 10px rgb(189 189 189 / 10%);</span></span><br><span class="line"><span class="emphasis">    transition: all .3s ease-in-out;</span></span><br><span class="line"><span class="emphasis">    border-radius: 12px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">.tk-comments-container&gt;.tk-comment:hover,</span></span><br><span class="line"><span class="emphasis">.tk-submit:nth-child(1):hover &#123;</span></span><br><span class="line"><span class="emphasis">    border-color: #6dc3fd;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">.tk-submit &#123;</span></span><br><span class="line"><span class="emphasis">    padding: 20px 10px 0;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">.tk-comments-container&gt;.tk-comment &#123;</span></span><br><span class="line"><span class="emphasis">    padding: 15px;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">/*</span> 页面初始化结束 <span class="emphasis">*/</span></span><br><span class="line"><span class="emphasis">div#todolist &#123;</span></span><br><span class="line"><span class="emphasis">    display: flex;</span></span><br><span class="line"><span class="emphasis">    flex-wrap: wrap;</span></span><br><span class="line"><span class="emphasis">    margin-top: 1rem;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis">.list_item &#123;</span></span><br><span class="line"><span class="emphasis">    display: inline-block;</span></span><br><span class="line"><span class="emphasis">    width: calc(50% - .4rem);</span></span><br><span class="line"><span class="emphasis">    background: #ffe3dd;</span></span><br><span class="line"><span class="emphasis">    border-radius: 12px;</span></span><br><span class="line"><span class="emphasis">    padding: 10px 1rem 1.2rem;</span></span><br><span class="line"><span class="emphasis">    border: 2px dashed #f7a796;</span></span><br><span class="line"><span class="emphasis">    --todo-border: 1px solid #f7a796;</span></span><br><span class="line"><span class="emphasis">    margin-right: 1rem;</span></span><br><span class="line"><span class="emphasis">    margin-bottom: 1rem;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis">.list_item h3 &#123;</span></span><br><span class="line"><span class="emphasis">    margin: 0;</span></span><br><span class="line"><span class="emphasis">    border-bottom: var(--todo-border);</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis">.list_item ul &#123;</span></span><br><span class="line"><span class="emphasis">    font-size: 17px;</span></span><br><span class="line"><span class="emphasis">    padding: 0 !important;</span></span><br><span class="line"><span class="emphasis">    margin: 0;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"> .list_item li&#123;</span></span><br><span class="line"><span class="emphasis">    margin: 0 !important;</span></span><br><span class="line"><span class="emphasis">    border-bottom: var(--todo-border);</span></span><br><span class="line"><span class="emphasis"> &#125;</span></span><br><span class="line"><span class="emphasis">.list_item li::marker &#123;</span></span><br><span class="line"><span class="emphasis">  content: none;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis">li.achieve &#123;</span></span><br><span class="line"><span class="emphasis">    opacity: .8;</span></span><br><span class="line"><span class="emphasis">    text-decoration: line-through;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis">@media screen and (max-width: 900px) &#123;</span></span><br><span class="line"><span class="emphasis">  div#todolist &#123;</span></span><br><span class="line"><span class="emphasis">    margin: 1rem 5px 0;</span></span><br><span class="line"><span class="emphasis">  &#125;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis">@media screen and (max-width: 768px) &#123;</span></span><br><span class="line"><span class="emphasis">  .list_item&#123;</span></span><br><span class="line"><span class="emphasis">    width: 100%;</span></span><br><span class="line"><span class="emphasis">  &#125;</span></span><br><span class="line"><span class="emphasis">&#125;</span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;todolist&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis">// 瀑布流函数，不用管</span></span><br><span class="line"><span class="emphasis">function waterfall(t)&#123;function e(t,e)&#123;var n=window.getComputedStyle(e);return parseFloat(n[&quot;margin&quot;+t])||0&#125;function n(t)&#123;return t+&quot;px&quot;&#125;function r(t)&#123;return parseFloat(t.style.left)&#125;function o(t)&#123;return t.clientWidth&#125;function l(t)&#123;return function(t)&#123;return parseFloat(t.style.top)&#125;(t)+function(t)&#123;return t.clientHeight&#125;(t)+e(&quot;Bottom&quot;,t)&#125;function i(t)&#123;return r(t)+o(t)+e(&quot;Right&quot;,t)&#125;function u(t)&#123;t=t.sort((function(t,e)&#123;return l(t)===l(e)?r(e)-r(t):l(e)-l(t)&#125;))&#125;function a(e)&#123;o(t)!=h&amp;&amp;(e.target.removeEventListener(e.type,arguments.callee),waterfall(t))&#125;&quot;string&quot;==typeof t&amp;&amp;(t=document.querySelector(t));var s=[].map.call(t.children,(function(t)&#123;return t.style.position=&quot;absolute&quot;,t&#125;));t.style.position=&quot;relative&quot;;var f=[];s.length&amp;&amp;(s[0].style.top=&quot;0px&quot;,s[0].style.left=n(e(&quot;Left&quot;,s[0])),f.push(s[0]));for(var p=1;p<span class="language-xml"><span class="language-javascript">&lt;s.<span class="property">length</span>;p++)&#123;<span class="keyword">var</span> c=s[p-<span class="number">1</span>],y=s[p];<span class="keyword">if</span>(!(<span class="title function_">i</span>(c)+<span class="title function_">o</span>(y)&lt;=<span class="title function_">o</span>(t)))<span class="keyword">break</span>;y.<span class="property">style</span>.<span class="property">top</span>=c.<span class="property">style</span>.<span class="property">top</span>,y.<span class="property">style</span>.<span class="property">left</span>=<span class="title function_">n</span>(<span class="title function_">i</span>(c)+<span class="title function_">e</span>(<span class="string">&quot;Left&quot;</span>,y)),f.<span class="title function_">push</span>(y)&#125;<span class="keyword">for</span>(;p&lt;s.<span class="property">length</span>;p++)&#123;<span class="title function_">u</span>(f);y=s[p];<span class="keyword">var</span> d=f.<span class="title function_">pop</span>();y.<span class="property">style</span>.<span class="property">top</span>=<span class="title function_">n</span>(<span class="title function_">l</span>(d)+<span class="title function_">e</span>(<span class="string">&quot;Top&quot;</span>,y)),y.<span class="property">style</span>.<span class="property">left</span>=<span class="title function_">n</span>(<span class="title function_">r</span>(d)),f.<span class="title function_">push</span>(y)&#125;<span class="title function_">u</span>(f);<span class="keyword">var</span> v=f[<span class="number">0</span>];t.<span class="property">style</span>.<span class="property">height</span>=<span class="title function_">n</span>(<span class="title function_">l</span>(v));<span class="keyword">var</span> h=<span class="title function_">o</span>(t);<span class="variable language_">window</span>.<span class="property">addEventListener</span>?<span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;resize&quot;</span>,a):<span class="variable language_">document</span>.<span class="property">body</span>.<span class="property">onresize</span>=a&#125;</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="emphasis"></span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="emphasis"><span class="comment">// 清单函数</span></span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="emphasis"><span class="title function_">todolist</span>();</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="emphasis"><span class="keyword">function</span> <span class="title function_">todolist</span>(<span class="params"></span>) &#123;</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="emphasis">    <span class="title function_">fetch</span>(<span class="string">&#x27;https://你的memos地址/api/memo?creatorId=1&amp;tag=清单&#x27;</span>).<span class="title function_">then</span>(<span class="function"><span class="params">res</span> =&gt;</span></span></span> res.json()).then(data =&gt; &#123; // 注意替换链接</span></span><br><span class="line"><span class="emphasis">        // 获取并处理数据</span></span><br><span class="line"><span class="emphasis">        data = data.data</span></span><br><span class="line"><span class="emphasis">        let box = document.getElementById(&#x27;todolist&#x27;)</span></span><br><span class="line"><span class="emphasis">        data.forEach(item =&gt; &#123;</span></span><br><span class="line"><span class="emphasis">            // 处理数据</span></span><br><span class="line"><span class="emphasis">            let content = item.content,</span></span><br><span class="line"><span class="emphasis">                title = content.match(/\[(.*</span>?)\]/g)[0].replace(/\[(.<span class="emphasis">*?)\]/,&#x27;$1&#x27;);</span></span><br><span class="line"><span class="emphasis">            // 去掉多余内容，替换清单内容</span></span><br><span class="line"><span class="emphasis">            content = content.replace(/#.*</span>\s/g, &#x27;&#x27;).replace(/(-\s\[\s\]\s)(.<span class="emphasis">*)/g, `<span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag">&lt;<span class="name">li</span>&gt;</span></span></span></span><span class="language-xml"><span class="language-javascript">&lt;i style=<span class="string">&quot;margin-right: 5px;&quot;</span> <span class="keyword">class</span>=<span class="string">&quot;fa-regular fa-circle&quot;</span>&gt;</span></span><span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span></span></span>$2<span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span></span></span>`).replace(/(-\s\[x\]\s)(.*</span>)/g, <span class="code">`&lt;li class=&quot;achieve&quot;&gt;&lt;i style=&quot;margin-right: 5px;&quot; class=&quot;fa-regular fa-circle-check&quot;&gt;&lt;/i&gt;$2&lt;/li&gt;`</span>);</span><br><span class="line"><span class="code">            // 渲染数据</span></span><br><span class="line"><span class="code">            let div = document.createElement(&#x27;div&#x27;);</span></span><br><span class="line"><span class="code">            div.className = &#x27;list_item&#x27;;</span></span><br><span class="line"><span class="code">            div.innerHTML = `&lt;h3&gt;$&#123;title&#125;&lt;/h3&gt;&lt;ul&gt;$&#123;content&#125;&lt;/ul&gt;`;</span></span><br><span class="line"><span class="code">            box.appendChild(div);</span></span><br><span class="line"><span class="code">        &#125;);</span></span><br><span class="line"><span class="code">        waterfall(&#x27;#todolist&#x27;);</span></span><br><span class="line"><span class="code">    &#125;).catch()</span></span><br><span class="line"><span class="code">&#125;</span></span><br><span class="line"><span class="code">&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><h3 id="使用">使用<a class="header-anchor" href="#使用"></a></h3><p>使用的格式如下：</p><figure class="highlight markdown"><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 class="section">#清单 [想去的地方]</span></span><br><span class="line"><span class="bullet">-</span> [ ] 轻笑的米奇妙妙屋(轻笑让我加的)</span><br><span class="line"><span class="bullet">-</span> [x] 已完成的清单</span><br></pre></td></tr></table></figure><p>注意，前面的<code>#清单 </code>是固定的。标题用中括号包起来。已完成的将括号内的空格改成x即可。</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302080138164.png" alt="image-20230208013833064" style="zoom: 50%;" /><blockquote><p>文章作者: <a href="https://blog.leonus.cn/">Leonus</a><br>文章链接: <a href="https://blog.leonus.cn/2023/memeos.html">https://blog.leonus.cn/2023/memeos.html</a></p></blockquote>]]></content>
      
      
      <categories>
          
          <category> 转载 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Replit </tag>
            
            <tag> 转载 </tag>
            
            <tag> Memos </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>09_Hexo-Replit 搭建 Uptime Kuma 监控服务</title>
      <link href="/posts/27addd89.html"/>
      <url>/posts/27addd89.html</url>
      
        <content type="html"><![CDATA[<h2 id="2023-10-01-更新">2023/10/01 更新<a class="header-anchor" href="#2023-10-01-更新"></a></h2><p>Replit 上的 Repl 报错，重新搭建 Uptime Kuma</p><p>参考自 <a href="https://blog.mnxy.eu.org/posts/uptime">梦念逍遥：使用Replit平台免费搭建站点监控工具——Uptime-Kuma</a></p><ol><li class="lvl-3"><p><a href="https://replit.com/">Replit</a> 导入仓库 <code>louislam/uptime-kuma</code>，语言 <code>Bash</code></p></li><li class="lvl-3"><p>.replit 即首次配置弹出的输入框 Configure the Run Command 输入 <code>node server/server.js</code></p></li><li class="lvl-3"><p>Shell 终端输入 <code>node</code>，选择 nodejs-16_x.out</p></li><li class="lvl-3"><p>Shell 终端输入以下内容，指定版本 1.21.3</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">git fetch --all</span><br><span class="line">git checkout 1.21.3 --force</span><br><span class="line">npm run setup</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>点击 Run</p></li></ol><h2 id="2023-06-01-更新">2023/06/01 更新<a class="header-anchor" href="#2023-06-01-更新"></a></h2><p>最近 Replit 的 Repl 出现回档现象，导致最新变更操作丢失，正如 <a href="https://github.com/valetzx/uptimekumaonreplit#readme">uptimekumaonreplit</a> 仓库管理者提到的 <code>Replit有点拉，似乎会回档，会导致数据库很多对不上。随便用用吧20220430</code>，回档现象我暂未找到解决办法</p><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>打算监控博客友链的存活情况（不太礼貌的行为），因 <a href="https://uptimerobot.com/">UptimeRobot</a> 免费版有 50 monitors 的限制，转而使用 <a href="https://github.com/louislam/uptime-kuma">Uptime Kuma</a>，<a href="https://github.com/louislam/uptime-kuma#-how-to-install">官方 readme</a> 介绍了 Docker、Non-Docker 两者安装方式</p><p>由 <a href="https://github.com/louislam/uptime-kuma/issues/1472">uptime-kuma/issues/1472</a> 及 <a href="https://jq.qq.com/?_wv=1027&amp;k=5o4Iga8D">butterfly 魔改群</a> 群友获知 <a href="https://replit.com/">Replit</a> 可以搭建 Uptime Kuma；根据 <a href="https://github.com/louislam/uptime-kuma/issues/1472">issues #1472</a> 给出的步骤并未顺利搭建（体质问题吧），进而继续百度</p><p>由 <a href="https://www.bilibili.com/video/BV16P4y197FN/">B站视频：Uptime Kuma…replit…</a> 获知仓库 <a href="https://github.com/valetzx/uptimekumaonreplit">valetzx/uptimekumaonreplit</a>（Replit 下搭建的很顺利）</p><p>由 <a href="https://www.bilibili.com/video/BV1aP411K7b3/">B站视频：Replit…绑定…域名</a> 获知 Replit 下服务绑定自定义域名</p><p>搭建效果见 <a href="http://status1.cpen.top/status/link">Mycpenの友链检测</a></p><h2 id="2-搭建步骤">2. 搭建步骤<a class="header-anchor" href="#2-搭建步骤"></a></h2><p><strong>主要步骤</strong>：Replit 导入 <a href="https://github.com/valetzx/uptimekumaonreplit">valetzx/uptimekumaonreplit</a> 项目</p><p>搭建步骤：</p><ol><li class="lvl-3"><p>注册 <a href="https://replit.com/">Replit</a></p></li><li class="lvl-3"><p>Replit 导入 <a href="https://github.com/valetzx/uptimekumaonreplit">valetzx/uptimekumaonreplit</a> 仓库</p><ul class="lvl-2"><li class="lvl-5"><p>按 <a href="https://github.com/valetzx/uptimekumaonreplit">valetzx/uptimekumaonreplit</a> readme 操作：</p><ul class="lvl-4"><li class="lvl-7"><p>Replit 个人版：点击 <a href="https://repl.it/github/valetzx/uptimekumaonreplit">Run on Replit</a> 导入 Replit</p></li><li class="lvl-7"><p>当加载完 Loading Nix environment… 后点击绿色 ▶ Run</p></li></ul></li></ul></li><li class="lvl-3"><p>Replit 服务绑定自定义域名</p><p>按 <a href="https://www.bilibili.com/video/BV1aP411K7b3/">B站视频：Replit…绑定…域名</a> 操作：在 Replit Webview 窗口右侧按钮下（如下图），绑定自定义域名，并按提示在域名服务商 DNS 控制台进行解析</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202301311404922.png" alt="image-20230131122911248" style="zoom: 25%;" /></li></ol><p>至此，搭建结束。可以通过 自定义域名 前往 Uptime Kuma 仪表盘进行 注册、设置、新增状态页、添加监控项、状态页分组绑定监控项</p><h2 id="3-注意点">3. 注意点<a class="header-anchor" href="#3-注意点"></a></h2><ol><li class="lvl-3"><p>监控类型为 <code>HTTP(s)</code> 时，<code>HTTP 选项 - 方法</code> 选择 <code>HEAD</code> 验证存活（不要使用默认的 GET，GET 会对对应服务造成 <code>大量无意义的流量</code>）</p></li><li class="lvl-3"><p>心跳间隔 (检测频率) 建议<code>拉长</code>（不要使用默认的 60s，会对对应服务造成 <code>大量无意义的流量</code>）。以我为例，设置了 <code>86400 秒</code>（即 1 天监控 1 次）</p></li></ol><p>以我为例 <code>监控项</code> 变动了 4 处值，如下图</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202301311243386.png" alt="image-20230131124355253" style="zoom: 33%;" /><br><p>若网站屏蔽了 Uptime Kuma 的 UA，例如此文 <a href="https://blog.zhheo.com/p/9540801e.html">如何禁止 Uptime Kuma 监控网站</a>，可以配置 <code>请求头</code> 来解决，参考自 <a href="https://blog.zhheo.com/p/9540801e.html#d102f6ee4dbe4242a1a545d6ce8b9654">张洪Heo.评论区</a></p><figure class="highlight json"><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 class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;User-Agent&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="4-参考链接">4. 参考链接<a class="header-anchor" href="#4-参考链接"></a></h2><p><a href="https://github.com/louislam/uptime-kuma">louislam/uptime-kuma</a></p><p><a href="https://github.com/valetzx/uptimekumaonreplit">* valetzx/uptimekumaonreplit</a></p><p><a href="https://github.com/louislam/uptime-kuma/issues/1472">louislam/uptime-kuma/issues/1472</a></p><p><a href="https://www.bilibili.com/video/BV16P4y197FN/">B站视频：Uptime Kuma…replit…</a></p><p><a href="https://www.bilibili.com/video/BV1aP411K7b3/">B站视频：Replit…绑定…域名</a></p><p><a href="https://blog.learnonly.xyz/p/c99d.html">valetzx：在Replit中自建监控网站（未参考）</a>（uptimekumaonreplit 仓库作者的文章，介绍了些监控报警通知。个人未配置）</p>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> Replit </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>08_Hexo-博客引用 B站鸿蒙字体</title>
      <link href="/posts/df249111.html"/>
      <url>/posts/df249111.html</url>
      
        <content type="html"><![CDATA[<h2 id="2022-12-31-更新">2022/12/31 更新<a class="header-anchor" href="#2022-12-31-更新"></a></h2><p>在 <a href="https://butterfly.zhheo.com/docs/font.html">butterfly.zhheo.com</a> 上看到下面这篇文章，介绍了很多其他字体（包括本文B站鸿蒙字体），写的很好</p><p><a href="https://www.thyuu.com/word/tips/62610">免费引入**黑体字体系列整理及 CSS 字体</a></p><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://blog.eurkon.com/">Eurkon</a> 那发现了B站使用的 <code>harmonyOS_Regular</code> 字体，<a href="https://www.bilibili.com/">B站网页端</a> 打开开发者工具能看到字体由 <a href="https://s1.hdslb.com/bfs/static/jinkela/long/font/regular.css">regular.css</a> 引入</p><p>计划用一段时间该字体，如有明显限速再停止使用</p><h2 id="2-引用步骤">2. 引用步骤<a class="header-anchor" href="#2-引用步骤"></a></h2><ol><li class="lvl-3"><p>自定义css 引入 <a href="https://s1.hdslb.com/bfs/static/jinkela/long/font/regular.css">regular.css</a> 内容</p></li><li class="lvl-3"><p>自定义css 追加使用该字体的 css，以我的站点为示例（<code>Butterfly 主题可跳过，直接步骤 3</code>）</p><figure class="highlight css"><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"><span class="selector-tag">body</span> &#123;</span><br><span class="line">    <span class="attribute">font-family</span>: HarmonyOS_Regular,-apple-system,BlinkMacSystemFont,<span class="string">&#x27;Segoe UI&#x27;</span>,<span class="string">&#x27;Helvetica Neue&#x27;</span>,Lato,Roboto,<span class="string">&#x27;PingFang SC&#x27;</span>,<span class="string">&#x27;Microsoft YaHei&#x27;</span>,sans-serif;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>Butterfly 主题内置了自定义字体的配置，参见 <a href="https://butterfly.js.org/posts/ceeb73f/#%E8%87%AA%E5%AE%9A%E7%BE%A9%E5%AD%97%E9%AB%94%E5%92%8C%E5%AD%97%E9%AB%94%E5%A4%A7%E5%B0%8F">官方文档_自定义字体和字体大小</a></p><p>示例：修改主题配置文件，如 [Blogroot]/_config.butterfly.yml</p><figure class="highlight diff"><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"># Don&#x27;t modify the following settings unless you know how they work (非必要不要修改)</span><br><span class="line">font:</span><br><span class="line">  global-font-size:</span><br><span class="line">  code-font-size:</span><br><span class="line"><span class="deletion">-  font-family: </span></span><br><span class="line"><span class="addition">+  font-family: HarmonyOS_Regular,-apple-system,BlinkMacSystemFont,&#x27;Segoe UI&#x27;,&#x27;Helvetica Neue&#x27;,Lato,Roboto,&#x27;PingFang SC&#x27;,&#x27;Microsoft YaHei&#x27;,sans-serif</span></span><br><span class="line">  code-font-family:</span><br></pre></td></tr></table></figure><p>个人建议：代码字体不建议使用 HarmonyOS_Regular，主题原生的 consolas 字体更好看</p></li></ol><h2 id="3-后记">3. 后记<a class="header-anchor" href="#3-后记"></a></h2><p>手机上唯二浏览器之一的 某浏览器 出现站内跳转时，页面长时间加载不出来的情况，考虑到 B站 对外站限速的可能性（排除法，大概率浏览器问题，同机的另一个浏览器不会复现🤔），备用方案：字体放 Github 个人仓库中，通过 <a href="https://statically.io/">staticaly</a> CDN 进行免费加速使用</p><p>该字体已同步至 <a href="https://github.com/mycpen/CDN/tree/main/font/s1.hdslb.com/bfs/static/jinkela/long/font">个人仓库</a></p><p>由 <a href="https://www.fomal.cc/posts/b48804d5.html#4-1-%E5%8F%AF%E7%94%A8%E7%9A%84%E5%85%8D%E8%B4%B9CDN%E9%80%89%E6%8B%A9">Fomalhaut🥝</a> 获知 staticaly CDN 的使用，引用内容如下</p><blockquote><p>原文地址：<a href="https://www.fomal.cc/posts/b48804d5.html#4-1-%E5%8F%AF%E7%94%A8%E7%9A%84%E5%85%8D%E8%B4%B9CDN%E9%80%89%E6%8B%A9">https://www.fomal.cc/</a></p><p>官网地址：<a href="https://www.staticaly.com">https://www.staticaly.com</a><br>轻松地从GitHub / GitLab / Bitbucket等加载您的项目 没有流量限制或限制。</p><p>文件通过超快速全球CDN提供。 在URL（不是分支）中使用特定标记或提交哈希。<br>根据URL永久缓存文件。 除master分支外，文件在浏览器中缓存1年。 具体用法：</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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></pre></td><td class="code"><pre><span class="line"># GitHub CDN</span><br><span class="line">https://cdn.staticaly.com/gh/:user/:repo/:tag/:file</span><br><span class="line">https://cdn.staticaly.com/gh/growvv/growvv.github.io/master/README.md</span><br><span class="line"></span><br><span class="line"># GitLab CDN</span><br><span class="line">https://cdn.staticaly.com/gl/:user/:repo/:tag/:file</span><br><span class="line"></span><br><span class="line"># Bitbucket CDN</span><br><span class="line">https://cdn.staticaly.com/bb/:user/:repo/:tag/:file</span><br><span class="line"></span><br><span class="line"># WordPress CDN</span><br><span class="line">https://cdn.staticaly.com/wp/c/:version/wp-includes/:file  </span><br><span class="line">https://cdn.staticaly.com/wp/p/:plugin_name/:version/:file  </span><br><span class="line">https://cdn.staticaly.com/wp/t/:theme_name/:version/:file</span><br><span class="line"></span><br><span class="line"># Imgpx CDN</span><br><span class="line">https://cdn.staticaly.com/img/:image_url</span><br><span class="line"></span><br><span class="line"># Favicons CDN</span><br><span class="line">https://cdn.staticaly.com/favicons/:favicon_url</span><br></pre></td></tr></table></figure><p>总结：staticaly CDN 作为免费 CDN，速度勉强还行</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212281317244.png" alt=""></p><h2 id="4-字体样式总结">4. 字体样式总结<a class="header-anchor" href="#4-字体样式总结"></a></h2><p>相较于 <a href="https://butterfly.js.org/">Butterfly</a> 主题原字体，harmonyOS_Regular 字体左右间距略变大，字母略变明显，汉字略细密</p><p>总结：感知不强，徒增功耗 😂</p><p><code>主题原字体（Segoe UI）</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212281336799.png" alt=""></p><p><code>harmonyOS_Regular 字体</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212281337989.png" alt=""></p>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> 字体 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>07_Hexo-插件整理</title>
      <link href="/posts/4c16ee73.html"/>
      <url>/posts/4c16ee73.html</url>
      
        <content type="html"><![CDATA[<p><strong>目录3 为转载内容</strong>，原文：<a href="https://blog.justlovesmile.top/posts/86111745.html">Justlovesmile_Hexo博客 | 插件推荐</a></p><h2 id="1-较为关注">1. 较为关注<a class="header-anchor" href="#1-较为关注"></a></h2><h3 id="1-1-hexo-blog-encrypt">1.1 hexo-blog-encrypt<a class="header-anchor" href="#1-1-hexo-blog-encrypt"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>博客文章加密，由 <a href="https://blog.justlovesmile.top/posts/43010.html">Justlovesmile文章</a> 获知</p></li><li class="lvl-2"><p><a href="https://github.com/D0n9X1n/hexo-blog-encrypt">Github地址</a></p></li></ul><h3 id="1-2-hexo-hide-posts">1.2 hexo-hide-posts<a class="header-anchor" href="#1-2-hexo-hide-posts"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>隐藏 Hexo 文章，由 <a href="https://github.com/jerryc127/hexo-theme-butterfly/pull/1122">Butterfly issue#1122</a>、<a href="https://github.com/jerryc127/hexo-theme-butterfly/issues/1119">issue#1119</a> 获知</p></li><li class="lvl-2"><p><a href="https://github.com/prinsss/hexo-hide-posts">Github地址</a></p></li></ul><h3 id="1-3-hexo-renderer-markdown-it">1.3 hexo-renderer-markdown-it<a class="header-anchor" href="#1-3-hexo-renderer-markdown-it"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>渲染引擎，由 <a href="https://butterfly.js.org/posts/ceeb73f/#Math-%E6%95%B8%E5%AD%B8">Butterfly文档</a> 获知，由 <a href="https://ezgx.tk/posts/65320/">Echocbx</a> 获知 plugins 配置项</p></li><li class="lvl-2"><p><a href="https://github.com/hexojs/hexo-renderer-markdown-it">Github地址</a></p></li></ul><h3 id="1-4-upupming-hexo-renderer-markdown-it-plus">1.4 @upupming/hexo-renderer-markdown-it-plus<a class="header-anchor" href="#1-4-upupming-hexo-renderer-markdown-it-plus"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>渲染引擎，由 <a href="https://butterfly.js.org/posts/ceeb73f/#Math-%E6%95%B8%E5%AD%B8">Butterfly文档</a> 获知</p></li><li class="lvl-2"><p><a href="https://github.com/upupming/hexo-renderer-markdown-it-plus">Github地址</a></p></li></ul><h3 id="1-5-hexo-renderer-markdown-it-katex">1.5 hexo-renderer-markdown-it-katex<a class="header-anchor" href="#1-5-hexo-renderer-markdown-it-katex"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>渲染引擎，由 <a href="https://www.nickxu.top/2022/04/17/Hexo-Butterfly-%E5%BB%BA%E7%AB%99%E6%8C%87%E5%8D%97%EF%BC%88%E5%85%AB%EF%BC%89%E4%BD%BF%E7%94%A8-KaTeX-%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/">Nick Xu</a> 获知</p></li><li class="lvl-2"><p><a href="https://github.com/Abreto/hexo-renderer-markdown-it-katex">Github地址</a></p></li></ul><h2 id="2-Butterfly主题">2. Butterfly主题<a class="header-anchor" href="#2-Butterfly主题"></a></h2><h3 id="2-1-hexo-butterfly-swiper">2.1 hexo-butterfly-swiper<a class="header-anchor" href="#2-1-hexo-butterfly-swiper"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>轮播图，作者：<a href="https://akilar.top/posts/8e1264d1/">Akilar</a>；二创：<a href="https://blog.anheyu.com/posts/sdxhu.html#hexo-butterfly-swiper-anzhiyu-%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85">安知鱼</a></p></li></ul><h3 id="2-2-hexo-butterfly-categories-card">2.2 hexo-butterfly-categories-card<a class="header-anchor" href="#2-2-hexo-butterfly-categories-card"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>分类磁铁，<a href="https://akilar.top/posts/a9131002/">Akilar</a></p></li></ul><h3 id="2-3-hexo-circle-of-friends">2.3 hexo-circle-of-friends<a class="header-anchor" href="#2-3-hexo-circle-of-friends"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>友链朋友圈，<a href="https://fcircle-doc.js.cool/#/">https://fcircle-doc.js.cool/#/</a></p></li><li class="lvl-2"><p>非插件</p></li></ul><h3 id="2-4-hexo-butterfly-article-double-row">2.4 hexo-butterfly-article-double-row<a class="header-anchor" href="#2-4-hexo-butterfly-article-double-row"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>文章双栏，<a href="https://zfe.space/post/hexo-butterfly-article-double-row.html">小冰</a></p></li></ul><h3 id="2-5-hexo-butterfly-charts">2.5 hexo-butterfly-charts<a class="header-anchor" href="#2-5-hexo-butterfly-charts"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>统计图表，<a href="https://guole.fun/posts/18158/">Guo Le</a></p></li></ul><h2 id="3-以下内容摘自-Justlovesmile">3. 以下内容摘自 Justlovesmile<a class="header-anchor" href="#3-以下内容摘自-Justlovesmile"></a></h2><p>原文：<a href="https://blog.justlovesmile.top/posts/86111745.html">Justlovesmile_Hexo博客 | 插件推荐</a></p><table><thead><tr><th>插件</th><th>功能</th><th>文档链接</th></tr></thead><tbody><tr><td>hexo-generator-index-pin-top</td><td>文章置顶</td><td><a href="https://github.com/netcan/hexo-generator-index-pin-top">https://github.com/netcan/hexo-generator-index-pin-top</a></td></tr><tr><td>hexo-wordcount</td><td>文章字数统计和阅读时长统计</td><td><a href="https://github.com/willin/hexo-wordcount">https://github.com/willin/hexo-wordcount</a></td></tr><tr><td>hexo-abbrlink</td><td>生成URL短链接</td><td><a href="https://github.com/rozbo/hexo-abbrlink">https://github.com/rozbo/hexo-abbrlink</a></td></tr><tr><td>hexo-lazyload-image</td><td>图片懒加载</td><td><a href="https://github.com/Troy-Yang/hexo-lazyload-image">https://github.com/Troy-Yang/hexo-lazyload-image</a></td></tr><tr><td>hexo-generator-baidu-sitemap</td><td>生成baidusitemap.xml</td><td><a href="https://github.com/coneycode/hexo-generator-baidu-sitemap">https://github.com/coneycode/hexo-generator-baidu-sitemap</a></td></tr><tr><td>hexo-generator-sitemap</td><td>生成sitemap.xml</td><td><a href="https://github.com/hexojs/hexo-generator-sitemap">https://github.com/hexojs/hexo-generator-sitemap</a></td></tr><tr><td>hexo-generator-feed</td><td>生成RSS文件</td><td><a href="https://github.com/hexojs/hexo-generator-feed">https://github.com/hexojs/hexo-generator-feed</a></td></tr><tr><td>hexo-external-link</td><td>外链跳转</td><td><a href="https://github.com/hvnobug/hexo-external-link">https://github.com/hvnobug/hexo-external-link</a></td></tr><tr><td>hexo-autonofollow</td><td>自动对外部链接增加nofollow属性</td><td><a href="https://github.com/liuzc/hexo-autonofollow">https://github.com/liuzc/hexo-autonofollow</a></td></tr><tr><td>hexo-filter-nofollow</td><td>为外链添加 <code>rel=&quot;noopener external nofollow noreferrer&quot;</code></td><td><a href="https://github.com/hexojs/hexo-filter-nofollow">https://github.com/hexojs/hexo-filter-nofollow</a></td></tr><tr><td>hexo-prism-plugin</td><td>代码高亮</td><td><a href="https://github.com/ele828/hexo-prism-plugin">https://github.com/ele828/hexo-prism-plugin</a></td></tr><tr><td>hexo-neat</td><td rowspan="2">博客压缩</td><td><a href="https://github.com/rozbo/hexo-neat">https://github.com/rozbo/hexo-neat</a></td></tr><tr><td>hexo-allminifier</td><td><a href="https://developer.aliyun.com/mirror/npm/package/hexo-all-minifier">https://developer.aliyun.com/mirror/npm/package/hexo-all-minifier</a></td></tr><tr><td>hexo-tag-aplayer</td><td>aplayer音乐播放器</td><td><a href="https://github.com/MoePlayer/hexo-tag-aplayer">https://github.com/MoePlayer/hexo-tag-aplayer</a></td></tr><tr><td>hexo-tag-dplayer</td><td>dplayer视频播放器</td><td><a href="https://github.com/MoePlayer/hexo-tag-dplayer">https://github.com/MoePlayer/hexo-tag-dplayer</a></td></tr><tr><td>hexo-douban</td><td>添加豆瓣读书，电影，游戏页面</td><td><a href="https://github.com/mythsman/hexo-douban">https://github.com/mythsman/hexo-douban</a></td></tr><tr><td>hexo-generator-searchdb</td><td>本地搜索,生成search.xml</td><td><a href="https://github.com/theme-next/hexo-generator-searchdb">https://github.com/theme-next/hexo-generator-searchdb</a></td></tr><tr><td>hexo-algoliasearch</td><td rowspan="2">搜索系统</td><td><a href="https://github.com/LouisBarranqueiro/hexo-algoliasearch">https://github.com/LouisBarranqueiro/hexo-algoliasearch</a></td></tr><tr><td>hexo-algolia</td><td><a href="https://github.com/oncletom/hexo-algolia">https://github.com/oncletom/hexo-algolia</a></td></tr><tr><td>hexo-generator-search</td><td>本地搜索系统</td><td><a href="https://github.com/wzpan/hexo-generator-search">https://github.com/wzpan/hexo-generator-search</a></td></tr><tr><td>hexo-baidu-url-submit</td><td>百度站长主动推送</td><td><a href="https://github.com/huiwang/hexo-baidu-url-submit">https://github.com/huiwang/hexo-baidu-url-submit</a></td></tr><tr><td>hexo-offline</td><td rowspan="2">开启PWA</td><td><a href="https://github.com/JLHwung/hexo-offline">https://github.com/JLHwung/hexo-offline</a></td></tr><tr><td>hexo-pwa</td><td><a href="https://github.com/lavas-project/hexo-pwa">https://github.com/lavas-project/hexo-pwa</a></td></tr><tr><td>hexo-helper-live2d</td><td>看板娘</td><td><a href="https://github.com/EYHN/hexo-helper-live2d">https://github.com/EYHN/hexo-helper-live2d</a></td></tr><tr><td>hexo-addlink</td><td>文末添加当前文章链接和版权声明</td><td><a href="https://github.com/acwong00/hexo-addlink">https://github.com/acwong00/hexo-addlink</a></td></tr><tr><td>hexo-blog-encrypt</td><td>博客文章加密</td><td><a href="https://github.com/MikeCoder/hexo-blog-encrypt">https://github.com/MikeCoder/hexo-blog-encrypt</a></td></tr><tr><td>hexo-simple-mindmap</td><td>博客添加脑图</td><td><a href="https://github.com/HunterXuan/hexo-simple-mindmap">https://github.com/HunterXuan/hexo-simple-mindmap</a></td></tr><tr><td>hexo-pdf</td><td>博客展示pdf</td><td><a href="https://github.com/superalsrk/hexo-pdf">https://github.com/superalsrk/hexo-pdf</a></td></tr><tr><td>hexo-tag-echarts</td><td>博客添加图表</td><td><a href="https://github.com/zhoulvjun/hexo-tag-echarts">https://github.com/zhoulvjun/hexo-tag-echarts</a></td></tr><tr><td>hexo-steam-games</td><td>添加Steam游戏界面</td><td><a href="https://github.com/HCLonely/hexo-steam-games">https://github.com/HCLonely/hexo-steam-games</a></td></tr><tr><td>hexo-bilibili-bangumi</td><td>添加bilibili番剧页面</td><td><a href="https://github.com/HCLonely/hexo-bilibili-bangumi">https://github.com/HCLonely/hexo-bilibili-bangumi</a></td></tr><tr><td>hexo-generator-random</td><td>生成随机文章页面</td><td><a href="https://github.com/Drew233/hexo-generator-random">https://github.com/Drew233/hexo-generator-random</a></td></tr><tr><td>hexo-web-push-notification</td><td>web推送插件</td><td><a href="https://github.com/glazec/hexo-web-push-notification">https://github.com/glazec/hexo-web-push-notification</a></td></tr></tbody></table>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> 插件 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>06_Other-Windows 图片批量压缩工具 ultra-tinypng</title>
      <link href="/posts/b7f58a40.html"/>
      <url>/posts/b7f58a40.html</url>
      
        <content type="html"><![CDATA[<h2 id="2023-07-11-作者更新">2023-07-11 作者更新<a class="header-anchor" href="#2023-07-11-作者更新"></a></h2><blockquote><p>fix：修复了tinypng官方修改了校验策略导致批量上传会报错为问题，解决方法是降低频率到单线程5秒一次<br>详见issue：<a href="https://github.com/libudu/ultra-tinypng/issues/1">#1</a></p><p>引自：<a href="https://github.com/libudu/ultra-tinypng/releases/tag/v0.4">https://github.com/libudu/ultra-tinypng/releases/tag/v0.4</a></p></blockquote><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.bilibili.com/video/BV1ve4y1C7im/">B站</a> 上发现了这款 Win 平台图片压缩工具</p><p>优点：</p><ol><li class="lvl-3"><p>作者：本项目基于<a href="https://github.com/zhanyuzhang/super-tinypng">super-tinypng</a>，在原项目基础上加入了打包开箱即用、递归目录、线程池、重复跳过的功能。 项目的原理是程序化处理文件，调用<a href="https://tinypng.com/">tinypng</a>的接口进行文件压缩。</p></li></ol><p>遗憾点：</p><ol><li class="lvl-3"><p>图片后缀需为 PNG或JPG</p></li><li class="lvl-3"><p>需小于5MB</p></li><li class="lvl-3"><p>Windows 平台工具（exe）</p></li></ol><h2 id="2-下载地址">2. 下载地址<a class="header-anchor" href="#2-下载地址"></a></h2><p>视频介绍：<a href="https://www.bilibili.com/video/BV1ve4y1C7im/">B站：【开源工具】图片素材一键批量压缩 untra-tinypng</a></p><p>项目源码：<a href="https://github.com/libudu/ultra-tinypng">Github</a></p><p>工具下载：<a href="https://github.com/libudu/ultra-tinypng/releases">Release</a></p><h2 id="3-相关及其他压缩工具">3. 相关及其他压缩工具<a class="header-anchor" href="#3-相关及其他压缩工具"></a></h2><p><a href="https://tinypng.com/">TinyPNG</a></p><p><a href="https://github.com/meowtec/Imagine/releases">Imagine</a></p><h2 id="4-鸣谢">4. 鸣谢<a class="header-anchor" href="#4-鸣谢"></a></h2><p>开发者：<a href="https://github.com/libudu">linpicio</a></p>]]></content>
      
      
      <categories>
          
          <category> Other </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Other </tag>
            
            <tag> TinyPNG </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_转载-图床搭建 Backblaze B2 + Cloudflare CDN</title>
      <link href="/posts/16589f92.html"/>
      <url>/posts/16589f92.html</url>
      
        <content type="html"><![CDATA[<h2 id="相关链接">相关链接<a class="header-anchor" href="#相关链接"></a></h2><ol><li class="lvl-3"><a href="https://blazeb2.js.org/">BlazeB2 - 基于 BackBlazeB2 和 Cloudflare 的图床工具（未使用）</a></li></ol><h2 id="转载文章">转载文章<a class="header-anchor" href="#转载文章"></a></h2><ol><li class="lvl-3"><p><a href="https://www.coca.cc/mf/37.html">Backblaze B2 + Cloudflare CDN可自定义域名的10G高速免费外链图床</a></p></li><li class="lvl-3"><p><a href="https://blog.winer.website/archives/use_blackblaze_b2_and_cloudflare_cdn_to_bulid_a_free_oss.html">使用Backblaze B2 + Cloudflare CDN + PicGo实现可自定义域名的10G免费图床解决方案</a></p></li><li class="lvl-3"><p><a href="https://blog.bloade.com/2022/06/20/%E4%BD%BF%E7%94%A8backblaze-b2%E5%92%8Ccloudflare%E4%BD%9C%E4%B8%BA%E5%85%8D%E8%B4%B9%E5%9B%BE%E5%BA%8A/">使用Backblaze B2和Cloudflare作为免费图床</a></p></li></ol><p>感谢 <a href="https://recreyed.tk/">ReCreyed</a> 的分享。以下内容全文摘自上面 3 篇文章</p><h2 id="文章1：Backblaze-B2-Cloudflare-CDN">文章1：Backblaze B2 + Cloudflare CDN<a class="header-anchor" href="#文章1：Backblaze-B2-Cloudflare-CDN"></a></h2><p>本博客其他文章使用的都是github图床，无意中发现了B2+CF+ShareX的自建图床方案，而且还可以自定义域名，所以就有了这篇文章，本文所有图片全部来自这种方法的图床。</p><p>图床指的就是储存图片的服务器，网站管理员为了方便维护和管理，会将图片存放在专门的服务器集群里，通常还会在外层套层 CDN 做分发。市面上的公开图床很多，例如 imgur、<a href="http://sm.ms">sm.ms</a>、imgbox 等等，这些图床都开放了 API 方便开发者调用。不过由于运营成本问题，也有不少图床相继倒闭或者转入收费。</p><p>怎么自建图床？如果是有VPS主机服务器，安装个Chevereto 开源图床网站程序即可。但这是VPS单纯用来做图床给博客外链图片用，有点浪费且不易长久。图片存储最好是放在大公司的云服务平台上， Backblaze B2 是一个云存储解决方案，类似于Amazon AWS S3, 但是价格稍微便宜一些. Backblaze的云存储每个注册用户拥有10G免费空间以及每天1G的下载流量，上传流量不限。超过免费额度后的价格以及与其他几家主流商家的对比见下图。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234175.png" alt=""></p><p>在backblaze存储1T的内容也仅需$5/月，不过流量费还是比较贵的 ，上传流量不限。 由于 <a href="https://www.cloudflare.com/bandwidth-alliance/">Bandwidth Alliance(带宽联盟)</a>，Backblaze 到 Cloudflare 之间的出口是完全免费的， 所以Backblaze B2可以配合cloudflare CDN来使用达到无限免费下载流量。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234730.png" alt=""></p><p>Backblaze宣布与Cloudflare合作，免除掉Backblaze到Cloudflare的流量费用。</p><p>因此我们得到如下网盘/图床产品：</p><ul class="lvl-0"><li class="lvl-2"><p>10G存储空间免费， 全球最可靠的云存储服务</p></li><li class="lvl-2"><p>上行免费</p></li><li class="lvl-2"><p>下行免费</p></li><li class="lvl-2"><p>可自定义域名</p></li><li class="lvl-2"><p>全球最强CDN加速</p></li></ul><h3 id="搭建自定义域名图床教程开始">搭建自定义域名图床教程开始<a class="header-anchor" href="#搭建自定义域名图床教程开始"></a></h3><p>首先，你需要有一个域名，选择一个子域名作为图床的域名。 关于图床的二级域名命名，一般有以下几种：</p><ul class="lvl-0"><li class="lvl-2"><p>img</p></li><li class="lvl-2"><p>images</p></li><li class="lvl-2"><p>assets</p></li><li class="lvl-2"><p>static （不仅存放图片，还有存放 css、js）</p></li></ul><p>然后，创建 Backblaze B2 Bucket(存储桶) 。</p><p>在<a href="https://www.backblaze.com/">Backblaze’s B2 storage</a> 注册一个账号，注册好了后，在后台面板选择 “Buckets”（存储桶），然后点击 “Create a Bucket”，创建一个存储桶。选Public，以便所有人可访问。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234897.png" alt=""></p><p>然后，回到 “Buckets(存储桶)” , 在你刚刚创建的存储桶上，点击 “Upload/Download(上传/下载)”. 上传一个临时的测试文件到存储桶中，然后在你刚上传的文件处，点击 “i(information，信息)”. 这是为了获取下一步需要的信息，你的存储桶处于哪台服务器上.</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234770.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234174.png" alt=""></p><p>在上面的截图中，可以看到，我的文件是放在 <a href="https://f000.backblazeb2.com/">https://f000.backblazeb2.com/</a> – 记住这个域名<br>最后，获取到地址之后就登录cloudflare，给你的域名添加一个子域名，并新增一条cname记录，指向文件地址中的域名，<a href="http://xn--img-uc0ep96boud.coca.xn--cccnamef000-b48rf915dg7a.backblazeb2.com">例如将img.coca.cc通过cname到f000.backblazeb2.com</a>，效果便是<a href="https://img.coca.cc/file/imgsgj/img.jpg">https://img.coca.cc/file/imgsgj/img.jpg</a> 指向 <a href="https://f001.backblazeb2.com/file/imgsgj/img.jpg">https://f001.backblazeb2.com/file/imgsgj/img.jpg</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234496.png" alt=""></p><p>根据上面截图中的记录, 我使用这个子域名 img.coca.cc作为图床的域名, 并且指向 <a href="http://f000.backblazeb2.com">f000.backblazeb2.com</a>. 确保 Cloudflare 橙色保护盾是开启的状态, 这代表请求是通过了 Cloudflare 的 CDN 代理层. Cloudflare 默认的 TTL 将被设置为 auto(自动).</p><p>虽然启用了CloudFlare CDN，但发现缓存永远不能命中（MISS），我们需要对添加一个缓存指令（默认是不缓存），打开存储桶设置，桶信息设置为{“cache-control”:“max-age=43200”}，其中43200单位为秒(s)，意思就是说43200秒内CF不会去从源站重新获取资源。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234558.png" alt=""></p><p>Cloudfalre的ssl设置需要使用full，因为backblaze仅提供https访问地址。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234323.png" alt=""></p><p>当然你如果觉得文件链接不好看太长了，你也可以使用cloudflare自带的页面规则301 ，缩短链接地址，比如通过 <a href="https://img.coca.cc/img.jpg">https://img.coca.cc/img.jpg</a> 直接访问 <a href="https://f001.backblazeb2.com/file/imgsgj/img.jpg">https://f001.backblazeb2.com/file/imgsgj/img.jpg</a> 。<br>例:<br>匹配规则 <a href="https://img.coca.cc/">https://img.coca.cc/</a>*<br>重定向网址到 <a href="https://f001.backblazeb2.com/file/imgsgj/$1">https://f001.backblazeb2.com/file/imgsgj/$1</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234511.png" alt=""></p><p>加一条页面缓存规则</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262234756.png" alt=""></p><p>最后，请注意：Backblaze B2 流出到 Cloudflare 的流量是免费的，也就是说就算 CF 回源 B2 也没有 $0.01/GB 的流出流量费，相当于免费无限流量。不过这并不能阻止坏蛋直接用 B2 的域名（而不是套了 CF 的域名）刷流量。</p><p>最后修改：2021 年 03 月 01 日</p><h2 id="文章2：Backblaze-B2-Cloudflare-CDN-PicGo">文章2：Backblaze B2 + Cloudflare CDN + PicGo<a class="header-anchor" href="#文章2：Backblaze-B2-Cloudflare-CDN-PicGo"></a></h2><h3 id="前言">前言<a class="header-anchor" href="#前言"></a></h3><p>近期，由于服务器需要扩展功能，以及阿里云推送日志时有所不便决定重新购买服务器并部署相关网站和服务。决定趁此机会对图片存储进行规范，由于网站未备案，国内的阿里云OSS+阿里云CDN、又拍云、七牛云等厂家提供的服务无法享受，只能将目光转向国外。</p><p>原本使用Github+JSDelivr是一个很好的免费图床解决方案，且网上教程也很多，但2020年8月9日JSDelivr发布的新使用政策中第四条引起讨论</p><figure class="highlight text"><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">4. Prohibited Use</span><br><span class="line"></span><br><span class="line">The following behavior is prohibited:</span><br><span class="line"></span><br><span class="line"> 1. Hosting or accessing content that:</span><br><span class="line">     - contains malware or harmful code in any form,</span><br><span class="line">     - violates proprietary rights of others,</span><br><span class="line">     - is sexually explicit,</span><br><span class="line">     - is potentially illegal in the EU or the USA.</span><br><span class="line"></span><br><span class="line"> 2. Abusing the service and its resources, or using jsDelivr as a general-purpose</span><br><span class="line">    file or media hosting service. This includes, for example:</span><br><span class="line">     - running an image hosting website and using jsDelivr as a storage for all</span><br><span class="line">       uploaded images,</span><br><span class="line">     - hosting videos, file backups, or other files in large quantities.</span><br><span class="line"></span><br><span class="line">    We recognize that there are legitimate projects that consist of a large number</span><br><span class="line">    of files, and these are not considered abuse. For example: icons packs, apps,</span><br><span class="line">    or games with a large number of assets.Copy</span><br></pre></td></tr></table></figure><p><code>running an image hosting website and using jsDelivr as a storage for all uploaded images</code>这句话有所歧义，因为无法判断个人博客和文章上传的图片数量和访问量是否会被判定为图片存储站，导致封禁或删除数据，只能寻求其余解决方案。</p><p>此时发现<a href="https://www.cloudflare.com/zh-cn/bandwidth-alliance/">Cloudflare Bandwidth Alliance宽带联盟宽带联盟</a>中包含Backblaze，Backblaze到Cloudflare的所有出口流量完全免费。再加上Backblaze对个人用户提供10G的免费存储额度，每天1G的下载量与无限上传量。我们可以同时使用两者达到10G免费额度与不限量上传下载。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262252472.png" alt=""></p><p>在超过免费存储额度之后，相比其他几家国外主流OSS服务提供商，Backblaze的价格也较为低廉，唯一的缺点是目前只支持信用卡支付。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262253539.png" alt=""></p><h3 id="前置条件">前置条件<a class="header-anchor" href="#前置条件"></a></h3><ol><li class="lvl-3"><p>一个域名~ 最好是一级域名，即xxx.xxx这种类型的。搜索任意域名供应商即可购买，比较推荐NameSlio，支持支付宝付款，免费的Whois隐私保护，同时价格便宜。<code>.com</code>域名每年仅需要9.95美金，如果不是很在乎可以买其他后缀只买首年，2美金一年。免费域名也有一些可以申请，比较出名的就是freenom的域名了，不过听说今年Cloudflare的免费服务不再支持免费域名，所以只能自己试试是否能够成功。</p></li></ol><h3 id="Backblaze-OSS部分">Backblaze OSS部分<a class="header-anchor" href="#Backblaze-OSS部分"></a></h3><ol><li class="lvl-3"><p>从<a href="https://www.backblaze.com/b2/cloud-storage.html">此处</a>进入，创建Backblaze账号并完善相关信息，直接从首页进入可能没有Sing Up选项</p></li><li class="lvl-3"><p>从<a href="https://secure.backblaze.com/b2_buckets.htm">此处</a>进入控制台，创建Buckets存储桶存储桶</p></li><li class="lvl-3"><p>给存储桶起一个名字方便识别且不易被猜测即可，无需在意生成的图片链接长短，后续可以进行重定向方便识别且不易被猜测即可，无需在意生成的图片链接长短，后续可以进行301重定向，并将<code>Files in Bucket are</code>修改为<code>Public</code><br><strong>注意：给存储桶起名时尽量起不易被别人猜测的名字，可在其中增加部分随机字符，如<code>c42rx71-example-winer-website</code>，因为在存储桶的模式为Public时，别人只需知道你的OSS服务提供商+存储桶名称+其中一个文件名，即可拼凑出文件真实链接，从而绕过CDN刷空你的免费流量，如果有绑定支付方式还会扣费。</strong></p></li></ol><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262253084.png" alt=""></p><ol><li class="lvl-3"><p>点击<code>Upload/Download</code>上传一张图片或临时文件，用于后续获取存储桶所在的服务器地址</p></li><li class="lvl-3"><p>从左侧菜单栏的<code>Browse Files</code>进入刚刚的存储桶并找到上传的文件，点击查看详细信息，记住<code>Friendly URL</code>行的链接内容</p></li></ol><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262254668.png" alt=""></p><ol start="3"><li class="lvl-3"><p>从<code>Friendly URL</code>的链接可以看到我们的存储桶位于<code>https://f002.backblazeb2.com/</code>，而<code>/file/example-winer-website</code>则是存放文件目录的相对路径，记住这两个值后登陆Cloudflare进行设置。</p></li></ol><h3 id="Cloudflare部分">Cloudflare部分<a class="header-anchor" href="#Cloudflare部分"></a></h3><ol><li class="lvl-3"><p>打开<a href="https://www.cloudflare.com/zh-cn/">Cloudflare官网</a>并进行注册</p></li><li class="lvl-3"><p>根据提示前往域名注册商修改DNS解析服务器到Cloudflare提供给你的服务器地址不同用户地址不同不同用户地址不同，个人使用选择免费计划即可</p></li></ol><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262255445.png" alt=""></p><ol start="3"><li class="lvl-3"><p>添加一条CNAME记录到你刚刚得到的存储桶服务器，二级域名可以根据喜好选择，但一般使用这几种</p><figure class="highlight text"><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">oss</span><br><span class="line">img</span><br><span class="line">images</span><br><span class="line">assets</span><br><span class="line">static(不仅存放图片，还存放网站加载时的css、js文件)</span><br></pre></td></tr></table></figure></li></ol><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262256761.png" alt=""></p><ol><li class="lvl-3"><p>此时等待DNS解析完成后我们就完成了通过Cloudflare访问Backblaze的设置，可以使用浏览器的开发者工具，访问二级域名下对应网址来查看是否命中CDN缓存。<code>cf-cache-status</code>行HIT代表命中缓存，MISS代表没有命中CDN缓存，回源到Backblaze，此时会消耗下载流量。</p></li></ol><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262257026.png" alt=""></p><ol start="2"><li class="lvl-3"><p>为了避免无法命中缓存或回源次数过多导致加载速度低下，我们需要回到Backblaze进行桶信息设置，添加<code>&#123;&quot;cache-control&quot;:&quot;max-age=86400&quot;&#125;</code>，意味86400秒内Cloudflare不再返回源站重新获取信息。<br><strong>注意，回源时为CDN节点回源站重新拉去数据，然后再传递给用户，并不是将源站地址直接转给用户，所以无需担心回源过多导致的免费流量配额消耗完毕。max-age可以不用太长，太长的话若源文件发生更改，且站点没有主动推送到CDN节点时会导致用户不能及时得到最新版本。（书写本文时发现BackBlaze也存在免费请求次数显示，B类C类请求每天各2500次，暂时未确定Cloudflare访问是否计算请求次数，故也不建议太短）</strong></p></li></ol><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262258762.png" alt=""></p><ol><li class="lvl-3"><p>可选可选<strong>不建议使用的重定向方式不建议使用的重定向方式</strong>通过cloudflare自带的页面规则301，对于文件连接进行重定向缩短链接地址。按照下图选项根据喜好进行创建即可，*用于匹配所有的图片路径及名称，<code>$1</code>代表使用星号部分的内容对网址进行补全。<br><strong>注意：</strong></p></li></ol><p><strong>1.匹配URL时，地址中的<code>/img</code>是必须的否则被转发过的URL会再次匹配到转发规则，造成重定向次数过多或其他位置错误，但是<code>/img</code>可以替换为任意不为<code>/file/example-winer-website(你的存储桶名)</code>的字符串</strong><br><strong>2.经过测试后发现，使用该方式进行的重定向在开发者工具Network页面可以抓取到重定向后的链接直接新标签打开图片也可以获取直接新标签打开图片也可以获取，从而得到你的存储桶名称以及真是文件名，配合服务器提供商即可拼凑真实地址进行恶意刷流量攻击。故建议使用第8步的第二种创建方式。</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262258597.png" alt=""></p><ol><li class="lvl-3"><p>可选可选在查找资料时，见到有些地方建议在进行URL重定向后增加一条页面缓存规则来防止缓存失效。按照下图进行配置即可。但是在我进行测试时发现不增加这条内容，也可以命中Cloudflare的CDN缓存，故暂时未添加。也可以在此处增加安全级别选项，并设置为<code>本质上为关</code>，来保证主站被攻击在CDN环节增加验证时，写在本地的Markdown文档能够正常加载图片。<br>猜测存在此步骤的可能原因是将缓存级别设置<code>无查询字符串</code>时仅在图片后不跟随参数时使用缓存的内容，部分OSS供应商提供追加参数对图片进行处理（如压缩、剪裁、缩放）后发送的功能，若主站缓存级别设置为标准，此处修改部分内容设置后就可以使用那些功能。但Backblaze的免费服务并不包含这些，所以暂时用不到。若以后发现在问题或真正的原因会进行补充说明。</p></li></ol><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262259760.png" alt=""></p><p>8.可选可选<strong>建议使用的重定向方式建议使用的重定向方式</strong>由于不使用链接重定向和使用页面规则重定向均会暴露桶名称，我们选择通过重写的方式进行解决。这种方式可以在链接不变的情况下改写其中的内容。这次我们使用规则中的转换规则进行页面重写。匹配主机名用于确定请求来源需要进行重写，且再次匹配完整URI确认不包含已经重写过的链接，避免出现反复重写的错误。重写路径的concat含义为将两字符串拼接，在请求的文件路径前添加存储桶路径，而主机名example.winer.website在使用concat函数时无需书写，会自动添加为传入请求的主机名。（如一定要在concat函数内添加主机名，请不要带<code>http://</code>或<code>https://</code>开头，而是在前面添加<code>/</code>进行替代，例如<code>concat(&quot;/example.winer.website/file/example-winer-website&quot;, http.request.uri.path)</code>）<br>注：如果页面规则剩余不足或不想使用本方法，也可以<a href="https://help.backblaze.com/hc/en-us/articles/360010017893-How-to-allow-Cloudflare-to-fetch-content-from-a-Backblaze-B2-private-bucket">参考本文</a>创建私有存储桶并使用Cloudflare Workers来进行访问。鉴于Workers访问方法已存在很久，且有众多其他博主教程，不再进行书写。但Workers同样有免费限额，请注意。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262259217.png" alt=""></p><h3 id="搭配PicGo更好的进行图床食用">搭配PicGo更好的进行图床食用<a class="header-anchor" href="#搭配PicGo更好的进行图床食用"></a></h3><p>首先恭喜你，至此你已经完成了图床基本搭建工作！下面是拓展部分</p><ol><li class="lvl-3"><p>图床搭建完毕后，若不进行其他操作，每次上传图片都需要打开Backblaze的网站并在完成身份验证后进入桶设置页面进行上传，即不便捷也不友好。因此介绍一款跨平台且同时支持命令行与可视化界面的图片上传工具——PicGo<br>主要功能即为上传图片到你指定的位置，并获取图片链接，搭配typora编辑器可以直接在粘贴图片时就自动上传并将链接写入Markdown文档，避免图片在其它网站或放在本地后移动文档导致的图片丢失。</p></li><li class="lvl-3"><p>进入<a href="https://github.com/Molunerfinn/PicGo">项目主页</a>，下载并安装PicGo</p></li><li class="lvl-3"><p>选择插件设置，搜索<code>s3</code>或进入<a href="https://github.com/wayjam/picgo-plugin-s3">插件项目主页</a>下载并安装该插件</p></li><li class="lvl-3"><p>安装完毕后左侧的图床设置会多出“Amazon S3”，对于所有与S3 API兼容的云存储均可使用</p></li><li class="lvl-3"><p>打开的<a href="https://secure.backblaze.com/app_keys.htm">Backblaze官网的AppKeys设置页面</a>，添加一个新的Key建议不要使用建议不要使用MasterApplicationKey，按照如下格式设置并申请Key<br><strong>注意：Key的最长有效时间为1000天，即86400000秒，过期后请重新申请</strong></p></li></ol><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202212262300765.png" alt=""></p><ol><li class="lvl-3"><p>记录得到的<code>Key ID、applicationKey、桶名称、桶的Endpoint地址</code>分别填写到对应位置。同时将301跳转或页面重写的网址填写到自定义域名。其余设置无需变更。保存后即可上传图片，也可以修改文件的命名方式或通过修改配置文件进行设置，详见<a href="https://github.com/wayjam/picgo-plugin-s3/blob/main/README.md">此页面</a>。</p></li></ol><h3 id="注意事项">注意事项<a class="header-anchor" href="#注意事项"></a></h3><p>到此为止所有工作都已完成，但是有一点需要注意：</p><ol><li class="lvl-3"><p>通过这种方式上传文件，文件路径中如果包含空格，在Backblaze存储时会将空格换为加号，所以路径中包含空格的文件PicGo上传后生成的链接并不正确。</p></li><li class="lvl-3"><p>通过此方法搭建的图床或书写的教程，切记不要泄露存储桶名称，避免刷流量，且建议给所有上传文件的命名规则添加哈希值，使其不可猜测，避免存储桶名称暴露时获取其他文件。</p></li></ol><p><strong>同时本文内建立的存储桶并未使用，教程书写完毕后立刻删除，并创建了及其难以猜测的存储桶名称更改了相关地址，无需尝试使用文中或图中的信息进行访问测试。</strong></p><p>最后修改：2022 年 08 月 28 日 10 : 37 AM</p><p>评论区</p><p><strong>刚下飞机的道士</strong> May 24th, 2022 at 11:48 am</p><p>感谢大佬文章，现在cloudflare提供了transform rules，可以不用worker进行路径重写了。</p><p><strong>sakuya</strong> April 9th, 2022 at 02:44 pm</p><p>友情提示：<br>第8步的concat&quot;/example.winer.website/file/example−winer−website&quot;,http.requrst.uri.paht)，似乎多了个括号，以及request、path写错了</p><p><strong><a href="https://blog.winer.website/">winer</a></strong> August 28th, 2022 at 10:36 am</p><p><strong><a href="https://blog.winer.website/archives/use_blackblaze_b2_and_cloudflare_cdn_to_bulid_a_free_oss.html#comment-10">@sakuya</a></strong></p><p>谢谢提醒，括号多的那个其实是因为外面有个中文的括号，只看有代码标记的里面就行<br>不过request和path确实是打错了hhhhh图片里还没错，这就改掉</p><h2 id="文章3：Backblaze-B2-Cloudflare">文章3：Backblaze B2 + Cloudflare<a class="header-anchor" href="#文章3：Backblaze-B2-Cloudflare"></a></h2><p>B2是Backblaze提供的一个OSS存储服务，有着10G的免费容量以及每天1G的免费流量。而且他还是Cloudflare带宽联盟的成员，通过Cloudflare传输Backblaze中的内容是完全免费的。即使在超出免费额度的情况下，$0.005 GB/Mo的的容量和$0.01 GB/Mo的流量价格比起其他存储服务的价格也十分便宜。</p><p>有许多其他文章也介绍了如何使用B2和CF作为免费图床，但现在CF有了新的转换规则功能，和其他文章使用的Worker和页面规则比起来，转换规则提供了更多的免费条目，也更易于使用。</p><p>当然用来作为网盘也可以，不过10G就不太够用了。</p><h3 id="要求">要求<a class="header-anchor" href="#要求"></a></h3><p>首先需要注册Backblaze B2和Cloudflare的账号，其次需要一个域名，现在Cloudflare就提供域名购买，也可以从namesilo或者其他地方购买后给Cloudflare解析。Backblaze注册之后需要进行邮箱验证，不然无法创建公开存储桶。</p><h3 id="创建存储桶">创建存储桶<a class="header-anchor" href="#创建存储桶"></a></h3><p>进入Backblaze的用户管理界面，选择B2云存储下面的桶选项，然后点击创建存储桶，创建时需要输入桶的名称，这个名称会包含在URL中，所以不能与其他人的桶活着自己的其他桶有同样的名字。创建时需要选中公众选项，将其设置为公开的，其他选项不需要修改。</p><p>在创建完成后可以在里面上传一张图片，点击上传后的图片，其中友好URL就是要使用的地址，接下来记录下友好URL的主机名，例如<code>f00x.backblaze2.com</code>。</p><p>刚创建的存储桶默认不会被Cloudflare缓存，而是每次都要回源，对于图床来说，缓存下来才更方便。点击桶选项，回到刚才创建存储桶的地方，可以看到已经创建好的存储桶，点击桶设定，将桶信息修改为<code>&#123;&quot;cache-control&quot;:&quot;max-age=43200&quot;&#125;</code>，其中<code>max-age=</code>后面的数字为Cloudflare的缓存时长，单位为秒。</p><h3 id="配置Cloudflare">配置Cloudflare<a class="header-anchor" href="#配置Cloudflare"></a></h3><p>在Cloudflare中为图床要使用的子域名创建一个CNAME记录，<a href="http://xn--f00x-494f1jq3rrmbn6ibbz97pr8ij4jlsc52yhw1drh7d.bckblze2.com">将其指向刚才记录下的主机名f00x.bckblze2.com</a>，由于要使用Cloudflare的CDN进行缓存，所以要将代理状态设置为已代理。</p><p>在创建CNAME记录之后，将友好URL的主机名换成刚创建的域名就可以访问文件了。如果测试时Cloudflare提示错误522，这是因为Backblaze只允许使用Https访问，需要在Cloudflare的SSL/TLS中改成完全（严格）。此外，如果是Cloudflare的Pro付费用户的话，还需要关闭自动签名交换(SXG)，他在速度-优化选项中。</p><p>直接使用CNAME域名修改URL的话的话会暴露存储桶的名称，也显得URL十分啰嗦，这时候就需要使用Cloudflare的转换规则来将URL缩短。</p><p>选择规则-转换规则，然后点击创建转换规则-重写URL创建一个重写URL的规则，首先为规则取一个名字。如果使用单独的子域名作为专用的图床域名的话，可以直接在字段中选择主机名，在运算符中选择等于，然后在值当中输入子域名。</p><p>如果图床并不是使用专门的子域名，需要点击编写表达式，并参照<a href="https://developers.cloudflare.com/ruleset-engine/rules-language">Cloudflare文档</a>来编写如何匹配图床的URL地址。</p><p>匹配表达式配置完成后，在下面的重写-路径中选择重写到，在选项中选择Dynamic，如果只想在URL中删去<code>/file/存储桶</code>名称的话，在后面填写<code>concat(&quot;/file/存储桶名称&quot;, http.request.uri.path)</code>，如果有其他要求，也可以参照上面的Cloudflare文档来修改。设置完成后点击部署即可启用该规则。现在输入<code>https://img.example.com/桶中的文件路径</code>或是自定义的地址即可加载存储桶中的图片。</p><p>以下是用这种方式上传的图片，另外如果有人认得作者是谁可以在评论里回复一下。</p><p>图片略…</p><h3 id="参考">参考<a class="header-anchor" href="#参考"></a></h3><p><a href="https://www.backblaze.com/blog/free-image-hosting-with-cloudflare-transform-rules-and-backblaze-b2/">Free Image Hosting With Cloudflare Transform Rules and Backblaze B2</a></p><p><a href="https://www.coca.cc/mf/37.html">Backblaze B2 + Cloudflare CDN可自定义域名的10G高速免费外链图床</a></p><p><a href="https://233.al/archives/b2-cf.html">Backblaze+CloudFlare实现0成本简单图床</a></p>]]></content>
      
      
      <categories>
          
          <category> 转载 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 转载 </tag>
            
            <tag> 图床 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>05_Other-使用 Python open 函数批量替换文件内容</title>
      <link href="/posts/3ffec809.html"/>
      <url>/posts/3ffec809.html</url>
      
        <content type="html"><![CDATA[<h2 id="2023-02-06-更新">2023/02/06 更新<a class="header-anchor" href="#2023-02-06-更新"></a></h2><p>VSCode 集成了 <code>某路径下的文件批量替换指定内容</code> 的功能，更方便</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302061839251.png" alt="image-20230206183933193" style="zoom:50%;" /><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.jsdelivr.com/">jsd</a> 失效之后，博主使用了新的图床方案，需将文章的原 jsd 图片链接替换为新的图片地址</p><p>这类脚本在网上有很多，都很推荐，如</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容（Python版）</a></p></li><li class="lvl-2"><p><a href="https://blog.zhheo.com/p/369dbf41.html">张洪Heo：用 Python 批量替换 md 文件内容</a></p></li><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/7a5857a0.html">Justlovesmile：如何自动下载、压缩并批量替换文章中的外链图片</a></p></li></ul><h2 id="2-脚本内容">2. 脚本内容<a class="header-anchor" href="#2-脚本内容"></a></h2><p>源码来自：<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容（Python版）</a></p><p>脚本采用递归的方式，遍历 43~46 行 目录下的所有文件，进行批量替换</p><p>说明：</p><ol><li class="lvl-3"><p>根据自身情况修改 43~46 行 需遍历的目录；修改 47、48 行 需要替换的内容</p></li><li class="lvl-3"><p>脚本第 24 行 限制了只筛选出 Markdown 类型的文本文件进行修改，如需修改其他类型的文本文件 需自行更改后缀进行匹配</p></li><li class="lvl-3"><p>执行前请先备份源文件，以防出错后无法还原</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考  https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数：search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line">    <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line">    all_file = os.listdir(search_path)</span><br><span class="line">    <span class="comment"># 对于每一个文件</span></span><br><span class="line">    <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line">        <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line">        <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line">            <span class="comment"># 递归查找</span></span><br><span class="line">            search(search_path + each_file + <span class="string">&#x27;/&#x27;</span>, search_result)</span><br><span class="line">        <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> re.findall(<span class="string">&#x27;.*\.md$&#x27;</span>, each_file) == [each_file]:</span><br><span class="line">            <span class="comment"># 输出路径</span></span><br><span class="line">                search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i &#x27;s/old_str/new_str/&#x27;</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径，replace_old_str 要替换的字符，replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;r&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f1: </span><br><span class="line">        content = f1.read()</span><br><span class="line">        f1.close()</span><br><span class="line">        t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;w&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f2:</span><br><span class="line">        f2.write(t)</span><br><span class="line">    f2.close()</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="comment">#path = &#x27;E:/code_zone/.history/20220831_blog/source/_posts/&#x27;</span></span><br><span class="line">path_list = [</span><br><span class="line">    <span class="string">&#x27;E:/code_zone/hexo-source/source/_posts/&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;E:/code_zone/hexo-source-butterfly/source/_posts/&#x27;</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elcfumuvhm/image/&#x27;</span></span><br><span class="line">new_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elcfumuvhm/image/&#x27;</span></span><br><span class="line"></span><br><span class="line">search_result = []</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">    result = []                 <span class="comment"># 存放文件路径</span></span><br><span class="line">    <span class="comment"># 默认当前目录</span></span><br><span class="line">    <span class="comment"># path = os.getcwd()</span></span><br><span class="line">    <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line">        search(path, result)    <span class="comment"># 获取文章路径</span></span><br><span class="line">    count = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line">        replace(file_name, old_str, new_str)</span><br><span class="line">        count += <span class="number">1</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;&#123;&#125; done  &#123;&#125;&quot;</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-参考文章">3. 参考文章<a class="header-anchor" href="#3-参考文章"></a></h2><p>源码来自：<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容（Python版）</a></p>]]></content>
      
      
      <categories>
          
          <category> Other </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Other </tag>
            
            <tag> Python </tag>
            
            <tag> Open </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>04_Other-使用 Python ftplib 模块同步又拍云云存储数据至本地</title>
      <link href="/posts/4f5c6419.html"/>
      <url>/posts/4f5c6419.html</url>
      
        <content type="html"><![CDATA[<h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.jsdelivr.com/">jsd</a> 失效之后，博主将图床资源从 github 迁移至又拍云云存储上</p><p><a href="https://github.com/willnewii/qiniuClient">qiniuClient</a> 是我所知的 云存储管理客户端，有需要的朋友可以下载使用</p><p>目前的图床方案是写文章时利用 picgo 上传图片，再通过 Python 脚本同步又拍云上的图片至本地，再将本地图片 push 到 github，通过云服务器（CentOS）计划任务 每天凌晨1点执行以上备份操作</p><h2 id="2-脚本内容">2. 脚本内容<a class="header-anchor" href="#2-脚本内容"></a></h2><p>源码来自：<a href="https://blog.csdn.net/ouyang_peng/article/details/79271113">https://blog.csdn.net/ouyang_peng/article/details/79271113</a></p><p>又拍云官方教程：<a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">创建存储服务和使用 FTP 上传</a></p><p>说明：</p><ol><li class="lvl-3"><p>脚本执行顺序是先下载云存储资源至本地，再将本地资源上传至云存储，所以云存储上的资源优先级更大，当本地出现同名资源时 会被覆盖</p></li><li class="lvl-3"><p>根据自身情况修改 273、274 行 路线、操作员/服务名、token（参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">创建存储服务和使用 FTP 上传</a>），和 290~297 行本地、云存储的资源路径</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        ftp自动下载、自动上传脚本，可以递归目录操作</span></span><br><span class="line"><span class="string">        作者：欧阳鹏</span></span><br><span class="line"><span class="string">        博客地址：http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string">        参数:</span></span><br><span class="line"><span class="string">                 host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                 port:端口号</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="comment"># print(&quot;__init__()---&gt; host = %s ,port = %s&quot; % (host, port))</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.host = host</span><br><span class="line">        <span class="variable language_">self</span>.port = port</span><br><span class="line">        <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line">        <span class="comment"># 重新设置下编码方式</span></span><br><span class="line">        <span class="comment">#self.ftp.encoding = &#x27;gbk&#x27;</span></span><br><span class="line">        <span class="variable language_">self</span>.ftp.encoding = <span class="string">&#x27;utf8&#x27;</span></span><br><span class="line">        <span class="comment"># 获取脚本路径</span></span><br><span class="line">        path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line">        <span class="variable language_">self</span>.log_file = <span class="built_in">open</span>(path + <span class="string">&quot;/log.txt&quot;</span>, <span class="string">&quot;a&quot;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string">            参数:</span></span><br><span class="line"><span class="string">                  username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                 password: 密码</span></span><br><span class="line"><span class="string">            &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            timeout = <span class="number">60</span></span><br><span class="line">            socket.setdefaulttimeout(timeout)</span><br><span class="line">            <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line">            <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line">            <span class="comment"># 打开调试级别2，显示详细信息</span></span><br><span class="line">            <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line">            <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line">            <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="variable language_">self</span>.deal_error(<span class="string">&quot;FTP 连接或登录失败 ，错误描述为：%s&quot;</span> % err)</span><br><span class="line">            <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string">             local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_file: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为：%s&quot; % err)</span></span><br><span class="line">            remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            local_file_size = os.path.getsize(local_file)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为：%s&quot; % err)</span></span><br><span class="line">            local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;local_file_size:%d  , remote_file_size:%d&#x27;</span> % (local_file_size, remote_file_size))</span><br><span class="line">        <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line">            <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从ftp下载文件</span></span><br><span class="line"><span class="string">            参数:</span></span><br><span class="line"><span class="string">                local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                remote_file: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&quot;download_file()---&gt; local_path = %s ,remote_path = %s&quot;</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 文件大小相同，无需下载&#x27;</span> % local_file)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;下载文件 %s ... ...&#x27;</span> % local_file)</span><br><span class="line">                buf_size = <span class="number">1024</span></span><br><span class="line">                file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;wb&#x27;</span>)</span><br><span class="line">                <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">&#x27;RETR %s&#x27;</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line">                file_handler.close()</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;下载文件出错，出现异常：%s &#x27;</span> % err)</span><br><span class="line">                <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string">                       参数:</span></span><br><span class="line"><span class="string">                         local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                         remote_path: 远程路径</span></span><br><span class="line"><span class="string">                &quot;&quot;&quot;</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt;  local_path = %s ,remote_path = %s&quot;</span> % (local_path, remote_path))</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录%s不存在，继续...&#x27;</span> % remote_path + <span class="string">&quot; ,具体错误描述为：%s&quot;</span> % err)</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> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录%s不存在，先创建本地目录&#x27;</span> % local_path)</span><br><span class="line">            os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.file_list = []</span><br><span class="line">        <span class="comment"># 方法回调</span></span><br><span class="line">        <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line">        remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录 列表: %s&#x27;</span> % remote_names)</span><br><span class="line">        <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line">            file_type = item[<span class="number">0</span>]</span><br><span class="line">            file_name = item[<span class="number">1</span>]</span><br><span class="line">            local = os.path.join(local_path, file_name)</span><br><span class="line">            <span class="keyword">if</span> file_type == <span class="string">&#x27;d&#x27;</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt; 下载目录： %s&quot;</span> % file_name)</span><br><span class="line">                <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line">            <span class="keyword">elif</span> file_type == <span class="string">&#x27;-&#x27;</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;download_file()---&gt; 下载文件： %s&quot;</span> % file_name)</span><br><span class="line">                <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;返回上层目录 %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string">             local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_path: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 不存在&#x27;</span> % local_file)</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> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;跳过相等的文件: %s&#x27;</span> % local_file)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">        buf_size = <span class="number">1024</span></span><br><span class="line">        file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;rb&#x27;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.storbinary(<span class="string">&#x27;STOR %s&#x27;</span> % remote_file, file_handler, buf_size)</span><br><span class="line">        file_handler.close()</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;上传: %s&#x27;</span> % local_file + <span class="string">&quot;成功!&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_path: 远程路径</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录 %s 不存在&#x27;</span> % local_path)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至远程目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line">        local_name_list = os.listdir(local_path)</span><br><span class="line">        <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line">            src = os.path.join(local_path, local_name)</span><br><span class="line">            <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line">                <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                    <span class="variable language_">self</span>.debug_print(<span class="string">&quot;目录已存在 %s ,具体错误描述为：%s&quot;</span> % (local_name, err))</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传目录： %s&quot;</span> % local_name)</span><br><span class="line">                <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传文件： %s&quot;</span> % local_name)</span><br><span class="line">                <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 退出ftp</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&quot;close()---&gt; FTP退出&quot;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line">        <span class="variable language_">self</span>.log_file.close()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 打印日志</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 处理错误异常</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                e：异常</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        log_str = <span class="string">&#x27;发生错误: %s&#x27;</span> % e</span><br><span class="line">        <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line">        sys.exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 记录日志</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                log_str：日志</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        time_now = time.localtime()</span><br><span class="line">        date_now = time.strftime(<span class="string">&#x27;%Y-%m-%d&#x27;</span>, time_now)</span><br><span class="line">        format_log_str = <span class="string">&quot;%s ---&gt; %s \n &quot;</span> % (date_now, log_str)</span><br><span class="line">        <span class="built_in">print</span>(format_log_str)</span><br><span class="line">        <span class="variable language_">self</span>.log_file.write(format_log_str)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 获取文件列表</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                line：</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line">        <span class="comment"># 去除  . 和  ..</span></span><br><span class="line">        <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;..&#x27;</span>]:</span><br><span class="line">            <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 获取文件名</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                line：</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        pos = line.rfind(<span class="string">&#x27;:&#x27;</span>)</span><br><span class="line">        <span class="keyword">while</span> (line[pos] != <span class="string">&#x27; &#x27;</span>):</span><br><span class="line">            pos += <span class="number">1</span></span><br><span class="line">        <span class="keyword">while</span> (line[pos] == <span class="string">&#x27; &#x27;</span>):</span><br><span class="line">            pos += <span class="number">1</span></span><br><span class="line">        file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line">        <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="comment"># 清除日志</span></span><br><span class="line">    path = os.path.dirname(os.path.realpath(__file__))      <span class="comment"># 脚本路径</span></span><br><span class="line">    <span class="keyword">if</span> os.path.exists(path + <span class="string">&#x27;/log.txt&#x27;</span>):</span><br><span class="line">        log_file = path + <span class="string">&#x27;/log.txt &#x27;</span><span class="keyword">if</span> os.sep == <span class="string">&quot;/&quot;</span> <span class="keyword">else</span> path + <span class="string">&#x27;\\&#x27;</span> + <span class="string">&#x27;log.txt&#x27;</span></span><br><span class="line">        subprocess.Popen(<span class="string">f&#x27;rm -rf <span class="subst">&#123;log_file&#125;</span>&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line">        time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    my_ftp = MyFTP(<span class="string">&quot;v0.ftp.upyun.com&quot;</span>)</span><br><span class="line">    my_ftp.login(<span class="string">&quot;xxx/xxx&quot;</span>, <span class="string">&quot;tokenxxxxxxxxx&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="comment"># my_ftp.download_file(&quot;E:/code_zone/image_bed/image/wallpaper/1.jpg&quot;, &quot;/image/wallpaper/1.jpg&quot;)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 上传单个文件</span></span><br><span class="line">    <span class="comment"># my_ftp.upload_file(&quot;G:/ftp_test/Release/XTCLauncher.apk&quot;, &quot;/App/AutoUpload/ouyangpeng/I12/Release/XTCLauncher.apk&quot;)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 下载目录</span></span><br><span class="line">    <span class="comment"># image.cpen.top/image/ → 本地 E:/code_zone/image_bed/image/    (本地图床目录, 又拍云路径)</span></span><br><span class="line">    <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>:</span><br><span class="line">        my_ftp.download_file_tree(<span class="string">&quot;E:/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)</span><br><span class="line">    <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>:     <span class="comment"># aliyun</span></span><br><span class="line">        my_ftp.download_file_tree(<span class="string">&quot;/root/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 上传目录</span></span><br><span class="line">    <span class="comment"># 本地 E:/code_zone/image_bed/image/ → image.cpen.top/image/    (本地图床目录, 又拍云路径)</span></span><br><span class="line">    <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>:      <span class="comment"># Windows</span></span><br><span class="line">        my_ftp.upload_file_tree(<span class="string">&quot;E:/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)    </span><br><span class="line">        my_ftp.close()</span><br><span class="line">    <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>:     <span class="comment"># aliyun</span></span><br><span class="line">        my_ftp.upload_file_tree(<span class="string">&quot;/root/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)  </span><br><span class="line">        my_ftp.close()</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="comment"># python E:/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"><span class="comment"># python3 /root/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Windows 终端</span></span><br><span class="line">python E:/code_zone/tools/python-ftp/ftp.py</span><br><span class="line"></span><br><span class="line"><span class="comment"># 类 Unix 终端</span></span><br><span class="line">python3 /root/code_zone/tools/python-ftp/ftp.py</span><br></pre></td></tr></table></figure><h2 id="3-参考文章">3. 参考文章<a class="header-anchor" href="#3-参考文章"></a></h2><p>源码来自：<a href="https://blog.csdn.net/ouyang_peng/article/details/79271113">Python实现的FTP上传和下载功能</a></p><p>又拍云官方教程：<a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">创建存储服务和使用 FTP 上传</a></p>]]></content>
      
      
      <categories>
          
          <category> Other </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Other </tag>
            
            <tag> Python </tag>
            
            <tag> FTP </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>03_Other-PC端环境记录</title>
      <link href="/posts/583c5c34.html"/>
      <url>/posts/583c5c34.html</url>
      
        <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录个人电脑环境</p><p>更新时间：2023.03.10</p><h2 id="Windows">Windows<a class="header-anchor" href="#Windows"></a></h2><h3 id="202303">202303<a class="header-anchor" href="#202303"></a></h3><p>系统重置记录</p><table><thead><tr><th colspan="3">软件</th></tr></thead><tbody><tr><td>联想电脑管家</td><td>联想应用商店</td><td>QQ</td></tr><tr><td>Clash for Windows</td><td>Typora</td><td>WeGame</td></tr><tr><td>Google Chrome</td><td>Microsoft Edge</td><td>Firefox</td></tr><tr><td>Logitech G HUB</td><td>搜狗输入法</td><td>网易邮箱大师</td></tr><tr><td>网易有道词典</td><td><a href="https://www.ghxi.com/ddqdpc.html">滴答清单</a></td><td>微信</td></tr><tr><td>腾讯会议</td><td>百度网盘</td><td>阿里云盘</td></tr><tr><td>哔哩哔哩</td><td>PotPlayer</td><td><a href="https://www.sublimetext.com/"><s>Sublime Text</s></a></td></tr><tr><td><a href="https://www.w3cschool.cn/sublimetext/sublimetext-mdc13bbj.html"><s>Sublime Text 汉化教程</s></a></td><td><a href="https://www.ghxi.com/sublimetext4.html">Sublime Text</a></td><td>WPS Office</td></tr><tr><td>腾讯文档</td><td>XMind ZEN（本地安装包）</td><td><a href="https://www.zjh336.cn/?id=280">XMind 8</a></td></tr><tr><td>WinRAR</td><td>Git</td><td>Windows Terminal</td></tr><tr><td><a href="https://www.bilibili.com/video/BV1n14y1x7Y7">WSL 2</a></td><td><a href="https://www.ghxi.com/vmware17.html">VMware Workstation Pro</a></td><td><a href="https://zhuanlan.zhihu.com/p/104118123">CentOS</a>、<a href="https://blog.cpen.top/posts/48860.html">安装教程</a></td></tr><tr><td>Xshell、Xftp</td><td>Visual Studio Code</td><td>SwitchHosts</td></tr><tr><td>PicGo、<a href="https://blog.csdn.net/jiangjianzhong00/article/details/128256073">教程</a>、<a href="https://github.com/mycpen/tools/tree/main/python-ftp">密钥</a></td><td>uTools</td><td>Snipaste</td></tr><tr><td>Python</td><td>PyCharm</td><td><a href="https://www.ghxi.com/navicat16.html">Navicat</a></td></tr><tr><td><a href="https://www.runoob.com/nodejs/nodejs-install-setup.html">Node.js</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_178562.html">联想软件：关闭Win10系统自动更新</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_184411_1.html"><s>联想软件：网络图标叹号修复工具</s></a></td></tr><tr><td><a href="https://github.com/listen1/listen1_desktop">Listen 1</a></td><td><a href="https://github.com/lyswhut/lx-music-desktop">LX Music</a></td><td><a href="https://desktop.telegram.org/">Telegram</a>、<a href="https://t.me/setlanguage/classic-zh-cn">汉化</a></td></tr><tr><td><a href="https://seer.61.com/">赛尔号</a></td><td><a href="https://github.com/Planshit/Tai">Tai</a></td><td rowspan="2"></td></tr><tr><td colspan="2"></td></tr></tbody></table><table><thead><tr><th colspan="3">GitHub</th></tr></thead><tbody><tr><td><a href="https://github.com/mycpen/image_bed">image_bed</a></td><td><a href="https://github.com/mycpen/ultra-tinypng">ultra-tinypng</a></td><td><a href="https://github.com/mycpen/tools">tools</a></td></tr><tr><td><a href="https://github.com/mycpen/hexo-source-butterfly">hexo-source-butterfly</a></td><td><a href="https://github.com/mycpen/hexo-source">hexo-source</a></td><td><a href="https://github.com/mycpen/hexo-source-diary">hexo-source-diary</a></td></tr><tr><td><a href="https://github.com/mycpen/nav">nav</a></td><td><a href="https://github.com/mycpen/dino">dino</a></td><td rowspan="3"></td></tr><tr><td rowspan="2" colspan="2"></td></tr><tr></tr></tbody></table><table><thead><tr><th colspan="3">VSCode</th></tr></thead><tbody><tr><td>简中插件</td><td>GitLens</td><td><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">Material Icon Theme</a></td></tr><tr><td><a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory">Git History</a></td><td><a href="https://wakatime.com/vs-code">WakaTime</a></td><td rowspan="2"></td></tr><tr><td colspan="2"></td></tr></tbody></table><table><thead><tr><th colspan="3">参考教程</th></tr></thead><tbody><tr><td><a href="https://blog.cpen.top/posts/583c5c34.html">本文</a></td><td><a href="https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&amp;mid=2649092080&amp;idx=3&amp;sn=124abf24a463486deaf380e710a31822&amp;chksm=be5bc85d892c414b2f52e7d7d58a3a6dc987324ded0ed749295a480ce0cb86df1eaefd7fb3c7&amp;scene=27">GIT SSH 密钥认证教程</a></td><td><a href="https://baijiahao.baidu.com/s?id=1742306839397588676">PyCharm 汉化</a></td></tr><tr><td><a href="https://www.ghxi.com/">果壳剥壳</a></td><td><a href="https://blog.csdn.net/qq_44498977/article/details/124204347">vscode 配置 gitbash 终端</a></td><td><a href="https://hexo.io/zh-cn/">Hexo 官网</a></td></tr><tr><td><a href="https://blog.anheyu.com/posts/sdxhu.html#npm-%E9%95%9C%E5%83%8F">npm 淘宝源</a></td><td><a href="https://juejin.cn/post/7078155627305893925">Typora 页面美化</a></td><td><a href="https://bearcai.com/index.php/archives/44/"><s>PicGo安装插件compress</s></a></td></tr><tr><td><a href="https://zhuanlan.zhihu.com/p/618663612">安装 Node.js</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><h3 id="202211">202211<a class="header-anchor" href="#202211"></a></h3><p>第三方分享网站：<a href="https://www.ghxi.com/">果壳剥壳</a></p><table><thead><tr><th>name</th><th>description</th></tr></thead><tbody><tr><td>联想电脑管家、联想应用商店、Legion Zone、Logitech G HUB、小米云服务、金山打字通、搜狗输入法、网易邮箱大师、网易有道词典、滴答清单</td><td rowspan="3"></td></tr><tr><td>腾讯QQ、微信、腾讯会议、向日葵</td></tr><tr><td>网易云音乐、酷我音乐、QQ音乐</td></tr><tr><td>百度网盘、阿里云盘、迅雷</td><td>网盘</td></tr><tr><td>哔哩、哔哩哔哩 UWP</td><td>哔哩哔哩uwp</td></tr><tr><td><a href="http://draw.io">draw.io</a></td><td>流程拓扑图</td></tr><tr><td>PotPlayer 64 bit</td><td>视频播放</td></tr><tr><td>Typora、Sublime Text、WPS Office、XMind 8、XMind 2021、腾讯文档、MarkdownPad 2</td><td>文本编辑</td></tr><tr><td>WSA Toolbox</td><td>WSA</td></tr><tr><td>Chrome、Firefox、Edge</td><td>浏览器</td></tr><tr><td>Windows Terminal、PowerShell 7、Git bash</td><td>终端</td></tr><tr><td>WSL2、Ubuntu 20.04 LTS、WSA</td><td rowspan="2">虚拟机</td></tr><tr><td>VMware Workstation Pro、Xshell 7、Xftp 7</td></tr><tr><td>Clash for Windows、Steam++</td><td>代理客户端</td></tr><tr><td>PyCharm、Visual Studio Code、HBuilder X、CodeBlocks、Visual C++ 6.0</td><td>开发工具</td></tr><tr><td>Postman</td><td>接口调试</td></tr><tr><td>SwitchHosts</td><td>本地解析</td></tr><tr><td>Navicat Premium 15、SQLyog、QuickRedis、Another Redis Desktop Manager</td><td>数据库客户端</td></tr><tr><td>PicGo</td><td>图片上传</td></tr><tr><td>uTools、Everything</td><td>剪贴板，取色</td></tr><tr><td>Snipaste</td><td>截图</td></tr><tr><td><a href="https://github.com/mycpen/ultra-tinypng">mycpen/ultra-tinypng</a></td><td>图片压缩。原地址：<a href="https://github.com/libudu/ultra-tinypng">libudu/ultra-tinypng</a></td></tr><tr><td><a href="https://github.com/mycpen/tools">mycpen/tools</a></td><td>私有仓库。ftp图床同步、内容替换</td></tr><tr></tr></tbody></table><h2 id="软件备份">软件备份<a class="header-anchor" href="#软件备份"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>bilibili下载助手 (谷歌插件)</p><p>引导页：<a href="https://csser.top/">csser.top</a>、<a href="https://docs.qq.com/doc/DQ2lhaWRpS0tubVVF">docs.qq.com</a></p><p>crx文件备份 (v3.0.0)：<a href="https://gitee.com/mycpen/cdn3/blob/master/download/bilibili-helper-3.0.0.crx">gitee.com/mycpen/cdn3</a></p></li></ul>]]></content>
      
      
      <categories>
          
          <category> Other </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Other </tag>
            
            <tag> 工具 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>06_Hexo-elemecdn 加速 Butterfly 第三方资源</title>
      <link href="/posts/9b5a2768.html"/>
      <url>/posts/9b5a2768.html</url>
      
        <content type="html"><![CDATA[<h2 id="2023-01-09-更新">2023/01/09 更新<a class="header-anchor" href="#2023-01-09-更新"></a></h2><p>今天发现 <a href="https://butterfly.js.org/posts/ceeb73f/#CDN">Butterfly 文档</a> 有介绍自定义 CDN 的配置项，只需简单配置即可完成需求，<code>所以之前写的东西 属于是 </code> <strong><code>画蛇添足</code></strong>，参考价值不高</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202301100050094.png" alt="image-20230110005050004" style="zoom:50%;" /><p>官方样例中的 <code>cdn.staticfile.org</code> CDN 加速由七牛云提供，技术社区掘金支持，可以直接填入使用</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><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="comment"># CDN</span></span><br><span class="line"><span class="comment"># Don&#x27;t modify the following settings unless you know how they work</span></span><br><span class="line"><span class="comment"># 非必要請不要修改</span></span><br><span class="line"><span class="attr">CDN:</span></span><br><span class="line">  <span class="comment"># The CDN provider of internal scripts (主題內部 js 的 cdn 配置)</span></span><br><span class="line">  <span class="comment"># option: local/jsdelivr/unpkg/cdnjs/custom</span></span><br><span class="line">  <span class="comment"># Dev version can only choose. ( dev版的主題只能設置為 local )</span></span><br><span class="line">  <span class="attr">internal_provider:</span> <span class="string">local</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># The CDN provider of third party scripts (第三方 js 的 cdn 配置)</span></span><br><span class="line">  <span class="comment"># option: local/jsdelivr/unpkg/cdnjs/custom</span></span><br><span class="line">  <span class="comment"># when set it to local, you need to install hexo-butterfly-extjs</span></span><br><span class="line">  <span class="comment"># third_party_provider: jsdelivr</span></span><br><span class="line">  <span class="attr">third_party_provider:</span> <span class="string">custom</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Add version number to CDN, true or false  </span></span><br><span class="line">  <span class="attr">version:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Custom format</span></span><br><span class="line">  <span class="comment"># For example: https://cdn.staticfile.org/$&#123;cdnjs_name&#125;/$&#123;version&#125;/$&#123;min_cdnjs_file&#125;</span></span><br><span class="line">  <span class="attr">custom_format:</span> <span class="string">https://cdn.staticfile.org/$&#123;cdnjs_name&#125;/$&#123;version&#125;/$&#123;min_cdnjs_file&#125;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><s>想用 elemecdn 的话，custom_format 配置项该怎么写 我也不清楚。尝试写 <code>https://npm.elemecdn.com/$&#123;name&#125;$&#123;verType&#125;/$&#123;file&#125;</code> 或 <code>https://npm.elemecdn.com/$&#123;cdnjs_name&#125;/$&#123;version&#125;/$&#123;min_cdnjs_file&#125;</code> 都失败了</s></p><p>想用 elemecdn 的话，<a href="https://butterfly.js.org/posts/ceeb73f/#custom-format">Butterfly 文档</a> 给出了格式：</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202301252338749.png" alt=""></p><p><strong><code>以下步骤已过时</code></strong></p><h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>博客异常加载，f12发现 <a href="https://unpkg.com/swiper/swiper-bundle.min.js">https://unpkg.com/swiper/swiper-bundle.min.js</a> （主因）和 <a href="https://unpkg.com/@fancyapps/ui/dist/fancybox.umd.js">https://unpkg.com/@fancyapps/ui/dist/fancybox.umd.js</a> 报 520（520，当源站服务器向 <a href="https://baike.baidu.com/item/CDN/420951?fromModule=lemma_inlink">CDN</a> 返回空白、未知或意外响应时，会发生 520 错误），日常都返的 200</p><p>基于此有了换 cdn 的想法。<a href="https://butterfly.js.org/posts/ceeb73f/#CDN">butterfly 官方教程</a> 介绍了 local/jsdelivr/unpkg/cdnjs/custom 这些选择，都不是想要的，看到别人用的 Element cdn，学习一下</p><h2 id="步骤">步骤<a class="header-anchor" href="#步骤"></a></h2><p>参考文章：<a href="https://butterfly.js.org/posts/ceeb73f/#CDN">butterfly官方教程#CDN</a>、<a href="https://blog.anheyu.com/posts/fe76.html">安知鱼 - 可用cdn整理</a>、<a href="https://blog.zhheo.com/p/790087d9.html#%E9%93%BE%E6%8E%A5">张洪 Heo - Butterfly CDN链接更改指南</a></p><p>修改源码：</p><ol><li class="lvl-3"><p>修改 themes/butterfly/scripts/events/cdn.js，新增 elemecdn 字段</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221028222132106.png" alt="image-20221028222132106" style="zoom: 67%;" /><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">elemecdn</span>: <span class="string">`https://npm.elemecdn.com/<span class="subst">$&#123;name&#125;</span><span class="subst">$&#123;verType&#125;</span>/<span class="subst">$&#123;file&#125;</span>`</span>,</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>修改 _config.butterfly.yml，CDN.third_party_provider</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221029143047143.png" alt="image-20221029143047143" style="zoom: 67%;" /><p>f12 看了下 网络，替换后没异常</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221028223148954.png" alt="image-20221028223148954" style="zoom:50%;" /></li><li class="lvl-3"><p>根据 <a href="https://blog.zhheo.com/p/790087d9.html#%E9%93%BE%E6%8E%A5">张洪Heo：Butterfly CDN链接更改指南</a> 按需替换 cdn链接（<s>需注意变量名，比如butterfly v4.4.0 fontawesome 写成 fontawesomeV6 似乎才会生效</s> <a href="https://github.com/jerryc127/hexo-theme-butterfly/releases/tag/4.8.0">Butterfly v4.8.0</a> 变量名已改为 fontawesome）</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221028223928594.png" alt="image-20221028223928594" style="zoom:50%;" /><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><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="attr">CDN:</span></span><br><span class="line">  <span class="attr">option:</span></span><br><span class="line">    <span class="comment"># 张洪Heo   https://blog.zhheo.com/p/790087d9.html</span></span><br><span class="line">    <span class="attr">jquery:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.6.0/jquery.min.js</span></span><br><span class="line">    <span class="attr">pjax:</span> <span class="string">https://npm.elemecdn.com/pjax@latest/pjax.min.js</span></span><br><span class="line">    <span class="attr">sharejs:</span> <span class="string">https://lib.baomitu.com/social-share.js/1.0.16/js/social-share.min.js</span></span><br><span class="line">    <span class="attr">sharejs_css:</span> <span class="string">https://lib.baomitu.com/social-share.js/1.0.16/css/share.min.css</span></span><br><span class="line">    <span class="attr">gitalk:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/gitalk/1.7.2/gitalk.min.js</span></span><br><span class="line">    <span class="attr">gitalk_css:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/gitalk/1.7.2/gitalk.min.css</span></span><br><span class="line">    <span class="attr">valine:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/valine/1.4.16/Valine.min.js</span></span><br><span class="line">    <span class="attr">disqusjs:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/disqusjs/1.3.0/disqus.js</span></span><br><span class="line">    <span class="attr">disqusjs_css:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/disqusjs/1.3.0/disqusjs.css</span></span><br><span class="line">    <span class="attr">waline:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/waline/1.5.4/Waline.min.js</span></span><br><span class="line">    <span class="attr">lazyload:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vanilla-lazyload/17.3.1/lazyload.iife.min.js</span></span><br><span class="line">    <span class="attr">instantpage:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/instant.page/5.1.0/instantpage.min.js</span></span><br><span class="line">    <span class="attr">typed:</span> <span class="string">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/typed.js/2.0.12/typed.min.js</span></span><br><span class="line">    <span class="comment"># fancybox_css: https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/fancybox/3.5.7/jquery.fancybox.min.css</span></span><br><span class="line">    <span class="comment"># fancybox: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/fancybox/3.5.7/jquery.fancybox.min.js</span></span><br><span class="line">    <span class="attr">medium_zoom:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/medium-zoom/1.0.6/medium-zoom.min.js</span></span><br><span class="line">    <span class="attr">snackbar_css:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/node-snackbar/0.1.16/snackbar.min.css</span></span><br><span class="line">    <span class="attr">snackbar:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/node-snackbar/0.1.16/snackbar.min.js</span></span><br><span class="line">    <span class="attr">fontawesome:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/6.0.0/css/all.min.css</span></span><br><span class="line">    <span class="comment"># fontawesomeV6: https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/font-awesome/6.0.0/css/all.min.css</span></span><br><span class="line">    <span class="comment"># translate: https://npm.elemecdn.com/js-heo@1.0.6/translate/tw_cn.js   # 与主题原文件不符</span></span><br><span class="line">    <span class="attr">aplayer_css:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/aplayer/1.10.1/APlayer.min.css</span></span><br><span class="line">    <span class="attr">aplayer_js:</span> <span class="string">https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/aplayer/1.10.1/APlayer.min.js</span></span><br><span class="line">    <span class="attr">meting_js:</span> <span class="string">https://npm.elemecdn.com/js-heo@1.0.12/metingjs/Meting.min.js</span></span><br><span class="line">    <span class="attr">prismjs_js:</span> <span class="string">https://npm.elemecdn.com/prismjs@1.1.0/prism.js</span></span><br><span class="line">    <span class="attr">prismjs_lineNumber_js:</span> <span class="string">https://npm.elemecdn.com/prismjs/plugins/line-numbers/prism-line-numbers.min.js</span></span><br><span class="line">    <span class="attr">prismjs_autoloader:</span> <span class="string">https://npm.elemecdn.com/prismjs/plugins/autoloader/prism-autoloader.min.js</span></span><br><span class="line">    <span class="attr">justifiedGallery_js:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js</span></span><br><span class="line">    <span class="attr">justifiedGallery_css:</span> <span class="string">https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/justifiedGallery/3.8.1/css/justifiedGallery.min.css</span></span><br><span class="line">    <span class="comment">#twikoo: https://npm.elemecdn.com/twikoo@1.6.8/dist/twikoo.all.min.js</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ol>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> Element </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>05_Hexo-twikoo数据从MongoDB导出-js适配pjax</title>
      <link href="/posts/51a9ee30.html"/>
      <url>/posts/51a9ee30.html</url>
      
        <content type="html"><![CDATA[<h1 id="一-Twikoo数据从MongoDB导出">一. Twikoo数据从MongoDB导出<a class="header-anchor" href="#一-Twikoo数据从MongoDB导出"></a></h1><h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><ol><li class="lvl-3"><p><strong>参考文章</strong> <a href="https://www.imaegoo.com/2022/twikoo-data-export/">iMaeGoo</a>、<a href="https://zhangshier.vip/posts/41646/#%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%87%BA">张时贰</a></p></li><li class="lvl-3"><p>记录 <a href="https://twikoo.js.org/">twikoo</a> 由 <a href="https://vercel.com/dashboard">vercel</a> + <a href="https://www.mongodb.com/">mongodb</a> 改为 <a href="https://twikoo.js.org/quick-start.html#%E7%A7%81%E6%9C%89%E9%83%A8%E7%BD%B2">私有部署</a>，数据导出过程</p></li><li class="lvl-3"><p>Win 下使用 <code>mongoexport</code> 和客户端工具 失败（个人原因，<a href="https://www.imaegoo.com/2022/twikoo-data-export/#%E5%AF%BC%E5%87%BA-Twikoo-%E5%9C%A8-Vercel-%E7%9A%84%E6%95%B0%E6%8D%AE">作者的样例</a> 是成功的），转而用云主机（CentOS 8.2）导出数据</p></li></ol><h2 id="步骤">步骤<a class="header-anchor" href="#步骤"></a></h2><p>参考自 <a href="https://www.imaegoo.com/2022/twikoo-data-export/">iMaeGoo</a>、<a href="https://zhangshier.vip/posts/41646/#%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%87%BA">张时贰</a></p><ol><li class="lvl-3"><p>MongoDB官网下载 <a href="https://www.mongodb.com/try/download/database-tools">Database Tools</a>，解压安装</p></li><li class="lvl-3"></li></ol><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"># 登录 Vercel 管理后台，点开 Twikoo 的环境，点击上方的 Settings，点击左侧的 Environment Variables，在页面下方找到 MONGODB_URI，点击对应的小眼睛图标，会出现数据库连接地址，点击以复制这串地址；</span></span><br><span class="line"><span class="comment"># 如果地址中包含参数，请先删去参数，参数即 “?” 和 “?” 后面的部分，例如 ?journal=true&amp;w=majority；</span></span><br><span class="line"><span class="comment"># 打开一个命令行窗口，粘贴以下命令：</span></span><br><span class="line">mongoexport --uri 这里换成刚才复制的地址 --collection comment --<span class="built_in">type</span> json --out twikoo-comments.json</span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><h1 id="二-js文件适配-PJAX">二. js文件适配 PJAX<a class="header-anchor" href="#二-js文件适配-PJAX"></a></h1><p><strong>参考文章</strong>：</p><p><a href="https://blog.zhheo.com/p/3e567fa7.html">张洪Hexo - pjax无法生效解决办法，butterfly主题维护你的pjax</a></p><p><a href="https://blog.leonus.cn/2022/owo-big.html#post-comment">Leonus - 评论区</a></p><p><a href="https://blog.panghai.top/posts/6e665e82/">心流 - 记录一次因为pjax导致js无法生效以及解决方案</a></p><ol><li class="lvl-3"><p>butterfly主题下</p><blockquote><p>butterfly的话就使用data-pjax属性来让js文件重载，因为这个是butterfly中写好的规则：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;script src=<span class="string">&quot;https://cdn.zhheo.com/JS-Heo/bb/showbb_in_index.js&quot;</span> data-pjax=<span class="string">&quot;&quot;</span> defer=<span class="string">&quot;&quot;</span>&gt;&lt;/script&gt;</span><br></pre></td></tr></table></figure></blockquote></li><li class="lvl-3"><p>在自定义js文件按照下面这样写即可，可以把代码弄成一个函数，然后把函数名放在下面的函数里面</p><blockquote><figure class="highlight javascript"><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">function</span> <span class="title function_">whenDOMReady</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="comment">//此处填写需要执行的代码，如:</span></span><br><span class="line">  <span class="comment">//leonus.demo()</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">whenDOMReady</span>() <span class="comment">//打开网站之后先执行一次函数</span></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;pjax:complete&quot;</span>, whenDOMReady) <span class="comment">//pjax加载完成之后执行上面函数</span></span><br></pre></td></tr></table></figure></blockquote></li></ol>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> Twikoo </tag>
            
            <tag> PJAX </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>04_Hexo-多平台部署-云服务器-GitHub-Gitee</title>
      <link href="/posts/38874.html"/>
      <url>/posts/38874.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-开篇词">一. 开篇词<a class="header-anchor" href="#一-开篇词"></a></h2><h3 id="1-1-前言">1.1 前言<a class="header-anchor" href="#1-1-前言"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>官方文档介绍了 Hexo 可以同时<code>一键部署</code>到多个平台，只需要同时使用多个 <code>deployer</code>。</p></li></ul><blockquote><p><a href="https://hexo.io/zh-cn/docs/one-command-deployment">中文官方文档</a></p><p>Hexo 提供了快速方便的一键部署功能，让您只需一条命令就能将网站部署到服务器上。</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">$ hexo deploy</span><br></pre></td></tr></table></figure><p>在开始之前，您必须先在 <code>_config.yml</code> 中修改参数，一个正确的部署配置中至少要有 <code>type</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">deploy:</span><br><span class="line">  <span class="built_in">type</span>: git</span><br></pre></td></tr></table></figure><p>您可同时使用多个 deployer，Hexo 会依照顺序执行每个 deployer。</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">deploy:</span><br><span class="line">- <span class="built_in">type</span>: git</span><br><span class="line">  repo:</span><br><span class="line">- <span class="built_in">type</span>: heroku</span><br><span class="line">  repo:</span><br></pre></td></tr></table></figure></blockquote><h3 id="1-2-说明">1.2. 说明<a class="header-anchor" href="#1-2-说明"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>使用 <code>Git Hooks</code> 同步 Hexo 生成的静态文件。（后期我弃用 git，改用 rsync 了）</p></li></ul><h2 id="二-步骤">二. 步骤<a class="header-anchor" href="#二-步骤"></a></h2><h3 id="2-1-云服务器创建-Git-仓库">2.1 云服务器创建 Git 仓库<a class="header-anchor" href="#2-1-云服务器创建-Git-仓库"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">$ cd /opt/git/</span><br><span class="line"></span><br><span class="line">$ git init --bare hexo.git# 创建 Hexo 远程仓库git init --bare 仓库名.git</span><br><span class="line"></span><br><span class="line">$ cd /opt/git/hexo.git/hooks/ </span><br><span class="line"></span><br><span class="line">$ vim post-receive </span><br><span class="line">#!/bin/bash</span><br><span class="line">git --work-tree=/opt/www/hexo --git-dir=/opt/git/hexo.git checkout -f</span><br><span class="line"></span><br><span class="line"># --work-tree=/opt/www/hexo   设置工作树的路径</span><br><span class="line"># --git-dir=/opt/git/hexo.git 设置存储库的路径</span><br><span class="line"></span><br><span class="line">$ chmod +x post-receive# 给钩子文件添加执行权限</span><br><span class="line"></span><br><span class="line">$ mkdir /opt/www/hexo# 创建工作树路径</span><br><span class="line"></span><br><span class="line">$ chmod -R 777 /opt/www/hexo# 授权，否则到后面访问报 403</span><br></pre></td></tr></table></figure><h4 id="2-1-2-deployer-使用-rsync-进行部署">2.1.2 deployer 使用 rsync 进行部署<a class="header-anchor" href="#2-1-2-deployer-使用-rsync-进行部署"></a></h4><p>前言：后面发现使用 git 上传至云服务器速度太慢了（不清楚啥原因），改用 rsync。</p><blockquote><p>git 上传速度如下图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906115955982.png" alt=""></p></blockquote><ol><li class="lvl-3"><p>使 git bash 支持 rsync（Windows）</p><p>参考<br><a href="https://blog.csdn.net/m0_48613893/article/details/124104757">https://blog.csdn.net/m0_48613893/article/details/124104757</a><br><a href="https://blog.csdn.net/qq_38689395/article/details/125758842">https://blog.csdn.net/qq_38689395/article/details/125758842</a><br>如果文件重复，就跳过<br>如果出错就修改文件名    <code>.\usr\bin\msys-xxhash-0.8.0.dll → msys-xxhash-0.dll</code></p></li><li class="lvl-3"><p><code>./_config.yml</code> 文件</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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">deploy:</span><br><span class="line">- type: rsync</span><br><span class="line">  host: IP地址</span><br><span class="line">  user: 使用者名称</span><br><span class="line">  root: 远程主机的根目录</span><br><span class="line">  port: 22</span><br><span class="line">  delete: true</span><br><span class="line">  verbose: true</span><br><span class="line">  ignore_errors: false</span><br></pre></td></tr></table></figure><p>参考 <a href="https://hexo.io/zh-cn/docs/one-command-deployment#Rsync">https://hexo.io/zh-cn/docs/one-command-deployment#Rsync</a></p></li></ol><p>在传大文件（也就10M）时依旧很慢，但比前者速度快些。</p><h3 id="2-2-配置本地Hexo-config-yml">2.2 配置本地Hexo _config.yml<a class="header-anchor" href="#2-2-配置本地Hexo-config-yml"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><code>./_config.yml</code> 文件，同步部署 <code>GitHub、Gitee、云服务器</code></p></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><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"># Deployment - 部署</span></span><br><span class="line"><span class="comment">## Docs: https://hexo.io/zh-cn/docs/one-command-deployment.html</span></span><br><span class="line">deploy:</span><br><span class="line">- <span class="built_in">type</span>: git</span><br><span class="line">  repository: root@IP地址:/opt/git/hexo.git</span><br><span class="line">  branch: master</span><br><span class="line">  commit: Site updated</span><br><span class="line">  message: hexo &#123;&#123; now(<span class="string">&#x27;YYYYMMDD&#x27;</span>) &#125;&#125;</span><br><span class="line">- <span class="built_in">type</span>: git</span><br><span class="line">  repository: git@github.com:mycpen/mycpen.github.io.git</span><br><span class="line">  branch: main</span><br><span class="line">  commit: Site updated</span><br><span class="line">  message: hexo &#123;&#123; now(<span class="string">&#x27;YYYYMMDD&#x27;</span>) &#125;&#125;       <span class="comment"># message为自定义提交信息，默认为 Site updated: YYYY-MM-DD HH:mm:ss</span></span><br><span class="line">- <span class="built_in">type</span>: git</span><br><span class="line">  repository: git@gitee.com:mycpen/mycpen.gitee.io.git</span><br><span class="line">  branch: master</span><br><span class="line">  commit: Site updated</span><br><span class="line">  message: hexo &#123;&#123; now(<span class="string">&#x27;YYYYMMDD&#x27;</span>) &#125;&#125;</span><br></pre></td></tr></table></figure><h3 id="2-3-配置-SSH-免密登录">2.3 配置 SSH 免密登录<a class="header-anchor" href="#2-3-配置-SSH-免密登录"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>本地 SSH 公钥 如<code>~/.ssh/id_rsa.pub</code>  内容添加至云服务器 <code>~/.ssh/authorized_keys</code> 中</p></li></ul><h3 id="2-4-部署">2.4 部署<a class="header-anchor" href="#2-4-部署"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>本地 Hexo 源文件项目下敲</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean ; hexo g ; hexo d</span><br></pre></td></tr></table></figure><h3 id="2-5-使用-NGINX-做-Web-服务器">2.5 使用 NGINX 做 Web 服务器<a class="header-anchor" href="#2-5-使用-NGINX-做-Web-服务器"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>新增虚拟主机配置</p></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><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="built_in">cat</span> /usr/local/nginx/conf/conf.d/blog.cpen.top.conf</span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    listen 443 ssl;</span><br><span class="line"></span><br><span class="line">    server_name blog.cpen.top;</span><br><span class="line"></span><br><span class="line">    error_page  404  /404.html;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 强制HTTPS跳转</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$scheme</span> = <span class="string">&quot;http&quot;</span>) &#123;</span><br><span class="line">        <span class="built_in">return</span>  307 https://$host<span class="variable">$request_uri</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    root /opt/www/hexo;</span><br><span class="line"></span><br><span class="line">    ssl_certificate     /usr/local/nginx/ssl/blog.cpen.top.pem;</span><br><span class="line">    ssl_certificate_key /usr/local/nginx/ssl/blog.cpen.top.key;</span><br><span class="line"></span><br><span class="line">    access_log /data/service_logs/nginx/blog.cpen.top_access.log misc;</span><br><span class="line">    error_log  /data/service_logs/nginx/blog.cpen.top_error.log;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>最后浏览器访问 <a href="https://blog.cpen.top/">https://blog.cpen.top/</a></p></li></ul><h2 id="三-注意点">三. 注意点<a class="header-anchor" href="#三-注意点"></a></h2><ol><li class="lvl-3"><p>配置 SSH <code>免密</code>；</p></li><li class="lvl-3"><p>存储目录<code>授权</code>；</p><p>给工作树路径 /opt/www/hexo 777 权限，~~一开始没授权 访问报 403，环境为 CentOS 8.2；~~原因找到了，第 5 点。</p></li><li class="lvl-3"><p>开放端口。注意是否需要在云服务器新增<code>安全组策略</code>，80、443 端口需要打开；</p></li><li class="lvl-3"><p>SELinux 等原因。</p></li><li class="lvl-3"><p><code>403 权限问题</code><br>后面查询发现了 <code>403</code> 的原因，Nginx 编译安装时我指定了启动用户为 普通用户（默认为 nobody），导致起的工作进程权限不够。而 Hexo 上传的新的静态文件权限不为 777。</p><p>所以修改 Nginx 的启动用户为 root。</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">$ vim /usr/local/nginx/conf/nginx.conf</span><br><span class="line">user    root;</span><br><span class="line"></span><br><span class="line">$ nginx -s reload</span><br></pre></td></tr></table></figure></li></ol><h2 id="四-参考文章">四. 参考文章<a class="header-anchor" href="#四-参考文章"></a></h2><p><a href="https://hexo.io/zh-cn/docs/one-command-deployment">官方文档 一键部署</a></p><p><code>*</code> <a href="https://blog.csdn.net/wangjienull/article/details/109227984">使用 Git Hooks 部署至云服务器</a></p><p><a href="https://blog.csdn.net/qq_38679881/article/details/122730065">使用 Git Hooks 部署至云服务器</a></p><p><a href="https://blog.csdn.net/Y_Ace/article/details/121764537">使用 Git Hooks 部署至云服务器 新增 git 用户、授权目录</a></p><p><code>*</code> <a href="https://www.idczone.net/news/3261.html/">访问403 修改 Nginx 启动用户为 root</a></p><p><code>*</code> <a href="https://blog.csdn.net/alexis7/article/details/109569218">访问403 授权 777 目录</a></p><p><a href="https://www.likecs.com/show-204450505.html">访问 403 CentOS 8 环境</a></p><p><a href="http://www.wjhsh.net/reblue520-p-6239733.html">访问 403 SELinux 未关闭</a></p><hr>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Troubleshooting </tag>
            
            <tag> Git </tag>
            
            <tag> Hexo </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>03_Hexo-Github Pages 个人博客源文件备份迁移</title>
      <link href="/posts/43907.html"/>
      <url>/posts/43907.html</url>
      
        <content type="html"><![CDATA[<h1 id="Github-Pages-个人博客源文件">Github Pages 个人博客源文件<a class="header-anchor" href="#Github-Pages-个人博客源文件"></a></h1><h2 id="1-起因">1. 起因<a class="header-anchor" href="#1-起因"></a></h2><ol><li class="lvl-3"><p><strong>源文件保存问题</strong>：<a href="https://hexo.io/">Hexo</a> 搭建的个人博客，其远程仓库只保存 <a href="https://hexo.io/">Hexo</a> 发布后的 Html 静态文件，博客的源 Markdown 文件、主题配置等资源还在本地；</p></li><li class="lvl-3"><p><strong>源文件隐私</strong>：考虑到源文件的隐秘性，放弃了新建分支存放源文件，而采用新建项目来存放。</p></li></ol><h2 id="2-作用">2. 作用<a class="header-anchor" href="#2-作用"></a></h2><ol><li class="lvl-3"><p>源文件<strong>备份</strong>；</p></li><li class="lvl-3"><p>博客的可移植性。</p></li></ol><h2 id="3-注意点">3. 注意点<a class="header-anchor" href="#3-注意点"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>删除 <code>themes</code> 文件下 clone 的主题文件下的 <code>.git</code> 文件；</p></li><li class="lvl-2"><p><code>node-modules/</code> 中，自定义了一些配置，改动了源码，需要同步，.gitignore 中不写入；</p><p>.gitignore 配置如下</p></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></pre></td><td class="code"><pre><span class="line">.DS_Store</span><br><span class="line">db.json</span><br><span class="line">*.<span class="built_in">log</span></span><br><span class="line">public/</span><br><span class="line">.deploy*/</span><br></pre></td></tr></table></figure><h2 id="4-配置步骤">4. 配置步骤<a class="header-anchor" href="#4-配置步骤"></a></h2><ol><li class="lvl-3"><p>将仓库克隆至本地；</p></li><li class="lvl-3"><p>安装 <a href="https://nodejs.org/en/">Node.js</a> 和 <a href="https://git-scm.com/">GIt</a>；<a href="https://hexo.io/zh-cn/docs/#%E5%AE%89%E8%A3%85">官方中文文档</a></p></li><li class="lvl-3"><p>安装 <a href="https://hexo.io/zh-cn/docs/#%E5%AE%89%E8%A3%85-Hexo">Hexo</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">$ npm install -g hexo-cli</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>如之前未配置 Git 信息，则需配置下；</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">git config --global user.email <span class="string">&quot;you@example.com&quot;</span></span><br><span class="line">git config --global user.name <span class="string">&quot;Your Name&quot;</span></span><br></pre></td></tr></table></figure><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830155020917.png" alt=""></p></blockquote></li><li class="lvl-3"><p>执行 <a href="https://hexo.io/zh-cn/docs/commands">Hexo 命令</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">hexo clean ; hexo g ; hexo d ; hexo s</span><br></pre></td></tr></table></figure><blockquote><p>过程顺利。</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830155418809.png" alt=""></p></blockquote></li><li class="lvl-3"><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">git pull ; git add . ; git commit -m <span class="string">&#x27;backup&#x27;</span> ; git push</span><br></pre></td></tr></table></figure><p>命令组合<code>git pull ; hexo clean ; hexo g ; hexo d ; git add . ; git commit -m 'backup' ; git push</code></p></li></ol><h2 id="5-参考文章">5. 参考文章<a class="header-anchor" href="#5-参考文章"></a></h2><p><a href="https://www.jianshu.com/p/a04d75ee9ab6">Hexo 和博客源文件之间的关系</a></p><p><a href="https://hexo.io/zh-cn/docs/github-pages">官方文档分支示例为 gh-pages</a></p><p><a href="https://zhuanlan.zhihu.com/p/127027266">新建仓库样例1</a></p><p><a href="https://blog.csdn.net/weixin_39961522/article/details/112096073">新建仓库样例2</a></p><p><a href="https://blog.csdn.net/stringwinder/article/details/126287503">新建仓库样例3</a></p><p><a href="https://zhuanlan.zhihu.com/p/71544809">新建分支样例1</a></p><p><a href="https://zhuanlan.zhihu.com/p/476603074">新建分支样例2</a></p><hr>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>02_Hexo-出错排查-Nunjucks Error</title>
      <link href="/posts/5162.html"/>
      <url>/posts/5162.html</url>
      
        <content type="html"><![CDATA[<h1 id="Hexo-出错排查">Hexo 出错排查<a class="header-anchor" href="#Hexo-出错排查"></a></h1><h2 id="一-Nunjucks-Error">一. Nunjucks Error<a class="header-anchor" href="#一-Nunjucks-Error"></a></h2><p><strong>现象描述</strong></p><blockquote><p>Unhandled rejection Nunjucks Error: _posts/xxx.md [Line 84, Column 13] <code>unknown block tag: 标签</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220829151147643.png" alt=""></p></blockquote><p><strong>解决办法</strong></p><blockquote><p>参考<a href="https://hexo.io/docs/troubleshooting.html#Escape-Contents">https://hexo.io/docs/troubleshooting.html#Escape-Contents</a><br><a href="https://blog.csdn.net/Calvin_zhou/article/details/109303640">https://blog.csdn.net/Calvin_zhou/article/details/109303640</a></p><p>泄露（Escape）内容</p><p>Hexo 使用 <a href="https://mozilla.github.io/nunjucks/">Nunjucks</a> 来解析文章（旧版本使用 <a href="http://paularmstrong.github.io/swig/">Swig</a>，两者语法类似），内容若包含 <code>&#123;&#123; &#125;&#125;</code> 或 <code>&#123;% %&#125;</code> 可能导致解析错误，您可以用 <a href="https://hexo.io/docs/tag-plugins#Raw"><code>raw</code></a> 标签包裹，single backtick <code>&#123;&#123; &#125;&#125;</code> 或 triple backtick 来避免潜在问题发生。<br>Alternatively, Nunjucks tags can be disabled through the renderer’s option (if supported), <a href="https://hexo.io/api/renderer#Disable-Nunjucks-tags">API</a> or <a href="https://hexo.io/docs/front-matter">front-matter</a>.</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">&#123;% raw %&#125;</span><br><span class="line">Hello &#123;&#123; world &#125;&#125;</span><br><span class="line">&#123;% endraw %&#125;</span><br></pre></td></tr></table></figure><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">Hello &#123;&#123; world &#125;&#125;</span><br><span class="line">```</span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Troubleshooting </tag>
            
            <tag> Hexo </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>02_Error-记 Win下 Git 忘加入 PATH</title>
      <link href="/posts/cb0ae693.html"/>
      <url>/posts/cb0ae693.html</url>
      
        <content type="html"><![CDATA[<h1 id="1-问题描述">1. 问题描述<a class="header-anchor" href="#1-问题描述"></a></h1><p>右键 vscode 打开项目，使用 git bash 作为终端 敲命令，有些仓库出现 <code>bash: xxx: command not found</code></p><p>原因：git 下的 bin 目录未加入环境变量，基础命令找不到</p><h1 id="2-加入环境变量">2. 加入环境变量<a class="header-anchor" href="#2-加入环境变量"></a></h1><p>xxx/git/bin 加入 PATH 变量</p><blockquote><p>参考自：<a href="https://blog.csdn.net/u012724595/article/details/114740935">https://blog.csdn.net/u012724595/article/details/114740935</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221026212837312.png" alt="image-20221026212837312" style="zoom:50%;" /><p>后话：xxx/bin/cmd 应该是安装 git 的时候选勾加上的。直接右键 git bash 是能查找到命令的，先前 用 vscode 打开经常用的仓库也能找到命令（为啥没报 not found 不确定原因）</p></blockquote>]]></content>
      
      
      <categories>
          
          <category> Error </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Error </tag>
            
            <tag> Git </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>02_Other-AList 搭建云盘</title>
      <link href="/posts/6a2caa19.html"/>
      <url>/posts/6a2caa19.html</url>
      
        <content type="html"><![CDATA[<h1 id="1-参考链接">1. 参考链接<a class="header-anchor" href="#1-参考链接"></a></h1><blockquote><p><a href="https://nn.ci/">作者 Xhofe</a></p><p><a href="https://alist.nn.ci/zh/">AList 官方文档</a></p><ul class="lvl-1"><li class="lvl-2"><p><a href="https://alist.nn.ci/zh/guide/">官方文档.指南</a></p></li><li class="lvl-2"><p><a href="https://alist.nn.ci/zh/guide/drivers/">官方文档.指南.添加存储</a></p></li><li class="lvl-2"><p><a href="https://alist.nn.ci/zh/config/">官方文档.配置</a></p></li></ul><p><a href="https://github.com/alist-org/alist/blob/main/README_cn.md">Github 地址</a></p><ul class="lvl-1"><li class="lvl-2"><p><a href="https://github.com/alist-org/alist/blob/main/README_cn.md#special-sponsors">Special sponsors</a></p><ul class="lvl-3"><li class="lvl-4"><a href="https://zhaoziyuan.la/">找资源 - 阿里云盘资源搜索引擎</a></li><li class="lvl-4"><a href="https://kinhdown.com/?Type=Tutorials">KinhDown 百度云盘不限速下载！永久免费！已稳定运行3年！非常可靠!</a></li></ul></li></ul><blockquote><p><strong>AList</strong>：🗂️ 一个支持多种存储的文件列表程序，使用 Gin 和 Solidjs。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">使用简单</span><br><span class="line">AList 从一开始就设计为易于安装，并且可以在所有平台上使用。</span><br><span class="line"></span><br><span class="line">多种存储</span><br><span class="line">AList 支持多个存储提供商，包括本地存储、阿里云盘、OneDrive、Google Drive 等，且易于拓展。</span><br><span class="line"></span><br><span class="line">支持 WebDAV</span><br><span class="line">AList 支持所有 WebDAV 存储，这是一种用于访问文件的标准。</span><br><span class="line"></span><br><span class="line">黑暗模式</span><br><span class="line">自由切换明暗模式</span><br><span class="line"></span><br><span class="line">受保护的路由</span><br><span class="line">为特定路径添加密码保护和身份验证</span><br><span class="line"></span><br><span class="line">文件预览</span><br><span class="line">支持视频、音频、文档、PDF、图片预览等，甚至支持 ipa 安装</span><br><span class="line"></span><br><span class="line">打包下载</span><br><span class="line">使用浏览器的 stream api 支持打包下载，无需使用服务器</span><br><span class="line"></span><br><span class="line">更多新功能</span><br><span class="line">包括文本编辑器、README/HTML 渲染、文件永久链接、Cloudflare Workers 代理等</span><br></pre></td></tr></table></figure></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 一键脚本</span></span><br><span class="line">curl -fsSL <span class="string">&quot;https://alist.nn.ci/v3.sh&quot;</span> | bash -s install</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight nginx"><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"># 反向代理</span></span><br><span class="line"><span class="section">location</span> / &#123;</span><br><span class="line">  <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">  <span class="attribute">proxy_set_header</span> Host <span class="variable">$http_host</span>;</span><br><span class="line">  <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">  <span class="attribute">proxy_set_header</span> Range <span class="variable">$http_range</span>;</span><br><span class="line"><span class="attribute">proxy_set_header</span> If-Range <span class="variable">$http_if_range</span>;</span><br><span class="line">  <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">  <span class="attribute">proxy_pass</span> http://127.0.0.1:5244;</span><br><span class="line">  <span class="comment"># the max size of file to upload</span></span><br><span class="line">  <span class="attribute">client_max_body_size</span> <span class="number">20000m</span>;</span><br><span class="line">&#125;</span><br><span class="line"></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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 命令</span></span><br><span class="line">启动: systemctl start alist</span><br><span class="line">关闭: systemctl stop alist</span><br><span class="line">配置开机自启: systemctl <span class="built_in">enable</span> alist</span><br><span class="line">取消开机自启: systemctl <span class="built_in">disable</span> alist</span><br><span class="line">状态: systemctl status alist</span><br><span class="line">重启: systemctl restart alist</span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> /opt/alist</span><br><span class="line"><span class="comment"># 运行程序</span></span><br><span class="line">./alist server</span><br><span class="line"><span class="comment"># 获得管理员信息</span></span><br><span class="line">./alist admin</span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote><hr><h1 id="2-个人样例">2. 个人样例<a class="header-anchor" href="#2-个人样例"></a></h1><h2 id="反向代理">反向代理<a class="header-anchor" href="#反向代理"></a></h2><figure class="highlight nginx"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># root @ CentOS in /usr/local/nginx/conf/conf.d</span></span><br><span class="line">$ <span class="attribute">cat</span> cpen.top.conf</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="comment"># AList 个人云盘</span></span><br><span class="line"><span class="comment"># https://github.com/alist-org/alist/blob/main/README_cn.md</span></span><br><span class="line">server &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">8004</span> ssl;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">server_name</span> cpen.top;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="attribute">proxy_pass</span> http://127.0.0.1:5244;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Host <span class="variable">$http_host</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Range <span class="variable">$http_range</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> If-Range <span class="variable">$http_if_range</span>;</span><br><span class="line">        <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">        <span class="comment"># the max size of file to upload</span></span><br><span class="line">        <span class="attribute">client_max_body_size</span> <span class="number">20000m</span>;</span><br><span class="line">        <span class="attribute">proxy_connect_timeout</span>      <span class="number">120</span>;   <span class="comment"># 加大120</span></span><br><span class="line">        <span class="attribute">proxy_send_timeout</span>         <span class="number">120</span>;   <span class="comment"># 加大120</span></span><br><span class="line">        <span class="attribute">proxy_read_timeout</span>         <span class="number">120</span>;   <span class="comment"># 加大120</span></span><br><span class="line">        <span class="attribute">proxy_http_version</span> <span class="number">1</span>.<span class="number">1</span>;           <span class="comment"># 开启后端，长连接</span></span><br><span class="line">        <span class="attribute">proxy_set_header</span> Connection <span class="string">&quot;&quot;</span>;   <span class="comment"># 开启后端，长连接</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_certificate</span>     /usr/local/nginx/ssl/cpen.top.pem;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /usr/local/nginx/ssl/cpen.top.key;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">access_log</span> /data/service_logs/nginx/cpen.top_access.log misc;</span><br><span class="line">    <span class="attribute">error_log</span>  /data/service_logs/nginx/cpen.top_error.log;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="设置-全局-自定义内容">设置.全局.自定义内容<a class="header-anchor" href="#设置-全局-自定义内容"></a></h2><figure class="highlight html"><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="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;display: flex; flex-direction: column; align-items: center;&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span> <span class="attr">rel</span>=<span class="string">&quot;noopener noreferrer&quot;</span> <span class="attr">class</span>=<span class="string">&quot;chakra-link line1 css-f4h6uy&quot;</span> <span class="attr">href</span>=<span class="string">&quot;http://beian.miit.gov.cn&quot;</span> <span class="attr">style</span>=<span class="string">&quot;&quot;</span>&gt;</span>苏ICP备xxx号<span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Other </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Other </tag>
            
            <tag> AList </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>30_Linux基础-shell编程-sed</title>
      <link href="/posts/4cb758ea.html"/>
      <url>/posts/4cb758ea.html</url>
      
        <content type="html"><![CDATA[<h1 id="一-sed的整行替换-c">一. sed的整行替换  c<a class="header-anchor" href="#一-sed的整行替换-c"></a></h1><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#示例：sed的整行替换  c</span></span><br><span class="line">[root@cPen_A 10]# <span class="built_in">cp</span> /etc/sysconfig/selinux .</span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;/^SELINUX=/c SELINUX=disabled&#x27;</span> selinux </span><br><span class="line">[root@cPen_A 10]# <span class="built_in">cp</span> /etc/ssh/sshd_config .</span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;/^#Port/c Port 2233&#x27;</span> sshd_config </span><br><span class="line">[root@cPen_A 10]# <span class="built_in">cat</span> sshd_config |grep Port</span><br><span class="line">Port 2233</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011221851457.png" alt=""></p></blockquote><hr><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#注：对文件的修改  用sed比较好</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A 10]# <span class="built_in">cp</span> /etc/sysconfig/network-scripts/ifcfg-ens33 .<span class="comment">#注：网卡配置文件</span></span><br><span class="line">[root@cPen_A 10]# vim ifcfg-ens33 </span><br><span class="line">BOOTPROTO=<span class="string">&quot;none&quot;</span><span class="comment">#注：none 静态配置ip地址dhcp动态获得ip</span></span><br><span class="line">NAME=<span class="string">&quot;ens33&quot;</span><span class="comment">#注：网卡连接的名字</span></span><br><span class="line">UUID=<span class="string">&quot;831f1350-14c2-46db-bf53-1937c5feb8f5&quot;</span><span class="comment">#注：网卡的设备编号的唯一值</span></span><br><span class="line">DEVICE=<span class="string">&quot;ens33&quot;</span><span class="comment">#注：网卡设备的名字</span></span><br><span class="line">ONBOOT=<span class="string">&quot;yes&quot;</span><span class="comment">#注：开机的时候是否激活  yes表示激活启动  no禁用</span></span><br><span class="line">IPADDR=<span class="string">&quot;192.168.0.38&quot;</span><span class="comment">#注：ip地址</span></span><br><span class="line">NETMASK=255.255.255.0<span class="comment">#注：子网掩码</span></span><br><span class="line">GATEWAY=192.168.0.1<span class="comment">#注：默认网关路由器的接口地址</span></span><br><span class="line">DNS1=192.168.0.1<span class="comment">#注：首选dns服务器</span></span><br><span class="line">DNS2=114.114.114.114<span class="comment">#注：备用dns服务器</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：将ip地址替换，使用sed  整行替换</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：光猫/调制解调器（modem）</span></span><br></pre></td></tr></table></figure><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011221926041.png" alt=""></p></blockquote><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011221940988.png" alt=""></p><p>需求分析：</p><ol><li class="lvl-3"><p>read或者位置变量</p></li><li class="lvl-3"><p>修改配置文件  sed（整行替换 或 局部替换）</p></li><li class="lvl-3"><p>ip合法判断  --&gt; 正则</p></li></ol></blockquote><hr><h1 id="二-sed的w命令-写入文件">二. sed的w命令  写入文件<a class="header-anchor" href="#二-sed的w命令-写入文件"></a></h1><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><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">sed的w命令  写入文件</span><br><span class="line"><span class="comment">#示例：把以#开头的行 不写到文件里</span></span><br><span class="line">[root@cPen_A 10]# sed <span class="string">&#x27;/^#/!w a.txt&#x27;</span> selinux </span><br><span class="line">[root@cPen_A 10]# <span class="built_in">cat</span> selinux |sed <span class="string">&#x27;/^#/!w abc.txt&#x27;</span></span><br><span class="line">[root@cPen_A 10]# <span class="built_in">cat</span> a.txt </span><br><span class="line">SELINUX=disabled</span><br><span class="line">SELINUXTYPE=targeted </span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011222050156.png" alt=""></p></blockquote><hr><h1 id="三-sed的替换-核心功能">三. sed的替换 --&gt;核心功能<a class="header-anchor" href="#三-sed的替换-核心功能"></a></h1><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011222143284.png" alt=""></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></pre></td><td class="code"><pre><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;s/xiaomi/redmi/&#x27;</span> phone.txt <span class="comment">#注：替换每一行的第1个xiaomi替换为redmi</span></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;s/vivo/nokia/2&#x27;</span> phone.txt <span class="comment">#注：替换每一行的第2个vivo替换为nokia</span></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;s/oppo/meizu/g&#x27;</span> phone.txt <span class="comment">#注：每一行所有的oppo替换为meizu</span></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;s/xiaomi/redmi/2g&#x27;</span> phone.txt <span class="comment">#注：替换每一行的第2个后所有xiaomi全部替换为redmi</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;/^ONBOOT/ s/yes/no/&#x27;</span> ifcfg-ens33 <span class="comment">#注：查找替换 （局部替换）</span></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;8 s/192.168.0.1/192.168.0.2/&#x27;</span> ifcfg-ens33 <span class="comment">#注：根据 行号替换 （局部替换）</span></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;8 s/GATEWAY.*/GATEWAY=192.168.0.2/&#x27;</span> ifcfg-ens33 <span class="comment">#注：整行替换</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：把所有apple删除 --&gt; 删除部分字符串</span></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;s/apple//g&#x27;</span> phone.txt <span class="comment">#注：拿空的去替换它</span></span><br><span class="line"></span><br><span class="line">\n  换行</span><br><span class="line">\t  tab</span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;s/s/\t/g&#x27;</span> phone.txt </span><br><span class="line"></span><br><span class="line">---------------------------------------------------------</span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;1c sanchuang&#x27;</span> /etc/hostname </span><br><span class="line"></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;3,5s/^/#/&#x27;</span> phone.txt <span class="comment">#注：3-5行加注释</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;3,5s/$/ sanchuang/&#x27;</span> phone.txt <span class="comment">#注：3-5行 末尾加sanchuang</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;/^DNS2/ s/^/#/&#x27;</span> ifcfg-ens33 <span class="comment">#注：注释</span></span><br><span class="line"><span class="comment">#DNS2=114.114.114.114</span></span><br></pre></td></tr></table></figure></blockquote><hr><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011222225313.png" alt=""></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="comment">#示例：</span></span><br><span class="line">[root@cPen_A 10]# sed -i <span class="string">&#x27;s#/sbin/nologin#/bin/bash#&#x27;</span> passwd </span><br></pre></td></tr></table></figure></blockquote><hr><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011222251704.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment">#示例：</span></span><br><span class="line">[root@cPen_A 10]# <span class="built_in">cat</span> c.txt </span><br><span class="line">0.0.0.0</span><br><span class="line">1.1.1.1</span><br><span class="line">2.2.2.2</span><br><span class="line">[root@cPen_A 10]# <span class="built_in">cat</span> c.txt|sed -n <span class="string">&#x27;s/$/:80/;H;$&#123;x;s/\n/,/2g;p&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">0.0.0.0:80,1.1.1.1:80,2.2.2.2:80</span><br><span class="line"></span><br><span class="line"> h H    Copy/append pattern space to hold space.</span><br><span class="line"></span><br><span class="line">       g G    Copy/append hold space to pattern space.</span><br><span class="line"></span><br><span class="line"> x      Exchange the contents of the hold and pattern spaces.</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@localhost 10]# <span class="built_in">cat</span> c.txt |<span class="built_in">tr</span> <span class="string">&#x27;\n&#x27;</span> <span class="string">&#x27;,&#x27;</span>|sed -n   <span class="string">&#x27;s/,/:80&amp;/g;p&#x27;</span>|awk -F, <span class="string">&#x27;OFS=&quot;,&quot;&#123;print $1,$2,$3&#125;&#x27;</span></span><br><span class="line">0.0.0.0:80,1.1.1.1:80,2.2.2.2:80</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011222324095.png" alt=""></p></blockquote><hr><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">sed的命令中&amp;的用法</span><br><span class="line">&amp;用于表示替换命令中的匹配模式</span><br></pre></td></tr></table></figure><hr><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011222349210.png" alt=""></p><p>(正则)  --》对应一个标签–》分组</p><p>从左到右 1开始</p><p>\3 引用第3个分组（标签）</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">示例：</span><br><span class="line">[root@cPen_A 10]# <span class="built_in">echo</span> aaa bbb 123456 ccc | sed -r <span class="string">&#x27;s/([a-z]+) ([a-z]+) ([0-9]+) ([a-z]+)/\3/&#x27;</span></span><br><span class="line">123456</span><br></pre></td></tr></table></figure></blockquote><hr><h1 id="四-模式空间-pattern-space-和暂存空间（hold-space）相关的命令">四. 模式空间(pattern space)和暂存空间（hold space）相关的命令<a class="header-anchor" href="#四-模式空间-pattern-space-和暂存空间（hold-space）相关的命令"></a></h1><blockquote><p>模式空间(pattern space)和暂存空间（hold space）相关的命令：</p><p>n 输出模式空间行，读取下一行替换当前模式空间的行，执行下一条处理命令而非第一条命令。</p><p>N 读入下一行，追加到模式空间行后面，此时模式空间有两行。</p><p>h 把模式空间里的行拷贝到暂存空间。</p><p>H 把模式空间里的行追加到暂存空间。</p><p>g 用暂存空间的内容替换模式空间的行。</p><p>G 把暂存空间的内容追加到模式空间的行后。</p><p>x 将暂存空间的内容于模式空间里的当前行互换。</p><p>！ 对所选行以外的所有行应用命令。</p><p><a href="http://blog.csdn.net/itsenlin/article/details/21129405">http://blog.csdn.net/itsenlin/article/details/21129405</a></p></blockquote><hr><h1 id="五-练习">五. 练习<a class="header-anchor" href="#五-练习"></a></h1><figure class="highlight markdown"><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></pre></td><td class="code"><pre><span class="line">练习：</span><br><span class="line">1.编写一个修改ip地址的脚本</span><br><span class="line">提醒用户输入ip、子网掩码、网关、dns服务器地址</span><br><span class="line">直接修改网卡配置文件，然后刷新服务让输入的ip地址信息生效</span><br><span class="line">需要检查输入ip地址是否合法，不能输入空的内容或者字母，如果ip地址不合法或者输入空内容、字母都给予提醒</span><br><span class="line">提醒：空的内容包括回车和空格，可以是多个空格</span><br><span class="line"></span><br><span class="line">需求分析：</span><br><span class="line"><span class="code">1.read或者位置变量</span></span><br><span class="line"><span class="code">2.修改配置文件  sed</span></span><br><span class="line"><span class="code">3.ip合法判断--》正则</span></span><br><span class="line"><span class="code"></span></span><br><span class="line">2.请将所有的非root用户的uid后面加一个0，gid前面加一个1</span><br><span class="line"><span class="code">复制/etc/passwd 到当前目录下操作</span></span><br><span class="line"><span class="code"></span></span><br><span class="line">3给下列含有大写字母的行，在数字后追加sanchuang  --》sed</span><br><span class="line">   abcd6Sdd9dde</span><br><span class="line">   islHishbxld</span><br><span class="line">   goBke8fji</span><br><span class="line">   daa5nshXxge</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">4.自己编辑一个文件test.txt，内容如下：</span><br><span class="line"><span class="code">0.0.0.0</span></span><br><span class="line"><span class="code">1.1.1.1</span></span><br><span class="line"><span class="code">2.2.2.2</span></span><br><span class="line"><span class="code">输出以下形式：</span></span><br><span class="line"><span class="code">0.0.0.0:80,1.1.1.1:80,2.2.2.2:80</span></span><br><span class="line"><span class="code">5.sed取出/etc/passwd文件的第一列</span></span><br><span class="line"><span class="code">6.sed将PATH环境变量中的冒号换成换行</span></span><br><span class="line"><span class="code">7.sed将PATH环境变量斜杠/换成斜杠\</span></span><br><span class="line"><span class="code">8.sed修改SELINUX配置文件从开启(enforcing)变成禁用(disabled)</span></span><br><span class="line"><span class="code">/etc/sysconfig/selinux</span></span><br><span class="line"><span class="code">9.去掉/etc/passwd文件中第二个字段的x</span></span><br><span class="line"><span class="code">10.将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=no修改为yes或者修改下IPADDR后面的ip地址</span></span><br><span class="line"><span class="code">只显示ip add的ip地址</span></span><br><span class="line"><span class="code">11.复制/etc/ssh/sshd_config 到当前目录，然后操作。将sshd_config里的端口号修改为8899</span></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Shell </tag>
            
            <tag> Sed </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>29_Linux基础-shell编程-awk-sed</title>
      <link href="/posts/3ae7567f.html"/>
      <url>/posts/3ae7567f.html</url>
      
        <content type="html"><![CDATA[<p><strong>awk</strong></p><p>输入分隔符（-F、FS）、输出分隔符（OFS）</p><hr><p>awk里引用shell变量</p><h1 id="一-awk和shell变量交换的问题">一. awk和shell变量交换的问题<a class="header-anchor" href="#一-awk和shell变量交换的问题"></a></h1><p><strong>awk和shell变量交换的问题</strong></p><p>1、使用 -v选项</p><p>2、使用双引号，但是awk内部的$0 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mtext>等</mtext></mrow><annotation encoding="application/x-tex">1等</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord">1</span><span class="mord cjk_fallback">等</span></span></span></span>符号前需要使用\转义</p><p>3、使用单引号，将变量引起来，然后前面加一个$符号再次引用变量的值，相当于取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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#示例：使用 -v选项</span></span><br><span class="line">[root@cPen_A ~]# sg=<span class="string">&quot;panjinhao&quot;</span></span><br><span class="line">[root@cPen_A ~]# <span class="built_in">echo</span> <span class="variable">$sg</span></span><br><span class="line">panjinhao</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">echo</span>|awk <span class="string">&#x27;&#123;print $sg&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A ~]# <span class="built_in">echo</span>|awk -v bsg=<span class="variable">$sg</span> <span class="string">&#x27;&#123;print bsg&#125;&#x27;</span></span><br><span class="line">panjinhao</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">ls</span>|awk -v bsg=<span class="variable">$sg</span> <span class="string">&#x27;&#123;print bsg&#125;&#x27;</span></span><br><span class="line">panjinhao<span class="comment">#注：ls 输出多行</span></span><br><span class="line">panjinhao</span><br><span class="line">……</span><br><span class="line">panjinhao</span><br><span class="line"></span><br><span class="line">[root@cPen_A lianxi]# vim test2.sh </span><br><span class="line">awk -v var=<span class="variable">$1</span> -F: <span class="string">&#x27;$1==var&#123;print NR,$0&#125;&#x27;</span> /etc/passwd</span><br><span class="line">[root@cPen_A lianxi]# bash test2.sh root</span><br><span class="line">1 root:x:0:0:root:/root:/bin/bash</span><br><span class="line">[root@cPen_A lianxi]# bash test2.sh sanchuang</span><br><span class="line">21 sanchuang:x:1000:1000::/home/sanchuang:/bin/bash</span><br><span class="line"><span class="comment">#注：第1个$1  位置变量，第2个$1 第1个字段</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：使用双引号，但是awk内部的$0 $1等$符号前需要使用\转义</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">mv</span>=<span class="string">&quot;zhangjie&quot;</span></span><br><span class="line">[root@cPen_A lianxi]# useradd zhangjie_123</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&quot;/^<span class="variable">$mv</span>/&#123;print \$1,\$3&#125;&quot;</span></span><br><span class="line">zhangjie_123 12358</span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：使用单引号，将变量引起来，然后前面加一个$符号再次引用变量的值，相当于取2次值</span></span><br><span class="line">[root@cPen_A lianxi]# sg=3</span><br><span class="line">[root@cPen_A lianxi]# awk -F: <span class="string">&#x27;/root/&#123;print $1,$&#x27;</span><span class="variable">$sg</span><span class="string">&#x27;&#125;&#x27;</span> /etc/passwd</span><br><span class="line">root 0</span><br><span class="line">operator 11</span><br></pre></td></tr></table></figure><hr><h1 id="二-进程和进程之间通信的方式">二. 进程和进程之间通信的方式<a class="header-anchor" href="#二-进程和进程之间通信的方式"></a></h1><p>1、共享内存</p><p>2、信号量</p><p>3、信号</p><p>4、管道</p><p>5、队列</p><p>6、Socket</p><hr><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">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/shadow</span><br><span class="line">第2个字段：密码字段</span><br><span class="line">*操作系统自带的，没有密码的</span><br><span class="line">!!用户建的，没有密码的</span><br><span class="line">提示：密码字段为*、!!表示没有设置密码；密码字段为空说明密码被清除。</span><br><span class="line"><span class="comment">#示例：没有设置密码的用户</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/shadow|awk -F: <span class="string">&#x27;BEGIN&#123;i=0&#125;length($2)&lt;=2&#123;print $1,&quot;没有设置密码&quot;;i++&#125;END&#123;print &quot;一共有&quot;i&quot;个用户&quot;&#125;&#x27;</span></span><br></pre></td></tr></table></figure><hr><h1 id="三-awk内置函数">三. awk内置函数<a class="header-anchor" href="#三-awk内置函数"></a></h1><p>awk内置的函数：</p><p>​length()</p><p>​int()</p><p>​sqrt()</p><p>​system()</p><p>String Functions</p><p>​sub()</p><p>​index()</p><p>​length()</p><p>​split()</p><p>Numeric Functions</p><p>yum install python3安装python3</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"><span class="comment">#示例：生成0-1之间随机数</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">echo</span> |awk <span class="string">&#x27;&#123;print rand()&#125;&#x27;</span></span><br><span class="line">0.237788</span><br><span class="line"><span class="comment">#示例：产生0-100之间随机数</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">echo</span> |awk <span class="string">&#x27;&#123;print rand()*100&#125;&#x27;</span></span><br><span class="line">23.7788</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">echo</span> |awk <span class="string">&#x27;&#123;print int(rand()*100)&#125;&#x27;</span></span><br><span class="line">23</span><br></pre></td></tr></table></figure><hr><h1 id="四-流控">四. 流控<a class="header-anchor" href="#四-流控"></a></h1><p>流控：流程控制control flow</p><p>for</p><p>while</p><p>case</p><p>if</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"><span class="keyword">if</span>语句</span><br><span class="line">单分支</span><br><span class="line">[root@cPen_A lianxi]# awk -F: <span class="string">&#x27;&#123;if($1 ~ /\&lt;...\&gt;/)print $0&#125;&#x27;</span> /etc/passwd</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">[root@cPen_A lianxi]# awk -F: <span class="string">&#x27;$1 ~ /\&lt;.&#123;3&#125;\&gt;/&#123;print $0&#125;&#x27;</span> /etc/passwd</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line"></span><br><span class="line">双分支</span><br><span class="line">[root@cPen_A lianxi]# awk -F: <span class="string">&#x27;&#123;if($1 ~ /\&lt;...\&gt;/)print $0;else print &quot;不符合要求&quot;&#125;&#x27;</span> /etc/passwd</span><br><span class="line">不符合要求</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br></pre></td></tr></table></figure><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220439733.png" alt=""></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><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">#练习</span></span><br><span class="line">/etc/passwd</span><br><span class="line"><span class="variable">$3</span>是uid 用户的编号</span><br><span class="line">如果用户的编号是0  --&gt; 管理员</span><br><span class="line">1~999  --&gt; 程序用户</span><br><span class="line">大于1000 --&gt; 普通用户</span><br><span class="line">最后统计出有多少管理员，多少程序用户，多少普通用户？</span><br><span class="line">-----------------------------------------------------</span><br><span class="line">[root@cPen_A ~]# awk -F: <span class="string">&#x27;BEGIN&#123;x=0;y=0;z=0&#125;&#123;if($3==&quot;0&quot;) &#123;print $1,&quot;管理员&quot;;x++&#125; else if($3&gt;=1 &amp;&amp; $3&lt;=999) &#123;print $1,&quot;程序用户&quot;;y++&#125; else  &#123;print $1,&quot;普通用户&quot;;z++&#125;&#125;END&#123;print &quot;管理员&quot;x,&quot;程序用户&quot;y,&quot;普通用户&quot;z&#125;&#x27;</span> /etc/passwd</span><br><span class="line">root 管理员</span><br><span class="line">bin 程序用户</span><br><span class="line">……</span><br><span class="line">管理员1 程序用户25 普通用户40</span><br></pre></td></tr></table></figure><hr><h1 id="五-awk的for循环、数组">五. awk的for循环、数组<a class="header-anchor" href="#五-awk的for循环、数组"></a></h1><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220532360.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220538243.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220551647.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220605574.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220614623.png" alt=""></p></blockquote><hr><p>awk难点：</p><ol><li class="lvl-3"><p>正则表达</p></li><li class="lvl-3"><p>if</p></li><li class="lvl-3"><p>内置函数</p></li><li class="lvl-3"><p>内置变量</p></li><li class="lvl-3"><p>for，数组array</p></li></ol><hr><h1 id="六-sed">六. sed<a class="header-anchor" href="#六-sed"></a></h1><p>sed是什么？what --&gt; text stream editor<br>有什么用？where  how --&gt; 修改和替换文本 --&gt; modify and substitute</p><p>sed是一种支持正则表达式的非交互式流编工具（stream editor）</p><p>​脚本中修改文本或者文本替换的最佳工具</p><p>交互式：一问一答。比如python3里敲命令</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220732396.png" alt=""></p></blockquote><p><strong>2个空间</strong><br><strong>pattern space --&gt; 处理数据的地方 --&gt; 处理一行数据后，模式空间会清空</strong><br><strong>hold space --&gt; 临时存放数据的地方</strong></p><p>把pattern space放到hold space  命令：h、H</p><p>把hold space放到pattern space  命令：g、G</p><p>#注：性能意识，sed在内存里运行，比磁盘速度快</p><p>#注：容量意识</p><hr><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">#示例：-i选项  直接在文件里进行修改，不输出到屏幕</span></span><br><span class="line">[root@cPen_A lianxi]# sed -i <span class="string">&#x27;s/xiaomi/redmi/g&#x27;</span> test.txt </span><br><span class="line"><span class="comment">#示例：通过管道传过来</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> chen |sed <span class="string">&#x27;s/xiaomi/redmi/g&#x27;</span></span><br></pre></td></tr></table></figure><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220845338.png" alt=""></p></blockquote><hr><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">[root@cPen_A lianxi]# <span class="built_in">cat</span> -n /etc/passwd|<span class="built_in">head</span> |<span class="built_in">tail</span> -6</span><br><span class="line">     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">     6<span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line">     8halt:x:7:0:halt:/sbin:/sbin/halt</span><br><span class="line">     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin</span><br><span class="line">    10operator:x:11:0:operator:/root:/sbin/nologin</span><br><span class="line"><span class="comment">#示例：-n选项  值显示匹配处理的行 （否则会输出所有）</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> -n /etc/passwd|sed -n <span class="string">&#x27;5,10p&#x27;</span></span><br><span class="line">     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">     6<span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line">     8halt:x:7:0:halt:/sbin:/sbin/halt</span><br><span class="line">     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin</span><br><span class="line">    10operator:x:11:0:operator:/root:/sbin/nologin</span><br></pre></td></tr></table></figure><hr><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011220928234.png" alt=""></p></blockquote><h2 id="sed的p命令示例">sed的p命令示例<a class="header-anchor" href="#sed的p命令示例"></a></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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br></pre></td><td class="code"><pre><span class="line">= :输出行号</span><br><span class="line"></span><br><span class="line">p命令输出的时候：</span><br><span class="line">连续的行</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|sed -n <span class="string">&#x27;1,5p&#x27;</span></span><br><span class="line">不连续的行</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|sed -n <span class="string">&#x27;10p;20p&#x27;</span></span><br><span class="line"></span><br><span class="line">示例：sed的p命令示例</span><br><span class="line">sed -n ‘行号1,行号2p’ 输出文件</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|sed -n <span class="string">&#x27;1,5p&#x27;</span><span class="comment">#注：连续用,号</span></span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">daemon:x:2:2:daemon:/sbin:/sbin/nologin</span><br><span class="line">adm:x:3:4:adm:/var/adm:/sbin/nologin</span><br><span class="line">lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|sed -n <span class="string">&#x27;=;1,5p&#x27;</span><span class="comment">#注：=；输出行号</span></span><br><span class="line">1</span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">2</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">3</span><br><span class="line">daemon:x:2:2:daemon:/sbin:/sbin/nologin</span><br><span class="line">4</span><br><span class="line">adm:x:3:4:adm:/var/adm:/sbin/nologin</span><br><span class="line">5</span><br><span class="line">lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">……</span><br><span class="line">14</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> -n /etc/passwd|sed -n <span class="string">&#x27;1,$p&#x27;</span><span class="comment">#注：$p最后一行</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> -n /etc/passwd|sed -n <span class="string">&#x27;5,+5p&#x27;</span><span class="comment">#注：第5行开始 往后加5行</span></span><br><span class="line">     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">     6<span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line">     8halt:x:7:0:halt:/sbin:/sbin/halt</span><br><span class="line">     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin</span><br><span class="line">    10operator:x:11:0:operator:/root:/sbin/nologin</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> -n /etc/passwd|sed -n <span class="string">&#x27;5,100!p&#x27;</span><span class="comment">#注：取反，取1到4行</span></span><br><span class="line">     1root:x:0:0:root:/root:/bin/bash</span><br><span class="line">     2bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">     3daemon:x:2:2:daemon:/sbin:/sbin/nologin</span><br><span class="line">     4adm:x:3:4:adm:/var/adm:/sbin/nologin</span><br><span class="line"><span class="comment">#示例：步长值</span></span><br><span class="line"><span class="comment"># cat -n /etc/passwd|sed -n &#x27;1~2p&#x27;</span></span><br><span class="line"><span class="comment"># cat -n /etc/passwd|sed -n &#x27;2~2p&#x27;</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> -n /etc/passwd|sed -n <span class="string">&#x27;1~2p&#x27;</span><span class="comment">#注：单数行，1开始每次往后2行</span></span><br><span class="line">     1root:x:0:0:root:/root:/bin/bash</span><br><span class="line">     3daemon:x:2:2:daemon:/sbin:/sbin/nologin</span><br><span class="line">     5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line">     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin</span><br><span class="line">    11games:x:12:100:games:/usr/games:/sbin/nologin</span><br><span class="line">    13nobody:x:99:99:Nobody:/:/sbin/nologin</span><br><span class="line">    15dbus:x:81:81:System message bus:/:/sbin/nologin</span><br><span class="line">    17sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin</span><br><span class="line">    19chrony:x:998:996::/var/lib/chrony:/sbin/nologin</span><br><span class="line">    21chenpeng:x:1001:1001::/home/chenpeng:/bin/bash</span><br><span class="line">    23nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> -n /etc/passwd|sed -n <span class="string">&#x27;2~2p&#x27;</span><span class="comment">#注：双数行</span></span><br><span class="line">     2bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">     4adm:x:3:4:adm:/var/adm:/sbin/nologin</span><br><span class="line">     6<span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">     8halt:x:7:0:halt:/sbin:/sbin/halt</span><br><span class="line">    10operator:x:11:0:operator:/root:/sbin/nologin</span><br><span class="line">    12ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin</span><br><span class="line">    14systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin</span><br><span class="line">    16polkitd:x:999:998:User <span class="keyword">for</span> polkitd:/:/sbin/nologin</span><br><span class="line">    18postfix:x:89:89::/var/spool/postfix:/sbin/nologin</span><br><span class="line">    20mysql:x:1000:1000::/home/mysql:/sbin/nologin</span><br><span class="line">    22redis:x:997:995:Redis Database Server:/var/lib/redis:/sbin/nologin</span><br><span class="line"><span class="comment">#示例：shell变量传到sed里</span></span><br><span class="line"><span class="comment">#双引号  推荐</span></span><br><span class="line">[root@localhost lianxi]# num1=6</span><br><span class="line">[root@localhost lianxi]# num2=10</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> -n /etc/passwd|sed -n <span class="string">&quot;<span class="variable">$&#123;num1&#125;</span>,<span class="variable">$&#123;num2&#125;</span>p&quot;</span></span><br><span class="line">     6<span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line">     8halt:x:7:0:halt:/sbin:/sbin/halt</span><br><span class="line">     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin</span><br><span class="line">    10operator:x:11:0:operator:/root:/sbin/nologin</span><br><span class="line"><span class="comment">#单引号</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> -n /etc/passwd|sed -n <span class="string">&#x27;&#x27;</span><span class="variable">$&#123;num1&#125;</span>,<span class="variable">$&#123;num2&#125;</span><span class="string">&#x27;p&#x27;</span></span><br><span class="line">     6<span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">     7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line">     8halt:x:7:0:halt:/sbin:/sbin/halt</span><br><span class="line">     9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin</span><br><span class="line">    10operator:x:11:0:operator:/root:/sbin/nologin</span><br><span class="line"></span><br><span class="line">----------------------------------------------------------</span><br><span class="line"><span class="comment">#示例：显示包含bash的行</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|sed -n <span class="string">&#x27;/bash/p&#x27;</span></span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">chenpeng:x:1001:1001::/home/chenpeng:/bin/bash</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|egrep <span class="string">&quot;bash&quot;</span></span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">chenpeng:x:1001:1001::/home/chenpeng:/bin/bash</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|awk <span class="string">&#x27;/bash/&#x27;</span></span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">chenpeng:x:1001:1001::/home/chenpeng:/bin/bash</span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：输出#号开头的行</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/ssh/ssh_config |sed -n <span class="string">&#x27;/^#/p&#x27;</span></span><br><span class="line"><span class="comment">#示例：输出不是#号开头的行</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/ssh/ssh_config |sed -n <span class="string">&#x27;/^#/!p&#x27;</span></span><br><span class="line"><span class="comment">#示例：显示 不是#号和!号开头的行</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/ssh/ssh_config |sed -r -n <span class="string">&#x27;/^#|^$/!p&#x27;</span><span class="comment">#注：-r支持更多正则</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/ssh/ssh_config |egrep -v <span class="string">&#x27;^#|^$&#x27;</span></span><br><span class="line"><span class="comment">#示例：显示 以/结尾的行</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">df</span> -h|egrep <span class="string">&quot;/$&quot;</span></span><br><span class="line">/dev/mapper/centos-root   17G  9.9G  7.2G   58% /</span><br><span class="line">[root@localhost lianxi]# <span class="built_in">df</span> -h|sed -n <span class="string">&#x27;/\/$/p&#x27;</span></span><br><span class="line">/dev/mapper/centos-root   17G  9.9G  7.2G   58% /</span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：以a-Z开头的行</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|sed -n <span class="string">&#x27;/^[a-Z]/p&#x27;</span></span><br><span class="line"><span class="comment">#示例：不以a-Z开头的行</span></span><br><span class="line">[root@localhost lianxi]# <span class="built_in">cat</span> /etc/passwd|sed -n <span class="string">&#x27;/^[^a-Z]/p&#x27;</span></span><br></pre></td></tr></table></figure><hr><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></pre></td><td class="code"><pre><span class="line">题目：截取nginx的access.log文件里3月18号15:30:00 -- 16:48:10时间段内的所有访问日志</span><br><span class="line"></span><br><span class="line">[root@cPen_A lianxi]# service firewalld stop<span class="comment">#注：立马停止firewalld服务</span></span><br><span class="line">[root@cPen_A lianxi]# systemctl <span class="built_in">disable</span> firewalld<span class="comment">#注：设置firewalld服务开机不启动--&gt;下次重启机器的时候不启动</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A nginx]# <span class="built_in">tail</span> -f access.log<span class="comment">#注：动态监控最后一行</span></span><br><span class="line">192.168.0.17 - - [09/Jan/2021:16:36:03 +0800] <span class="string">&quot;GET /favicon.ico HTTP/1.1&quot;</span> 404 3650 <span class="string">&quot;http://192.168.0.118/&quot;</span> <span class="string">&quot;Mozilla/5.0 (Linux; Android 10; PCT-AL10; HMSCore 5.1.0.300; GMSCore 20.26.14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 HuaweiBrowser/11.0.5.304 Mobile Safari/537.36&quot;</span> <span class="string">&quot;-&quot;</span></span><br><span class="line">[root@cPen_A nginx]# <span class="built_in">pwd</span></span><br><span class="line">/var/log/nginx<span class="comment">#注：nginx的日志文件的路径</span></span><br><span class="line">[root@cPen_A nginx]# <span class="built_in">ls</span></span><br><span class="line">access.log  access.log-20201202.gz  error.log  error.log-20201202.gz</span><br><span class="line"><span class="comment">#注：access.log是nginx的访问日志文件，记录访问过我们的网站的信息</span></span><br><span class="line">[root@cPen_A nginx]# <span class="built_in">cat</span> access.log | awk -F<span class="string">&#x27;[()]&#x27;</span> <span class="string">&#x27;&#123;print $2&#125;&#x27;</span>|<span class="built_in">sort</span>|<span class="built_in">uniq</span> -c|<span class="built_in">sort</span> -nr</span><br><span class="line">     13 Windows NT 10.0; WOW64<span class="comment">#注：排序去重 再降序排序 显示数量</span></span><br><span class="line">      4 Linux; Android 10; PCT-AL10; HMSCore 5.1.0.300; GMSCore 20.26.14</span><br><span class="line">---------------------------------------------------------------------------</span><br><span class="line">[09/Jan/2021:16:32:46 +0800] --&gt; 09/Jan/2021:16:32:46</span><br><span class="line">[09/Jan/2021:16:33:07 +0800] --&gt; 09/Jan/2021:16:32:46</span><br><span class="line"><span class="comment">#示例：查找该时间段的所有访问日志</span></span><br><span class="line">[root@cPen_A nginx]# <span class="built_in">cat</span> access.log|sed -n <span class="string">&#x27;/09\/Jan\/2021:16:32:46/,/09\/Jan\/2021:16:33:07/p&#x27;</span></span><br><span class="line"><span class="comment">#示例：正则写法</span></span><br><span class="line">[root@cPen_A nginx]# <span class="built_in">cat</span> access.log|sed -r -n <span class="string">&#x27;/09\/Jan\/2021:16:(3[789]|4[0-9]|5[01]):(0[1-9]|[1-5][0-9])/p&#x27;</span></span><br><span class="line"><span class="comment">#注：分钟的范围37~51  秒的范围01~59</span></span><br><span class="line"><span class="comment">#37~51</span></span><br><span class="line"><span class="comment">#37~39</span></span><br><span class="line"><span class="comment">#40~49</span></span><br><span class="line"><span class="comment">#50~51</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#01~59</span></span><br><span class="line">0[1-9]|[1-5][0-9]</span><br></pre></td></tr></table></figure><hr><h2 id="sed的d命令示例">sed的d命令示例<a class="header-anchor" href="#sed的d命令示例"></a></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><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></pre></td><td class="code"><pre><span class="line">sed的d命令示例</span><br><span class="line">删除操作可以根据行号和匹配模式进行操作</span><br><span class="line"><span class="comment">#示例：删除有denghui的行</span></span><br><span class="line">[root@cPen_A nginx]# <span class="built_in">cat</span> /etc/passwd|sed <span class="string">&#x27;/denghui/d&#x27;</span></span><br><span class="line"><span class="comment">#示例：-i动原文件  删除有redmi这行</span></span><br><span class="line">[root@cPen_A lianxi]# sed -i <span class="string">&#x27;/redmi/d&#x27;</span> test.txt </span><br><span class="line"><span class="comment">#示例：根据行删除</span></span><br><span class="line">[root@cPen_A lianxi]# sed -i <span class="string">&#x27;2d&#x27;</span> test.txt <span class="comment">#注：删除第2行</span></span><br><span class="line">sed查找方式:</span><br><span class="line">1、根据行号</span><br><span class="line">2、根据模式 --&gt;正则表达式=字符+特殊符号</span><br><span class="line">3、根据字符串</span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：在第4行后面追加huawei</span></span><br><span class="line">[root@cPen_A lianxi]# sed -i <span class="string">&#x27;4a huawei&#x27;</span> test.txt </span><br><span class="line"><span class="comment">#示例：在第4行前面插入apple</span></span><br><span class="line">[root@cPen_A lianxi]# sed -i <span class="string">&#x27;4i apple&#x27;</span> test.txt </span><br><span class="line"><span class="comment">#示例：在VIVO这行前一行插入OPPO</span></span><br><span class="line">[root@cPen_A lianxi]# sed -i <span class="string">&#x27;/VIVO/i OPPO&#x27;</span> test.txt </span><br><span class="line"><span class="comment">#示例：在VIVO同行后面添加APPLE.&amp;表示前面全部</span></span><br><span class="line">[root@cPen_A lianxi]# sed -i <span class="string">&#x27;s/VIVO/&amp; APPLE/&#x27;</span> test.txt </span><br><span class="line"><span class="comment">#示例：将所有为huawei都替换成sanchuang</span></span><br><span class="line">[root@cPen_A lianxi]# sed -i <span class="string">&#x27;s/huawei/sanchuang/g&#x27;</span> test.txt </span><br><span class="line">sed的命令：</span><br><span class="line">p</span><br><span class="line">d</span><br><span class="line">a</span><br><span class="line">i</span><br><span class="line">s</span><br><span class="line">c</span><br><span class="line">r</span><br><span class="line">w</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Shell </tag>
            
            <tag> Awk </tag>
            
            <tag> Sed </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>28_Linux基础-shell编程-awk</title>
      <link href="/posts/29e2641c.html"/>
      <url>/posts/29e2641c.html</url>
      
        <content type="html"><![CDATA[<blockquote><p>/bin下面放二进制文件<br>lib 放系统的公共模块、公共库、公共工具<br>/dev设备文件</p><p>#标准输入、标准输出</p><p>/usr  安装的命令安装的模块 编译安装、rpm安装的程序</p><p>/boot  系统启动会到这里来找</p><p>/proc  保留正在运行的程序</p><p>/proc/sys  正在运行的内核参数进行修改<br>/etc/sysctl.conf  永久修改<br>[root@localhost net]# sysctl -p  生效</p><p>/run  保存pid文件</p><p>/var/log  系统日志</p></blockquote><hr><h1 id="一-脚本调试-x">一. 脚本调试 -x<a class="header-anchor" href="#一-脚本调试-x"></a></h1><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"><span class="comment">#示例：脚本的调试  -x</span></span><br><span class="line">[root@cPen_A lianxi]# bash -x test.sh </span><br><span class="line">+ <span class="built_in">ls</span></span><br><span class="line">aaa2  aaa.py  d.md5  mod1.py  __pycache__  test_class2.py  test_class.py  test.sh  </span><br><span class="line">+ <span class="built_in">echo</span> ok</span><br><span class="line">ok</span><br><span class="line">+ <span class="built_in">echo</span> err</span><br><span class="line">err</span><br></pre></td></tr></table></figure><hr><h1 id="二-小数计算">二. 小数计算<a class="header-anchor" href="#二-小数计算"></a></h1><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">#示例：小数计算</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">echo</span> <span class="string">&quot;scale=2;5/3&quot;</span> |bc</span><br><span class="line">1.66</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">echo</span> <span class="string">&quot;5 3&quot;</span> |awk <span class="string">&#x27;&#123;print $1/$2&#125;&#x27;</span></span><br><span class="line">1.66667</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">echo</span> <span class="string">&quot;5 3&quot;</span> |awk <span class="string">&#x27;&#123;printf &quot;%.2f&quot;,$1/$2&#125;&#x27;</span></span><br><span class="line">1.67</span><br></pre></td></tr></table></figure><hr><h1 id="三-打印奇数">三. 打印奇数<a class="header-anchor" href="#三-打印奇数"></a></h1><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">[root@cPen_A lianxi]# <span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">seq</span> 1 2 100` ;<span class="keyword">do</span> <span class="built_in">echo</span> <span class="variable">$i</span>;<span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：或者类似C语言for循环写法</span></span><br></pre></td></tr></table></figure><hr><h1 id="四-合并文件">四. 合并文件<a class="header-anchor" href="#四-合并文件"></a></h1><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#示例：合并文件</span></span><br><span class="line">把用户名字和用户金额统一在一起</span><br><span class="line"><span class="comment">#注：把2个文件按照列合并</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">cat</span> user.txt </span><br><span class="line">100 cp1</span><br><span class="line">200 cp2</span><br><span class="line">300 cp3</span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">cat</span> money.txt </span><br><span class="line">100 <span class="variable">$500</span></span><br><span class="line">300 <span class="variable">$600</span></span><br><span class="line">200 <span class="variable">$400</span></span><br><span class="line">-----------------------------------------------------</span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">cat</span> money.txt |<span class="built_in">sort</span> -t <span class="string">&quot; &quot;</span> -n &gt;money2.txt</span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">cat</span> user.txt |<span class="built_in">sort</span> -t <span class="string">&quot; &quot;</span> -n &gt;user2.txt                                                                                            </span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">cat</span> user2.txt </span><br><span class="line">100 cp1</span><br><span class="line">200 cp2</span><br><span class="line">300 cp3</span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">cat</span> money2.txt </span><br><span class="line">100 <span class="variable">$500</span></span><br><span class="line">200 <span class="variable">$400</span></span><br><span class="line">300 <span class="variable">$600</span></span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">join</span> user2.txt money2.txt </span><br><span class="line">100 cp1 <span class="variable">$500</span></span><br><span class="line">200 cp2 <span class="variable">$400</span></span><br><span class="line">300 cp3 <span class="variable">$600</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">paste</span> user2.txt money2.txt </span><br><span class="line">100 cp1 100 <span class="variable">$500</span></span><br><span class="line">200 cp2 200 <span class="variable">$400</span></span><br><span class="line">300 cp3 300 <span class="variable">$600</span></span><br><span class="line"></span><br><span class="line">-----------------------------------------------------</span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> user_id user_name</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="keyword">while</span> <span class="built_in">read</span> user_id2 user_money</span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">        <span class="keyword">if</span> [[ <span class="variable">$user_id</span> == <span class="variable">$user_id2</span> ]]</span><br><span class="line">        <span class="keyword">then</span></span><br><span class="line">            <span class="built_in">echo</span> <span class="variable">$user_id</span> <span class="variable">$user_name</span> <span class="variable">$user_money</span> &gt;&gt; user_money.txt</span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">    <span class="keyword">done</span> &lt; money.txt</span><br><span class="line"><span class="keyword">done</span> &lt; user.txt</span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><blockquote><p>sed处理文本</p><p>vim替换文本，用替换模式  按r</p><p>sed在文本外部操作文本里面的内容。做更新替换和删除（比如修改一键化安装脚本  配置文件  用sed去修改）</p><p><a href="http://c.biancheng.net/linux/sed.html">http://c.biancheng.net/linux/sed.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><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">[root@cPen_A shell_test]# vim test.txt</span><br><span class="line">aa</span><br><span class="line">bb</span><br><span class="line">cc</span><br><span class="line">abc</span><br><span class="line">def</span><br><span class="line">[root@cPen_A shell_test]# sed <span class="string">&#x27;/a/d&#x27;</span> test.txt </span><br><span class="line">bb</span><br><span class="line">cc</span><br><span class="line">def</span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">cat</span> test.txt </span><br><span class="line">aa</span><br><span class="line">bb</span><br><span class="line">cc</span><br><span class="line">abc</span><br><span class="line">def</span><br><span class="line">[root@cPen_A shell_test]# sed -i <span class="string">&#x27;/a/d&#x27;</span> test.txt <span class="comment">#注：真正删除成功</span></span><br><span class="line">[root@cPen_A shell_test]# <span class="built_in">cat</span> test.txt </span><br><span class="line">bb</span><br><span class="line">cc</span><br><span class="line">def</span><br></pre></td></tr></table></figure></blockquote><hr><h1 id="五-文本处理">五. 文本处理<a class="header-anchor" href="#五-文本处理"></a></h1><blockquote><p><strong>1.文本处理（请使用shell脚本让其满足下列特性）：</strong></p><p>（1）给下列含有大写字母的行，在大写字母后追加数字2020  --》sed</p><p>abcdSdddde</p><p>islHishbxld</p><p>goBkefji</p><p>daanshXxge</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">sed -i‘s/oldword/newword/g’ c.txt</span><br><span class="line"><span class="comment">#注：s  substitute替换</span></span><br><span class="line">&amp;代表前面匹配的oldword</span><br><span class="line"></span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> c.txt |sed <span class="string">&#x27;s/[A-Z]/&amp;2020/g&#x27;</span></span><br><span class="line">[root@cPen_A ~]# sed -i <span class="string">&#x27;s/[A-Z]/&amp;2020/g&#x27;</span> c.txt<span class="comment">#注：对源文件做修改</span></span><br></pre></td></tr></table></figure></blockquote><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><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></pre></td><td class="code"><pre><span class="line">（2）请取出下列以逗号分割符最后一个字段不为0的行,并对最后一个字段以100为最小单位取整取正</span><br><span class="line">   000001,2,115</span><br><span class="line">   000002,2,1,0</span><br><span class="line">   000002,2,1,-200</span><br><span class="line">awk，<span class="built_in">tr</span></span><br><span class="line"></span><br><span class="line">[root@cPen_A ~]# vim c.txt</span><br><span class="line">? ?000001,2,115</span><br><span class="line">? ?000002,2,1,0</span><br><span class="line">? ?000002,2,1,-200</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> c.txt |<span class="built_in">tail</span> -3|awk -F, <span class="string">&#x27;$NF != 0&#123;print $1,int($NF/100)&#125;&#x27;</span></span><br><span class="line">? ?000001 1</span><br><span class="line">? ?000002 -2</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> c.txt |<span class="built_in">tail</span> -3|awk -F, <span class="string">&#x27;$NF != 0&#123;print $0,int($NF/100)&#125;&#x27;</span>|<span class="built_in">tr</span> -d <span class="string">&quot;-&quot;</span></span><br><span class="line">? ?000001,2,115 1</span><br><span class="line">? ?000002,2,1,200 2</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> c.txt |<span class="built_in">tail</span> -3|awk -F, <span class="string">&#x27;$NF != 0&#123;print $0,sqrt(int($NF/100)*int($NF/100))&#125;&#x27;</span></span><br><span class="line">? ?000001,2,115 1</span><br><span class="line">? ?000002,2,1,-200 2</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> c.txt |<span class="built_in">tail</span> -3|awk -F, <span class="string">&#x27;$NF != 0&#123;print $0,sqrt(int($NF/100)*int($NF/100)),length($1)&#125;&#x27;</span></span><br><span class="line">? ?000001,2,115 1 9</span><br><span class="line">? ?000002,2,1,-200 2 9</span><br><span class="line"><span class="comment">#注：$NF != 0 最后一项不为0</span></span><br><span class="line"><span class="comment">#注：$0 指全部。sqrt开平方</span></span><br><span class="line"></span><br><span class="line">AWK 里有很多的内置函数</span><br><span class="line">int()</span><br><span class="line">sqrt() 开根号</span><br><span class="line">length()</span><br><span class="line"></span><br><span class="line">[root@cPen_A ~]# a=-488</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a#-&#125;</span><span class="comment">#注：删除-号</span></span><br><span class="line">488</span><br></pre></td></tr></table></figure></blockquote><hr><h1 id="六-awk">六. awk<a class="header-anchor" href="#六-awk"></a></h1><blockquote><p>awk  是什么？</p><p>​awk是linux里的一个文本处理的命令（工具） --&gt; 程序 --&gt; c语言</p><p>unix --&gt; awk</p><p>​为什么要使用awk?</p><p>​截取内容</p><p>bc进行小数运算</p><p>awk也可以</p></blockquote><blockquote><p>字段：field --&gt; 列 column</p><p>name  age  sex  grade</p><p>cali       18   M    70</p><p>rose     19   F      90</p><p>#注：CSV文件  以,作为分割的文件</p><p>$0  存储的是整行数据</p><p>每个数据存入$1-$7中</p></blockquote><blockquote><p>AWK 默认的分隔符是空白（空格、tab）</p><p>输入分隔符</p><p>​-F</p><p>输出分隔符</p><p>​,</p></blockquote><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></pre></td><td class="code"><pre><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F<span class="string">&quot;:&quot;</span> <span class="string">&#x27;&#123;print $1$3$7&#125;&#x27;</span></span><br><span class="line">root0/bin/bash</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F<span class="string">&quot;:&quot;</span> <span class="string">&#x27;&#123;print $1,$3,$7&#125;&#x27;</span></span><br><span class="line">root 0 /bin/bash</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011213436007.png" alt=""></p></blockquote><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><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">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;BEGIN&#123;print &quot;######start######&quot;&#125; /bash$/&#123;print $1,$7&#125;END&#123;print &quot;######end######&quot;&#125;&#x27;</span></span><br><span class="line"><span class="comment">######start######</span></span><br><span class="line">root /bin/bash</span><br><span class="line">sanchuang /bin/bash</span><br><span class="line">……</span><br><span class="line">chen223344 /bin/bash</span><br><span class="line"><span class="comment">######end######</span></span><br><span class="line"><span class="comment">#注：/bash$ 以bash结尾的行</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：统计有多少行</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;BEGIN&#123;i=0&#125; &#123;i++&#125; END&#123;print i&#125;&#x27;</span></span><br><span class="line">65</span><br><span class="line"><span class="comment">#注：不需要用$，因为引用的不是变量</span></span><br><span class="line"><span class="comment">#注：多条命令使用，在&#123;花括号&#125;里放;号</span></span><br><span class="line"><span class="comment">#注：~波浪符号  模糊匹配  ~/feng/； ||  或；&amp;&amp;  且</span></span><br></pre></td></tr></table></figure></blockquote><h2 id="AWK内置变量">AWK内置变量<a class="header-anchor" href="#AWK内置变量"></a></h2><blockquote><p><strong>AWK内置变量</strong></p><p>NR  代表行号  number of record --&gt; record 记录 --&gt; 行</p><p>NF  代表一行的字段数量  number of field</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mi>F</mi><mtext>表示最后一个字段；</mtext></mrow><annotation encoding="application/x-tex">NF  表示最后一个字段；</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">NF</span><span class="mord cjk_fallback">表示最后一个字段；</span></span></span></span>(NF-1)倒数第一个字段</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><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></pre></td><td class="code"><pre><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd |awk -F: <span class="string">&#x27;BEGIN&#123;num=0;print &quot;开始统计/etc/passwd文件&quot;&#125; $1 ~ /feng/ || $3 &gt; 1005 &#123;print NR,NF,$1,length($1),$(NF-1),$NF,$3;num++&#125;END&#123;print &quot;统计结束&quot;,num&#125;&#x27;</span></span><br><span class="line">开始统计/etc/passwd文件</span><br><span class="line">24 7 chenpeng1 9 /home/chenpeng1 /bin/bash 1100</span><br><span class="line">25 7 chenpeng2 9 /home/chenpeng2 /bin/bash 1200</span><br><span class="line">……</span><br><span class="line">65 7 nfsnobody 9 /var/lib/nfs /sbin/nologin 65534</span><br><span class="line">统计结束 37</span><br><span class="line"></span><br><span class="line">-------------------------------------------------------------------</span><br><span class="line"><span class="comment">#示例：AWK过滤功能</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;/xiexy/&#x27;</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|egrep <span class="string">&quot;xiexy&quot;</span></span><br><span class="line"><span class="comment">#示例：AWK截取功能</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">who</span> |awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span></span><br><span class="line">tty1</span><br><span class="line">pts/2</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">who</span> |awk <span class="string">&#x27;&#123;print $2,$4&#125;&#x27;</span></span><br><span class="line">tty1 11:23</span><br><span class="line">pts/2 09:38</span><br><span class="line"><span class="comment">#示例：自定义的字符串和字段拼接</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">who</span> |awk <span class="string">&#x27;&#123;print &quot;time:&quot;$4,&quot;name:&quot;$2&#125;&#x27;</span></span><br><span class="line"><span class="keyword">time</span>:11:23 name:tty1</span><br><span class="line"><span class="keyword">time</span>:09:38 name:pts/2</span><br><span class="line"></span><br><span class="line">-------------------------------------------------------------------</span><br><span class="line"><span class="comment">#示例：/^[^abcdefg]/  不是以abcdefg开头的行</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;/^[^abcdefg]/&#123;print $1,$7&#125;&#x27;</span></span><br><span class="line"><span class="comment">#示例：/^[^A-z]/  不是A-z字母开头的行</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;/^[^A-z]/&#123;print $1,$7&#125;&#x27;</span></span><br><span class="line"><span class="comment">#示例：指定2个分割符</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|<span class="built_in">tail</span> -1|awk -F[:/] <span class="string">&#x27;&#123;print $8&#125;&#x27;</span></span><br><span class="line">lib</span><br></pre></td></tr></table></figure><h2 id="awk命令的操作符">awk命令的操作符<a class="header-anchor" href="#awk命令的操作符"></a></h2><blockquote><p>awk命令的操作符<br>比较操作符：匹配符号  ~  !~</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"><span class="comment">#示例：</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">who</span></span><br><span class="line">root     tty1         2020-12-23 11:23</span><br><span class="line">root     pts/2        2021-01-08 09:38 (192.168.0.119)</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">who</span>|awk <span class="string">&#x27;$2 ~ /pts/&#123;print $0&#125;&#x27;</span></span><br><span class="line">root     pts/2        2021-01-08 09:38 (192.168.0.119)</span><br><span class="line"></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;$1 ~/deng/ &amp;&amp; $3&gt;1058 &amp;&amp; $NF ~/bash$/&#x27;</span></span><br></pre></td></tr></table></figure></blockquote><h2 id="文本数据表达式">文本数据表达式<a class="header-anchor" href="#文本数据表达式"></a></h2><blockquote><p>文本数据表达式:<br>==  精确匹配<br>~   模糊匹配</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">[root@cPen_A lianxi]# awk -F: <span class="string">&#x27;$3 ~ /\&lt;...\&gt;/ &#123;print $1,$3&#125;&#x27;</span> /etc/passwd</span><br><span class="line">systemd-network 192</span><br><span class="line">polkitd 999</span><br><span class="line">chrony 998</span><br><span class="line">nginx 997</span><br><span class="line">[root@cPen_A lianxi]# awk -F: <span class="string">&#x27;$3 ~ /\&lt;.&#123;3&#125;\&gt;/ &#123;print $1,$3&#125;&#x27;</span> /etc/passwd</span><br><span class="line">systemd-network 192</span><br><span class="line">polkitd 999</span><br><span class="line">chrony 998</span><br><span class="line">nginx 997</span><br><span class="line"></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;$1 ~ /deng/ &#123;print $1&#125;&#x27;</span></span><br></pre></td></tr></table></figure></blockquote><h2 id="awk-内置变量和函数">awk 内置变量和函数<a class="header-anchor" href="#awk-内置变量和函数"></a></h2><blockquote><p><strong>awk 内置变量和函数？</strong><br>NF每行$0的字段数<br>NR当前处理的行号<br>FS  当前的输入分隔符，默认是空白字符（空格和tab） field separator<br>OFS 当前的输出分隔符，默认是空格字符（空格）  output field separator</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><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></pre></td><td class="code"><pre><span class="line">示例：</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;&#123;print NR,$0&#125;&#x27;</span></span><br><span class="line">1 root:x:0:0:root:/root:/bin/bash<span class="comment">#注：NR行号</span></span><br><span class="line">2 bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;&#123;print NR,$0,NF&#125;&#x27;</span></span><br><span class="line">1 root:x:0:0:root:/root:/bin/bash 7</span><br><span class="line">2 bin:x:1:1:bin:/bin:/sbin/nologin 7</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;&#123;print NR,$0,$NF&#125;&#x27;</span></span><br><span class="line">1 root:x:0:0:root:/root:/bin/bash /bin/bash</span><br><span class="line">2 bin:x:1:1:bin:/bin:/sbin/nologin /sbin/nologin</span><br><span class="line"></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cat</span> /etc/passwd|awk <span class="string">&#x27;FS=&quot;:&quot;;OFS=&quot;#&quot;&#123;print NR,$0,$NF&#125;&#x27;</span></span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">1#root:x:0:0:root:/root:/bin/bash#root:x:0:0:root:/root:/bin/bash</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">2#bin:x:1:1:bin:/bin:/sbin/nologin#/sbin/nologin</span><br><span class="line">daemon:x:2:2:daemon:/sbin:/sbin/nologin</span><br><span class="line"><span class="comment">#推荐使用-F指定输入分隔符</span></span><br><span class="line"></span><br><span class="line">===========================================================================================</span><br><span class="line">使用NF变量显示passwd文件倒数第二列的内容</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;&#123;print $(NF-1)&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">----------------------------------------------------------</span><br><span class="line">显示passwd文件中第5到第10行的用户名</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;NR &gt;= 5 &amp;&amp; NR &lt;= 10 &#123;print $1&#125;&#x27;</span></span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;NR &gt;= 5 &amp;&amp; NR &lt;= 10 &#123;print NR,$1&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">----------------------------------------------------------</span><br><span class="line">显示passwd文件中第7列不是bash的用户名</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;$7 ~ /bash/ &#123;print NR,$1&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">----------------------------------------------------------</span><br><span class="line">显示passwd文件中行号是5结尾的行号和行</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;NR ~ /5$/ &#123;print NR,$1&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">----------------------------------------------------------</span><br><span class="line">用ip add只显示ip(不能使用<span class="built_in">tr</span>或者<span class="built_in">cut</span>命令)</span><br><span class="line">[root@cPen_A ~]# ip add|awk <span class="string">&#x27;$NF ~ /ens33/ &#123;print $0&#125;&#x27;</span></span><br><span class="line">    inet 192.168.0.118/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33</span><br><span class="line">[root@cPen_A ~]# ip add|awk <span class="string">&#x27;$NF ~ /ens33/ &#123;print $2&#125;&#x27;</span></span><br><span class="line">192.168.0.118/24</span><br><span class="line">[root@cPen_A ~]# ip add|awk <span class="string">&#x27;$NF ~ /ens33/ &#123;print $2&#125;&#x27;</span>|awk -F/ <span class="string">&#x27;&#123;print $1&#125;&#x27;</span></span><br><span class="line">192.168.0.118</span><br><span class="line"></span><br><span class="line">----------------------------------------------------------</span><br><span class="line">[root@localhost lianxi]# yum  install net-tools -y</span><br><span class="line">先使用ifconfig，使用awk显示eth0的入站流量和出站流量(字节)</span><br><span class="line">[root@cPen_A ~]# ifconfig|<span class="built_in">head</span> -8|awk <span class="string">&#x27;$1 ~ /RX/ &amp;&amp; $4 ~ /bytes/ || $1 ~ /TX/ &amp;&amp; $4 ~ /bytes/ &#123;print $0&#125;&#x27;</span></span><br><span class="line">        RX packets 494598  bytes 38344433 (36.5 MiB)</span><br><span class="line">        TX packets 17025  bytes 1718505 (1.6 MiB)</span><br><span class="line">[root@cPen_A ~]# ifconfig|<span class="built_in">head</span> -8|awk <span class="string">&#x27;$1 ~ /RX/ &amp;&amp; $4 ~ /bytes/ || $1 ~ /TX/ &amp;&amp; $4 ~ /bytes/ &#123;print $5&#125;&#x27;</span></span><br><span class="line">38372669</span><br><span class="line">1719743</span><br><span class="line">[root@cPen_A ~]# ifconfig|<span class="built_in">head</span> -8|awk <span class="string">&#x27;$0 ~ /RX.*bytes|TX.*bytes/  &#123;print $5&#125;&#x27;</span></span><br><span class="line">38476866</span><br><span class="line">1744541</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：当有&amp;&amp;或者||，&amp;&amp;（and）的优先级高</span></span><br><span class="line"></span><br><span class="line">----------------------------------------------------------</span><br><span class="line">使用awk命令统计以r开头的用户数目，显示如下效果</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> /etc/passwd|awk -F: <span class="string">&#x27;BEGIN&#123;i=0&#125; $1 ~ /^r/ &#123;print $1;i++&#125; END&#123;print i&#125;&#x27;</span></span><br><span class="line">root</span><br><span class="line">rpc</span><br><span class="line">rpcuser</span><br><span class="line">3</span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Shell </tag>
            
            <tag> Awk </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>27_Linux基础-nginx</title>
      <link href="/posts/45562d6f.html"/>
      <url>/posts/45562d6f.html</url>
      
        <content type="html"><![CDATA[<p>web方向</p><p>​经典提问：</p><p>​在浏览器里输入一个www.baidu.com回车，到显示出内容，背后发生哪些事情？</p><p>​应用层 --&gt; 传输层 --&gt; 网络层 --&gt; 数据链路层 --&gt; 物理层</p><p>​nginx --&gt; 详细的使用</p><p>​flask --&gt; web服务器 --&gt; python写的 --&gt; 自己写的web服务器软件</p><p>​mvc, usgi等</p><p>​nginx --&gt; web服务器 --&gt; C语言</p><p>​go语言 --&gt; bingo</p><p>​http/https协议</p><hr><p>nginx</p><p>​1.安装 --&gt; 最新版本 --&gt; 编写脚本 --&gt; 一键安装</p><p>​2.nginx的配置文件深入讲解 --&gt; 经典的功能实现</p><p>​3.一定要使用一个云服务器 --&gt; 购买域名 --&gt; 备案 --&gt; 上线</p><p>​4.http协议</p><hr><h1 id="1-nginx是什么？">1. nginx是什么？<a class="header-anchor" href="#1-nginx是什么？"></a></h1><p>nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.</p><p>​<a href="http://nginx.org/">http://nginx.org/</a></p><p>​http是什么？</p><p>​HTTP是Hyper Text Transfer Protocol（超文本传输协议）的缩写</p><p>​工作：应用层</p><p>​www --&gt; World Wide Web 万维网</p><p>​协议：其实就规矩，方便双方沟通使用</p><p>​http协议是：浏览器和web服务器之间使用的</p><p>​谁能读懂http协议？</p><p>​所有的浏览器，所有web服务器，爬虫库（requests）等其他</p><hr><h1 id="2-nginx的安装">2. nginx的安装<a class="header-anchor" href="#2-nginx的安装"></a></h1><p>centos8.2nginx-1.19.5</p><p>nginx最新的nginx-1.19.5</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></pre></td><td class="code"><pre><span class="line">[root@cPen ~]# <span class="built_in">cat</span> /etc/centos-release<span class="comment">#注：查看版本</span></span><br><span class="line">CentOS Linux release 7.6.1810 (Core) </span><br><span class="line">1.下载</span><br><span class="line"><span class="built_in">mkdir</span> -p /nginx</span><br><span class="line"><span class="built_in">cd</span> /nginx</span><br><span class="line">curl -O http://nginx.org/download/nginx-1.19.5.tar.gz</span><br><span class="line">2.解压</span><br><span class="line">[root@cPen_B nginx]# tar xf nginx-1.19.5.tar.gz </span><br><span class="line">[root@cPen_B nginx]# <span class="built_in">cd</span> nginx-1.19.5</span><br><span class="line">[root@cPen_B nginx-1.19.5]# </span><br><span class="line">编译安装经典3步：</span><br><span class="line">1.编译前的配置：配置安装到哪里，启用哪些功能等</span><br><span class="line">./configure</span><br><span class="line">2.编译，将c的代码编译成二进制文件</span><br><span class="line">make</span><br><span class="line">3.编译安装，将编译好的二进制文件复制到第一步里我们指定的路径</span><br><span class="line">make install</span><br><span class="line"></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><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></pre></td><td class="code"><pre><span class="line">[root@cPen_B nginx-1.19.5]# ./configure --<span class="built_in">help</span>  查看哪些功能可以开启，哪些功能可以禁用</span><br><span class="line">prefix 前缀</span><br><span class="line"></span><br><span class="line">--prefix=/usr/local/nginx   指定安装路径</span><br><span class="line">--with-select_module  启用，默认没有启用</span><br><span class="line">--without-select_module  禁用，默认是启用</span><br><span class="line"></span><br><span class="line">--with-http_ssl_module   启用https功能</span><br><span class="line">--with-http_realip_module  --》修改http协议，里面增加一个字段realip--&gt;nginx服务器做反向代理服务器的时候使用</span><br><span class="line"></span><br><span class="line">============</span><br><span class="line">解决依赖关系</span><br><span class="line">yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make </span><br><span class="line"></span><br><span class="line">编译前的配置</span><br><span class="line">[root@cPen_B nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --user=cPen_nginx --group=cPen_nginx --build=scweb_server --with-threads --with-file-aio --with-http_v2_module --with-http_ssl_module --with-stream</span><br><span class="line"></span><br><span class="line">编译</span><br><span class="line">make -j 2</span><br><span class="line"></span><br><span class="line">编译安装</span><br><span class="line">make install</span><br><span class="line"></span><br><span class="line">启动nginx</span><br><span class="line">[root@cPen_B nginx-1.19.5]# <span class="built_in">cd</span> /usr/local/nginx</span><br><span class="line">[root@cPen_B nginx]# <span class="built_in">ls</span></span><br><span class="line">conf  html  logs  sbin</span><br><span class="line">conf 存放配置文件</span><br><span class="line">html 存放网页文件</span><br><span class="line">logs 存放日志</span><br><span class="line">sbin 存放启动nginx的程序</span><br><span class="line">[root@cPen_B nginx]# <span class="built_in">cd</span> sbin/</span><br><span class="line">[root@cPen_B sbin]# <span class="built_in">ls</span></span><br><span class="line">nginx</span><br><span class="line">[root@cPen_B sbin]# ./nginx</span><br><span class="line">[root@cPen_B sbin]# lsof -i:80</span><br><span class="line">COMMAND   PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">nginx   23548       root    9u  IPv4  66009      0t0  TCP *:http (LISTEN)</span><br><span class="line">nginx   23549 cPen_nginx    9u  IPv4  66009      0t0  TCP *:http (LISTEN)</span><br><span class="line">[root@cPen_B sbin]# ps aux|grep nginx</span><br><span class="line">root       23548  0.0  0.0  41072   836 ?        Ss   19:09   0:00 nginx: master process ./nginx</span><br><span class="line">cPen_ng+   23549  0.0  0.2  74636  4852 ?        S    19:09   0:00 nginx: worker process</span><br><span class="line"><span class="comment">#注：master是领导，worker真正干活的</span></span><br><span class="line">master process 父进程：管理进程</span><br><span class="line">worker process 子进程：被管理的进程</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：pstree  查看进程树  -p选项看到进程号</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#修改PATH变量，方便启动nginx和停止nginx</span></span><br><span class="line">[root@cPen_B sbin]# PATH=/usr/local/nginx/sbin/:<span class="variable">$PATH</span></span><br><span class="line">[root@cPen_B sbin]# <span class="built_in">echo</span> <span class="variable">$PATH</span></span><br><span class="line">/usr/local/nginx/sbin/:/lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/root/bin:/usr/local/nginx5/sbin:/root/bin</span><br><span class="line"></span><br><span class="line"><span class="comment">#关闭防火墙和selinux</span></span><br><span class="line">[root@cPen nginx]# service firewalld stop<span class="comment">#注：立马关闭防火墙</span></span><br><span class="line">Redirecting to /bin/systemctl stop firewalld.service</span><br><span class="line">[root@cPen nginx]# systemctl <span class="built_in">disable</span> firewalld<span class="comment">#注：设置防火墙开机不要启动</span></span><br><span class="line"><span class="comment">#关闭selinux</span></span><br><span class="line">setenforce 0    <span class="comment">#临时关闭</span></span><br><span class="line">sed -i <span class="string">&#x27;/^SELINUX/ s/enforcing/disabled/&#x27;</span> /etc/sysconfig/selinux</span><br><span class="line">sed -i <span class="string">&#x27;/^SELINUX/ s/enforcing/disabled/&#x27;</span> /etc/selinux/config</span><br><span class="line"></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><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">开机启动nginx的问题</span><br><span class="line">脚本的方式</span><br><span class="line">思考：如何让编译安装的nginx开机启动？</span><br><span class="line">1./etc/rc.local</span><br><span class="line">[root@sc-nginx sbin]# <span class="built_in">echo</span> <span class="string">&quot;/usr/local/nginx/sbin/nginx&quot;</span> &gt;&gt;/etc/rc.local </span><br><span class="line">[root@sc-nginx sbin]# <span class="built_in">chmod</span> +x /etc/rc.d/rc.local </span><br><span class="line"><span class="comment"># Please note that you must run &#x27;chmod +x /etc/rc.d/rc.local&#x27; to ensure</span></span><br><span class="line">    ------------------------------------------------------------------------</span><br><span class="line">    [root@cPen_B ~]# <span class="built_in">chmod</span> +x /etc/rc.d/rc.local </span><br><span class="line">    <span class="comment">#注：这是给源文件可执行权限</span></span><br><span class="line">    [root@cPen_B ~]# <span class="built_in">chmod</span> +x /usr/local/nginx/sbin/nginx</span><br><span class="line">    [root@cPen_B ~]# vim /etc/rc.local    <span class="comment">#注：启动的时候会执行这个文件里的脚本</span></span><br><span class="line">    <span class="comment">#注：添加 /usr/local/nginx/sbin/nginx （最好是绝对路径）</span></span><br><span class="line"><span class="comment">#on boot</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;/usr/local/nginx/sbin/nginx&quot;</span> &gt;&gt;/etc/rc.local</span><br><span class="line"><span class="built_in">chmod</span> +x /etc/rc.d/rc.local</span><br></pre></td></tr></table></figure><hr><p><strong>配置文件</strong></p><p>​路径  /usr/local/nginx/conf/</p><p>​nginx.conf #注：主配置文件</p><p>面试：请你说说nginx配置文件里有哪些常见的配置 （讲它的结构）</p><p>​日志</p><p>​access.log 记录正常的访问</p><p>​error.log  访问出错的信息</p><p>​listen</p><figure class="highlight nginx"><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br></pre></td><td class="code"><pre><span class="line">[root@<span class="attribute">cPen</span> conf]<span class="comment"># cat nginx.conf</span></span><br><span class="line"><span class="comment">#user  nobody;#注：指定启动nginx的用户</span></span><br><span class="line">worker_processes  <span class="number">1</span>;<span class="comment">#注：工作进程的数量 需要和cpu核心的数量一致</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#error_log  logs/error.log;#注：日志文件放在哪里，日志级别</span></span><br><span class="line"><span class="comment">#error_log  logs/error.log  notice;</span></span><br><span class="line"><span class="comment">#error_log  logs/error.log  info;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#pid        logs/nginx.pid;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：块 &#123;&#125;</span></span><br><span class="line"><span class="section">events</span> &#123;</span><br><span class="line">    <span class="attribute">worker_connections</span>  <span class="number">1024</span>;<span class="comment">#注：表示nginx可以同时支持的并发数，同时支持多少人访问，具体需要考虑机器的cpu，内存，磁盘IO，网络带宽 --》压力测试</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="section">http</span> &#123;<span class="comment">#注：与http协议相关的</span></span><br><span class="line">    <span class="attribute">include</span>       mime.types;</span><br><span class="line">    <span class="attribute">default_type</span>  application/octet-stream;</span><br><span class="line"></span><br><span class="line">    <span class="comment">#log_format  main  &#x27;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#x27;</span></span><br><span class="line">    <span class="comment">#                  &#x27;$status $body_bytes_sent &quot;$http_referer&quot; &#x27;</span></span><br><span class="line">    <span class="comment">#                  &#x27;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#x27;;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#access_log  logs/access.log  main;</span></span><br><span class="line"></span><br><span class="line">    <span class="attribute">sendfile</span>        <span class="literal">on</span>;</span><br><span class="line">    <span class="comment">#tcp_nopush     on;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#keepalive_timeout  0;</span></span><br><span class="line">    <span class="attribute">keepalive_timeout</span>  <span class="number">65</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">#gzip  on;</span></span><br><span class="line"></span><br><span class="line">    <span class="section">server</span> &#123;<span class="comment">#注：提供http服务的，一个server对应一个网站</span></span><br><span class="line">        <span class="comment">#listen       80;#注：监听的端口</span></span><br><span class="line">        <span class="attribute">listen</span>       <span class="number">8080</span>;</span><br><span class="line">        <span class="comment">#server_name  localhost;#注：为哪个网站(域名)提供网站的</span></span><br><span class="line">        <span class="attribute">server_name</span>  www.cpen.top;</span><br><span class="line"></span><br><span class="line">        <span class="comment">#charset koi8-r;</span></span><br><span class="line">        <span class="attribute">charset</span> utf-<span class="number">8</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment">#access_log  logs/host.access.log  main;</span></span><br><span class="line"></span><br><span class="line">        <span class="section">location</span> / &#123;<span class="comment">#注：访问网页的根</span></span><br><span class="line">            <span class="attribute">root</span>   html;<span class="comment">#注：存放网页的位置</span></span><br><span class="line">            <span class="attribute">index</span>  index.html index.htm;<span class="comment">#注：指定首页，其他页面通过链接过去</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">#error_page  404              /404.html;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># redirect server error pages to the static page /50x.html</span></span><br><span class="line">        <span class="comment">#</span></span><br><span class="line">        <span class="attribute">error_page</span>   <span class="number">500</span> <span class="number">502</span> <span class="number">503</span> <span class="number">504</span>  /50x.html;</span><br><span class="line">        <span class="section">location</span> = /50x.html &#123;</span><br><span class="line">            <span class="attribute">root</span>   html;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"># proxy the PHP scripts to Apache listening on 127.0.0.1:80</span></span><br><span class="line">        <span class="comment">#</span></span><br><span class="line">        <span class="comment">#location ~ \.php$ &#123;</span></span><br><span class="line">        <span class="comment">#    proxy_pass   http://127.0.0.1;</span></span><br><span class="line">        <span class="comment">#&#125;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000</span></span><br><span class="line">        <span class="comment">#</span></span><br><span class="line">        <span class="comment">#location ~ \.php$ &#123;</span></span><br><span class="line">        <span class="comment">#    root           html;</span></span><br><span class="line">        <span class="comment">#    fastcgi_pass   127.0.0.1:9000;</span></span><br><span class="line">        <span class="comment">#    fastcgi_index  index.php;</span></span><br><span class="line">        <span class="comment">#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;</span></span><br><span class="line">        <span class="comment">#    include        fastcgi_params;</span></span><br><span class="line">        <span class="comment">#&#125;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># deny access to .htaccess files, if Apache&#x27;s document root</span></span><br><span class="line">        <span class="comment"># concurs with nginx&#x27;s one</span></span><br><span class="line">        <span class="comment">#</span></span><br><span class="line">        <span class="comment">#location ~ /\.ht &#123;</span></span><br><span class="line">        <span class="comment">#    deny  all;</span></span><br><span class="line">        <span class="comment">#&#125;</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment"># another virtual host using mix of IP-, name-, and port-based configuration</span></span><br><span class="line">    <span class="comment">#</span></span><br><span class="line">    <span class="comment">#server &#123;</span></span><br><span class="line">    <span class="comment">#    listen       8000;</span></span><br><span class="line">    <span class="comment">#    listen       somename:8080;</span></span><br><span class="line">    <span class="comment">#    server_name  somename  alias  another.alias;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#    location / &#123;</span></span><br><span class="line">    <span class="comment">#        root   html;</span></span><br><span class="line">    <span class="comment">#        index  index.html index.htm;</span></span><br><span class="line">    <span class="comment">#    &#125;</span></span><br><span class="line">    <span class="comment">#&#125;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment"># HTTPS server</span></span><br><span class="line">    <span class="comment">#</span></span><br><span class="line">    <span class="comment">#server &#123;</span></span><br><span class="line">    <span class="comment">#    listen       443 ssl;</span></span><br><span class="line">    <span class="comment">#    server_name  localhost;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#    ssl_certificate      cert.pem;</span></span><br><span class="line">    <span class="comment">#    ssl_certificate_key  cert.key;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#    ssl_session_cache    shared:SSL:1m;</span></span><br><span class="line">    <span class="comment">#    ssl_session_timeout  5m;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#    ssl_ciphers  HIGH:!aNULL:!MD5;</span></span><br><span class="line">    <span class="comment">#    ssl_prefer_server_ciphers  on;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#    location / &#123;#注：和路由相关的</span></span><br><span class="line">    <span class="comment">#        root   html;</span></span><br><span class="line">    <span class="comment">#        index  index.html index.htm;</span></span><br><span class="line">    <span class="comment">#    &#125;</span></span><br><span class="line">    <span class="comment">#&#125;</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>配置文件里相关配置</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011201523665.png" alt=""></p></blockquote><hr><p><strong>防火墙</strong></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">iptables -A INPUT -p tcp --dport 8099 -j ACCEPT</span><br></pre></td></tr></table></figure><hr><p>nginx的首页文件</p><p>[root@cPen html]# cd /usr/local/nginx/html/</p><p>[root@cPen html]# vim index.html #注：修改首页</p><p>#注：修改内容自己定义</p><p>#注：修改网页内容不需要刷新nginx服务</p><p>​只有修改nginx的配置文件才需要刷新nginx服务</p><hr><p><strong>使用域名访问：</strong></p><p>​阿里云：没有备案的域名不允许访问</p><p>​腾讯云：没有备案的域名不允许访问</p><p>购买域名–》绑定公网ip–》搞一个首页–》去备案</p><hr><h1 id="3-shell编程语法">3. shell编程语法<a class="header-anchor" href="#3-shell编程语法"></a></h1><p><strong>shell编程语法</strong></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">\  续行</span><br><span class="line">cmd1 &amp;&amp; cmd2</span><br><span class="line">cmd1 || cmd2</span><br><span class="line">cmd1 &amp;&amp; cmd2 || cmd3</span><br><span class="line"></span><br><span class="line"><span class="built_in">test</span> -d <span class="string">&#x27;/usr/local/nginx8/logs&#x27;</span></span><br><span class="line">[ -d /usr/local/nginx8/logs ]  判断/usr/local/nginx8/logs这个目录是否存在</span><br><span class="line"></span><br><span class="line"><span class="built_in">test</span> -f <span class="string">&#x27;/usr/local/nginx8/conf/nginx.conf&#x27;</span> </span><br><span class="line">[ -f /usr/local/nginx8/conf/nginx.conf ]  判断/usr/local/nginx8/conf/nginx.conf这个文件是否存在</span><br></pre></td></tr></table></figure><hr><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">[root@sc-nginx nginx-1.19.5]# <span class="built_in">which</span> killall</span><br><span class="line">/usr/bin/killall</span><br><span class="line">[root@sc-nginx nginx-1.19.5]# rpm -qf /usr/bin/killall </span><br><span class="line">psmisc-23.1-5.el8.x86_64</span><br><span class="line"><span class="comment">#注：killall -9 nginx  杀死所有nginx进程</span></span><br></pre></td></tr></table></figure><hr><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="comment">#注：vim编辑器 全部替换</span></span><br><span class="line">:%s/nginx8/nginx18/</span><br></pre></td></tr></table></figure><hr><h1 id="4-web">4. web<a class="header-anchor" href="#4-web"></a></h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">nginx</span><br><span class="line">官方网站    http://nginx.org/en/</span><br><span class="line">     http://nginx.org/en/docs/</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">静态页面  纯html,css,js（没有和数据库交互）</span><br><span class="line"> nginx的强项是解析静态页面</span><br><span class="line">动态页面  需要使用动态编程语言：python，go，java，c#，php等</span><br><span class="line"> 和数据库交互 --&gt; 读写数据</span><br><span class="line">图解</span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011202103199.png" alt="image-20221011202103199" style="zoom:150%;" /></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><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><br><span class="line">    --with-http_realip_module</span><br><span class="line">    --with-http_ssl_module</span><br><span class="line">    --with-stream  让nginx具有负载均衡，支持4层</span><br><span class="line">     enables building the stream module <span class="keyword">for</span> generic TCP/UDP proxying and load balancing.</span><br><span class="line">启动nginx</span><br><span class="line">    ./nginx</span><br><span class="line">    启动</span><br><span class="line">        ./nginx -s stop  停止</span><br><span class="line">        nginx -s reload  重启</span><br><span class="line">    <span class="built_in">kill</span></span><br><span class="line">    killall</span><br><span class="line">    pstreeyum install psmisc</span><br><span class="line">    lsof -i:80</span><br><span class="line">    netstat -anplut</span><br><span class="line">    PATH变量的修改    PATH=/usr/local/nginx/sbin/:<span class="variable">$PATH</span>  临时修改</span><br><span class="line">                    永久修改 </span><br><span class="line">                    vim /etc/profile  在末尾添加 PATH=/usr/local/nginx/sbin:<span class="variable">$PATH</span></span><br><span class="line">                    </span><br></pre></td></tr></table></figure><hr><p>http协议</p><p>​1.0</p><p>​1.1</p><p>​2.0</p><p>​http2.0比http1.1好在哪里？</p><p>​http和https的区别</p><hr><p><strong>设置xshell小键盘可用</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011202303724.png" alt=""></p><p>#注：属性 --》 终端 --》 VT模式 --》 设置为普通</p></blockquote><hr><p>–with-http_realip_module  --》修改http协议，里面增加一个字段realip–&gt;nginx服务器做反向代理服务器的时候使用</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011202334741.png" alt="image-20221011202334741" style="zoom:150%;" /></blockquote><hr><h1 id="5-nginx安装脚本">5. nginx安装脚本<a class="header-anchor" href="#5-nginx安装脚本"></a></h1><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></pre></td><td class="code"><pre><span class="line">[root@cPen nginx]# <span class="built_in">cat</span> onekey_install_nginx.sh </span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#time:2020-12-12</span></span><br><span class="line"><span class="comment">#author: cPen</span></span><br><span class="line"><span class="comment">#company: cPen</span></span><br><span class="line"><span class="comment">#mail:1533431376@qq.com</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#新建用户，用来启动nginx</span></span><br><span class="line">useradd -s /sbin/nologin cPen_nginx</span><br><span class="line"><span class="comment">#解决依赖关系</span></span><br><span class="line">yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make psmisc lsof net-tools vim</span><br><span class="line"></span><br><span class="line"><span class="comment">#download file</span></span><br><span class="line"><span class="built_in">mkdir</span> -p /nginx</span><br><span class="line"><span class="built_in">cd</span> /nginx</span><br><span class="line">curl -O http://nginx.org/download/nginx-1.19.5.tar.gz</span><br><span class="line"><span class="comment">#解压文件</span></span><br><span class="line">tar xf nginx-1.19.5.tar.gz</span><br><span class="line"><span class="built_in">cd</span> nginx-1.19.5</span><br><span class="line"><span class="comment">#编译前的配置</span></span><br><span class="line">./configure --prefix=/usr/local/nginx --user=cPen_nginx --group=cPen_nginx --build=scweb_server --with-threads --with-file-aio --with-http_v2_module --with-http_ssl_module --with-stream</span><br><span class="line"></span><br><span class="line"><span class="comment">#编译，-j 2 启动2个进程去编译，需要你有2个核心的cpu</span></span><br><span class="line">make -j 2</span><br><span class="line"></span><br><span class="line"><span class="comment">#编译安装</span></span><br><span class="line">make install</span><br><span class="line"></span><br><span class="line"><span class="comment">#修改PATH变量</span></span><br><span class="line">PATH=/usr/local/nginx/sbin:<span class="variable">$PATH</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;PATH=/usr/local/nginx/sbin:$PATH&#x27;</span> &gt;&gt;/etc/profile</span><br><span class="line"></span><br><span class="line"><span class="comment">#关闭防火墙</span></span><br><span class="line">service firewalld stop</span><br><span class="line">systemctl <span class="built_in">disable</span> firewalld</span><br><span class="line"></span><br><span class="line"><span class="comment">#关闭selinux</span></span><br><span class="line">setenforce 0    <span class="comment">#临时关闭</span></span><br><span class="line">sed -i <span class="string">&#x27;/^SELINUX/ s/enforcing/disabled/&#x27;</span> /etc/sysconfig/selinux</span><br><span class="line">sed -i <span class="string">&#x27;/^SELINUX/ s/enforcing/disabled/&#x27;</span> /etc/selinux/config</span><br><span class="line"></span><br><span class="line"><span class="comment">#启动nginx</span></span><br><span class="line">nginx</span><br><span class="line"></span><br><span class="line"><span class="comment">#on boot</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;/usr/local/nginx/sbin/nginx&quot;</span> &gt;&gt;/etc/rc.local</span><br><span class="line"><span class="built_in">chmod</span> +x /etc/rc.d/rc.local</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Nginx </tag>
            
            <tag> Linux </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>26_Linux基础-项目轮廓-回顾ansible-dns-nfs-nginx</title>
      <link href="/posts/dd4b1092.html"/>
      <url>/posts/dd4b1092.html</url>
      
        <content type="html"><![CDATA[<h1 id="一-ansible">一. ansible<a class="header-anchor" href="#一-ansible"></a></h1><p><strong>ansible</strong></p><p>​是什么？由哪些组成？<br>​有什么作用？<br>​paramiko--&gt; 这个库/模块 ansible实现ssh功能</p><hr><p>是什么？</p><p>ansible是一个自动化运维工具的名称</p><hr><p>由哪些组成？</p><p><strong>ansible组成：</strong></p><p>​1、host inventory--#定义客户机，可以对客户机进行分类：db类，web类…等等</p><p>​2、playbook  --#剧本 让主机按照我给定的剧本去完成一些事情</p><p>​3、module--#模块 实现一个个功能的程序</p><p>​4、pluging --#插件 实现一些额外的小功能</p><p>---------------------------------------</p><p>有什么作用？</p><p>装软件、卸软件、改配置、打补丁、做备份、跑脚本（运维工作）</p><p>---------------------------------------</p><p>ansible是python写的，底层是ssh</p><p>---------------------------------------</p><p>paramiko--》 这个库/模块 ansible实现ssh功能</p><p>---------------------------------------</p><p>sshpass 模块 --》linux命令 实现ssh登录</p><p>---------------------------------------</p><p>[root@cPen_A ~]# ansible --version#注：查看版本<br>ansible 2.9.15</p><hr><h1 id="二-grep">二. grep<a class="header-anchor" href="#二-grep"></a></h1><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">#grep相关命令</span></span><br><span class="line">[root@cPen_B network-scripts]# <span class="built_in">cat</span> /etc/passwd|grep -B 5 mail<span class="comment">#注：查看前5行</span></span><br><span class="line">[root@cPen_B network-scripts]# <span class="built_in">cat</span> /etc/passwd|grep -A 5 mail<span class="comment">#注：查看后5行</span></span><br><span class="line">[root@cPen_B network-scripts]# <span class="built_in">cat</span> /etc/passwd|grep -C 5 mail<span class="comment">#注：中间 查看前后5行</span></span><br></pre></td></tr></table></figure><hr><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">[root@cPen_A ~]# vim /etc/ansible/ansible.cfg <span class="comment">#注：ansible配置文件</span></span><br><span class="line">forks          = 5<span class="comment">#注：起5个进程去处理 -f 选项</span></span><br></pre></td></tr></table></figure><hr><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">ip地址显示不出来</span><br><span class="line">service NetworkManager stop<span class="comment">#注：这个服务影响的</span></span><br><span class="line">service network restart</span><br></pre></td></tr></table></figure><hr><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">template模板--&gt; 绝大部分固定的，有几个是变量，根据ansible取机器上的值</span><br><span class="line"></span><br><span class="line">[root@cPen_A ansible]# ansible web -m setup<span class="comment">#注：查看节点服务器的信息  以字典形式展示</span></span><br><span class="line">192.168.0.79 | SUCCESS =&gt; &#123;</span><br><span class="line">    <span class="string">&quot;ansible_facts&quot;</span>: &#123;</span><br><span class="line">……</span><br><span class="line">&#125;</span><br><span class="line">[root@cPen_A ansible]# ansible web -m setup -a <span class="string">&quot;filter=ansible_all_ipv4_addresses&quot;</span></span><br><span class="line"><span class="comment">#注：过滤获得指定信息</span></span><br><span class="line"><span class="comment">#注：获取 ansible-demo3 主机的 IPV4 地址</span></span><br><span class="line">192.168.0.79 | SUCCESS =&gt; &#123;</span><br><span class="line">    <span class="string">&quot;ansible_facts&quot;</span>: &#123;<span class="comment">#注：ansible_事实</span></span><br><span class="line">        <span class="string">&quot;ansible_all_ipv4_addresses&quot;</span>: [</span><br><span class="line">            <span class="string">&quot;192.168.0.79&quot;</span></span><br><span class="line">        ], </span><br><span class="line">        <span class="string">&quot;discovered_interpreter_python&quot;</span>: <span class="string">&quot;/usr/bin/python&quot;</span></span><br><span class="line">    &#125;, </span><br><span class="line">    <span class="string">&quot;changed&quot;</span>: <span class="literal">false</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">==========================================================</span><br><span class="line">ssh = paramiko.SSHClient()</span><br><span class="line">ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())</span><br><span class="line">ssh.connect(<span class="string">&quot;某IP地址&quot;</span>,22,<span class="string">&quot;用户名&quot;</span>, <span class="string">&quot;口令&quot;</span>)</span><br><span class="line">==========================================================</span><br><span class="line">解决使用密码连接，第一ssh过去的时候，需要输入<span class="built_in">yes</span>的问题</span><br><span class="line"></span><br><span class="line">[root@C ansible]# vim hosts </span><br><span class="line">[web]</span><br><span class="line">192.168.0.77</span><br><span class="line">[db]</span><br><span class="line">192.168.0.35 ansible_ssh_user=root ansible_ssh_pass=123456</span><br><span class="line"></span><br><span class="line">[root@C ansible]# vim ansible.cfg </span><br><span class="line"><span class="comment"># uncomment this to disable SSH key host checking</span></span><br><span class="line">host_key_checking = False</span><br></pre></td></tr></table></figure><hr><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">api接口 --&gt; application interface</span><br><span class="line"><span class="comment">#注：写接口</span></span><br><span class="line">json有什么用？轻量级的数据交换格式</span><br></pre></td></tr></table></figure><hr><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">[root@cPen_A ansible]# ansible-doc -l<span class="comment">#注：查看ansible的模块</span></span><br><span class="line"><span class="comment">#注：doc 文档，l list</span></span><br></pre></td></tr></table></figure><hr><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">lastest表示安装  不是指最新的</span><br></pre></td></tr></table></figure><hr><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">项目</span><br><span class="line">ansible</span><br><span class="line"></span><br><span class="line">项目名称：使用ansible批量部署nginx集群和mysql集群</span><br><span class="line">项目环境：centos8.2，ansible2.9.15，nginx1.19.5,mysql5.7.31</span><br><span class="line">项目描述：</span><br><span class="line"><span class="code">使用ansible去批量部署6台nginx服务器，1台NFS文件服务器，3台MySQL服务器，其中nginx采用源码编译安装，MySQL采用二进制安装，NFS采用yum安装方法。nginx的编译安装和MySQL的二进制安装过程提前编写好脚本，通过ansible下发到nginx和MySQL服务器上执行，全程采用playbook来实现批量自动化部署</span></span><br><span class="line"><span class="code">项目步骤：</span></span><br><span class="line"><span class="code">1.部署好11台linux虚拟机，全部的配置，采用1核2G的内存的配置，安装好centos8.2的系统。</span></span><br><span class="line"><span class="code">2.然后在一台linux系统里安装部署ansible，采用yum安装。</span></span><br><span class="line"><span class="code">3.编写好一键安装nginx的脚本，连同nginx.conf配置文件都指定好内容，方便后面的playbook使用。</span></span><br><span class="line"><span class="code">4.编写好一键安装MySQL的脚本，连同my.cnf配置文件都指定好内容，方便后面的playbook使用。</span></span><br><span class="line"><span class="code">5.在ansible服务器和所有的nginx，MySQL，NFS服务器之间建立ssh免密通道</span></span><br><span class="line"><span class="code">6.最后编写ansible的playbook文件去统一部署nginx，MySQL，nfs服务器</span></span><br><span class="line"><span class="code">7.测试整个安装部署是否成功</span></span><br><span class="line"><span class="code">项目心得：</span></span><br><span class="line"><span class="code">1.对ansible的在大规模集群里的使用有了一些了解，深入体会到批量部署的便捷</span></span><br><span class="line"><span class="code">2.对集群有了一定的认识</span></span><br><span class="line"><span class="code">3.编写脚本的能力有了提升</span></span><br><span class="line"><span class="code">4.自己对*个故障的排除，提升自己的troubleshooting的能力</span></span><br><span class="line"><span class="code">============================================================================================</span></span><br><span class="line"><span class="code">写项目时</span></span><br><span class="line"><span class="code">1.摆数据</span></span><br></pre></td></tr></table></figure><hr><p>nginx</p><p>​是什么？有什么用？</p><p>​nginx是一个web服务器</p><p>​web就是网站</p><hr><p>dns</p><p>​domain name system  域名解析系统</p><p>​<a href="http://www.aliyun.com">www.aliyun.com</a> --&gt; ip</p><p>​为什么需要DNS？</p><p>​方便记住某个网站名字</p><p>​ip很难记</p><p>正向解析：域名 --&gt; ip</p><p>反向解析： ip --&gt; 域名</p><p>在浏览器输入www,baidu.com回车后发生了什么？</p><p>​1、浏览器缓存</p><p>​2、hosts文件</p><p>​3、本地dns服务器</p><p>​4、转发服务器</p><p>​5、根域名服务器</p><p>​6、迭代过程</p><p>​7、递归返回</p><p>​8、直接访问</p><hr><p>CDN内容分发网络：加速（就近解析）</p><p>#注：缓存有滞后的</p><p>#注：视频业务大量使用CDN</p><hr><p>记录类型</p><p>​A记录 --&gt; address record</p><p>​www --&gt; 120.77.248.190</p><hr><p>需要上线一个自己的网站，有哪些流程(工作要做)？</p><p>1、购买云服务器，部署nginx，mysql，Python等环境</p><p>2、购买域名 <a href="http://www.chenpeng.com">www.chenpeng.com</a>，绑定域名和云服务器 --&gt; A记录 --&gt; 备案(服务器在国内必须备案)</p><p>3、开发网站 --&gt; 写网站</p><p>4、测试网站</p><p>5、上传到云服务器的nginx网页根目录下 --&gt; 上线</p><hr><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">[root@cPen_C lianxi]# yum provides nslookup</span><br><span class="line"><span class="comment">#注：查看命令从哪个包安装</span></span><br></pre></td></tr></table></figure><hr><p>NFS</p><p>​network file system网络文件系统</p><p>​有什么用？</p><p>​共享文件 --&gt; 多台服务器使用相同的内容</p><p>#注：NFS是最廉价的解放方案，受网络影响、服务器硬件配置低，磁盘的速度，CPU，内存，网络带宽 都是比较差的</p><p>#注：比较贵的解决方案：上专业存储</p><p>#注：更好的是 SAN 光纤设备</p><p>SAN --&gt;</p><p>NAS --&gt; 网络附加存储</p><p>SAN一般指存储区域网络。存储区域网络（Storage Area Network，简称SAN）采用网状通道（Fibre Channel ，简称FC，区别与Fiber Channel光纤通道）技术，通过FC交换机连接存储阵列和服务器主机，建立专用于数据存储的区域网络</p><p>NAS（Network Attached Storage：网络附属存储）按字面简单说就是连接在网络上，具备资料存储功能的装置，因此也称为“网络存储器”。</p><hr><p>ansible</p><p>​项目</p><p>dns</p><p>nginx一键部署</p><p>网站上线</p><p>NFS</p><p>​SAN</p><p>​NAS</p><hr><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></pre></td><td class="code"><pre><span class="line">nginx一键安装 脚本</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#author:cali</span></span><br><span class="line"><span class="comment">#time:2020-49</span></span><br><span class="line"><span class="comment">#company:sanchuang</span></span><br><span class="line"><span class="comment">#email:695811769@qq.com</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> -p /nginx2</span><br><span class="line"><span class="built_in">cd</span> /nginx2</span><br><span class="line"><span class="comment">#download nginx</span></span><br><span class="line">curl -O http://nginx.org/download/nginx-1.17.9.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment">#创建用户</span></span><br><span class="line">useradd lihu</span><br><span class="line"></span><br><span class="line"><span class="comment">#解压</span></span><br><span class="line">tar xf nginx-1.17.9.tar.gz </span><br><span class="line"></span><br><span class="line"><span class="comment">#进入解压目录</span></span><br><span class="line"><span class="built_in">cd</span> nginx-1.17.9</span><br><span class="line"></span><br><span class="line"><span class="comment">#解决依赖关系</span></span><br><span class="line">yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make </span><br><span class="line"></span><br><span class="line"><span class="comment">#配置</span></span><br><span class="line">./configure  --prefix=/usr/local/nginx9  --user=lihu --group=lihu --with-threads  --with-file-aio  --with-http_ssl_module  --with-http_stub_status_module  --with-stream </span><br><span class="line"></span><br><span class="line"><span class="comment">#编译和安装</span></span><br><span class="line">make -j 2 ; make install</span><br><span class="line"></span><br><span class="line"><span class="comment">#开机启动</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;/usr/local/nginx9/sbin/nginx&quot;</span> &gt;&gt;/etc/rc.local </span><br><span class="line"><span class="built_in">chmod</span> +x /etc/rc.d/rc.local </span><br><span class="line"></span><br><span class="line"><span class="comment">#修改PATH变量</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;PATH=/usr/local/nginx9/sbin:<span class="variable">$PATH</span>&quot;</span> &gt;&gt;/etc/profile</span><br><span class="line">PATH=/usr/local/nginx9/sbin:<span class="variable">$PATH</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#启动</span></span><br><span class="line">nginx</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>25_Linux基础-NFS服务</title>
      <link href="/posts/317b0311.html"/>
      <url>/posts/317b0311.html</url>
      
        <content type="html"><![CDATA[<p>日志轮转：</p><p><a href="https://blog.csdn.net/weixin_43265596/article/details/85469405">https://blog.csdn.net/weixin_43265596/article/details/85469405</a></p><p><a href="https://www.cnblogs.com/liangyuxing/p/11962863.html">https://www.cnblogs.com/liangyuxing/p/11962863.html</a></p><p><a href="https://blog.csdn.net/dhxaohei/article/details/8014764">https://blog.csdn.net/dhxaohei/article/details/8014764</a></p><hr><h1 id="一-NFS简介">一. NFS简介<a class="header-anchor" href="#一-NFS简介"></a></h1><p>**NFS（Network File System的简称，即网络文件系统）**可以通过网络，让不同的机器、不同的操作系统可以共享彼此的文件。NFS可以将远程的计算机磁盘挂载到本地，读写文件像访问本地磁盘一样操作</p><p><strong>前提</strong>：关闭selinx<br>关闭iptables</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><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></pre></td><td class="code"><pre><span class="line">1、安装</span><br><span class="line">[root@cPen_A lianxi]# yum install nfs-utils</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">2、修改配置文件/etc/exports</span><br><span class="line">[root@cPen_A lianxi]# vim /etc/exports<span class="comment">#注：配置文件</span></span><br><span class="line">/opt/www 192.168.255.0/24(rw,no_root_squash)</span><br><span class="line"><span class="comment">#注：192.168.255.0/24共享，rw权限 读写，no_root_squash 将远程根用户当成本地根用户，即不压制root</span></span><br><span class="line">首先创建/opt/www目录，在这下面创建index.html文件，文件内容”this is <span class="built_in">test</span> nfs”</span><br><span class="line">再添加exports配置，nfs的配置：vim /etc/exports</span><br><span class="line">添加如下行：</span><br><span class="line">/opt/www 192.168.255.0/24(rw)</span><br><span class="line">表示共享/opt/www目录，给192.168.255./24这个网段的主机都可以通过nfs来访问我本地的/opt/www目录</span><br><span class="line">括号()里面的表示选项，rw表示读写</span><br><span class="line"></span><br><span class="line">生效配置：</span><br><span class="line">exportfs -a 或者重启服务</span><br><span class="line"></span><br><span class="line">[root@cPen_A opt]# <span class="built_in">cd</span> /opt</span><br><span class="line">[root@cPen_A opt]# <span class="built_in">mkdir</span> www</span><br><span class="line">[root@cPen_A opt]# <span class="built_in">cd</span> www</span><br><span class="line">[root@cPen_A www]# vim index.html</span><br><span class="line">this is <span class="built_in">test</span> nfs</span><br><span class="line">[root@cPen_A www]# <span class="built_in">pwd</span></span><br><span class="line">/opt/www</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：/opt放额外的软件包的目录</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">3、启动nfs服务</span><br><span class="line">[root@cPen_A www]# service nfs start<span class="comment">#注：启动服务</span></span><br><span class="line">[root@cPen_A www]# showmount -e<span class="comment">#注：检测是否可以连接</span></span><br><span class="line">Export list <span class="keyword">for</span> cPen_A:</span><br><span class="line">/opt/www 192.168.255.0/24</span><br><span class="line"><span class="comment">#注：centos8下 启动 [root@cPen_B ~]# service nfs-server start</span></span><br><span class="line">---------------------------------------------------------------</span><br><span class="line">NFS的连接查看</span><br><span class="line">可以在server端先自我测试一下是否可以连接。</span><br><span class="line">命令：showmount [-ae] [hostname  | IP]</span><br><span class="line">-a：显示当前主机与客户端的NFS连接共享的状态</span><br><span class="line">-e：显示某台主机的/etc/exports所共享的目录数据</span><br><span class="line">---------------------------------------------------------------</span><br><span class="line">4、在另一台机器上测试</span><br><span class="line">出现返回 表示ok</span><br><span class="line">[root@cPen_C ~]# showmount -e 192.168.255.28<span class="comment">#注：后面指定分析的机器的ip地址</span></span><br><span class="line">Export list <span class="keyword">for</span> 192.168.255.28:<span class="comment">#注：出现这种情况，表示可以连接 连通性没有问题</span></span><br><span class="line">/opt/www 192.168.255.0/24</span><br><span class="line"></span><br><span class="line">5、挂载网络文件</span><br><span class="line">在另外一台机器</span><br><span class="line">[root@cPen_C ~]# <span class="built_in">mkdir</span> /mnt2</span><br><span class="line">[root@cPen_C ~]# mount -t nfs 192.168.255.28:/opt/www /mnt2<span class="comment">#注：挂载网络文件</span></span><br><span class="line">[root@cPen_C ~]# <span class="built_in">df</span><span class="comment">#注：使用df命令看磁盘挂载情况（这是网络磁盘挂载）</span></span><br><span class="line">192.168.255.28:/opt/www 17811456 2165760 15645696   13% /mnt2</span><br><span class="line"></span><br><span class="line">[root@cPen_C ~]# <span class="built_in">cd</span> /mnt2</span><br><span class="line">[root@cPen_C mnt2]# <span class="built_in">ls</span></span><br><span class="line">index.html</span><br><span class="line">[root@cPen_C mnt2]# <span class="built_in">cat</span> index.html </span><br><span class="line">this is <span class="built_in">test</span> nfs</span><br><span class="line">[root@cPen_C mnt2]# <span class="built_in">ls</span></span><br><span class="line">index.html</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cd</span> /opt/www/<span class="comment">#注：服务端A主机 操作</span></span><br><span class="line">[root@cPen_A www]# <span class="built_in">touch</span> index2.html<span class="comment">#注：服务端操作</span></span><br><span class="line">[root@cPen_C mnt2]# <span class="built_in">ls</span></span><br><span class="line">index2.html  index.html</span><br><span class="line">[root@cPen_C mnt2]# <span class="built_in">mkdir</span> index2.html</span><br><span class="line"><span class="built_in">mkdir</span>: 无法创建目录<span class="string">&quot;index2.html&quot;</span>: 权限不够</span><br><span class="line"><span class="comment">#注：客户机C没有权限去操作服务器A文件</span></span><br><span class="line"><span class="comment">#没有权限的话 /etc/exports 设置 no_root_squash ，就可以操作了</span></span><br><span class="line">no_root_squash 将远程根用户当成本地根用户，即不压制root</span><br><span class="line"><span class="comment">#注：让服务器将 远端的root用户 识别成 本地根用户</span></span><br><span class="line"><span class="comment">#注：修改配置文件后，需要使用exportfs -a 生效配置；再重新挂载（先取消挂载，再重新挂载）</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#示例：取消挂载</span></span><br><span class="line">[root@cPen_C mnt2]# <span class="built_in">cd</span> ..<span class="comment">#注：先退出mnt2目录，否则报繁忙</span></span><br><span class="line">[root@cPen_C /]# umount /mnt2<span class="comment">#注：然后取消挂载</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#修改配置文件后，需要使用exportfs -a 生效</span></span><br><span class="line"><span class="comment">#重新挂载：</span></span><br><span class="line">    先退出/mnt2目录，然后执行：</span><br><span class="line">    umount /mnt2</span><br><span class="line">    再执行挂载</span><br></pre></td></tr></table></figure><hr><h1 id="二-npcbind和nfs">二. npcbind和nfs<a class="header-anchor" href="#二-npcbind和nfs"></a></h1><p>启动nfs之前，确保rpcbind服务已经启动<br>nfs启动的时候，会向rpcbind服务注册端口，会返回一个端口给nfs使用<br>可以使用<br><code>rpcinfo -p</code>命令 <strong>查看nfs端口是否已经注册成功</strong><br>rpcbind就像房东，nfs是租客<br>#注：nfs自己不能起端口，rpcbind为nfs注册端口<br>#注：nfs起来之前 要确保rpcbind起来<br>[root@cPen_A www]# <code>rpcinfo -p</code>#注：<strong>rpcbind为nfs起2049端口</strong><br>100003    3   tcp   2049  nfs</p><hr><h1 id="三-实验：nfs和nginx-搭配使用-负载均衡和文件共享">三. 实验：nfs和nginx 搭配使用 负载均衡和文件共享<a class="header-anchor" href="#三-实验：nfs和nginx-搭配使用-负载均衡和文件共享"></a></h1><p>A:192.168.0.73nfs真实机<br>B:192.168.0.79代理机+真实机<br>C:192.168.0.53真实机</p><p>前提：<br>三台主机都安装好nginx，其中一台开启nfs服务<br>在A机器上开启了nfs服务，网站目录存放在/opt/www下，B、C可以挂载A的/opt/www目录到本地<br>A机器配置好nfs服务，开启nfs服务，然后在A、C两台上 执行：<br>[root@cPen_B ~]# mount -t nfs 192.168.0.73:/opt/www /opt/www<br>[root@cPen_C ~]# mount -t nfs 192.168.0.73:/opt/www /opt/www</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line">B机器变成代理机</span><br><span class="line">第1步：把8080端口起来</span><br><span class="line">修改A、B、C三台主机nginx的配置，启动8080端口，绑定域名www.sc.com</span><br><span class="line"><span class="comment">#注：配置文件目录：/etc/nginx</span></span><br><span class="line"><span class="comment">#注：进入 /etc/nginx/conf.d目录下  创建 sc.conf</span></span><br><span class="line">输入以下内容</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cd</span> /etc/nginx/</span><br><span class="line">[root@cPen_A nginx]# <span class="built_in">cd</span> conf.d/</span><br><span class="line">[root@cPen_A conf.d]# vim sc.conf<span class="comment">#注：后缀必须是 .conf，自动加载读取 该配置文件</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen  8080;<span class="comment">#注：监听8080端口</span></span><br><span class="line">    server_name  www.sc.com;<span class="comment">#注：指定域名</span></span><br><span class="line"></span><br><span class="line">    root /opt/www;<span class="comment">#注：指定网站家目录，默认去家目录下找index.html</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">[root@cPen_A conf.d]# nginx -t<span class="comment">#注：进行语法检测</span></span><br><span class="line">[root@cPen_A conf.d]# nginx -s reload<span class="comment">#注：生效配置</span></span><br><span class="line">[root@cPen_A conf.d]# lsof -i:8080<span class="comment">#注：8080端口起来了</span></span><br><span class="line">COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">nginx   3193  root    6u  IPv4  50354      0t0  TCP *:webcache (LISTEN)</span><br><span class="line">nginx   3194 nginx    6u  IPv4  50354      0t0  TCP *:webcache (LISTEN)</span><br><span class="line">nginx   3195 nginx    6u  IPv4  50354      0t0  TCP *:webcache (LISTEN)</span><br><span class="line"></span><br><span class="line">使用lsof -i:8080端口是否启动</span><br><span class="line">使用curl -H <span class="string">&quot;Host: www.sc.com&quot;</span> http://192.168.0.73:8080 查看返回的内容是否一致</span><br><span class="line">访问192.168.0.68的8080端口，以www.sc.com域名去访问</span><br><span class="line">[root@cPen_A ~]# curl -H <span class="string">&quot;Host: www.sc.com&quot;</span> http://192.168.0.73:8080</span><br><span class="line">this is <span class="built_in">test</span> nfs</span><br><span class="line"><span class="comment">#注：三台机器访问返回的内容相同  都是 this is test nfs</span></span><br><span class="line"></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：在B机器上添加反向代理</span></span><br><span class="line">对B机器进行负载均衡：把请求转发到其他机器（代理转发）（高可用）</span><br><span class="line">[root@cPen_B conf.d]# vim sc.conf </span><br><span class="line">server &#123;</span><br><span class="line">    listen  8080;</span><br><span class="line">    server_name  www.sc.com;</span><br><span class="line"></span><br><span class="line">    root /opt/www;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">upstream sc &#123;<span class="comment">#注：代理转发，为upstream取名为sc</span></span><br><span class="line">    server 192.168.0.73:8080;</span><br><span class="line">    server 192.168.0.53:8080;</span><br><span class="line">    server 192.168.0.79:8080;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">#注：虚拟主机，让不同的域名做不同的事情</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen  80;</span><br><span class="line">    server_name  www.sc.com;</span><br><span class="line"></span><br><span class="line">    root /opt/www;</span><br><span class="line"></span><br><span class="line">    location / &#123;<span class="comment">#注：访问网站的/目录，都会转发到sc</span></span><br><span class="line">        proxy_set_header Host <span class="variable">$host</span>;<span class="comment">#注：头部信息，不加的话  可能变成B的主机地址</span></span><br><span class="line"><span class="comment">#注：让客户端发过来的头部host字段信息 和转发包的头部host字段保持一致</span></span><br><span class="line">        proxy_pass http://sc;<span class="comment">#注：设置后端代理服务器</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen  80;</span><br><span class="line">    server_name  www.sc1.com;</span><br><span class="line"></span><br><span class="line">    root /usr/share/www;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">        proxy_set_header Host <span class="variable">$host</span>;</span><br><span class="line">        proxy_pass http://sc;</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">#注：输出www.sc.com时，请求时，会有数据包存放host头部信息:www.sc.com ，80端口收到这个包之后，知道是要转发到8080端口。B机器帮你请求A、B、C的8080端口发起请求</span></span><br><span class="line"><span class="comment">#注：客户机发起请求 www.sc.com，host头部信息www.sc.com（请求包里的，客户机携带的头部信息），B主机交给相应的server去处理，请求B主机的80端口去处理，转发到8080端口，B主机帮你去请求，B收到包的时候，交给server去处理。这时候A发起的这个包的头部信息 可能就是B的ip地址了（不是www.sc.com了），8080端口收到请求后，没有B的ip地址的server_name，会转发失败。所以 proxy_set_header Host $host 让它们的头部信息保持一致</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">[root@cPen_B conf.d]# nginx -t</span><br><span class="line">[root@cPen_B conf.d]# nginx -s reload</span><br><span class="line"></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#然后多次访问80端口，查看返回内容是否一致，以及查看每台机器的/var/log/nginx/access.log日志是否有新的请求过来 tail -f  /var/log/nginx/access.log</span></span><br><span class="line"></span><br><span class="line">[root@cPen_B conf.d]# curl -H <span class="string">&quot;Host: www.sc.com&quot;</span> http://192.168.0.79</span><br><span class="line">this is <span class="built_in">test</span> nfs</span><br><span class="line"><span class="comment">#注：代理转发，访问80端口，转发到8080端口，分发到3台机器去执行了（负载均衡）</span></span><br><span class="line"></span><br><span class="line">[root@cPen_C conf.d]# <span class="built_in">tail</span> -f  /var/log/nginx/access.log <span class="comment">#注：C主机下 ，B主机帮请求</span></span><br><span class="line">192.168.0.79 - - [01/Dec/2020:17:21:54 +0800] <span class="string">&quot;GET / HTTP/1.0&quot;</span> 200 17 <span class="string">&quot;-&quot;</span> <span class="string">&quot;curl/7.61.1&quot;</span> <span class="string">&quot;-&quot;</span></span><br><span class="line"><span class="comment">#注：平均打到3台，默认做轮转</span></span><br></pre></td></tr></table></figure><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011191610524.png" alt=""></p></blockquote><p>#注：可以使用 killall nginx 全部杀死</p><p>#注：404 没找到，403 forbid 禁止</p><blockquote><p>#注：A、B换成B、A<br>nginx代理机+真实机</p><p>A</p><p>nginx真实机</p><p>B <strong>nfs</strong></p><p>nginx真实机</p><p>C</p><p><a href="http://xn--www-kg0fp40a2u2b2uy59q.sc.com">客户端访问www.sc.com</a>访问A nginx代理机的80端口（代理的意思是转发）<br>A机器 返回本机的8080去处理，或者B机器的8080去处理，或者C机器的8080去处理<br>负载均衡：2万人访问A机器80端口，80端口不会去处理请求，只是做代理转发，交给本机8080处理，或者B机器的8080处理，C机器的8080处理。A、B、C三台返回的页面网站 都要保持一致<br>把B机器/opt/www目录 挂载到A上和C上 （保存文件的一致性，改的都是B机器的nfs）</p></blockquote><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20221011191803355.png" alt=""></p></blockquote><blockquote><p>#注：网络问题</p><p>桥接模式VMnet0同网段</p><p>NAT模式VMnet8同网段</p></blockquote>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> NFS </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>24_Linux基础-DNS服务</title>
      <link href="/posts/ecc378ee.html"/>
      <url>/posts/ecc378ee.html</url>
      
        <content type="html"><![CDATA[<p>参考文章：<a href="https://blog.csdn.net/loukundeboke/article/details/80012231">https://blog.csdn.net/loukundeboke/article/details/80012231</a></p><p><strong>DNS服务</strong><br><strong>DNS( Domain Name System) 域名系统</strong></p><blockquote><p>前提：</p><p>我们网络中都是使用ip地址通信，无论是访问服务，还是不同主机间进行数据交换</p><p>ip地址非常多，如果每个服务都通过ip地址来登录的话，用户就需要记住这些很复杂的ip地址，不方便用户使用</p><p>就像保存在手机里的电话号码一样，会有一个备注，通过这个备注 就可以找到正确的相应联系人的电话</p><p>那域名解析跟这个实现差不多，在普通用户中，我们用域名来访问服务，域名就通过域名解析来获取到ip地址</p><p>dns服务就像电话簿，提供了可以查询的域名到ip地址的映射关系</p><p>#注：<a href="http://xn--www-u68d60m59inlbiy0ilt3c1dm.taobao.com">在浏览器中输入www.taobao.com</a>，敲回车的一瞬间，先去解析域名</p><p>#注：域名系统；提供域名解析；ip对于用户来说，使用没有域名方便</p></blockquote><hr><h1 id="1-完全限定域名-FQDN">1. 完全限定域名 FQDN<a class="header-anchor" href="#1-完全限定域名-FQDN"></a></h1><p><strong>FQDN</strong>：Full Qualified Domain Name，<strong>完全限定域名</strong>，即每个域在全球网络都是唯一的；另外值得提到的一点是域并不是指诸如www.google.com这样的域名，而google.com才是域</p><p>#注：<a href="http://www.music.163.com/">www.music.163.com/</a>163.com是域，前面是主机名</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">安装dns服务软件包<span class="built_in">bind</span></span><br><span class="line">[root@cPen_B ~]# yum install <span class="built_in">bind</span></span><br><span class="line"><span class="comment">#注：安装后，数据存放在/var/named/下</span></span><br><span class="line">[root@cPen_B ~]# <span class="built_in">cd</span> /var/named/</span><br><span class="line">[root@cPen_B named]# <span class="built_in">ls</span></span><br><span class="line">data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves</span><br></pre></td></tr></table></figure><hr><h1 id="2-域的分类">2. 域的分类<a class="header-anchor" href="#2-域的分类"></a></h1><blockquote><p>一、根域（.） 全球13组根域名服务器以英文字母A到M依序命名，域名格式为“<a href="http://xn--p8sy69a.root-servers.net">字母.root-servers.net</a>”</p><p>​在/var/named/name.ca文件中可以查看# 注：标识为.</p><p>二、顶级域</p><p>​顶级域：顶级域（Top Level Domain，简称TLD）分为三类</p><p>​   1&gt; 通用顶级域：诸如 .com(商业机构) .org(非营利性组织) .net(网络服务机构)等</p><pre><code>   2&gt; 国家顶级域：诸如 .cn(中国) .uk(英国) .us(美国) .jp(日本) .hk   3&gt; 反向域（基础建设顶级域）：.arpa,即从IP到FQDN的反向解析# 注：反向查找</code></pre><p>#注：正向域：从域名到ip; 反向域：从ip到域名</p><p>三、</p><p>​二级域</p><p>​三级域</p><p><a href="http://www.sc.163.com">www.sc.163.com</a>--&gt; <a href="http://xn--cjs751gkfr.com">顶级域.com</a>  --&gt;<a href="http://xn--163-pi9d993b6v0d.com">二级域163.com</a>  --&gt;<a href="http://xn--sc-mv2ck10bj02c.163.com">三级域sc.163.com</a></p><p>​#注：前面的www是它的主机名</p></blockquote><hr><h1 id="3-DNS解析">3. DNS解析<a class="header-anchor" href="#3-DNS解析"></a></h1><p>正向解析域名 --&gt; ip</p><p>反向解析ip --&gt; 域名</p><h2 id="常用命令域名解析命令">常用命令域名解析命令<a class="header-anchor" href="#常用命令域名解析命令"></a></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><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><br><span class="line">1、Ping</span><br><span class="line">[root@cPen_A ~]# ping www.baidu.com</span><br><span class="line">PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.</span><br><span class="line">64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 <span class="keyword">time</span>=16.3 ms</span><br><span class="line"><span class="comment">#注：ping命令只能返回1个ip</span></span><br><span class="line"></span><br><span class="line">2、host</span><br><span class="line">安装bind-utils软件包</span><br><span class="line">yum install bind-utils</span><br><span class="line">[root@cPen_A ~]# host www.baidu.com</span><br><span class="line">www.baidu.com is an <span class="built_in">alias</span> <span class="keyword">for</span> www.a.shifen.com.#注：为www.a.shifen.com取别名www.baidu.com</span><br><span class="line">www.a.shifen.com has address 14.215.177.38<span class="comment">#注：ip地址</span></span><br><span class="line">www.a.shifen.com has address 14.215.177.39</span><br><span class="line"></span><br><span class="line">3、dig<span class="comment">#注：看的比较详细，推荐</span></span><br><span class="line">[root@cPen_A ~]# dig www.baidu.com</span><br><span class="line">;; ANSWER SECTION:</span><br><span class="line">www.baidu.com.34INCNAMEwww.a.shifen.com.</span><br><span class="line">www.a.shifen.com.216INA14.215.177.38</span><br><span class="line">www.a.shifen.com.216INA14.215.177.39</span><br><span class="line"></span><br><span class="line">4、nslookup</span><br><span class="line">[root@cPen_A ~]# nslookup www.baidu.com</span><br><span class="line">www.baidu.comcanonical name = www.a.shifen.com.<span class="comment">#注：查询的时候会加上根域，平时感觉不到</span></span><br><span class="line">Address: 14.215.177.38</span><br><span class="line">Address: 14.215.177.39</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：可以拿DNS实现分流的作用。将新机器的域名地址解析成2个ip</span></span><br><span class="line"><span class="comment">#注：负载均衡：把很多机器当做1台机器使用。DNS可以做到负载均衡，把流量分发到很多机器</span></span><br><span class="line"><span class="comment">#注：高可用：1台机器去服务 它跪掉了，高可用就是这台机器跪掉了，把流量引导其他机器</span></span><br><span class="line"><span class="comment">#注：高可用避免单点故障</span></span><br><span class="line"><span class="comment">#注：运维思想：备份、高可用。比如系统盘2块，其中1块跪掉了，另外一块还能继续服务</span></span><br><span class="line"><span class="comment">#注：负载均衡和高可用 一般一起存在</span></span><br></pre></td></tr></table></figure><h2 id="DNS服务软件：bind">DNS服务软件：bind<a class="header-anchor" href="#DNS服务软件：bind"></a></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><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></pre></td><td class="code"><pre><span class="line">DNS服务软件：<span class="built_in">bind</span></span><br><span class="line">默认端口 udp协议 53号端口</span><br><span class="line">[root@cPen_A ~]# less /etc/services </span><br><span class="line">domain          53/udp</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">示例：修改/etc/hosts文件</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> /etc/hosts</span><br><span class="line">127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4</span><br><span class="line">::1         localhost localhost.localdomain localhost6 localhost6.localdomain6</span><br><span class="line">[root@cPen_A ~]# ping localhost<span class="comment">#注：解析成127.0.0.1</span></span><br><span class="line">PING localhost (127.0.0.1) 56(84) bytes of data.</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> /etc/hosts</span><br><span class="line">127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4</span><br><span class="line">::1         localhost localhost.localdomain localhost6 localhost6.localdomain6</span><br><span class="line">127.0.0.1   www.baidu.com baid.com<span class="comment">#注：添加这一行</span></span><br><span class="line">[root@cPen_A ~]# ping www.baidu.com</span><br><span class="line">PING www.baidu.com (127.0.0.1) 56(84) bytes of data.<span class="comment">#注：解析成127.0.0.1</span></span><br><span class="line">[root@cPen_A ~]# ping baid.com</span><br><span class="line">PING www.baidu.com (127.0.0.1) 56(84) bytes of data.<span class="comment">#注：解析成127.0.0.1</span></span><br><span class="line"><span class="comment">#注：/etc/hosts文件 解析时 优先级最高</span></span><br><span class="line"></span><br><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A html]# <span class="built_in">pwd</span></span><br><span class="line">/usr/share/nginx/html</span><br><span class="line">[root@cPen_A html]# vim index.html</span><br><span class="line">hello world</span><br><span class="line">cPen</span><br><span class="line">[root@cPen_A html]# ip a</span><br><span class="line">inet 192.168.0.19/24 brd 192.168.0.255 scope global noprefixroute dynamic ens33</span><br><span class="line"><span class="comment">#Windows机器上</span></span><br><span class="line">Windows：C:\Windows\System32\drivers\etc\hosts</span><br><span class="line"><span class="comment">#注：hosts文件里</span></span><br><span class="line"><span class="comment"># localhost name resolution is handled within DNS itself.</span></span><br><span class="line"><span class="comment">#127.0.0.1       localhost</span></span><br><span class="line"><span class="comment">#::1             localhost</span></span><br><span class="line">192.168.0.39 www.ldj.com<span class="comment">#注：添加这一条</span></span><br><span class="line">这样在浏览器查找 www.ldj.com 就会访问到linux机器上的网址。www.ldj.com被解析成192.168.0.39</span><br></pre></td></tr></table></figure><hr><h1 id="4-DNS解析过程">4. DNS解析过程<a class="header-anchor" href="#4-DNS解析过程"></a></h1><blockquote><p>DNS解析过程：<br>#注：面试题：<strong><a href="http://xn--www-0v1ev05dwmi.baidu.com">当敲入www.baidu.com</a> 发生什么事情</strong><br>1、先查找<strong>本地hosts文件</strong>，linux：/etc/hosts;  Windows：C:\Windows\System32\drivers\etc\hosts<br>可以解析就直接返回地址<br>2、hosts文件不能解析，去看<strong>本地缓存</strong>。如果有，则返回结果，没有就进行下一步查找<br>linux下域名缓存：nscd服务<br>[root@cPen_A html]# yum install nscd<br>[root@cPen_A html]# service nscd restart#注：清除缓存 (重启服务就是清除缓存)<br>缓存会有缓存时间，缓存多久可以指定的<br>#注：设置了DNS服务，但是设置了没有生效，考虑1、缓存 清除缓存和2、/etc/hosts是否写死<br>3、本地缓存没有找到，就会去请求<strong>本地的域名服务器</strong>，本地域名服务器有 就返回查询结果<br><strong>Linux下指定域名解析服务器文件 /etc/resolv.conf  （配置本地域名服务器ip地址的文件）</strong><br>第1个指定的nameserver就是首选dns服务器，剩下的都是备选dns服务器</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">[root@cPen_A html]# vim /etc/resolv.conf </span><br><span class="line"><span class="comment"># Generated by NetworkManager</span></span><br><span class="line">nameserver 114.114.114.114<span class="comment">#注：可以指定多个ip 去解析ip</span></span><br><span class="line">nameserver 192.168.0.1<span class="comment">#注：用nameserver指定</span></span><br><span class="line">[root@cPen_A html]# dig www.baidu.com</span><br><span class="line">;; SERVER: 114.114.114.114#53(114.114.114.114)<span class="comment">#注：访问114.114.114.114 53号端口去解析ip</span></span><br></pre></td></tr></table></figure><p>4、本地域名服务器没有找到相应记录，如果<strong>设置转发</strong>查找，就会去<strong>转发的服务器</strong>上去查询。如果<strong>没有设置转发，或者都没有找到</strong>，就会去<strong>根域查找</strong> （迭代查找）<br>本地DNS就把请求发至13台根DNS，根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理，并会返回一个负责该<strong>顶级域名服务器的一个IP</strong>。本地DNS服务器收到IP信息后，将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后，如果自己无法解析，它就会找一个管理.com域的下一级DNS服务器地址(<a href="http://qq.com">qq.com</a>)给本地DNS服务器。当本地DNS服务器收到这个地址后，就会找qq.com域服务器，重复上面的动作，进行查询，直至找到www.qq.com主机</p></blockquote><blockquote><p>#注：<strong>面试题：<a href="http://xn--www-0v1ev05dwmi.baidu.com">当敲入www.baidu.com</a> 发生什么事情 （DNS解析流程）</strong><br>答：DNS解析流程<br>第1步 先去 <code>本地hosts文件</code>(/etc/hosts)去找 <code>ip和域名的映射关系</code>。有就返回。没有就去<br>第2步 <code>本地DNS缓存</code> 找…。有就返回。没有就去<br>第3步 <code>本地的域名服务器</code> (/etc/resolv.conf)找…。有就返回。没有就<br>第4步 如果本地域名服务器 <code>设置转发</code>查找，就会去转发的服务器 上找…， 有就返回。<br>没有找到 或 没有设置 就去 <code>根域查找</code>，先在<code>根域</code>里找到<code>顶级域的服务器ip地址 返回顶级域</code>的ip地址给<code>本地域名服务器</code><br><code>本地域名服务器</code>再去<code>顶级域名服务器</code> 找，没有找到就返回<code>二级域服务器</code>的ip地址，本地域名服务器去<code>二级域里找</code>，没有找到 <code>返回三级域</code>的ip地址<code>给本地域名服务器</code>……迭代查找，直到找到整个域名才返回<br>或者说 去根域查找，迭代查找，  直到找到为止</p></blockquote><hr><h1 id="5-dns服务的类型">5. dns服务的类型<a class="header-anchor" href="#5-dns服务的类型"></a></h1><p><strong>dns服务的类型</strong></p><ol><li class="lvl-3"><p><strong>缓存域名服务器</strong></p></li><li class="lvl-3"><p><strong>主域名服务器</strong><br>这上面定义了真正的ip到域名的映射关系</p></li><li class="lvl-3"><p><strong>从域名服务器</strong><br>上面的数据域名映射 从主域名服务器获取</p></li></ol><p><strong>1、缓存域名服务器</strong><br>也称为 唯高速缓存服务器<br>通过向其他域名服务器查询获得域名-&gt;IP地址记录<br>将域名查询结果缓存到本地，提高重复查询时的速度<br><strong>2、主域名服务器</strong><br>特定DNS区域的官方服务器，具有唯一性，权威性<br>负责维护该区域内所有域名-&gt;IP地址的映射记录<br><strong>3、从域名服务器</strong><br>也称为 辅助域名服务器<br>其维护的 域名-&gt;IP地址记录 来源于主域名服务器</p><hr><h1 id="6-域名服务器配置">6. 域名服务器配置<a class="header-anchor" href="#6-域名服务器配置"></a></h1><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><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></pre></td><td class="code"><pre><span class="line">1、安装<span class="built_in">bind</span>、bind-utils</span><br><span class="line">域名解析主程序</span><br><span class="line">[root@cPen_B etc]# <span class="built_in">which</span> named</span><br><span class="line">/usr/sbin/named</span><br><span class="line"></span><br><span class="line">2、配置文件</span><br><span class="line">如果没有安装bind-chroot软件包</span><br><span class="line">主配置文件： /etc/named.conf   数据文件位于：/var/named/目录</span><br><span class="line">[root@cPen_B etc]# less /etc/named.conf </span><br><span class="line"></span><br><span class="line">3、修改配置</span><br><span class="line">1、 vim /etc/named.conf<span class="comment"># 注：全局配置文件</span></span><br><span class="line">options &#123;</span><br><span class="line">        listen-on port 53 &#123; 127.0.0.1; &#125;;</span><br><span class="line">        listen-on port 53 &#123; any; &#125;;<span class="comment"># 注：将监听地址改成any，设置监听在本机的任意ip上</span></span><br><span class="line">        allow-query     &#123; localhost; &#125;;<span class="comment"># 注：允许访问服务的主机 </span></span><br><span class="line">        allow-query     &#123; any; &#125;;<span class="comment"># 注：将权限设置为any，允许任何人来查询</span></span><br><span class="line">zone <span class="string">&quot;.&quot;</span> IN &#123;<span class="comment"># 注：定义根域</span></span><br><span class="line">        <span class="built_in">type</span> hint;<span class="comment"># 注：指定根域</span></span><br><span class="line">        file <span class="string">&quot;named.ca&quot;</span>;<span class="comment"># 注：在named.ca里去找 /var/named/named.ca</span></span><br><span class="line">&#125;;</span><br><span class="line">include <span class="string">&quot;/etc/named.rfc1912.zones&quot;</span>;<span class="comment"># 注：定义其他域</span></span><br><span class="line">include <span class="string">&quot;/etc/named.root.key&quot;</span>;</span><br><span class="line">2、域配置文件 /etc/named.rfc1912.zones</span><br><span class="line">添加域配置：</span><br><span class="line">[root@cPen_B ~]# vim /etc/named.rfc1912.zones</span><br><span class="line">zone <span class="string">&quot;sc.com&quot;</span> IN &#123;<span class="comment"># 注：添加sc.com域的解析</span></span><br><span class="line">        <span class="built_in">type</span> master;<span class="comment"># 注：主域名服务器</span></span><br><span class="line">        file <span class="string">&quot;&quot;</span>sc.com<span class="string">&quot;&quot;</span>;<span class="comment"># 注：域名配置存放文件 (域的解析从哪里文件里去找)</span></span><br><span class="line">        allow-update &#123; none; &#125;;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">4、配置指定域的解析文件</span><br><span class="line">目录：/var/named</span><br><span class="line"><span class="comment">#注：注意权限， named用户要可读</span></span><br><span class="line"><span class="comment">#注：注意属组</span></span><br><span class="line">[root@cPen_B named]# <span class="built_in">cp</span> named.empty sc.com</span><br><span class="line">[root@cPen_B named]# <span class="built_in">pwd</span></span><br><span class="line">/var/named</span><br><span class="line">[root@cPen_B named]# vim sc.com </span><br><span class="line"><span class="variable">$TTL</span> 3H; 注：缓存时间</span><br><span class="line">@       IN SOA   sc.com. (; 注：修改的地方</span><br><span class="line">                                        0       ; serial</span><br><span class="line">                                        1D      ; refresh</span><br><span class="line">                                        1H      ; retry</span><br><span class="line">                                        1W      ; expire</span><br><span class="line">                                        3H )    ; minimum</span><br><span class="line">        NS      @</span><br><span class="line">        A       127.0.0.1</span><br><span class="line">        AAAA    ::1</span><br><span class="line">;注：A记录正向解析记录</span><br><span class="line">dns A 192.168.136.129;注：dns服务器的IP地址</span><br><span class="line">www A 192.168.136.129;注：www服务器的IP地址</span><br><span class="line">*    A  192.168.136.123;注：配置泛域名解析</span><br><span class="line">;mail MX 192.168.136.129;注：分号注释</span><br><span class="line">;dns  IN 600 A  192.168.136.129;注：配置A记录解析 缓存时间为600s</span><br><span class="line">[root@cPen_B named]# service named restart<span class="comment"># 注：重启服务</span></span><br><span class="line">[root@cPen_B named]# lsof -i:53<span class="comment"># 注：端口起来了</span></span><br><span class="line">COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">named   1839 named   21u  IPv4  42519      0t0  TCP localhost:domain (LISTEN)</span><br><span class="line">named   1839 named   22u  IPv4  42521      0t0  TCP cPen_B:domain (LISTEN)</span><br><span class="line">named   1839 named   23u  IPv6  42523      0t0  TCP localhost:domain (LISTEN)</span><br><span class="line">[root@cPen_B named]# dig www.sanchuang.com</span><br><span class="line">;; SERVER: 192.168.136.2#53(192.168.136.2)</span><br><span class="line">[root@cPen_B named]# <span class="built_in">cat</span> /etc/resolv.conf <span class="comment"># 注：指定本机的DNS服务器</span></span><br><span class="line"><span class="comment"># Generated by NetworkManager</span></span><br><span class="line">search localdomain</span><br><span class="line">nameserver 192.168.136.2</span><br><span class="line">[root@cPen_B named]# dig www.sc.com @192.168.136.129<span class="comment"># 注：用192.168.136.129去解析</span></span><br><span class="line">;; QUESTION SECTION:</span><br><span class="line">;www.sc.com.INA</span><br><span class="line"></span><br><span class="line">;; ANSWER SECTION:</span><br><span class="line">www.sc.com.10800INA192.168.136.129<span class="comment"># 注：解析成功</span></span><br><span class="line"></span><br><span class="line">;; AUTHORITY SECTION:</span><br><span class="line">sc.com.10800INNSsc.com.</span><br><span class="line"></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><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="comment">#设置反向域</span></span><br><span class="line">[root@cPen_B named]# vim /etc/named.rfc1912.zones</span><br><span class="line">zone <span class="string">&quot;1.0.0.127.in-addr.arpa&quot;</span> IN &#123;</span><br><span class="line">        <span class="built_in">type</span> master;</span><br><span class="line">        file <span class="string">&quot;named.loopback&quot;</span>;</span><br><span class="line">        allow-update &#123; none; &#125;;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">[root@cPen_B named]# <span class="built_in">pwd</span></span><br><span class="line">/var/named</span><br><span class="line">[root@cPen_B named]# less named.loopback </span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><h1 id="7-资源记录类型">7. 资源记录类型<a class="header-anchor" href="#7-资源记录类型"></a></h1><blockquote><p><strong>资源记录类型</strong><br>（1）A记录（Address）正向解析<br>A记录是将一个主机名（全称域名FQDN）和一个IP地址关联起来。这也是大多数客户端程序默认的查询类型。</p><p>（2）PTR记录（Pointer）反向解析<br>PTR记录将一个IP地址对应到主机名（全称域名FQDN）。这些记录保存在in-addr.arpa域中。</p><p>（3）CNAME记录(Canonical Name)别名<br>别名记录，也称为规范名字(Canonical Name)。这种记录允许您将多个名字映射到同一台计算机。</p><p>（4）MX记录（Mail eXchange）<br>MX记录是邮件交换记录，它指向一个邮件服务器，用于电子邮件系统发邮件时根据 收信人的地址后缀来定位邮件服务器。MX记录也叫做邮件路由记录，用户可以将该域名下的邮件服务器指向到自己的mail server上，然后即可自行操控所有的邮箱设置。<br>当有多个MX记录（即有多个邮件服务器）时，则需要设置数值来确定其优先级。通过设置优先级数字来指明首选服务器，数字越小表示优先级越高。</p><p>（5）NS记录（Name Server）<br>NS（Name Server）记录是域名服务器记录，也称为授权服务器，用来指定该域名由哪个DNS服务器来进行解析。<br>将网站的NS记录指向到目标地址，在设置NS记录的同时还需要设置目标网站的指向，否则NS记录将无法正常解析<br>NS记录优先于A记录。即，如果一个主机地址同时存在NS记录和A记录，则A记录不生效。</p></blockquote><hr><h1 id="8-小节">8. 小节<a class="header-anchor" href="#8-小节"></a></h1><p><strong>DNS服务</strong><br><strong>DNS( Domain Name System) 域名系统</strong><br>#注：域名系统；提供域名解析；ip对于用户来说，使用没有域名方便</p><blockquote><p>FQDN完全限定域名<br><a href="http://www.baidu.com">www.baidu.com</a><br>域：<a href="http://baidu.com">baidu.com</a><br>主机名：www</p></blockquote><blockquote><p><strong>域名分类</strong><br>根类（.）全国只有13组<br>顶级域通用域名<br>.com用于商业<br>.org非盈利性组织<br>.net网络服务<br>国家<br>.cn<br>.jp<br>.hk<br>.us<br>反向解析域.arpa<br>二级域，三级域……</p></blockquote><blockquote><p><strong>DNS解析</strong><br>正向解析把域名解析成ip<br>反向解析把ip解析成域名</p></blockquote><blockquote><p><strong>DNS解析流程（面试）</strong></p><p>1、先查找本地hosts文件 有没有对应ip和域名的映射关系，存在就返回</p><p>2、hosts文件里没有找到，就会在本地缓存中查找，如果找到就返回结果 完成解析</p><p>3、本地缓存中没有找到，就会去本地域名服务器查找，找到返回结果 完成解析</p><p>4、本地域名服务器中没有，如果设置了转发查找 就会去转发服务器查找。如果没有找到 就会去根域去找顶级域的服务器ip地址，返回给本地域名服务器，本地域名服务器再去顶级域服务器上 找二级域服务器ip地址，依次类推 直到找到整个域名结果为止</p><p>5、DNS迭代查询之后，如果拿到结果 就返回给本地域名服务器，本地域名服务器再返回给客户端</p><p>#注：DNS客户机迭代查找</p></blockquote><p><strong>DNS服务简单搭建</strong></p><blockquote><p><strong>软件包安装</strong><br>bind<br>bind-utils</p><p><strong>配置文件</strong><br>主配置文件/etc/named.conf<br>域配置文件/etc/named.rfc1912.zones<br>数据目录/var/named下面文件 需要给named用户可读权限</p><p><strong>DNS端口</strong>53UDP</p><p><strong>记录类型</strong><br>A记录正向解析记录<br>PTR记录反向解析记录<br>CNAME别名<br>MX邮件记录<br>NS授权dns服务器</p><p><strong>泛域名解析</strong><br>对于域sc.com添加：*    A  192.168.0.39#注：只是对主机名的泛域名解析<br>表示主机名任意<a href="http://123.sc.com">123.sc.com</a>#注：abc.123.sc.com不可以<br><a href="http://abc.sc.com">abc.sc.com</a></p></blockquote><p><strong>常见的域名解析命令</strong></p><blockquote><p>ping<br>host<br>dig<br>nslookup</p></blockquote><p><strong>相关配置文件</strong></p><blockquote><p>/etc/hosts  指定域名和ip的对应关系，优先级最高<br>/etc/resolv.conf指定dns服务器地址<br>网络连通性都是访问服务的前提条件</p></blockquote>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> DNS </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>23_Linux基础-ansible2</title>
      <link href="/posts/b0a8892b.html"/>
      <url>/posts/b0a8892b.html</url>
      
        <content type="html"><![CDATA[<h1 id="一-云计算">一. 云计算<a class="header-anchor" href="#一-云计算"></a></h1><blockquote><p><strong>云计算</strong><br>openstack<br>docker<br>kvm<br>虚拟化技术：在本身物理机的基础上虚拟出云主机<br>#唯一的不好是 安全性不高 数据保存在别人那里的 (影响不大)</p></blockquote><blockquote><p>#trouble shooting的能力 问题解答的能力</p><p>#注：ssh开启2种验证 - 先公钥认证再密码认证密码认证失败 提示permit deny</p></blockquote><hr><h1 id="二-ansible不是守护进程">二. ansible不是守护进程<a class="header-anchor" href="#二-ansible不是守护进程"></a></h1><blockquote><p>#ansible 不是守护进程 执行ansible命令的时候才会执行ansible<br>#守护进程：一直在内存里面，等待别人连接<br>#ssh是守护进程<br>#执行1条命令 命令不是守护进程</p><p>#ansible不是一个守护进程（守护进程：起来后一直在内存中运行，等待其他人访问）<br>#ansible就是一个命令脚本，使用Python写的</p><p>#[root@cPen_A ansible]# sudo -i#注：直接回到root用户</p></blockquote><hr><h1 id="三-ansible的模块">三. ansible的模块<a class="header-anchor" href="#三-ansible的模块"></a></h1><p><strong>ansible的模块</strong></p><h2 id="1-copy模块">1. copy模块<a class="header-anchor" href="#1-copy模块"></a></h2><blockquote><p>从本地copy文件分发到目录主机路径<br>参数说明:<br>src= 源文件路径# 注：source 源</p><p>​dest= 目标路径 # 注：destination 目的地</p><p>​注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下，不带/是目录递归复制过去<br>​content= 自行填充的文件内容<br>​owner 属主<br>​group 属组<br>​mode权限</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><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">示例1：shell模块、copy模块</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#示例1：使用ansible 在B、C主机创建/lianxi 目录</span></span><br><span class="line"><span class="comment">#-m指定模块</span></span><br><span class="line"><span class="comment">#-a传的参数</span></span><br><span class="line">ansible 接 指定主机 -m 指定模块 -a 执行的参数</span><br><span class="line">[root@cPen_A ansible]# ansible all -m shell -a <span class="string">&quot;mkdir /lianxi -p&quot;</span></span><br><span class="line"><span class="comment">#注：rc ==&gt; reutrn code --&gt; 为0表示执行成功</span></span><br><span class="line"><span class="comment">#注：rc ==&gt; reutrn code --&gt; 为1表示执行失败</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#示例2：将ansible-copy文件 复制到主机B、C/lianxi/ansible目录下，指定权限属主数组</span></span><br><span class="line">[root@cPen_A lianxi]# vim ansible-copy</span><br><span class="line">[root@cPen_A lianxi]# ansible all -m copy -a <span class="string">&quot;src=/lianxi/ansible-copy dest=/lianxi/ansible mode=777 owner=sanchuang group=sanchuang&quot;</span></span><br><span class="line"><span class="comment">#注：确认B、C主机 指定的用户sanchuang和组sanchuang存在</span></span><br><span class="line"><span class="comment">#md5sum一般来说 是 信息的摘要判定文件是否被修改</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><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">示例2：指定webser组，将/etc/passwd 赋值到主机/tmp目录下，指定权限777</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A lianxi]# ansible webser -m copy -a <span class="string">&quot;src=/etc/passwd dest=/tmp mode=777&quot;</span></span><br><span class="line"></span><br><span class="line">===========================================================================================</span><br><span class="line"></span><br><span class="line">示例3：copy src路径后面带/不带/的区别</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：src= 路径后面带/ 表示带里面的所有内容复制到目标目录下，不带/是目录递归复制过去</span></span><br><span class="line"><span class="comment">#注：不带/</span></span><br><span class="line">[root@cPen_A copy_dir]# ansible all -m copy -a <span class="string">&quot;src=/lianxi/copy_dir dest=/lianxi/ansible&quot;</span></span><br><span class="line"><span class="comment">#注：带/</span></span><br><span class="line">[root@cPen_A copy_dir]# ansible all -m copy -a <span class="string">&quot;src=/lianxi/copy_dir/ dest=/lianxi/ansible&quot;</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></pre></td></tr></table></figure><h2 id="2-fetch模块">2. fetch模块<a class="header-anchor" href="#2-fetch模块"></a></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><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><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A lianxi]# ansible webser -m fetch -a <span class="string">&quot;src=/etc/hostname dest=/lianxi mode=644&quot;</span></span><br><span class="line">192.168.0.22 | CHANGED =&gt; &#123;</span><br><span class="line">    <span class="string">&quot;changed&quot;</span>: <span class="literal">true</span>, </span><br><span class="line">    <span class="string">&quot;checksum&quot;</span>: <span class="string">&quot;c468f7340237d9f531122f5b03345ce8ac5641b4&quot;</span>,   <span class="comment"># 注：拉去下来后会比较</span></span><br><span class="line">    <span class="string">&quot;dest&quot;</span>: <span class="string">&quot;/lianxi/192.168.0.22/etc/hostname&quot;</span>, </span><br><span class="line">    <span class="string">&quot;md5sum&quot;</span>: <span class="string">&quot;8d23b0947f191eb9c20728677271eb4d&quot;</span>, </span><br><span class="line">    <span class="string">&quot;remote_checksum&quot;</span>: <span class="string">&quot;c468f7340237d9f531122f5b03345ce8ac5641b4&quot;</span>, <span class="comment"># 注：和远程比较 内容是否变更</span></span><br><span class="line">    <span class="string">&quot;remote_md5sum&quot;</span>: null</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">#注：大文件传送中途 突然断掉了 ，文件没有传完  保存的md5sum和它的md5sum不一样</span></span><br><span class="line"><span class="comment">#注：如果2个值一致说明传完了</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">ls</span><span class="comment"># 注：路径自动加了个以ip地址为名的文件夹</span></span><br><span class="line">192.168.0.20  192.168.0.22  ansible-copy  copy_dir</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">cd</span> 192.168.0.20</span><br><span class="line">[root@cPen_A 192.168.0.20]# <span class="built_in">ls</span></span><br><span class="line">etc</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><br><span class="line">fetch会自动的在dest指定目录后加上远程主机命名的目录结构后面接src目录结构</span><br><span class="line">fetch存储到本地的目录结构dest + 远程主机名 + src</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：md5可以判定1、文件是否修改；2、文件是否传完</span></span><br><span class="line"><span class="comment">#注：或者使用任何hash算法中的其中一种，去比较值是否相等</span></span><br></pre></td></tr></table></figure><h2 id="3-command模块">3. command模块<a class="header-anchor" href="#3-command模块"></a></h2><p>在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析</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></pre></td><td class="code"><pre><span class="line">示例1：<span class="built_in">command</span>、shell</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A 192.168.0.20]# ansible all -m <span class="built_in">command</span> -a <span class="string">&quot;ifconfig&quot;</span></span><br><span class="line">[root@cPen_A 192.168.0.20]# ansible all -m shell -a <span class="string">&quot;ifconfig&quot;</span></span><br><span class="line"></span><br><span class="line">示例2：<span class="built_in">command</span>裸执行 (后面传的参数不会做解析)</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：把ifconfig|grep inet整个当做1个命令去执行</span></span><br><span class="line">[root@cPen_A 192.168.0.20]# ansible all -m <span class="built_in">command</span> -a <span class="string">&quot;ifconfig|grep inet&quot;</span></span><br><span class="line">192.168.0.22 | FAILED | rc=2 &gt;&gt;</span><br><span class="line">[Errno 2] 没有那个文件或目录</span><br><span class="line"><span class="comment">#属于裸执行，不会解析它的管道符号 会认为ifconfig|grep inet 是一个命令</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：shell可以 (后面传的参数会做解析)</span></span><br><span class="line">[root@cPen_A 192.168.0.20]# ansible all -m shell -a <span class="string">&quot;ifconfig|grep inet&quot;</span></span><br><span class="line"></span><br><span class="line">============================================================================================</span><br><span class="line">[root@cPen_A ansible]# ifconfig<span class="comment"># 注：查看网卡(看的东西多一点)</span></span><br><span class="line"><span class="comment">#注：可以看接收包、返回包、字节，有多少错误</span></span><br><span class="line">[root@cPen_A ansible]# ip a<span class="comment"># 注：查看网卡</span></span><br></pre></td></tr></table></figure><h2 id="4-shell模块">4. shell模块<a class="header-anchor" href="#4-shell模块"></a></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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A 192.168.0.20]# ansible all -m shell -a <span class="string">&quot;ifconfig|grep inet&quot;</span></span><br><span class="line">跟<span class="built_in">command</span>一样，只不过shell模块可以解析管道之类的功能</span><br></pre></td></tr></table></figure><h2 id="5-file模块">5. file模块<a class="header-anchor" href="#5-file模块"></a></h2><blockquote><p>设置文件属性(创建文件)<br>常用参数:<br>path目标路径<br>state directory为目录,link为软件链接<br>group 目录属组<br>owner 属主<br>等,其他参数通过ansible-doc -s file 获取</p><p>state –<br>absent删除文件和目录的<br>directory目录<br>touch  新建空文件<br>link  软链接<br>hard硬链接</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><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></pre></td><td class="code"><pre><span class="line">示例1：查看file文件帮助信息</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A lianxi]# ansible-doc -s file<span class="comment"># 注：查看file文件帮助信息</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例2：在目标主机/tmp目录下创建目录</span><br><span class="line"><span class="comment">#注：创建文件目录</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A lianxi]# ansible all -m file -a <span class="string">&quot;path=/tmp/sanchuang state=directory&quot;</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例3：设置修改文件属性</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A lianxi]# ansible all -m file -a <span class="string">&quot;path=/tmp/passwd owner=sanchuang&quot;</span></span><br></pre></td></tr></table></figure><h2 id="6-cron模块">6. cron模块<a class="header-anchor" href="#6-cron模块"></a></h2><p>通过cron模块对目标主机生成计划任务<br>常用参数:<br>除了分(minute)时(hour)日(day)月(month)周(week)外<br>name: 本次计划任务的名称<br>state: present 生成(默认) |absent 删除 (基于name)</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"><span class="comment">#注：首先查看程序有没有起来</span></span><br><span class="line">[root@cPen_A ~]# ps -ef |grep crond</span><br><span class="line">root        702      1  0 10:59 ?        00:00:00 /usr/sbin/crond -n</span><br><span class="line">root       3582   3553  0 14:41 pts/3    00:00:00 grep --color=auto crond</span><br><span class="line"><span class="comment">#注：学会看日志</span></span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cd</span> /var/log/</span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# less cron</span><br><span class="line">Nov 25 12:01:01 cPen_A run-parts(/etc/cron.hourly)[3498]: finished 0anacron</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><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">示例1：添加计划任务</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：每三分钟输出当前时间，到/tmp/time.txt文件中</span></span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ansible all -m cron -a <span class="string">&quot;minute=*/3 job=&#x27;date &gt;&gt;/tmp/time.txt&#x27; name=date_test state=present&quot;</span><span class="comment"># 注：minute=*/3指定每3分钟 date &gt;&gt;/tmp/time.txt 命令</span></span><br><span class="line">[root@cPen_B ~]# crontab -l</span><br><span class="line"><span class="comment">#Ansible: date_test</span></span><br><span class="line">*/3 * * * * <span class="built_in">date</span> &gt;&gt;/tmp/time.txt</span><br><span class="line"></span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ansible 192.168.0.20 -m cron -a <span class="string">&quot;minute=*/3 job=&#x27;date &gt;&gt;/tmp/time.txt&#x27; name=date_test state=present&quot;</span><span class="comment"># 注：可以单独为某个主机设置  并非一定批量处理</span></span><br><span class="line"></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例2：删除计划任务</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ansible 192.168.0.20 -m cron -a  <span class="string">&quot;name=date_test state=absent&quot;</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">ntp服务是一个时间管理服务器</span><br><span class="line">示例：ntp服务 系统时间管理服务</span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# yum install ntp<span class="comment"># 注：centos7</span></span><br><span class="line">[root@cPen_B ~]# yum install chrony<span class="comment"># 注：centos8里面  ntp已被 chrony取代</span></span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ntpdate ntp1.aliyun.com<span class="comment"># 注：同步阿里云的时间</span></span><br><span class="line"><span class="comment">#注：使用ntp客户端 同步ntp的服务器 把时间同步</span></span><br></pre></td></tr></table></figure><h2 id="7-yum模块">7. yum模块<a class="header-anchor" href="#7-yum模块"></a></h2><p>故名思义就是yum安装软件包的模块;<br>常用参数说明:<br>enablerepo,disablerepo表示启用与禁用某repo库<br>name 安装包名<br>state (present’ orinstalled’, latest’)表示安装, (absent’ or `removed’) 表示删除</p><p>#注：name安装的包名state 安装还是卸载</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">示例：安装wget</span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ansible all -m yum -a <span class="string">&quot;name=wget state=installed&quot;</span></span><br><span class="line">示例：卸载wget</span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ansible all -m yum -a <span class="string">&quot;name=wget state=absent&quot;</span></span><br></pre></td></tr></table></figure><h2 id="8-service模块">8. service模块<a class="header-anchor" href="#8-service模块"></a></h2><p>服务管理模块<br>常用参数:<br>name:服务名<br>state:服务状态 started（启动）stopped（关闭）restarted（重启）reloaded（重新加载）<br>enabled: 是否开机启动 true|false<br>runlevel: 启动级别 (systemed方式忽略)</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"><span class="comment">#安装文件传输服务vsftpd</span></span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ansible all -m yum -a <span class="string">&quot;name=vsftpd state=installed&quot;</span></span><br><span class="line"></span><br><span class="line">示例：关闭vsftpd服务</span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ansible all -m service -a <span class="string">&quot;name=vsftpd state=stopped&quot;</span></span><br><span class="line">示例：开启vsftpd服务</span><br><span class="line">[root@cPen_A <span class="built_in">log</span>]# ansible all -m service -a <span class="string">&quot;name=vsftpd state=started&quot;</span></span><br></pre></td></tr></table></figure><h2 id="9-script模块">9. script模块<a class="header-anchor" href="#9-script模块"></a></h2><p>1、把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;</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><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">[root@cPen_A ~]# vim test.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;test ansible&quot;</span> &gt;&gt;/tmp/ansible.txt</span><br><span class="line">[root@cPen_A ~]# ansible all -m script -a <span class="string">&quot;/root/test.sh&quot;</span><span class="comment"># 注：/root/test.sh脚本路径</span></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">-f 6指定6个进程去执行</span><br><span class="line"></span><br><span class="line"><span class="built_in">command</span>模块不能识别管道符号、shell模块 可以识别</span><br><span class="line">copy模块 推送</span><br><span class="line">script模块 不需要上传脚本，在远程服务器执行脚本</span><br></pre></td></tr></table></figure><hr><h1 id="四-查看系统版本">四. 查看系统版本<a class="header-anchor" href="#四-查看系统版本"></a></h1><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><br><span class="line">[root@cPen_B ~]# <span class="built_in">uname</span> -r<span class="comment"># 注：查看系统内核</span></span><br><span class="line">4.18.0-193.el8.x86_64</span><br><span class="line">[root@cPen_B ~]# <span class="built_in">cat</span> /etc/redhat-release <span class="comment"># 注：查看/etc/redhat-release 去查看系统版本</span></span><br><span class="line">CentOS Linux release 8.2.2004 (Core) </span><br></pre></td></tr></table></figure><hr><h1 id="五-链接">五. 链接<a class="header-anchor" href="#五-链接"></a></h1><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></pre></td><td class="code"><pre><span class="line">示例：软链接</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">ln</span> -s ansible-copy ansible-copy-likcs-s<span class="comment">#注：前面原文件 后面链接文件</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">ls</span> -al <span class="comment"># 注：-s soft软</span></span><br><span class="line">lrwxrwxrwx   1 root root  12 11月 25 11:30 ansible-copy-likcs-s -&gt; ansible-copy</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">示例：硬链接</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">ln</span> ansible-copy ansible-copy-link</span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">ls</span> -al</span><br><span class="line">-rw-r--r--   2 root root  20 11月 25 10:12 ansible-copy-link</span><br><span class="line"><span class="built_in">rm</span> -rf 删除源文件 硬链接文件 依旧没事</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"><span class="comment">#软链接、硬链接</span></span><br><span class="line"><span class="comment">#创建一个硬链接 文件的链接数会+1</span></span><br><span class="line"><span class="comment">#删除硬链接文件或者是源文件  只是把文件的链接数-1  文件不会被真正删除</span></span><br><span class="line"><span class="comment">#创建一个硬链接</span></span><br><span class="line">[root@cPen_A lianxi]# <span class="built_in">ls</span> -al</span><br><span class="line">-rw-r--r--   2 root root  20 11月 25 10:12 ansible-copy<span class="comment"># 注：链接为2</span></span><br><span class="line"><span class="comment">#注：软链接</span></span><br><span class="line">lrwxrwxrwx   1 root root  12 11月 25 11:30 ansible-copy-likcs-s -&gt; ansible-copy <span class="comment"># 注：链接为1</span></span><br><span class="line"><span class="comment">#注：硬链接</span></span><br><span class="line">-rw-r--r--   2 root root  20 11月 25 10:12 ansible-copy-link<span class="comment"># 注：链接为2</span></span><br><span class="line">符号链接数 1 是</span><br><span class="line"><span class="built_in">rm</span> -rf 删除的是 文件名 和 磁盘里面data的链接</span><br><span class="line">data还存在于磁盘里 ，过一段时间 新的数据会覆盖 data</span><br><span class="line"><span class="comment">#注：为1表示删除了后就没有了，为2表示删除后还有</span></span><br></pre></td></tr></table></figure><hr><h1 id="六-playbook">六. playbook<a class="header-anchor" href="#六-playbook"></a></h1><p>如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象<br>#注：<strong>语法 yaml格式配置</strong></p><blockquote><p><strong>1、playbook的核心元素</strong><br>hosts : playbook配置文件作用的主机<br>tasks: 任务列表<br>variables: 变量<br>templates:包含模板语法的文本文件<br>handlers :由特定条件触发的任务<br>roles :用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等<br><strong>2、playbook运行方式</strong><br>ansible-playbook --check 只检测可能会发生的改变,但不真执行操作<br>ansible-playbook --list-hosts 列出运行任务的主机<br>ansible-playbook --syntax-check playbook.yaml 语法检测<br>ansible-playbook -t TAGS_NAME playbook.yaml 只执行TAGS_NAME任务<br>ansible-playbook playbook.yaml 运行</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><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">示例：编写/执行 playbook</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：把A机器的/etc/passwd复制到其他机器的/tmp/passwd_tmp下</span></span><br><span class="line">[root@cPen_A ~]# vim ansible_playbook_sc.yaml<span class="comment">#注：编写playbook</span></span><br><span class="line">- hosts: all</span><br><span class="line">  remote_user: root</span><br><span class="line">  tasks:</span><br><span class="line">  - name: up file</span><br><span class="line">    copy: src=/etc/passwd dest=/tmp/passwd_tmp</span><br><span class="line"><span class="comment">#执行playbook</span></span><br><span class="line">[root@cPen_A ~]# ansible-playbook ansible_playbook_sc.yaml </span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例：yaml文件怎么去编写</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#第1步 先安装python3：yum install python3</span></span><br><span class="line"><span class="comment">#第2步 使用pip3安装PyYaml模块</span></span><br><span class="line">[root@cPen_A ~]# pip3 install PyYaml</span><br><span class="line">[root@cPen_A ~]# python3</span><br><span class="line">&gt;&gt;&gt; import yaml</span><br><span class="line">&gt;&gt;&gt; fp = open(<span class="string">&quot;ansible_playbook_sc.yaml&quot;</span>)</span><br><span class="line">&gt;&gt;&gt; dict = yaml.load(fp)</span><br><span class="line">&gt;&gt;&gt; dict</span><br><span class="line">[&#123;<span class="string">&#x27;hosts&#x27;</span>: <span class="string">&#x27;all&#x27;</span>, <span class="string">&#x27;remote_user&#x27;</span>: <span class="string">&#x27;root&#x27;</span>, <span class="string">&#x27;tasks&#x27;</span>: [&#123;<span class="string">&#x27;name&#x27;</span>: <span class="string">&#x27;up file&#x27;</span>, <span class="string">&#x27;copy&#x27;</span>: <span class="string">&#x27;src=/etc/passwd dest=/tmp/passwd_tmp&#x27;</span>&#125;]&#125;]</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><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">#注：使用</span></span><br><span class="line">1、创建yaml文件</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">cat</span> ansible_playbook_sc.yaml <span class="comment"># 注：类似于字典形式 - 相当于list ；里面相当于字典</span></span><br><span class="line">- hosts: all<span class="comment"># 注：对所有主机生效（什么组）</span></span><br><span class="line">  remote_user: root<span class="comment"># 注：root用户执行</span></span><br><span class="line">  tasks:<span class="comment"># 注：让它做什么事情</span></span><br><span class="line">  - name: up file<span class="comment"># 注：事情名字叫up file</span></span><br><span class="line">    copy: src=/etc/passwd dest=/tmp/passwd_tmp<span class="comment"># 注：使用copy模块 执行源 目的地址</span></span><br><span class="line">2、可以使用Python解析yaml</span><br><span class="line">&gt;&gt;&gt; import yaml</span><br><span class="line">&gt;&gt;&gt; fp = open(<span class="string">&quot;ansible_playbook_sc.yaml&quot;</span>)</span><br><span class="line">&gt;&gt;&gt; dict = yaml.load(fp)</span><br><span class="line">&gt;&gt;&gt; dict</span><br><span class="line">[&#123;<span class="string">&#x27;hosts&#x27;</span>: <span class="string">&#x27;all&#x27;</span>, <span class="string">&#x27;remote_user&#x27;</span>: <span class="string">&#x27;root&#x27;</span>, <span class="string">&#x27;tasks&#x27;</span>: [&#123;<span class="string">&#x27;name&#x27;</span>: <span class="string">&#x27;up file&#x27;</span>, <span class="string">&#x27;copy&#x27;</span>: <span class="string">&#x27;src=/etc/passwd dest=/tmp/passwd_tmp&#x27;</span>&#125;]&#125;]</span><br><span class="line"><span class="comment">#注：使用copy模块 来指定src dest</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><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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A ~]# vim ansible_playbook_sc.yaml<span class="comment"># 注：编写</span></span><br><span class="line">- hosts: all</span><br><span class="line">  remote_user: root</span><br><span class="line">  tasks:</span><br><span class="line">  - name: up file</span><br><span class="line">    copy: src=/etc/passwd dest=/tmp/passwd_tmp</span><br><span class="line">  - name: download redis</span><br><span class="line">    yum: name=redis state=installed</span><br><span class="line">- hosts: webser</span><br><span class="line">  tasks:</span><br><span class="line">  - name: remove file</span><br><span class="line">    shell: <span class="built_in">rm</span> -rf /tmp/passwd_tmp</span><br><span class="line">[root@cPen_A ~]# ansible-playbook ansible_playbook_sc.yaml <span class="comment"># 注：运行</span></span><br></pre></td></tr></table></figure><h1 id="七-总结">七. 总结<a class="header-anchor" href="#七-总结"></a></h1><blockquote><p>ansible通过常用模块在命令行就可以针对主机清单来管理配置远程主机,无需要代理客户端程序,但需要目标主机有ssh和python2.4+;基于ssh协议既可以通过用户名和密码,也可以通过私钥,推荐使用私钥;<br>windows上需要安装powershell及winrm服务也可以做到,关于这方面 可以参考我之前的博客 <a href="http://blog.51cto.com/dyc2005/2064746">ansible自动化管理windows</a><br>通过ansib-doc来获取模块信息及指定模块帮助信息;<br>ansible-playbook 基于YAML语法配置;可以对playbook文件进行测试,解析并执行应用于指定无端主机;非常方便我们统一编排分发管理远程主机;</p></blockquote><h1 id="八-练习">八. 练习<a class="header-anchor" href="#八-练习"></a></h1><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></pre></td><td class="code"><pre><span class="line">示例：每天凌晨1点 检查/etc/passwd 文件是否被修改，并且生成检查报告</span><br><span class="line"></span><br><span class="line">示例：编写脚本 实现ansible node节点(管理的主机)服务器备份 备份/var/log/messages日志 备份到/backup目录下，并且取名2020-11-25-01-log.tar.gz，每一个小时执行一次</span><br><span class="line"><span class="comment">############################################################################################</span></span><br><span class="line">示例：每天凌晨1点 检查/etc/passwd 文件是否被修改，并且生成检查报告</span><br><span class="line">-----------------------------------------------------------------------------------------------------------</span><br><span class="line">方法1 <span class="built_in">md5sum</span> 检查文件是否修改 <span class="built_in">md5sum</span> -c --status</span><br><span class="line">check_file.sh</span><br><span class="line"><span class="built_in">md5sum</span> -c --status d.md5 &amp;&amp;<span class="built_in">echo</span> <span class="string">&quot;文件未被修改&quot;</span> ||<span class="built_in">echo</span> <span class="string">&quot;文件已被修改&quot;</span></span><br><span class="line"><span class="built_in">md5sum</span> /etc/passwd &amp;&gt; d.md5<span class="comment">#注：文件名必须是 d.md5</span></span><br><span class="line">-----------------------------------------------------------------------------------------------------------</span><br><span class="line">方法2</span><br><span class="line">check_ectpasswd.sh</span><br><span class="line">a=<span class="string">&#x27;md5sum /etc/passwd&#x27;</span><span class="comment">#注：现在的md5值</span></span><br><span class="line">b=<span class="string">&#x27;tail -n1 /root/b&#x27;</span> <span class="comment">#注：上次的md5值</span></span><br><span class="line">[[ <span class="variable">$a</span>==<span class="variable">$b</span> ]]&amp;&amp;<span class="built_in">echo</span> <span class="string">&quot;文件未被修改!&quot;</span> &gt;&gt; /root/c||<span class="built_in">echo</span> <span class="string">&quot;文件已被修改!&quot;</span> &gt;&gt; /root/c</span><br><span class="line"><span class="variable">$a</span>  &gt;&gt; /root/b</span><br><span class="line">-----------------------------------------------------------------------------------------------------------</span><br><span class="line">方法3</span><br><span class="line"><span class="built_in">touch</span> /tmp/passwd.log</span><br><span class="line"><span class="built_in">touch</span> /tmp/passwd.txt</span><br><span class="line">a=`<span class="built_in">md5sum</span> /etc/passwd`</span><br><span class="line">b=`<span class="built_in">md5sum</span> /tmp/passwd.txt`</span><br><span class="line">c=<span class="variable">$&#123;a:0:32&#125;</span><span class="comment">#注：因为md5sum是任意长度的输入 固定长度的输出</span></span><br><span class="line">d=<span class="variable">$&#123;b:0:32&#125;</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$c</span> = <span class="variable">$d</span> ] </span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date)</span>文件未被修改&quot;</span> &gt;&gt;/tmp/passwd.log  </span><br><span class="line">    <span class="built_in">cat</span> /etc/passwd &gt;/tmp/passwd.txt</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date)</span>文件已被修改&quot;</span> &gt;&gt;/tmp/passwd.log</span><br><span class="line">    <span class="built_in">cat</span> /etc/passwd &gt;/tmp/passwd.txt</span><br><span class="line"><span class="keyword">fi</span> </span><br><span class="line">===========================================================================================================</span><br><span class="line">ansible_playbook_zuoye.yaml</span><br><span class="line"> - hosts: all</span><br><span class="line">   remote_user: root</span><br><span class="line">   tasks: </span><br><span class="line">   - name: check file</span><br><span class="line">     cron: hour=1 day=*/1 job=<span class="string">&#x27;/usr/bin/bash ~/check_file.sh&#x27;</span></span><br><span class="line"><span class="comment">#注：需要把脚本file到各个虚拟机，没有写这一步</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">示例：编写脚本 实现ansible node节点(管理的主机)服务器备份 备份/var/log/messages日志 备份到/backup目录下，并且取名2020-11-25-01-log.tar.gz，每一个小时执行一次</span><br><span class="line"> - hosts: all</span><br><span class="line">   remote_user: root</span><br><span class="line">   tasks: </span><br><span class="line">   - name: backup messages</span><br><span class="line">     cron: hour=1 job=<span class="string">&#x27;tar czf /backup/$(date +%Y-%m-%d-%H-log.tar.gz) /var/log/messages&#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><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="built_in">md5sum</span> 检查文件是否修改 <span class="built_in">md5sum</span> -c --status</span><br><span class="line">[root@cPen_A lianxi]# man <span class="built_in">md5sum</span></span><br><span class="line">       -c, --check</span><br><span class="line">              <span class="built_in">read</span> MD5 sums from the FILEs and check them</span><br><span class="line">       --status</span><br><span class="line">              don<span class="string">&#x27;t output anything, status code shows success</span></span><br><span class="line"><span class="string">[root@cPen_A lianxi]# md5sum /etc/passwd &gt; d.md5#注：写进这个文件 文件名必须是这个 不能变</span></span><br><span class="line"><span class="string">[root@cPen_A lianxi]# cat d.md5 </span></span><br><span class="line"><span class="string">28b2503e7fb565ddc0b8ec1f9ad6a9c7  /etc/passwd</span></span><br><span class="line"><span class="string">[root@cPen_A lianxi]# md5sum -c --status d.md5#注：检查文件是否修改</span></span><br><span class="line"><span class="string">[root@cPen_A lianxi]# echo $?#注：文件未修改，返回0</span></span><br><span class="line"><span class="string">0</span></span><br><span class="line"><span class="string">[root@cPen_A lianxi]# useradd chen223344</span></span><br><span class="line"><span class="string">[root@cPen_A lianxi]# md5sum -c --status d.md5</span></span><br><span class="line"><span class="string">[root@cPen_A lianxi]# echo $?#注：文件修改，返回1</span></span><br><span class="line"><span class="string">1</span></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Ansible </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_Other-Supervisor管理进程-Twikoo版本升级</title>
      <link href="/posts/88a726.html"/>
      <url>/posts/88a726.html</url>
      
        <content type="html"><![CDATA[<h2 id="1-Supervisor-管理-Twikoo">1. Supervisor 管理 Twikoo<a class="header-anchor" href="#1-Supervisor-管理-Twikoo"></a></h2><h3 id="参考文章">参考文章<a class="header-anchor" href="#参考文章"></a></h3><blockquote><p>参考文章：</p><p><a href="https://blog.csdn.net/cyt0906/article/details/107344361">https://blog.csdn.net/cyt0906/article/details/107344361</a></p><p><a href="https://www.cnblogs.com/loveCrane/p/15954893.html">https://www.cnblogs.com/loveCrane/p/15954893.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></pre></td><td class="code"><pre><span class="line">yum install epel-release  <span class="comment">#安装yum源</span></span><br><span class="line">yum install -y supervisor</span><br><span class="line"></span><br><span class="line">supervisord -c /etc/supervisord.conf</span><br><span class="line"></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><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> /etc/supervisord.d/test.conf</span><br><span class="line"><span class="comment">#项目名</span></span><br><span class="line">[program:blog]</span><br><span class="line"><span class="comment">#脚本目录</span></span><br><span class="line">directory=/opt/bin</span><br><span class="line"><span class="comment">#脚本执行命令</span></span><br><span class="line"><span class="built_in">command</span>=/usr/bin/python /opt/bin/test.py</span><br><span class="line"></span><br><span class="line"><span class="comment">#supervisor启动的时候是否随着同时启动，默认True</span></span><br><span class="line">autostart=<span class="literal">true</span></span><br><span class="line"><span class="comment">#当程序exit的时候，这个program不会自动重启,默认unexpected，设置子进程挂掉后自动重启的情况，有三个选项，false,unexpected和true。如果为false的时候，无论什么情况下，都不会被重新启动，如果为unexpected，只有当进程的退出码不在下面的exitcodes里面定义的</span></span><br><span class="line">autorestart=<span class="literal">false</span></span><br><span class="line"><span class="comment">#这个选项是子进程启动多少秒之后，此时状态如果是running，则我们认为启动成功了。默认值为1</span></span><br><span class="line">startsecs=1</span><br><span class="line"></span><br><span class="line"><span class="comment">#脚本运行的用户身份 </span></span><br><span class="line">user = <span class="built_in">test</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#日志输出 </span></span><br><span class="line">stderr_logfile=/tmp/blog_stderr.log </span><br><span class="line">stdout_logfile=/tmp/blog_stdout.log </span><br><span class="line"><span class="comment">#把stderr重定向到stdout，默认 false</span></span><br><span class="line">redirect_stderr = <span class="literal">true</span></span><br><span class="line"><span class="comment">#stdout日志文件大小，默认 50MB</span></span><br><span class="line">stdout_logfile_maxbytes = 20MB</span><br><span class="line"><span class="comment">#stdout日志文件备份数</span></span><br><span class="line">stdout_logfile_backups = 20</span><br><span class="line"></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><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">supervisorctl status        //查看所有进程的状态</span><br><span class="line">supervisorctl stop es       //停止es</span><br><span class="line">supervisorctl start es      //启动es</span><br><span class="line">supervisorctl restart       //重启es</span><br><span class="line">supervisorctl update        //配置文件修改后使用该命令加载新的配置</span><br><span class="line">supervisorctl reload        //重新启动配置中的所有程序</span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote><h3 id="个人样例">个人样例<a class="header-anchor" href="#个人样例"></a></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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># supervisor主配置文件</span></span><br><span class="line">$ <span class="built_in">cat</span> /etc/supervisord.conf</span><br><span class="line">...</span><br><span class="line">[include]</span><br><span class="line">files = supervisord.d/*.ini</span><br><span class="line">files = /root/sh_file/supervisord.d/*.ini</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ <span class="built_in">ls</span> /root/sh_file/supervisord.d/</span><br><span class="line">tkserver.ini</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># twikoo服务 配置</span></span><br><span class="line">$ <span class="built_in">cat</span> /root/sh_file/supervisord.d/tkserver.ini</span><br><span class="line"><span class="comment">#项目名</span></span><br><span class="line">[program:tkserver]</span><br><span class="line"><span class="comment">#脚本目录</span></span><br><span class="line">directory=/root/sh_file/twikoo</span><br><span class="line"><span class="comment">#脚本执行命令</span></span><br><span class="line"><span class="built_in">command</span>=/bin/bash /root/sh_file/twikoo/tkserver.sh</span><br><span class="line"></span><br><span class="line"><span class="comment">#supervisor启动的时候是否随着同时启动，默认True</span></span><br><span class="line">autostart=<span class="literal">true</span></span><br><span class="line"><span class="comment">#当程序exit的时候，这个program不会自动重启,默认unexpected，设置子进程挂掉后自动重启的情况，有三个选项，false,unexpected和true。如果为false的时候，无论什么情况下，都不会被重新启动，如果为unexpected，只有当进程的退出码不在下面的exitcodes里面定 义的</span></span><br><span class="line">autorestart=<span class="literal">false</span></span><br><span class="line"><span class="comment">#这个选项是子进程启动多少秒之后，此时状态如果是running，则我们认为启动成功了。默认值为1</span></span><br><span class="line">startsecs=1</span><br><span class="line"></span><br><span class="line"><span class="comment">#脚本运行的用户身份</span></span><br><span class="line">user = root</span><br><span class="line"></span><br><span class="line"><span class="comment">#日志输出</span></span><br><span class="line">stderr_logfile=/tmp/blog_stderr.log</span><br><span class="line">stdout_logfile=/tmp/blog_stdout.log</span><br><span class="line"><span class="comment">#把stderr重定向到stdout，默认 false</span></span><br><span class="line">redirect_stderr = <span class="literal">true</span></span><br><span class="line"><span class="comment">#stdout日志文件大小，默认 50MB</span></span><br><span class="line">stdout_logfile_maxbytes = 20MB</span><br><span class="line"><span class="comment">#stdout日志文件备份数</span></span><br><span class="line">stdout_logfile_backups = 20</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行twikoo的脚本</span></span><br><span class="line">$ <span class="built_in">cat</span> /root/sh_file/twikoo/tkserver.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">tkserver</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动supervisord</span></span><br><span class="line">$ supervisord -c /etc/supervisord.conf</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$ supervisorctl status</span><br><span class="line"></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><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="comment"># 相关命令</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 supervisor</span></span><br><span class="line">yum install epel-release  <span class="comment">#安装yum源</span></span><br><span class="line">yum install -y supervisor</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 supervisor</span></span><br><span class="line">$ supervisord -c /etc/supervisord.conf</span><br><span class="line"></span><br><span class="line"><span class="comment"># supervisor 命令</span></span><br><span class="line">supervisorctl status        <span class="comment"># 查看所有进程的状态</span></span><br><span class="line">supervisorctl stop tkserver       <span class="comment"># 停止tkserver</span></span><br><span class="line">supervisorctl start tkserver      <span class="comment"># 启动tkserver</span></span><br><span class="line">supervisorctl restart tkserver    <span class="comment"># 重启tkserver</span></span><br><span class="line">supervisorctl update        <span class="comment"># 配置文件修改后使用该命令加载新的配置</span></span><br><span class="line">supervisorctl reload        <span class="comment"># 重新启动配置中的所有程序</span></span><br><span class="line"><span class="comment"># 注：把es换成all可以管理配置中的所有进程。直接输入supervisorctl进入supervisorctl的shell交互界面，此时上面的命令不带supervisorctl可直接使用。</span></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><h2 id="2-Twikoo版本升级（私有部署）">2. Twikoo版本升级（私有部署）<a class="header-anchor" href="#2-Twikoo版本升级（私有部署）"></a></h2><h3 id="更新-1-6-22">更新 1.6.22<a class="header-anchor" href="#更新-1-6-22"></a></h3><p>时间：2023-10-10，版本 <strong>1.6.22</strong> &lt;= 1.6.7</p><p>参考：<a href="https://twikoo.js.org/update.html#%E9%92%88%E5%AF%B9%E7%A7%81%E6%9C%89%E9%83%A8%E7%BD%B2%E7%9A%84%E6%9B%B4%E6%96%B0%E6%96%B9%E5%BC%8F">twikoo.js.org</a></p><p>1.6.22 支持评论/访问量数据 json 导出了</p><p>官网步骤：</p><ol><li class="lvl-3"><p>停止旧版本 <code>kill $(ps -ef | grep tkserver | grep -v 'grep' | awk '&#123;print $2&#125;')</code></p></li><li class="lvl-3"><p>拉取新版本 <code>npm i -g tkserver@latest</code></p></li><li class="lvl-3"><p>启动新版本 <code>nohup tkserver &gt;&gt; tkserver.log 2&gt;&amp;1 &amp;</code></p></li></ol><p>我的步骤：</p><ol><li class="lvl-3"><p>先备份，我的数据路径 <strong>/root/sh_file/twikoo</strong>，<code>cp -r twikoo twikoo_bak</code></p></li><li class="lvl-3"><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></pre></td><td class="code"><pre><span class="line">supervisorctl status tkserver</span><br><span class="line"></span><br><span class="line">supervisorctl stop tkserver</span><br><span class="line"></span><br><span class="line">ps -ef | grep tkserver | grep -v <span class="string">&#x27;grep&#x27;</span> | awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. 停止旧版本</span></span><br><span class="line"><span class="built_in">kill</span> $(ps -ef | grep tkserver | grep -v <span class="string">&#x27;grep&#x27;</span> | awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 拉取新版本</span></span><br><span class="line">npm i -g tkserver@latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 启动新版本</span></span><br><span class="line"><span class="comment"># kill $(ps -ef | grep tkserver | grep -v &#x27;grep&#x27; | awk &#x27;&#123;print $2&#125;&#x27;)</span></span><br><span class="line">supervisorctl start tkserver</span><br><span class="line"></span><br><span class="line"><span class="built_in">rm</span> -rf twikoo_bak<span class="comment"># 删备份</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>更新 butterfly 前端资源，CDN.option.twikoo，<a href="https://www.staticfile.org/">www.staticfile.org</a> 上查找</p></li></ol><h3 id="前言">前言<a class="header-anchor" href="#前言"></a></h3><p>乌龙事件，原本以为自己的 twikoo 版本过低，打算升级解决。后来发现是 butterfly 内置的 twikoo js 版本低，换个 js 就行。</p><p>主题配置文件 _config.butterfly.yml 新增 twikoo cdn</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></pre></td><td class="code"><pre><span class="line"><span class="attr">CDN:</span></span><br><span class="line">  <span class="attr">option:</span></span><br><span class="line">    <span class="attr">twikoo:</span> <span class="string">https://npm.elemecdn.com/twikoo@1.6.7/dist/twikoo.all.min.js</span></span><br></pre></td></tr></table></figure><h3 id="参考文章-2">参考文章<a class="header-anchor" href="#参考文章-2"></a></h3><p><strong>参考自</strong>：<a href="https://twikoo.js.org/quick-start.html#%E9%92%88%E5%AF%B9%E7%A7%81%E6%9C%89%E9%83%A8%E7%BD%B2%E7%9A%84%E6%9B%B4%E6%96%B0%E6%96%B9%E5%BC%8F">twikoo 官网</a></p><ol><li class="lvl-3"><p>停止旧版本 <code>kill $(ps -ef | grep tkserver | grep -v 'grep' | awk '&#123;print $2&#125;')</code></p></li><li class="lvl-3"><p>拉取新版本 <code>npm i -g tkserver@latest</code></p></li><li class="lvl-3"><p>启动新版本 <code>nohup tkserver &gt;&gt; tkserver.log 2&gt;&amp;1 &amp;</code></p></li></ol><h3 id="个人样例-2">个人样例<a class="header-anchor" href="#个人样例-2"></a></h3><p><strong>个人步骤记录</strong></p><ol><li class="lvl-3"><p>检查是否异常</p></li></ol><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"><span class="comment"># 发现 supervisor 未执行，启动程序</span></span><br><span class="line">$ supervisorctl status tkserver</span><br><span class="line">unix:///run/supervisor/supervisor.sock refused connection</span><br><span class="line"></span><br><span class="line">$ supervisord -c /etc/supervisord.conf</span><br><span class="line">Unlinking stale socket /run/supervisor/supervisor.sock</span><br><span class="line"></span><br><span class="line">$ supervisorctl status tkserver</span><br><span class="line">tkserver                         RUNNING   pid 3268176, <span class="built_in">uptime</span> 0:00:03</span><br><span class="line"></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>停止旧版本 <code>supervisorctl stop tkserver</code> &amp;&amp; <code>kill $(ps -ef | grep tkserver | grep -v 'grep' | awk '&#123;print $2&#125;')</code></p></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 停止 twikoo 进程</span></span><br><span class="line">$ supervisorctl stop tkserver</span><br><span class="line">tkserver: ERROR (not running)</span><br><span class="line"></span><br><span class="line">$ supervisorctl status tkserver</span><br><span class="line">tkserver                         EXITED    Nov 06 07:00 PM</span><br><span class="line"></span><br><span class="line">$ ps -ef | grep tkserver | grep -v <span class="string">&#x27;grep&#x27;</span> | awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span></span><br><span class="line">1618196</span><br><span class="line">1618197</span><br><span class="line"></span><br><span class="line"><span class="comment"># 停止旧版本</span></span><br><span class="line">$ <span class="built_in">kill</span> $(ps -ef | grep tkserver | grep -v <span class="string">&#x27;grep&#x27;</span> | awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span>)</span><br><span class="line"></span><br><span class="line">$ ps aux |grep twikoo</span><br><span class="line"></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p>拉取新版本 <code>npm i -g tkserver@latest</code></p></li><li class="lvl-3"><p>启动新版本 <code>supervisorctl start tkserver</code></p></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 拉取新版本</span></span><br><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/twikoo</span><br><span class="line"></span><br><span class="line">$ npm i -g tkserver@latest</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动新版本</span></span><br><span class="line">$ supervisorctl start tkserver</span><br><span class="line">tkserver: started</span><br><span class="line"></span><br><span class="line">$ ps aux |grep twikoo</span><br><span class="line">root     3308516  0.0  0.1  16956  2892 ?        S    19:06   0:00 /bin/bash /root/sh_file/twikoo/tkserver.sh</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Other </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Twikoo </tag>
            
            <tag> Other </tag>
            
            <tag> Supervisor </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_Error-Nginx 反代后端接口报错</title>
      <link href="/posts/5552.html"/>
      <url>/posts/5552.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-前言">一. 前言<a class="header-anchor" href="#一-前言"></a></h2><blockquote><p>NGINX 反向代理 后端接口时报错：<code>[error] ...: *1918 readv() failed (104: Connection reset by peer) while reading upstream ...</code></p><p>控制台报错信息</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220917210427284.png" alt=""></p><p>NGINX错误日志</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220917210540055.png" alt=""></p></blockquote><h2 id="二-解决办法">二. 解决办法<a class="header-anchor" href="#二-解决办法"></a></h2><blockquote><p><strong>参考文章</strong> <a href="http://blog.51yip.com/apachenginx/2203.html">http://blog.51yip.com/apachenginx/2203.html</a></p><p>查看nginx error错误，发现上传接口报以下错：</p><p><code>2019/10/10 19:58:25 [error] 299784#0: \*5967188 readv() failed (104: Connection reset by peer) while reading upstream, client: 59.34.155.7, server: xxxxxxxx, request: &quot;POST /stream/tracking/file HTTP/1.1&quot;, upstream: &quot;http://xxxxxxxx/stream/tracking/file&quot;, host: &quot;xxxxxxxx&quot;</code></p><p>这种错误日志不多，第一感觉就是上传文件过大，传输时间过长，然后连接被中断。</p><p><code>当使用nginx作为反向代理时，为了支持长连接，需要做到两点：</code></p><p><code>从client到nginx的连接是长连接，对于客户端来说，nginx长连接是默认开启的。 从nginx到server的连接是长连接，需要自己开启</code></p><figure class="highlight nginx"><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="section">upstream</span> bigdata &#123;  </span><br><span class="line">    <span class="attribute">server</span> <span class="number">10</span>.<span class="number">0</span>.<span class="number">20</span>.xx:<span class="number">18018</span>;  </span><br><span class="line">    <span class="attribute">server</span> <span class="number">10</span>.<span class="number">0</span>.<span class="number">20</span>.xx:<span class="number">18018</span>;  </span><br><span class="line">    <span class="attribute">server</span> <span class="number">10</span>.<span class="number">0</span>.<span class="number">20</span>.xx:<span class="number">18018</span>;  </span><br><span class="line">    <span class="attribute">server</span> <span class="number">10</span>.<span class="number">0</span>.<span class="number">20</span>.xx:<span class="number">18018</span>;  </span><br><span class="line">    <span class="attribute">keepalive</span> <span class="number">100</span>;   //根据qps来调整  </span><br><span class="line">&#125;    </span><br><span class="line">  </span><br><span class="line"><span class="section">location</span> <span class="regexp">~ /</span> &#123;  </span><br><span class="line">。。。。。。。。。省略。。。。。。。。。。。。。  </span><br><span class="line">    <span class="attribute">proxy_connect_timeout</span>      <span class="number">120</span>;   //加大120  </span><br><span class="line">    <span class="attribute">proxy_send_timeout</span>         <span class="number">120</span>;   //加大120  </span><br><span class="line">    <span class="attribute">proxy_read_timeout</span>         <span class="number">120</span>;   //加大120  </span><br><span class="line">    <span class="attribute">proxy_http_version</span> <span class="number">1</span>.<span class="number">1</span>;    //开启后端，长连接  </span><br><span class="line">    <span class="attribute">proxy_set_header</span> Connection <span class="string">&quot;&quot;</span>;  //开启后端，长连接  </span><br><span class="line">&#125;  </span><br></pre></td></tr></table></figure><p>注意：<code>keepalive指定的数值是Nginx每个worker连接后端的最大长连接数，而不是整个Nginx的.</code></p><p>作者:海底苍鹰</p><p>地址:<a href="http://blog.51yip.com/apachenginx/2203.html">http://blog.51yip.com/apachenginx/2203.html</a></p></blockquote><h2 id="三-个人配置记录">三. 个人配置记录<a class="header-anchor" href="#三-个人配置记录"></a></h2><figure class="highlight nginx"><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></pre></td><td class="code"><pre><span class="line">$ <span class="attribute">cat</span> cpen.top.conf</span><br><span class="line">server &#123;</span><br><span class="line">    <span class="attribute">listen</span> xxx ssl;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">server_name</span> xxx.xxx;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="attribute">proxy_pass</span> http://127.0.0.1:xxx;</span><br><span class="line">        <span class="attribute">proxy_connect_timeout</span>      <span class="number">120</span>;   <span class="comment"># 加大120</span></span><br><span class="line">        <span class="attribute">proxy_send_timeout</span>         <span class="number">120</span>;   <span class="comment"># 加大120</span></span><br><span class="line">        <span class="attribute">proxy_read_timeout</span>         <span class="number">120</span>;   <span class="comment"># 加大120</span></span><br><span class="line">        <span class="attribute">proxy_http_version</span> <span class="number">1</span>.<span class="number">1</span>;           <span class="comment"># 开启后端，长连接</span></span><br><span class="line">        <span class="attribute">proxy_set_header</span> Connection <span class="string">&quot;&quot;</span>;   <span class="comment"># 开启后端，长连接</span></span><br><span class="line">        <span class="attribute">proxy_set_header</span>    Host            <span class="variable">$host</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span>    X-Real-IP       <span class="variable">$remote_addr</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span>    X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span>    Upgrade         <span class="variable">$http_upgrade</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_certificate</span>     /usr/local/nginx/ssl/xxx.pem;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /usr/local/nginx/ssl/xxx.key;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">access_log</span> /data/service_logs/nginx/xxx.log misc;</span><br><span class="line">    <span class="attribute">error_log</span>  /data/service_logs/nginx/xxx.log;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> Error </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Error </tag>
            
            <tag> Nginx </tag>
            
            <tag> Troubleshooting </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_PHP-CentOS8.2 编译安装 PHP8.1.10</title>
      <link href="/posts/63259.html"/>
      <url>/posts/63259.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-前言">一. 前言<a class="header-anchor" href="#一-前言"></a></h2><p>因 <a href="https://www.jsdelivr.com/">https://www.jsdelivr.com/</a> 失效，博主打算将 GitHub 托管的图床备份到其他平台。</p><p>网上看到 <a href="https://github.com/lsky-org/lsky-pro">兰空图床</a> 萌生了自建图床的念头，搭建环境要求 PHP &gt;= 8.0.2，于是打算编译安装 PHP。</p><p>最终因服务器配置太低（1核2G）编译失败而放弃。转而投身之前已经搭建好环境的又拍云平台。</p><p>博文内容：<code>PHP-CentOS8.2 编译安装 PHP8.1.10</code> + <code>编写GitHub图床迁移至又拍云的脚本（ftp）</code> + <code>编写批量修改文章内容的脚本</code></p><h2 id="二-正文">二. 正文<a class="header-anchor" href="#二-正文"></a></h2><h3 id="2-1❤-CentOS8-2-编译安装-PHP8-1-10">2.1❤ CentOS8.2 编译安装 PHP8.1.10<a class="header-anchor" href="#2-1❤-CentOS8-2-编译安装-PHP8-1-10"></a></h3><p><strong>2.1.1</strong> PHP8 和 oniguruma 源码下载并上传至服务器 /mnt 目录</p><p><a href="https://www.php.net/distributions/php-8.1.10.tar.gz">https://www.php.net/distributions/php-8.1.10.tar.gz</a></p><p><a href="https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4">https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar xzf oniguruma-6.9.4.tar.gz</span><br><span class="line">tar xzf php-8.1.10.tar.gz</span><br></pre></td></tr></table></figure><p><strong>2.1.2</strong> 安装 PHP8 依赖包</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="comment"># 2 安装 PHP8 依赖包</span></span><br><span class="line">yum -y install autoconf freetype gd libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel net-snmp-devel libjpeg-devel php-ldap openldap-devel openldap-clients freetype-devel gmp-devel libzip libzip-devel sqlite-devel automake libtool</span><br></pre></td></tr></table></figure><p><strong>2.1.3</strong> 编译 PHP8 依赖包 oniguruma</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 3.1 生成 configure</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/oniguruma-6.9.4</span><br><span class="line">./autogen.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.2 生成编译配置文件</span></span><br><span class="line">./configure --prefix=/usr</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.3 编译并安装</span></span><br><span class="line">make &amp;&amp; make install</span><br></pre></td></tr></table></figure><p><strong>2.1.4</strong> 编译 PHP8 主包</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"><span class="comment"># 4.1 生成编译配置文件</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/php-8.1.10</span><br><span class="line">./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-opcache --with-pcre-jit --enable-gd --with-jpeg --with-freetype --with-gettext --with-curl --with-openssl --enable-sockets --enable-mbstring --enable-xml --with-zip --with-zlib --with-snmp --with-mhash --enable-ftp --enable-bcmath --enable-soap --enable-shmop --enable-sysvsem --enable-pcntl --with-gmp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.2 编译并安装</span></span><br><span class="line">make &amp;&amp; make install</span><br></pre></td></tr></table></figure><p>因为配置过低，编译失败。</p><p><strong>2.1.5</strong> 编译安装后目录</p><p>/usr/local/php</p><p><strong>参考</strong></p><p><a href="https://www.bilibili.com/read/cv9248283/">https://www.bilibili.com/read/cv9248283/</a></p><p><a href="https://www.bilibili.com/video/BV13U4y1T7VS">https://www.bilibili.com/video/BV13U4y1T7VS</a></p><h3 id="2-2-基于-FTP-将GitHub图床迁移至又拍云">2.2 基于 FTP 将GitHub图床迁移至又拍云<a class="header-anchor" href="#2-2-基于-FTP-将GitHub图床迁移至又拍云"></a></h3><p><strong>参考</strong></p><p><a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">官方视频教程 - 创建存储服务和使用 FTP 上传</a>可以得到用户名和密码</p><p>默认已经完成了又拍云云存储服务的申请 + 绑定自定义域名 <a href="https://help.upyun.com/knowledge-base/quick_start/">https://help.upyun.com/knowledge-base/quick_start/</a></p><p><strong>2.2.1</strong> 编写 Python 脚本 实现批量</p><p>源码来自<a href="http://blog.csdn.net/ouyang_peng/article/details/79271113">http://blog.csdn.net/ouyang_peng/article/details/79271113</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        ftp自动下载、自动上传脚本，可以递归目录操作</span></span><br><span class="line"><span class="string">        作者：欧阳鹏</span></span><br><span class="line"><span class="string">        博客地址：http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string">        参数:</span></span><br><span class="line"><span class="string">                 host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                 port:端口号</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="comment"># print(&quot;__init__()---&gt; host = %s ,port = %s&quot; % (host, port))</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.host = host</span><br><span class="line">        <span class="variable language_">self</span>.port = port</span><br><span class="line">        <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line">        <span class="comment"># 重新设置下编码方式</span></span><br><span class="line">        <span class="comment">#self.ftp.encoding = &#x27;gbk&#x27;</span></span><br><span class="line">        <span class="variable language_">self</span>.ftp.encoding = <span class="string">&#x27;utf8&#x27;</span></span><br><span class="line">        <span class="comment"># 获取脚本路径</span></span><br><span class="line">        path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line">        <span class="variable language_">self</span>.log_file = <span class="built_in">open</span>(path + <span class="string">&quot;/log.txt&quot;</span>, <span class="string">&quot;a&quot;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string">            参数:</span></span><br><span class="line"><span class="string">                  username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                 password: 密码</span></span><br><span class="line"><span class="string">            &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            timeout = <span class="number">60</span></span><br><span class="line">            socket.setdefaulttimeout(timeout)</span><br><span class="line">            <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line">            <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line">            <span class="comment"># 打开调试级别2，显示详细信息</span></span><br><span class="line">            <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line">            <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line">            <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="variable language_">self</span>.deal_error(<span class="string">&quot;FTP 连接或登录失败 ，错误描述为：%s&quot;</span> % err)</span><br><span class="line">            <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string">             local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_file: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为：%s&quot; % err)</span></span><br><span class="line">            remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            local_file_size = os.path.getsize(local_file)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为：%s&quot; % err)</span></span><br><span class="line">            local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;local_file_size:%d  , remote_file_size:%d&#x27;</span> % (local_file_size, remote_file_size))</span><br><span class="line">        <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line">            <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从ftp下载文件</span></span><br><span class="line"><span class="string">            参数:</span></span><br><span class="line"><span class="string">                local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                remote_file: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&quot;download_file()---&gt; local_path = %s ,remote_path = %s&quot;</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 文件大小相同，无需下载&#x27;</span> % local_file)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;下载文件 %s ... ...&#x27;</span> % local_file)</span><br><span class="line">                buf_size = <span class="number">1024</span></span><br><span class="line">                file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;wb&#x27;</span>)</span><br><span class="line">                <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">&#x27;RETR %s&#x27;</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line">                file_handler.close()</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;下载文件出错，出现异常：%s &#x27;</span> % err)</span><br><span class="line">                <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string">                       参数:</span></span><br><span class="line"><span class="string">                         local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">                         remote_path: 远程路径</span></span><br><span class="line"><span class="string">                &quot;&quot;&quot;</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt;  local_path = %s ,remote_path = %s&quot;</span> % (local_path, remote_path))</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录%s不存在，继续...&#x27;</span> % remote_path + <span class="string">&quot; ,具体错误描述为：%s&quot;</span> % err)</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> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录%s不存在，先创建本地目录&#x27;</span> % local_path)</span><br><span class="line">            os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.file_list = []</span><br><span class="line">        <span class="comment"># 方法回调</span></span><br><span class="line">        <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line">        remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录 列表: %s&#x27;</span> % remote_names)</span><br><span class="line">        <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line">            file_type = item[<span class="number">0</span>]</span><br><span class="line">            file_name = item[<span class="number">1</span>]</span><br><span class="line">            local = os.path.join(local_path, file_name)</span><br><span class="line">            <span class="keyword">if</span> file_type == <span class="string">&#x27;d&#x27;</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt; 下载目录： %s&quot;</span> % file_name)</span><br><span class="line">                <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line">            <span class="keyword">elif</span> file_type == <span class="string">&#x27;-&#x27;</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;download_file()---&gt; 下载文件： %s&quot;</span> % file_name)</span><br><span class="line">                <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;返回上层目录 %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string">             local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_path: 远程文件</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 不存在&#x27;</span> % local_file)</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> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;跳过相等的文件: %s&#x27;</span> % local_file)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">        buf_size = <span class="number">1024</span></span><br><span class="line">        file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;rb&#x27;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.storbinary(<span class="string">&#x27;STOR %s&#x27;</span> % remote_file, file_handler, buf_size)</span><br><span class="line">        file_handler.close()</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;上传: %s&#x27;</span> % local_file + <span class="string">&quot;成功!&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string">           参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">             remote_path: 远程路径</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line">            <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录 %s 不存在&#x27;</span> % local_path)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至远程目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line">        local_name_list = os.listdir(local_path)</span><br><span class="line">        <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line">            src = os.path.join(local_path, local_name)</span><br><span class="line">            <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line">                <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                    <span class="variable language_">self</span>.debug_print(<span class="string">&quot;目录已存在 %s ,具体错误描述为：%s&quot;</span> % (local_name, err))</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传目录： %s&quot;</span> % local_name)</span><br><span class="line">                <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传文件： %s&quot;</span> % local_name)</span><br><span class="line">                <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 退出ftp</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.debug_print(<span class="string">&quot;close()---&gt; FTP退出&quot;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line">        <span class="variable language_">self</span>.log_file.close()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 打印日志</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 处理错误异常</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                e：异常</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        log_str = <span class="string">&#x27;发生错误: %s&#x27;</span> % e</span><br><span class="line">        <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line">        sys.exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 记录日志</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                log_str：日志</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        time_now = time.localtime()</span><br><span class="line">        date_now = time.strftime(<span class="string">&#x27;%Y-%m-%d&#x27;</span>, time_now)</span><br><span class="line">        format_log_str = <span class="string">&quot;%s ---&gt; %s \n &quot;</span> % (date_now, log_str)</span><br><span class="line">        <span class="built_in">print</span>(format_log_str)</span><br><span class="line">        <span class="variable language_">self</span>.log_file.write(format_log_str)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 获取文件列表</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                line：</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line">        <span class="comment"># 去除  . 和  ..</span></span><br><span class="line">        <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;..&#x27;</span>]:</span><br><span class="line">            <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot; 获取文件名</span></span><br><span class="line"><span class="string">            参数：</span></span><br><span class="line"><span class="string">                line：</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        pos = line.rfind(<span class="string">&#x27;:&#x27;</span>)</span><br><span class="line">        <span class="keyword">while</span> (line[pos] != <span class="string">&#x27; &#x27;</span>):</span><br><span class="line">            pos += <span class="number">1</span></span><br><span class="line">        <span class="keyword">while</span> (line[pos] == <span class="string">&#x27; &#x27;</span>):</span><br><span class="line">            pos += <span class="number">1</span></span><br><span class="line">        file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line">        <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="comment"># 清除日志</span></span><br><span class="line">    path = os.path.dirname(os.path.realpath(__file__))      <span class="comment"># 脚本路径</span></span><br><span class="line">    <span class="keyword">if</span> os.path.exists(path + <span class="string">&#x27;/log.txt&#x27;</span>):</span><br><span class="line">        log_file = path + <span class="string">&#x27;/log.txt &#x27;</span><span class="keyword">if</span> os.sep == <span class="string">&quot;/&quot;</span> <span class="keyword">else</span> path + <span class="string">&#x27;\\&#x27;</span> + <span class="string">&#x27;log.txt&#x27;</span></span><br><span class="line">        subprocess.Popen(<span class="string">f&#x27;rm -rf <span class="subst">&#123;log_file&#125;</span>&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line">        time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    my_ftp = MyFTP(<span class="string">&quot;xxx.ftp.upyun.com&quot;</span>)</span><br><span class="line">    my_ftp.login(<span class="string">&quot;xxx/xxx&quot;</span>, <span class="string">&quot;xxx&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="comment"># my_ftp.download_file(&quot;E:/code_zone/image_bed/image/wallpaper/1.jpg&quot;, &quot;/image/wallpaper/1.jpg&quot;)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 上传单个文件</span></span><br><span class="line">    <span class="comment"># my_ftp.upload_file(&quot;G:/ftp_test/Release/XTCLauncher.apk&quot;, &quot;/App/AutoUpload/ouyangpeng/I12/Release/XTCLauncher.apk&quot;)</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 下载目录</span></span><br><span class="line">    <span class="comment"># image.cpen.top/image/ → 本地 E:/code_zone/image_bed/image/    (本地图床目录, 又拍云路径)</span></span><br><span class="line">    <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>:</span><br><span class="line">        my_ftp.download_file_tree(<span class="string">&quot;E:/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)</span><br><span class="line">    <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>:     <span class="comment"># aliyun</span></span><br><span class="line">        my_ftp.download_file_tree(<span class="string">&quot;/root/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 上传目录</span></span><br><span class="line">    <span class="comment"># 本地 E:/code_zone/image_bed/image/ → image.cpen.top/image/    (本地图床目录, 又拍云路径)</span></span><br><span class="line">    <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>:      <span class="comment"># Windows</span></span><br><span class="line">        my_ftp.upload_file_tree(<span class="string">&quot;E:/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)    </span><br><span class="line">        my_ftp.close()</span><br><span class="line">    <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>:     <span class="comment"># aliyun</span></span><br><span class="line">        my_ftp.upload_file_tree(<span class="string">&quot;/root/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)  </span><br><span class="line">        my_ftp.close()</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="comment"># python E:/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"><span class="comment"># python3 /root/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.2.2</strong> 说明</p><p><code>my_ftp.login(&quot;用户名xxx/xxx&quot;, &quot;密码xxx&quot;)</code> 参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">https://techs.upyun.com/videos/cdnpage/creating_storage.html</a></p><p>后期又将脚本传到云服务器上，通过计划任务，每15分钟同步，保持 GitHub 与又拍云图床一致</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"><span class="comment"># root @ CentOS in ~ [18:05:59]</span></span><br><span class="line">$ crontab -l</span><br><span class="line">*/15 * * * *  <span class="built_in">cd</span> /root/code_zone/image_bed/; git pull; python3 /root/code_zone/tools/python-ftp/ftp.py; bash git.sh</span><br></pre></td></tr></table></figure><p>迁移好图床后，博客中调用图片资源时 浏览器自动 http 跳 https，因为没有证书导致图片失效，于是又申请了 ssl 证书，上传至又拍云。</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220910180219146.png" alt=""></p></blockquote><h3 id="2-3-编写批量修改文章内容的脚本">2.3 编写批量修改文章内容的脚本<a class="header-anchor" href="#2-3-编写批量修改文章内容的脚本"></a></h3><p>源码参考<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">https://blog.csdn.net/qq_38150250/article/details/118026219</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考  https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数：search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line">    <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line">    all_file = os.listdir(search_path)</span><br><span class="line">    <span class="comment"># 对于每一个文件</span></span><br><span class="line">    <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line">        <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line">        <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line">            <span class="comment"># 递归查找</span></span><br><span class="line">            search(search_path + each_file + <span class="string">&#x27;/&#x27;</span>, search_result)</span><br><span class="line">        <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> re.findall(<span class="string">&#x27;.*\.md$&#x27;</span>, each_file) == [each_file]:</span><br><span class="line">            <span class="comment"># 输出路径</span></span><br><span class="line">                search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i &#x27;s/old_str/new_str/&#x27;</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径，replace_old_str 要替换的字符，replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;r&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f1: </span><br><span class="line">        content = f1.read()</span><br><span class="line">        f1.close()</span><br><span class="line">        t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;w&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f2:</span><br><span class="line">        f2.write(t)</span><br><span class="line">    f2.close()</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="comment">#path = &#x27;E:/code_zone/.history/20220831_blog/source/_posts/&#x27;</span></span><br><span class="line">path_list = [</span><br><span class="line">    <span class="string">&#x27;E:/code_zone/hexo-source/source/_posts/&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;E:/code_zone/hexo-source-butterfly/source/_posts/&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;E:/code_zone/hexo-source-diary/source/_posts/&#x27;</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elcfumuvhm/image/&#x27;</span></span><br><span class="line">new_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elcfumuvhm/image/&#x27;</span></span><br><span class="line">search_result = []</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">    result = []                 <span class="comment"># 存放文件路径</span></span><br><span class="line">    <span class="comment"># 默认当前目录</span></span><br><span class="line">    <span class="comment"># path = os.getcwd()</span></span><br><span class="line">    <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line">        search(path, result)    <span class="comment"># 获取文章路径</span></span><br><span class="line">    count = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line">        replace(file_name, old_str, new_str)</span><br><span class="line">        count += <span class="number">1</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;&#123;&#125; done  &#123;&#125;&quot;</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.3.1</strong> 说明</p><p><code>search</code>函数指定文件类型为 .md，可获得文章的完整路径；</p><p><code>path_list</code>列表存放需要修改的文章父目录路径，可以递归查询子目录；</p><p><code>old_str</code>需要替换的内容</p><p><code>new_str</code>新内容</p>]]></content>
      
      
      <categories>
          
          <category> PHP </category>
          
      </categories>
      
      
        <tags>
            
            <tag> PHP </tag>
            
            <tag> 脚本 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>10_Python-CSDN_内存管理</title>
      <link href="/posts/62975.html"/>
      <url>/posts/62975.html</url>
      
        <content type="html"><![CDATA[<blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Python内存管理三大块</span><br><span class="line">○ 引用计数</span><br><span class="line">○ 垃圾回收</span><br><span class="line">○ 内存池</span><br><span class="line">Python的内存管理以引用计数为主，垃圾回收为辅，还有个内存池</span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="一-引用机制">一. 引用机制<a class="header-anchor" href="#一-引用机制"></a></h2><blockquote><p>● 引用机制</p><p>Python动态类型</p><p>○ <mark>对象</mark>是储存在内存中的实体。</p><p>○ 我们在程序中写的<mark>对象名</mark>，只是指向这一对象的引用(reference)</p><p>○ <mark>引用和对象分离</mark>，是动态类型的核心</p><p>○ 引用可以随时指向一个新的对象（内存地址会不一样）</p></blockquote><hr><h2 id="二-引用计数">二. 引用计数<a class="header-anchor" href="#二-引用计数"></a></h2><blockquote><p>● 引用计数</p><p><strong>在Python中，每个对象都有存有指向该对象的引用总数，即引用计数(reference count)</strong></p><p>引用计数器原理</p><p>○ 每个对象维护一个 ob_ref 字段，用来记录该对象当前被引用的次数 每当<strong>新的引用指向该对象</strong>时，它的<strong>引用计数ob_ref加1</strong></p><p>○ 每当该对象的<strong>引用失效时计数ob_ref减1</strong></p><p>○ <strong>一旦对象的引用计数为0</strong>，该<strong>对象可以被回收，对象占用的内存空间将被释放</strong>。 它的缺点是需要额外的空间维护引用计数，这个问题是其次的</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># a = 1 , b = 1 ，1的引用计数为2（保存它被引用的次数）</span></span><br><span class="line"><span class="comment"># a = 2 , b = 3 , 1的引用计数为0（内存里面不需要它了，回收销毁，这块对象被回收了，对象占用的内存空间将被释放）</span></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></pre></td><td class="code"><pre><span class="line">获取引用计数: getrefcount()</span><br><span class="line">○ 当使用某个引用作为参数，传递给getrefcount()时，参数实际上创建了一个临时的引用。因此，</span><br><span class="line">getrefcount()所得到的结果，会比期望的多<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">from</span> sys <span class="keyword">import</span> getrefcount<span class="comment"># 导入模块</span></span><br><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line"><span class="built_in">print</span>(getrefcount(a))   <span class="comment"># 获取对象a的引用计数 ， 结果为2</span></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><br><span class="line">○ 当一个对象A被另一个对象B引用时，A的引用计数将增加<span class="number">1</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">减少引用计数</span><br><span class="line">○ <span class="keyword">del</span>删除或重新引用时，引用计数会变化（<span class="keyword">del</span>只是删除引用）</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="keyword">from</span> sys <span class="keyword">import</span> getrefcount</span><br><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]<span class="comment"># 真实引用计数：1</span></span><br><span class="line">b = a<span class="comment"># 真实引用计数：2</span></span><br><span class="line">c = [a,a]<span class="comment"># 真实引用计数：4</span></span><br><span class="line"><span class="keyword">del</span> c[<span class="number">0</span>]            <span class="comment"># del删除引用引用计数 - 1 ； 真实引用计数: 3</span></span><br><span class="line"><span class="built_in">print</span>(c)            <span class="comment"># c 是列表对象输出为 [[1, 2, 3]]</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(getrefcount(a))   <span class="comment"># 引用计数为4，真实引用计数为3</span></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><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">循环引用的情况</span><br><span class="line">x = []</span><br><span class="line">y = []</span><br><span class="line">x.append(y)  y.append(x)</span><br><span class="line">○ 对于上面相互引用的情况,如果不存在其他对象对他们的引用,这两个对象所占用的内存也还是无法回收,从而导致内存泄漏</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>x = [<span class="number">1</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>y = [<span class="number">2</span>]</span><br><span class="line"></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>x.append(y)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>x</span><br><span class="line">[<span class="number">1</span>, [<span class="number">2</span>]]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>y.append(x)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>y</span><br><span class="line">[<span class="number">2</span>, [<span class="number">1</span>, [...]]]<span class="comment"># 注：发生死循环</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">from</span> sys <span class="keyword">import</span> getrefcount</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>x = [<span class="string">&quot;x&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>y = [<span class="string">&quot;y&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>getrefcount(x)</span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>getrefcount(y)</span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>x.append(y)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>getrefcount(x)</span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>getrefcount(y)</span><br><span class="line"><span class="number">3</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>y.append(x)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>getrefcount(x)</span><br><span class="line"><span class="number">3</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>x</span><br><span class="line">[<span class="string">&#x27;x&#x27;</span>, [<span class="string">&#x27;y&#x27;</span>, [...]]]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>y</span><br><span class="line">[<span class="string">&#x27;y&#x27;</span>, [<span class="string">&#x27;x&#x27;</span>, [...]]]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">del</span> x</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>y</span><br><span class="line">[<span class="string">&#x27;y&#x27;</span>, [<span class="string">&#x27;x&#x27;</span>, [...]]]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">del</span> y<span class="comment"># del x;del y引用删除，这块内存区域获取不到了</span></span><br></pre></td></tr></table></figure><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">○ 简单</span><br><span class="line">○ 实时性</span><br></pre></td></tr></table></figure><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">○ 维护引用计数消耗资源</span><br><span class="line">○ 循环引用时，无法回收</span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="三-垃圾回收">三. 垃圾回收<a class="header-anchor" href="#三-垃圾回收"></a></h2><blockquote><p><strong>● 垃圾回收</strong></p><p><strong>回收原则</strong></p><p>○ 当Python的某个对象的引用计数降为0时，<mark>可以</mark>被垃圾回收</p><p><strong>gc机制</strong></p><p>○ GC作为现代编程语言的自动内存管理机制，专注于两件事</p><p>○ 找到内存中无用的垃圾资源</p><p>○ 清除这些垃圾并把内存让出来给其他对象使用</p><p>GC彻底把程序员从资源管理的重担中解放出来，让他们有更多的时间放在业务逻辑上。但这并不意味着码农就可以不去了解GC，毕竟多了解GC知识还是有利于我们写出更健壮的代码</p><p><strong>效率问题</strong></p><p>○ 垃圾回收时，Python不能进行其它的任务。频繁的垃圾回收将大大降低Python的工作效率</p><p>○ 当Python运行时，会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数。当两者的差值高于某个阈值时，垃圾回收才会启动</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">import</span> gc</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(gc.get_threshold())</span><br><span class="line">(<span class="number">700</span>, <span class="number">10</span>, <span class="number">10</span>)<span class="comment"># 注：默认值</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">del</span> x</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">del</span> y</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>gc.collect()</span><br><span class="line"><span class="number">2</span><span class="comment"># 删除了2个循环引用</span></span><br><span class="line"></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;x1 xx&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;x1 xx&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="number">1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="number">2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>gc.collect()</span><br><span class="line"><span class="number">0</span></span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">三种情况触发垃圾回收</span><br><span class="line">○ 调用gc.collect()</span><br><span class="line">○ GC达到阀值时</span><br><span class="line">○ 程序退出时</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">分代(generation)回收</span><br><span class="line">这一策略的基本假设是：存活时间越久的对象，越不可能在后面的程序中变成垃圾</span><br><span class="line">○ Python将所有的对象分为0，1，2三代</span><br><span class="line">○ 所有的新建对象都是0代对象</span><br><span class="line">○ 当某一代对象经历过垃圾回收，依然存活，那么它就被归入下一代对象</span><br><span class="line">○ 垃圾回收启动时，一定会扫描所有的0代对象</span><br><span class="line">○ 如果0代经过一定次数垃圾回收，那么就启动对0代和1代的扫描清理</span><br><span class="line">○ 当1代也经历了一定次数的垃圾回收后，那么会启动对0，1，2，即对所有对象进行扫描</span><br></pre></td></tr></table></figure><p>标记清除</p><p>​标记-清除机制，顾名思义，首先标记对象（垃圾检测），然后清除垃圾（垃圾回收）。</p><p>​主要用于解决<mark>循环引用</mark>。</p><p>○ 1.标记：活动（有被引用）, 非活动（可被删除）</p><p>○ 2.清除：清除所有非活动的对象</p></blockquote><hr><h2 id="四-缓冲池">四. 缓冲池<a class="header-anchor" href="#四-缓冲池"></a></h2><blockquote><p>● 缓冲池</p><p><strong>整数对象缓冲池</strong></p><p>○ 对于==[-5,256]== 这样的<strong>小整数</strong>，系统已经初始化好，可以直接拿来用。而对于其他的大整数，系统则提前申请了一块内存空间，等需要的时候在这上面创建大整数对象</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><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="comment"># 示例：小整数而言 id都是一样的</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="number">777</span><span class="comment"># a和b不是一样的</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="number">777</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)<span class="comment"># 内存地址不同</span></span><br><span class="line"><span class="number">140133545530064</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)<span class="comment"># 内存地址不同</span></span><br><span class="line"><span class="number">140133545530384</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = b = <span class="number">777</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140133545530480</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545530480</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="number">1</span><span class="comment"># a和b是一样的</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="number">1</span><span class="comment"># python的整数对象缓冲池</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140133544871840</span><span class="comment"># 内存地址一样</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133544871840</span><span class="comment"># 内存地址一样</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">from</span> sys <span class="keyword">import</span> getrefcount</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>getrefcount(a)</span><br><span class="line"><span class="number">801</span></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><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></pre></td><td class="code"><pre><span class="line">字符串缓存</span><br><span class="line">○ 为了检验两个引用指向同一个对象，我们可以用<span class="keyword">is</span>关键字。<span class="keyword">is</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="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;xxx&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;xxx&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140133545760616</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545760616</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;xxx &quot;</span><span class="comment"># 注：特殊字符不能放到缓冲区</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;xxx &quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140133545760672</span><span class="comment"># 内存地址不一样</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545760728</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;xxx_&quot;</span><span class="comment"># 注：数字、字母、下划线的组合 放在字符串缓冲区</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;xxx_&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140133545760616</span><span class="comment"># 内存地址一样</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545760616</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;hello world&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;hello world&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)<span class="comment"># 内存地址不一样</span></span><br><span class="line"><span class="number">140133545242928</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545242992</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;helloworld&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;helloworld&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)<span class="comment"># 内存地址一样</span></span><br><span class="line"><span class="number">140133545243120</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545243120</span></span><br><span class="line"></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;你好&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;你好&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140612691332856</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140612688894592</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例：对于乘法创建的字符  只会缓冲20个</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;x&quot;</span>*<span class="number">21</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;x&quot;</span>*<span class="number">21</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)<span class="comment"># 内存地址不一样</span></span><br><span class="line"><span class="number">140133545742176</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545742248</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;x&quot;</span>*<span class="number">20</span><span class="comment"># 内存地址一样</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;x&quot;</span>*<span class="number">20</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140133545246768</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545246768</span></span><br></pre></td></tr></table></figure><p><strong>注意</strong></p><p>○ 这对于经常使用的数字和字符串来说也是一种优化的方案</p><p><strong>字符串的intern机制</strong></p><p>○ python对于短小的，只含有<mark>字母数字</mark>的字符串自动触发缓存机制。其他情况不会缓存</p></blockquote><hr><h2 id="五-深拷贝与浅拷贝">五. 深拷贝与浅拷贝<a class="header-anchor" href="#五-深拷贝与浅拷贝"></a></h2><blockquote><p><strong>● 深拷贝与浅拷贝</strong></p><p><strong>浅拷贝</strong></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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="string">&quot;first&quot;</span>:[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = a.copy()<span class="comment"># 拷贝第一层数据（地址）</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;first&#x27;</span>: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b</span><br><span class="line">&#123;<span class="string">&#x27;first&#x27;</span>: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)<span class="comment"># a、b引用变了</span></span><br><span class="line"><span class="number">140133410603584</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133545741768</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&quot;second&quot;</span>] = <span class="string">&quot;No.2&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;first&#x27;</span>: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>], <span class="string">&#x27;second&#x27;</span>: <span class="string">&#x27;No.2&#x27;</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b</span><br><span class="line">&#123;<span class="string">&#x27;first&#x27;</span>: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&quot;first&quot;</span>].append(<span class="number">4</span>)<span class="comment"># a、b里面的”first”引用 没有改变</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a<span class="comment"># 拷贝第一层数据（地址）</span></span><br><span class="line">&#123;<span class="string">&#x27;first&#x27;</span>: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>], <span class="string">&#x27;second&#x27;</span>: <span class="string">&#x27;No.2&#x27;</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b</span><br><span class="line">&#123;<span class="string">&#x27;first&#x27;</span>: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a[<span class="string">&quot;first&quot;</span>])<span class="comment"># 第一层数据（地址） 内存地址相同</span></span><br><span class="line"><span class="number">140133413100296</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b[<span class="string">&quot;first&quot;</span>])</span><br><span class="line"><span class="number">140133413100296</span></span><br></pre></td></tr></table></figure><p><strong>深拷贝</strong></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="string">&quot;first&quot;</span>:[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">import</span> copy<span class="comment"># 导入模块</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = copy.deepcopy(a)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)<span class="comment"># 内存地址不同</span></span><br><span class="line"><span class="number">140133545248160</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(b)</span><br><span class="line"><span class="number">140133410604736</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&quot;second&quot;</span>] = <span class="string">&quot;No.2&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&quot;first&quot;</span>].append(<span class="number">4</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;first&#x27;</span>: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>], <span class="string">&#x27;second&#x27;</span>: <span class="string">&#x27;No.2&#x27;</span>&#125;<span class="comment"># 递归拷贝所有层的数据</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b</span><br><span class="line">&#123;<span class="string">&#x27;first&#x27;</span>: [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]&#125;<span class="comment"># 递归拷贝所有层的数据</span></span><br></pre></td></tr></table></figure><p>小结</p><p>○ 数字和字符串、元组，不能改变对象本身，只能改变引用的指向，称为<mark>不可变数据对象</mark>(immutable  object)</p><p>○ 列表、字典、集合可以通过引用其元素，改变对象自身(in-place change)。这种对象类型，称为<mark>可变数据对象</mark>(mutable object)</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a=[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b=[<span class="number">1</span>,<span class="number">2</span>,[<span class="number">4</span>,<span class="number">5</span>]]<span class="comment"># 可变数据对象，有影响</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = b[:]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, [<span class="number">4</span>, <span class="number">5</span>]]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b[<span class="number">2</span>].append(<span class="number">7</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, [<span class="number">4</span>, <span class="number">5</span>, <span class="number">7</span>]]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, [<span class="number">4</span>, <span class="number">5</span>, <span class="number">7</span>]]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b=[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]<span class="comment"># 不可变数据对象，没有影响</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = b[:]</span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 内存管理 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>09_Python-CSDN_上下文管理器</title>
      <link href="/posts/9186.html"/>
      <url>/posts/9186.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><blockquote><p>● 介绍</p><p>上下文管理器是装饰器的近亲，与装饰器类似的，它们都是包装其他代码的工具</p><p>○ 装饰器：包装用于定义的代码块</p><p>○ 上下文管理器：可以包装任意格式的代码块</p><p><strong>上下文管理器是一个包装任意代码块的对象，上下文管理器保证:</strong></p><p>○ 进入上下文管理器时，每次代码执行的一致性</p><p>○ 当退出上下文管理器时，相关的资源会被正确地回收（即使内部代码出错，退出步骤也执行）</p><p><strong>上下文管理器的应用</strong></p><p>○ 上下文管理器被用到最多的就是——作为确保资源正确清理的一种方式</p></blockquote><hr><h2 id="二-语法">二. 语法<a class="header-anchor" href="#二-语法"></a></h2><blockquote><p><strong>with语句</strong></p><p>○ python2.5中加入的关键字with</p><p>○ with语句仅仅能对支持上下文管理协议的对象使用。</p><p>○ with语句的表达式的作用是返回一个遵循特定协议的对象，具体来说，该对象必须定义一个==__enter__<mark>方法和</mark>__exit__==方法</p><p><strong>with语句执行的解析</strong></p><p>○ 语法：with context_expr as cm:  do_sth()</p><p>○ 当with语句执行时，便执行上下文表达式（context_expr）来获得一个上下文管理器对象，上下文管理器的职责是提供一个上下文对象，用于在with语句块中处理细节：</p><p>​○ 一旦获得了上下文对象，就会调用它的__enter__()方法</p><p>​○ 将完成with语句块执行前的所有准备工作</p><p>​○ 如果with语句后面跟了as语句，<mark>方法返回的结果</mark>会被赋值给as关键字后面的变量</p><p>​○ 除了self参数，__enter__方法不接受任何其他参数。</p><p>​○ __enter__方法一般负责执行一些配置</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：上下文管理器 基本语法</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1、普通方法打开文件对象</span></span><br><span class="line">fp = <span class="built_in">open</span>(<span class="string">&quot;test.txt&quot;</span>,<span class="string">&quot;a+&quot;</span>)  <span class="comment"># a+ 追加写</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">dir</span>(fp))</span><br><span class="line"><span class="comment">#结果为 [ …&#x27;__enter__&#x27;, …, &#x27;__exit__&#x27;…]</span></span><br><span class="line"><span class="comment">#注：有__enter__、__exit__方法，是上下文管理器</span></span><br><span class="line">fp.write(<span class="string">&quot;this is test&quot;</span>)</span><br><span class="line">fp.close()  <span class="comment">#注：处理结束后，把它关掉，不然占资源</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2、用with语句执行</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;test.txt&quot;</span>,<span class="string">&quot;a+&quot;</span>) <span class="keyword">as</span> f:    <span class="comment">#注：赋给f对象</span></span><br><span class="line">    f.write(<span class="string">&quot;write test&quot;</span>)</span><br><span class="line">    <span class="comment">#退出语句执行之后 with自动回收对象</span></span><br><span class="line">    <span class="comment">#因为打开的文件对象是上下文管理器</span></span><br><span class="line">    <span class="comment">#注：open(&quot;test.txt&quot;,&quot;a+&quot;):上下文表达式</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span>语句执行的解析</span><br><span class="line">○ 当<span class="keyword">with</span>语句块结束时，无论是正常结束，还是由于异常，都会调用上下文对象的__exit__()方法</span><br><span class="line">○ __exit__()方法有<span class="number">3</span>个参数</span><br><span class="line">○ 如果<span class="keyword">with</span>语句正常结束，三个参数全部都是 <span class="literal">None</span></span><br><span class="line">○ 如果发生异常，三个参数的值分别等于调用sys.exc_info()函数返回的三个值：类型（异常类）、值（异常实例）和跟踪记录（traceback），相应的跟踪记录对象。</span><br><span class="line">○ 因为上下文管理器主要作用于共享资源，__enter__()和__exit__()方法基本是完成的是分配和释放资源的低层次工作，比如：数据库连接、锁分配、信号量加/减、状态管理、文件打开/关闭、异常处理等</span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="三-异常处理">三. 异常处理<a class="header-anchor" href="#三-异常处理"></a></h2><blockquote><p>● 异常处理</p><p><strong>上下文管理器必须定义__exit__方法，该方法可以选择性地处理包装代码块中出现的异常，或者处理其他需要关闭上下文状态的事情</strong></p><p><strong>__exit__方法接收了异常信息，就有处理这个异常的义务，通常可以做以下几件：</strong></p><p>○ 传播异常</p><p>○ 中止异常</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：__exit__</span></span><br><span class="line"><span class="comment">#__exit__ 接受三个参数  异常类，异常值，回溯信息</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#上下文管理器  传播异常  终止异常</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyException</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__enter__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">self</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__exit__</span>(<span class="params">self, exc_type, exc_val, exc_tb</span>):</span><br><span class="line">        <span class="keyword">if</span> exc_val: <span class="comment">#注：如果有异常发生</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;My exception: <span class="subst">&#123;exc_val&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="comment"># return False   #注：传播异常，给解释器识别</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span>     <span class="comment">#注：中止异常</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> MyException():<span class="comment">#使用上下文管理器</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="number">1</span>+<span class="number">1</span>)  <span class="comment">#注：没有异常，输出为2</span></span><br><span class="line"><span class="keyword">with</span> MyException():</span><br><span class="line">    <span class="built_in">print</span>(<span class="number">1</span>/<span class="number">0</span>)  <span class="comment">#注：False时 有异常</span></span><br><span class="line"><span class="comment">#False时 结果为 My exception: division by zero</span></span><br><span class="line"><span class="comment">#True时 结果为</span></span><br><span class="line"><span class="comment"># My exception: division by zero#注：True时  不报错，程序不中断</span></span><br><span class="line"><span class="comment">#注：True时 把异常传递出去，给解释器知道</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;end......&quot;</span>)</span><br><span class="line"><span class="comment">#注：return False 不会执行 end......</span></span><br><span class="line"><span class="comment">#注：return True  执行了   end......</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例：如果是ValueError异常，终止异常；如果不是，传播异常</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyException</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__enter__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">self</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__exit__</span>(<span class="params">self, exc_type, exc_val, exc_tb</span>):</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">issubclass</span>(exc_type, ValueError): <span class="comment">#注：如果是ValueError异常及子类异常</span></span><br><span class="line">        <span class="comment"># if exc_type == ValueError:  #注：exc_type是类，所以判断条件ValueError类</span></span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span> <span class="comment">#终止异常</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span>    <span class="comment">#传播异常</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> MyException():</span><br><span class="line">    <span class="built_in">print</span>(<span class="number">1</span>+<span class="number">1</span>)</span><br><span class="line">    <span class="keyword">raise</span> ValueError(<span class="string">&quot;test value error&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：issubclass(exc_type, ValueError) 如果是ValueError异常及子类异常</span></span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="四-contextlib模块">四. contextlib模块<a class="header-anchor" href="#四-contextlib模块"></a></h2><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">● contextlib模块</span><br><span class="line"></span><br><span class="line">contextlib模块介绍</span><br><span class="line">○ contextlib模块实现上下文自动管理</span><br><span class="line">○ 这个生成器可以用更简单的方法创建上下文管理器</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><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：contextlib实现上下文管理器</span></span><br><span class="line"><span class="keyword">import</span> contextlib</span><br><span class="line"></span><br><span class="line"><span class="meta">@contextlib.contextmanager</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">mycontext</span>():</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;enter context&quot;</span>)</span><br><span class="line">    <span class="keyword">yield</span>   <span class="comment">#注：生成器函数</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;exit context&quot;</span>)</span><br><span class="line"></span><br><span class="line">c1 = mycontext()</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">dir</span>(c1))</span><br><span class="line"><span class="comment">#结果为 […&#x27;__enter__&#x27;,  &#x27;__exit__&#x27;…]</span></span><br><span class="line"><span class="comment">#注：使用装饰器后 就是上下文管理器了。不使用装饰器，只是生成器对象</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> c1:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;xxxxxxxxxx&quot;</span>)</span><br><span class="line"><span class="comment">#结果为</span></span><br><span class="line"><span class="comment"># enter context</span></span><br><span class="line"><span class="comment"># xxxxxxxxxx</span></span><br><span class="line"><span class="comment"># exit context</span></span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 上下文管理器 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>08_Python-CSDN_面向对象练习</title>
      <link href="/posts/13683.html"/>
      <url>/posts/13683.html</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.runoob.com/python3/python3-class.html">菜鸟教程：面向对象<br>https://www.runoob.com/python3/python3-class.html</a></p><h2 id="一-回合制对战游戏">一. 回合制对战游戏<a class="header-anchor" href="#一-回合制对战游戏"></a></h2><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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><br><span class="line"></span><br><span class="line"> ○回合制对战游戏</span><br><span class="line"> ●创建角色：名字、性别、血量、装备  ●战斗</span><br><span class="line"> ●创建房间：                          ●装备-防弹衣</span><br><span class="line"> ●角色可加入房间                      ●血量默认100</span><br><span class="line"> ●房间内的人可互打                    ●正常被攻击-10滴血</span><br><span class="line"> ●房间上限2人                        ●有防弹衣-5滴血</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Role</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self,name,sex,blood=<span class="number">100</span>,body_armor=<span class="literal">None</span></span>):</span><br><span class="line">        <span class="variable language_">self</span>.name = name</span><br><span class="line">        <span class="variable language_">self</span>.sex = sex</span><br><span class="line">        <span class="variable language_">self</span>.blood = blood</span><br><span class="line">        <span class="variable language_">self</span>.body_armor = body_armor</span><br><span class="line">        <span class="variable language_">self</span>.room = <span class="literal">None</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">attack</span>(<span class="params">self,other</span>):</span><br><span class="line">        <span class="keyword">if</span> <span class="variable language_">self</span>.room == other.room:<span class="comment"># 注：同一房间</span></span><br><span class="line">            <span class="keyword">if</span> <span class="variable language_">self</span> != other:<span class="comment"># 注：不同的人</span></span><br><span class="line">                <span class="keyword">if</span> <span class="variable language_">self</span>.blood &gt; <span class="number">0</span> <span class="keyword">and</span> other.blood &gt; <span class="number">0</span>:</span><br><span class="line">                    reduce_blood = <span class="number">5</span> <span class="keyword">if</span> other.body_armor <span class="keyword">else</span> <span class="number">10</span></span><br><span class="line"><span class="comment"># 注：body_armor为假 返回10(没有设置防弹衣)</span></span><br><span class="line">                    other.blood -= reduce_blood</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;self.name&#125;</span>攻击<span class="subst">&#123;other.name&#125;</span> <span class="subst">&#123;reduce_blood&#125;</span>点血量\t<span class="subst">&#123;self.name&#125;</span>当前血量：<span class="subst">&#123;self.blood&#125;</span>\t<span class="subst">&#123;other.name&#125;</span>当前血量：<span class="subst">&#123;other.blood&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">&quot;其中一方已死亡，不能攻击&quot;</span>)</span><br><span class="line">                    exit()</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;你不能攻击自己&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;攻击对象，不在同一个房间&quot;</span>)</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Room</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self,name</span>):</span><br><span class="line">        <span class="variable language_">self</span>.member = []</span><br><span class="line">        <span class="variable language_">self</span>.name = name</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">join</span>(<span class="params">self,role</span>):</span><br><span class="line">        <span class="keyword">if</span> role.room == <span class="literal">None</span>:</span><br><span class="line"><span class="comment"># 注：在角色的类里定义的属性room</span></span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">len</span>(<span class="variable language_">self</span>.member) &lt; <span class="number">2</span>:</span><br><span class="line">                <span class="variable language_">self</span>.member.append(role)</span><br><span class="line"><span class="comment"># 注：member房间的属性，房间只能加2个人 所以&lt;2</span></span><br><span class="line">                role.room = <span class="variable language_">self</span>.name</span><br><span class="line"><span class="comment"># 注：达到条件，定义角色加入到 某个房间</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;此房间已满&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;此角色已经加入房间了&quot;</span>)</span><br><span class="line"></span><br><span class="line">role_dict = &#123;&#125;  <span class="comment"># 存放初始化实例# 注：存放名字和对象的关系</span></span><br><span class="line">room_dict = &#123;&#125;  <span class="comment"># 存放初始化实例</span></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;请选择：1.创建角色\t2.创建房间\t3.加入房间\t4.开始战斗\t5.退出&quot;</span>)</span><br><span class="line">    enter_number = <span class="built_in">input</span>(<span class="string">&quot;请输入你的选择\t&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> enter_number.isdigit():</span><br><span class="line">        enter_number = <span class="built_in">int</span>(enter_number)</span><br><span class="line">        <span class="keyword">if</span> <span class="number">1</span> &lt;= enter_number &lt;=<span class="number">5</span>:</span><br><span class="line">            <span class="keyword">if</span> enter_number == <span class="number">1</span>:</span><br><span class="line">                name, sex = <span class="built_in">input</span>(<span class="string">&quot;请输入角色的姓名与性别，空格隔开\n&quot;</span>).split()</span><br><span class="line"><span class="comment">#注：split()是为了 分割 将字符 赋给2个变量</span></span><br><span class="line">                role_dict[name] = Role(name, sex)</span><br><span class="line">                def_blood = <span class="built_in">input</span>(<span class="string">&quot;输入自定义血量\n&quot;</span>)</span><br><span class="line">                <span class="keyword">if</span> def_blood.isdigit():</span><br><span class="line">                    role_dict[name].blood = <span class="built_in">int</span>(def_blood)</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;自定义成功，用户<span class="subst">&#123;name&#125;</span>当前血量<span class="subst">&#123;role_dict[name].blood&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;自定义失败，用户<span class="subst">&#123;name&#125;</span>当前血量<span class="subst">&#123;role_dict[name].blood&#125;</span>&quot;</span>)</span><br><span class="line">                wear_body_armor = <span class="built_in">input</span>(<span class="string">&quot;输入y装备防弹衣\n&quot;</span>)</span><br><span class="line">                <span class="keyword">if</span> wear_body_armor == <span class="string">&quot;y&quot;</span>:</span><br><span class="line">                    role_dict[name].body_armor = <span class="number">1</span></span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">2</span>:</span><br><span class="line">                name = <span class="built_in">input</span>(<span class="string">&quot;请输入房间的名字\n&quot;</span>)</span><br><span class="line">                room_dict[name] = Room(name)</span><br><span class="line"><span class="comment"># 注：创建好的对象(实例化对象) 保存在字典里</span></span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">3</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;当前角色有<span class="subst">&#123;role_dict.keys()&#125;</span>，当前房间有<span class="subst">&#123;room_dict.keys()&#125;</span>&quot;</span>)</span><br><span class="line">                role_name, room_name = <span class="built_in">input</span>(<span class="string">&quot;请输入要加入的角色和房间名，空格隔开\n&quot;</span>).split()</span><br><span class="line"><span class="comment"># 注：这里可以做1个判断 (考虑到各种情况)</span></span><br><span class="line">                room_dict[room_name].join(role_dict[role_name])</span><br><span class="line"><span class="comment"># 注：从字典 取出房间对象，调用房间对象的join()方法</span></span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">4</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;当前房间有<span class="subst">&#123;room_dict.keys()&#125;</span>&quot;</span>)</span><br><span class="line">                room_name = <span class="built_in">input</span>(<span class="string">&quot;请输入房间的名字\n&quot;</span>)<span class="comment"># 注：选择房间</span></span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">len</span>(room_dict[room_name].member) == <span class="number">2</span>:</span><br><span class="line"><span class="comment"># 注：len()==2 这是保证房间里有2个人  才能对打</span></span><br><span class="line">                    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">                        room_dict[room_name].member[<span class="number">0</span>].attack(room_dict[room_name].member[<span class="number">1</span>])</span><br><span class="line">                        room_dict[room_name].member[<span class="number">1</span>].attack(room_dict[room_name].member[<span class="number">0</span>])</span><br><span class="line"><span class="comment"># 注：通过字典获取房间实例对象，member是房间的属性</span></span><br><span class="line"><span class="comment"># 注：为什么房间实例能获取到创建角色类的对象？因为选项3 是角色类属性 加入 房间member属性，保证了这一步能调用成功实例化对象</span></span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;房间<span class="subst">&#123;room_name&#125;</span>人数不足2人，对战失败！&quot;</span>)</span><br><span class="line">                    <span class="keyword">continue</span></span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">5</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;退出对战&quot;</span>)</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;输入错误，请输入1-5选择操作！&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;输入错误，请输入1-5选择操作！&quot;</span>)</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505044926926.png" alt=""></p></blockquote><hr><h2 id="二-模拟ATM">二. 模拟ATM<a class="header-anchor" href="#二-模拟ATM"></a></h2><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">● ②、模拟ATM</span><br><span class="line"></span><br><span class="line">○模拟ATM</span><br><span class="line">●1、创建ATM</span><br><span class="line">    ○ATM里的总金额</span><br><span class="line">    ○ATM可向里面加钱</span><br><span class="line">    ○ATM里的钱取出来</span><br><span class="line"></span><br><span class="line">●2、创建账户去取钱</span><br><span class="line">    ○账户属性   名称、余额、密码</span><br><span class="line">    ○账户要选择1台ATM进行操作</span><br><span class="line">    ○可以取钱、存钱、查询余额</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Atm</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self,name,atm_total</span>):</span><br><span class="line">        <span class="variable language_">self</span>.name = name</span><br><span class="line">        <span class="variable language_">self</span>.atm_total = atm_total</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">add</span>(<span class="params">self,money</span>):</span><br><span class="line">        <span class="variable language_">self</span>.atm_total += money</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;机器<span class="subst">&#123;self.name&#125;</span>增加金额<span class="subst">&#123;money&#125;</span>元，<span class="subst">&#123;self.name&#125;</span>当前总金额为<span class="subst">&#123;self.atm_total&#125;</span>元&quot;</span>)</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">decrease</span>(<span class="params">self,money</span>):</span><br><span class="line">        <span class="keyword">if</span> <span class="variable language_">self</span>.atm_total &lt; money:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;self.name&#125;</span>余额不足，取钱失败&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="variable language_">self</span>.atm_total -= money</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;机器<span class="subst">&#123;self.name&#125;</span>取出金额<span class="subst">&#123;money&#125;</span>元，<span class="subst">&#123;self.name&#125;</span>当前总金额为<span class="subst">&#123;self.atm_total&#125;</span>元&quot;</span>)</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Account</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self,name,balance,passwd</span>):</span><br><span class="line">        <span class="variable language_">self</span>.name = name</span><br><span class="line">        <span class="variable language_">self</span>.balance = balance</span><br><span class="line">        <span class="variable language_">self</span>.passwd = passwd</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">draw</span>(<span class="params">self,atm,money</span>):</span><br><span class="line">        <span class="keyword">if</span> money &lt;= <span class="variable language_">self</span>.balance:</span><br><span class="line">            <span class="keyword">if</span> money &lt;= atm.atm_total:</span><br><span class="line">                <span class="variable language_">self</span>.balance -= money</span><br><span class="line">                atm.atm_total -= money</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;成功取款<span class="subst">&#123;money&#125;</span>元，<span class="subst">&#123;self.name&#125;</span>当前余额为<span class="subst">&#123;self.balance&#125;</span>元&quot;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;ATM机 <span class="subst">&#123;atm.name&#125;</span>余额不足，取款失败！&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;您输入的金额大于您的账户余额，取款失败！&quot;</span>)</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">save</span>(<span class="params">self,atm,money</span>):</span><br><span class="line">        <span class="variable language_">self</span>.balance += money</span><br><span class="line">        atm.atm_total += money</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;成功存款<span class="subst">&#123;money&#125;</span>元，<span class="subst">&#123;self.name&#125;</span>当前余额为<span class="subst">&#123;self.balance&#125;</span>元&quot;</span>)</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">look</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;self.name&#125;</span>当前余额为<span class="subst">&#123;self.balance&#125;</span>元&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 管理员操作</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">atm_os</span>():</span><br><span class="line">    <span class="comment"># 管理员登录验证</span></span><br><span class="line">    name, paaswd = <span class="built_in">input</span>(<span class="string">&quot;请输入管理员账号和密码，空格隔开\n&quot;</span>).split()</span><br><span class="line">    <span class="keyword">if</span> (name, paaswd) <span class="keyword">in</span> admin_dict.items():</span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;管理员账号出错&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;请选择：1.创建ATM\t2.ATM加钱\t3.ATM取钱\t4.返回上一级&quot;</span>)</span><br><span class="line">        enter_number = <span class="built_in">input</span>(<span class="string">&quot;请输入你的选择\t&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> enter_number.isdigit():</span><br><span class="line">            enter_number = <span class="built_in">int</span>(enter_number)</span><br><span class="line">            <span class="keyword">if</span> <span class="number">1</span> &lt;= enter_number &lt;= <span class="number">4</span>:</span><br><span class="line">                <span class="comment"># 1、创建ATM</span></span><br><span class="line">                <span class="keyword">if</span> enter_number == <span class="number">1</span>:</span><br><span class="line">                    name, atm_total = <span class="built_in">input</span>(<span class="string">&quot;请输入ATM名称，总金额，空格隔开\n&quot;</span>).split()</span><br><span class="line">                    atm_total = <span class="built_in">int</span>(atm_total)</span><br><span class="line">                    atm_dict[name] = Atm(name,atm_total)</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;创建ATM机 <span class="subst">&#123;name&#125;</span>成功，<span class="subst">&#123;name&#125;</span>当前总金额<span class="subst">&#123;atm_total&#125;</span>元&quot;</span>)</span><br><span class="line">                <span class="comment"># 2、ATM加钱</span></span><br><span class="line">                <span class="keyword">elif</span> enter_number == <span class="number">2</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;当前存在的ATM机器：<span class="subst">&#123;atm_dict.keys()&#125;</span>&quot;</span>)</span><br><span class="line">                    atm_name = <span class="built_in">input</span>(<span class="string">&quot;请输入ATM名称\n&quot;</span>)</span><br><span class="line">                    <span class="keyword">if</span> atm_name <span class="keyword">in</span> atm_dict.keys():</span><br><span class="line">                        money = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;请输入金额\n&quot;</span>))</span><br><span class="line">                        atm_dict[atm_name].add(money)</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;atm_name&#125;</span>不存在&quot;</span>)</span><br><span class="line">                <span class="comment"># 3、ATM取钱</span></span><br><span class="line">                <span class="keyword">elif</span> enter_number == <span class="number">3</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;当前存在的ATM机器：<span class="subst">&#123;atm_dict.keys()&#125;</span>&quot;</span>)</span><br><span class="line">                    atm_name = <span class="built_in">input</span>(<span class="string">&quot;请输入ATM名称\n&quot;</span>)</span><br><span class="line">                    <span class="keyword">if</span> atm_name <span class="keyword">in</span> atm_dict.keys():</span><br><span class="line">                        money = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;请输入金额\n&quot;</span>))</span><br><span class="line">                        <span class="keyword">if</span> money &gt; <span class="number">0</span>:</span><br><span class="line">                            atm_dict[atm_name].decrease(money)</span><br><span class="line">                        <span class="keyword">else</span>:</span><br><span class="line">                            <span class="built_in">print</span>(<span class="string">&quot;取出的金额不能为负&quot;</span>)</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;atm_name&#125;</span>不存在&quot;</span>)</span><br><span class="line">                <span class="keyword">elif</span> enter_number == <span class="number">4</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">&quot;退出ATM操作&quot;</span>)</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;输入错误，请输入1-4选择操作&quot;</span>)</span><br><span class="line"><span class="comment"># 账户操作</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">account_os</span>():</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;请选择：1.创建账户\t2.取钱\t3.存钱\t4.查询余额\t5.返回上一级&quot;</span>)</span><br><span class="line">        enter_number = <span class="built_in">input</span>(<span class="string">&quot;请输入你的选择\t&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> enter_number.isdigit():</span><br><span class="line">            enter_number = <span class="built_in">int</span>(enter_number)</span><br><span class="line">            <span class="keyword">if</span> <span class="number">1</span> &lt;= enter_number &lt;= <span class="number">5</span>:</span><br><span class="line">                <span class="comment"># 1、创建账户</span></span><br><span class="line">                <span class="keyword">if</span> enter_number == <span class="number">1</span>:</span><br><span class="line">                    name, balance, passwd = <span class="built_in">input</span>(<span class="string">&quot;请输入账户名称、余额和密码进行创建，空格分割\n&quot;</span>).split()</span><br><span class="line">                    balance = <span class="built_in">int</span>(balance)</span><br><span class="line">                    account_dict[name] = Account(name,balance,passwd)</span><br><span class="line">                    account_passwd[name] = passwd</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;创建用户 <span class="subst">&#123;name&#125;</span>成功，余额为<span class="subst">&#123;balance&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">elif</span> enter_number == <span class="number">2</span> <span class="keyword">or</span> enter_number == <span class="number">3</span> <span class="keyword">or</span> enter_number == <span class="number">4</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;当前的ATM机有<span class="subst">&#123;atm_dict.keys()&#125;</span>&quot;</span>)</span><br><span class="line">                    atm, name, passwd = <span class="built_in">input</span>(<span class="string">&quot;请输入您选择的ATM机、您的账户名称和密码进行登陆，空格分割\n&quot;</span>).split()</span><br><span class="line">                    <span class="comment"># 验证ATM是否存在</span></span><br><span class="line">                    <span class="keyword">if</span> atm <span class="keyword">in</span> atm_dict.keys():</span><br><span class="line">                        <span class="comment"># 验证账户</span></span><br><span class="line">                        <span class="keyword">if</span> (name, passwd) <span class="keyword">in</span> account_passwd.items():</span><br><span class="line">                            atm = atm_dict[atm]</span><br><span class="line">                            <span class="comment"># 2、取钱</span></span><br><span class="line">                            <span class="keyword">if</span> enter_number == <span class="number">2</span>:</span><br><span class="line">                                money = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;请输入取款金额\n&quot;</span>))</span><br><span class="line">                                account_dict[name].draw(atm, money)</span><br><span class="line">                            <span class="comment"># 3、存钱</span></span><br><span class="line">                            <span class="keyword">elif</span> enter_number == <span class="number">3</span>:</span><br><span class="line">                                money = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;请输入存款金额\n&quot;</span>))</span><br><span class="line">                                account_dict[name].save(atm, money)</span><br><span class="line">                            <span class="comment"># 4、查询余额</span></span><br><span class="line">                            <span class="keyword">elif</span> enter_number == <span class="number">4</span>:</span><br><span class="line">                                account_dict[name].look()</span><br><span class="line">                        <span class="keyword">else</span>:</span><br><span class="line">                            <span class="built_in">print</span>(<span class="string">&quot;账户错误&quot;</span>)</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;atm&#125;</span>不存在&quot;</span>)</span><br><span class="line">                <span class="keyword">elif</span> enter_number == <span class="number">5</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">&quot;退出账户操作&quot;</span>)</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;输入错误，请输入1-5选择操作&quot;</span>)</span><br><span class="line"></span><br><span class="line">admin_dict = &#123;<span class="string">&quot;admin&quot;</span>:<span class="string">&quot;123456&quot;</span>&#125; <span class="comment"># 管理员信息</span></span><br><span class="line">account_passwd = &#123;&#125; <span class="comment"># 账户信息</span></span><br><span class="line">atm_dict = &#123;&#125;       <span class="comment"># 存放初始化实例</span></span><br><span class="line">account_dict = &#123;&#125;   <span class="comment"># 存放初始化实例</span></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;请选择：1.ATM操作\t2.账户操作\t3.退出&quot;</span>)</span><br><span class="line">    enter_number = <span class="built_in">input</span>(<span class="string">&quot;请输入你的选择\t&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> enter_number.isdigit():</span><br><span class="line">        enter_number = <span class="built_in">int</span>(enter_number)</span><br><span class="line">        <span class="keyword">if</span> <span class="number">1</span> &lt;= enter_number &lt;= <span class="number">3</span>:</span><br><span class="line">            <span class="comment"># 1、ATM操作</span></span><br><span class="line">            <span class="keyword">if</span> enter_number == <span class="number">1</span>:</span><br><span class="line">                atm_os()</span><br><span class="line">            <span class="comment"># 2、账户操作</span></span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">2</span>:</span><br><span class="line">                account_os()</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;退出操作！&quot;</span>)</span><br><span class="line">                exit()</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;输入错误，请输入1-3选择操作&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;输入错误，请输入1-3选择操作&quot;</span>)</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505045128067.png" alt=""></p></blockquote><hr><h2 id="三-Linux用户管理类">三. Linux用户管理类<a class="header-anchor" href="#三-Linux用户管理类"></a></h2><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">● ③、Linux用户管理类</span><br><span class="line"></span><br><span class="line"> Linux用户管理类</span><br><span class="line"> ●基类：实现往linux系统里添加用户</span><br><span class="line"> ●子类A：</span><br><span class="line">   ○能够查看、修改uid和gid、shell等信息   ●子类C(A,B)：</span><br><span class="line"> ●子类B：                                  ○1.可以单独新建组</span><br><span class="line">   ○1.能删除用户                           ○2.可以将某个用户的gid修改为新建的组的gid</span><br><span class="line">   ○2.能删除组                             ○3.加入异常机制，异常的名字需要自己定义</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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Base</span>():</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">add</span>(<span class="params">self,name,passwd</span>):</span><br><span class="line">        subprocess.Popen(<span class="string">f&#x27;useradd <span class="subst">&#123;name&#125;</span> -p <span class="subst">&#123;passwd&#125;</span>&amp;&gt;/dev/null &amp;&amp; echo &quot;<span class="subst">&#123;name&#125;</span>创建成功&quot; ||echo &quot;创建失败&quot;&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">A</span>(<span class="title class_ inherited__">Base</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">look</span>(<span class="params">self,name</span>):</span><br><span class="line">        p = subprocess.Popen(<span class="string">f&#x27;cut -d &quot;:&quot; -f 1,3,4,7 /etc/passwd|grep -E ^<span class="subst">&#123;name&#125;</span>:&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">modify</span>(<span class="params">self,name,uid,gid,shell</span>):</span><br><span class="line">        p = subprocess.Popen(<span class="string">f&#x27;usermod -u <span class="subst">&#123;uid&#125;</span> -g <span class="subst">&#123;gid&#125;</span> -s <span class="subst">&#123;shell&#125;</span> <span class="subst">&#123;name&#125;</span>&amp;&gt;/dev/null &amp;&amp; echo &quot;修改成功&quot; ||echo &quot;修改失败&quot;&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">B</span>(<span class="title class_ inherited__">Base</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">del_user</span>(<span class="params">self,name</span>):</span><br><span class="line">        p = subprocess.Popen(<span class="string">f&#x27;userdel -r <span class="subst">&#123;name&#125;</span>&amp;&gt;/dev/null &amp;&amp; echo &quot;删除成功&quot; ||echo &quot;创建失败&quot;&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">del_group</span>(<span class="params">self,name</span>):</span><br><span class="line">        p = subprocess.Popen(<span class="string">f&#x27;groupdel <span class="subst">&#123;name&#125;</span>&amp;&gt;/dev/null &amp;&amp; echo &quot;删除成功&quot; ||echo &quot;删除失败&quot;&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">C</span>(A,B):</span><br><span class="line">    group_member = []</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">group_add</span>(<span class="params">self,gid,name</span>):</span><br><span class="line">        p = subprocess.Popen(<span class="string">f&#x27;groupadd -g <span class="subst">&#123;gid&#125;</span> <span class="subst">&#123;name&#125;</span>&amp;&gt;/dev/null &amp;&amp; echo &quot;创建成功&quot; ||echo &quot;创建失败&quot;&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line">        C.group_member.append(gid)</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">gid_modify</span>(<span class="params">self,gid,name</span>):</span><br><span class="line">        <span class="keyword">if</span> gid <span class="keyword">in</span> C.group_member:</span><br><span class="line">            p = subprocess.Popen(<span class="string">f&#x27;usermod -g <span class="subst">&#123;gid&#125;</span> <span class="subst">&#123;name&#125;</span>&amp;&gt;/dev/null &amp;&amp; echo &quot;修改成功&quot; ||echo &quot;修改失败&quot;&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;修改失败，<span class="subst">&#123;gid&#125;</span>不是新建的组id&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">DefinedError</span>(<span class="title class_ inherited__">Exception</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__str__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;这是自定义异常&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;&#x27;&#x27;请选择：</span></span><br><span class="line"><span class="string">1.添加用户\t2.查看uid、gid和shell信息\t3.修改uid、gid和shell信息</span></span><br><span class="line"><span class="string">4.删除用户\t5.删除组\t6.新建组\t7.修改用户gid\t8.触发异常\t9.退出&#x27;&#x27;&#x27;</span>)</span><br><span class="line">    enter_number = <span class="built_in">input</span>(<span class="string">&quot;请输入你的选择\t&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> enter_number.isdigit():</span><br><span class="line">        enter_number = <span class="built_in">int</span>(enter_number)</span><br><span class="line">        <span class="keyword">if</span> <span class="number">1</span> &lt;= enter_number &lt;= <span class="number">9</span>:</span><br><span class="line">            <span class="keyword">if</span> enter_number == <span class="number">1</span>:</span><br><span class="line">                sample = Base()</span><br><span class="line">                name, passwd = <span class="built_in">input</span>(<span class="string">&quot;请输入用户名和密码，空格分割\n(2个参数)\t&quot;</span>).split()</span><br><span class="line">                sample.add(name, passwd)</span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">2</span>:</span><br><span class="line">                sample = A()</span><br><span class="line">                name = <span class="built_in">input</span>(<span class="string">&quot;请输入用户名\n&quot;</span>)</span><br><span class="line">                sample.look(name)</span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">3</span>:</span><br><span class="line">                sample = A()</span><br><span class="line">                name,uid,gid,shell = <span class="built_in">input</span>(<span class="string">&quot;请输入用户名，修改后的uid、gid和shell，空格分割\n(4个参数)\t&quot;</span>).split()</span><br><span class="line">                sample.modify(name,uid,gid,shell)</span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">4</span>:</span><br><span class="line">                sample = B()</span><br><span class="line">                name = <span class="built_in">input</span>(<span class="string">&quot;请输入用户名\n&quot;</span>)</span><br><span class="line">                sample.del_user(name)</span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">5</span>:</span><br><span class="line">                sample = B()</span><br><span class="line">                name = <span class="built_in">input</span>(<span class="string">&quot;请输入组名\n&quot;</span>)</span><br><span class="line">                sample.del_group(name)</span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">6</span>:</span><br><span class="line">                sample = C()</span><br><span class="line">                name, gid = <span class="built_in">input</span>(<span class="string">&quot;请输入组名、指定的gid，空格分割\n(2个参数)\t&quot;</span>).split()</span><br><span class="line">                sample.group_add(gid,name)</span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">7</span>:</span><br><span class="line">                sample = C()</span><br><span class="line">                name, gid = <span class="built_in">input</span>(<span class="string">&quot;请输入用户名、gid\n(2个参数)\t&quot;</span>).split()</span><br><span class="line">                sample.gid_modify(gid,name)</span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">8</span>:</span><br><span class="line">                <span class="keyword">raise</span> DefinedError</span><br><span class="line">            <span class="keyword">elif</span> enter_number == <span class="number">9</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;退出系统&quot;</span>)</span><br><span class="line">                exit()</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;输入错误，请输入1-5选择操作！&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;输入错误，请输入1-5选择操作！&quot;</span>)</span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> OOP </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>07_Python-CSDN_高阶函数</title>
      <link href="/posts/46.html"/>
      <url>/posts/46.html</url>
      
        <content type="html"><![CDATA[<blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">高阶函数：把函数作为参数传入，这样的函数称为高阶函数。</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func01</span>(<span class="params">a, b</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;a&#125;</span> <span class="subst">&#123;b&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func02</span>(<span class="params">func,a,b</span>):   <span class="comment"># 注：把函数作为参数传递;func02称为高阶函数</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;start func......&quot;</span>)</span><br><span class="line">    func(a,b)</span><br><span class="line"></span><br><span class="line">func02(func01,<span class="string">&quot;x&quot;</span>,<span class="string">&quot;y&quot;</span>)</span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="常用高阶函数">常用高阶函数<a class="header-anchor" href="#常用高阶函数"></a></h2><h3 id="map">map<a class="header-anchor" href="#map"></a></h3><blockquote><p>● map</p><p><strong>用Python-map代码实现：f(x)=x*x</strong></p><p>●内置函数map，map()函数接收两个参数，一个是<mark>函数</mark>，一个是<mark>Iterable（可多个）。</mark></p><p>●map将传入的函数依次作用到序列的每个元素，并把结果作为新的Iterator返回。</p><p>●map()传入的第一个参数是f，即函数对象本身。</p><p>●由于结果r是一个Iterator，Iterator是惰性序列。</p><p>●可通过list()函数让它把整个序列都计算出来并返回一个list。</p><p>●map()作为高阶函数，事实上它把运算规则抽象了，因此，我们不但可以计算简单的f(x)=x**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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例1：map 映射</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func</span>(<span class="params">item</span>):         <span class="comment"># 接收1个参数item</span></span><br><span class="line">    <span class="keyword">return</span> item*item    <span class="comment"># 返回数的平方</span></span><br><span class="line"></span><br><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>]       <span class="comment"># 注：a是可迭代对象</span></span><br><span class="line">result = <span class="built_in">map</span>(func, a)</span><br><span class="line"><span class="built_in">print</span>(result)   <span class="comment"># 注：返回 map对象</span></span><br><span class="line"><span class="comment">#结果为 &lt;map object at 0x0000020EDE156970&gt;</span></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">list</span>(result))</span><br><span class="line"><span class="comment">#结果为 [1, 4, 9, 16, 25, 36]</span></span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例2：保留2位小数</span></span><br><span class="line">b = [<span class="number">1.239865</span>,<span class="number">4.56</span>,<span class="number">3.2</span>,<span class="number">9.82356</span>]</span><br><span class="line"></span><br><span class="line">result = <span class="built_in">map</span>(<span class="keyword">lambda</span> x:<span class="built_in">round</span>(x,<span class="number">2</span>), b)</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">list</span>(result))</span><br><span class="line"><span class="comment">#结果为 [1.24, 4.56, 3.2, 9.82]</span></span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例3：转化为百分数，并且保留2位小数</span></span><br><span class="line">c = [<span class="number">0.000564</span>, <span class="number">0.456723</span>, <span class="number">0.5</span>, <span class="number">0.71345</span>]</span><br><span class="line">result = <span class="built_in">map</span>(<span class="keyword">lambda</span> x:<span class="built_in">format</span>(x,<span class="string">&#x27;.2%&#x27;</span>), c)</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">list</span>(result))</span><br><span class="line"><span class="comment">#结果为 [&#x27;0.06%&#x27;, &#x27;45.67%&#x27;, &#x27;50.00%&#x27;, &#x27;71.34%&#x27;]</span></span><br></pre></td></tr></table></figure></blockquote><hr><h3 id="filter">filter<a class="header-anchor" href="#filter"></a></h3><blockquote><p>○ filter</p><p><strong>用Python-filter代码实现：在一个list中，删掉偶数，只保留奇数</strong></p><p>○Python内建的filter()函数用于过滤序列。和map()类似，filter()也接收一个函数和一个序列。</p><p>○filter()把传入的函数依次作用于每个元素，然后<mark>根据返回值是True还是False决定保留还是丢弃</mark>该元素。</p><p>○注意到filter()函数返回的是一个Iterator，也就是一个惰性序列。</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例1：保留奇数</span></span><br><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">8</span>]</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func01</span>(<span class="params">x</span>):</span><br><span class="line">    <span class="keyword">return</span> x % <span class="number">2</span> == <span class="number">1</span>   <span class="comment"># 注：保留奇数；返回结果true\false</span></span><br><span class="line"></span><br><span class="line">result = <span class="built_in">filter</span>(func01, a)</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">list</span>(result))</span><br><span class="line"><span class="comment">#结果为 [1, 3, 5, 7]</span></span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例2：返回100以内的回数</span></span><br><span class="line">b = <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">101</span>) <span class="comment"># 注：字符串反向切片</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func02</span>(<span class="params">x</span>):</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">str</span>(x) == <span class="built_in">str</span>(x)[::-<span class="number">1</span>]</span><br><span class="line">result = <span class="built_in">filter</span>(func02, b)</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">list</span>(result))</span><br><span class="line"><span class="comment">#结果为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99]</span></span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例3：过滤出 1-100 以内 开平方根 是整数的数</span></span><br><span class="line"><span class="comment"># 方法：开平方后还在原列表里</span></span><br><span class="line"><span class="comment"># 过滤出 1-100 以内 开平方根 是整数的数</span></span><br><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> sqrt</span><br><span class="line">c = <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">101</span>)</span><br><span class="line">result = <span class="built_in">filter</span>(<span class="keyword">lambda</span> x:sqrt(x) <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">101</span>) , <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">101</span>))</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">list</span>(result)) <span class="comment"># 注：开平方后的数还在 c 里面</span></span><br><span class="line"><span class="comment">#结果为 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]</span></span><br></pre></td></tr></table></figure></blockquote><h3 id="sorted">sorted<a class="header-anchor" href="#sorted"></a></h3><blockquote><p>● sorted</p><p><strong>用Python-sorted代码实现：按绝对值大小排序</strong></p><p>sorted()函数也是一个高阶函数，它还可以接收一个key函数来实现自定义的排序。</p><p>key指定的函数将作用于list的每一个元素上，并根据key函数返回的结果进行排序。</p><p>对比原始的list和经过key=abs处理过的list：</p><p>●执行语句：<mark>sorted([36, 5, -12, 9, -21], key=abs)</mark></p><ol><li class="lvl-6"><p>原始字符：list = [36, 5, -12, 9, -21]</p></li><li class="lvl-6"><p>经过key-abs对应得到：[36, 5, 12, 9, 21]</p></li><li class="lvl-6"><p>按照keys-abs排序结果：[5, 9, 12, 21, 36]</p></li><li class="lvl-6"><p>原始字符串最终结果：[5, 9, -12, -21, 36]</p></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例1：sorted(a)和a.sort()</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">3</span>,<span class="number">0</span>]<span class="comment"># 注：不会改变a的值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">sorted</span>(a)<span class="comment"># 注：从小到大排序</span></span><br><span class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.sort()<span class="comment"># 注：会改变a的值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例2：全为布尔型，可以排序</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="number">1</span>,<span class="literal">True</span>,<span class="number">0</span>,<span class="literal">False</span>,<span class="string">&quot;c&quot;</span>==<span class="string">&quot;c&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">sorted</span>(a)</span><br><span class="line">[<span class="number">0</span>, <span class="literal">False</span>, <span class="number">1</span>, <span class="literal">True</span>, <span class="literal">True</span>]</span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例3：按照字符串长度排序</span></span><br><span class="line"><span class="comment"># 注：按照首字母的ASCII码排序</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&quot;abc&quot;</span>,<span class="string">&quot;defg&quot;</span>,<span class="string">&quot;123456&quot;</span>,<span class="string">&quot;1&quot;</span>,<span class="string">&quot;sbbbfg&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">sorted</span>(a)</span><br><span class="line">[<span class="string">&#x27;1&#x27;</span>, <span class="string">&#x27;123456&#x27;</span>, <span class="string">&#x27;abc&#x27;</span>, <span class="string">&#x27;defg&#x27;</span>, <span class="string">&#x27;sbbbfg&#x27;</span>]</span><br><span class="line"><span class="comment"># 注：按照字符串长度排序</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">sorted</span>(a,key=<span class="built_in">len</span>)</span><br><span class="line">[<span class="string">&#x27;1&#x27;</span>, <span class="string">&#x27;abc&#x27;</span>, <span class="string">&#x27;defg&#x27;</span>, <span class="string">&#x27;123456&#x27;</span>, <span class="string">&#x27;sbbbfg&#x27;</span>]</span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例4：元组排序</span></span><br><span class="line"><span class="comment"># 元组的排序，先比较第一个值，再比较第二个，依次类推</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a=[(<span class="number">1</span>,<span class="number">2</span>),(<span class="number">2</span>,<span class="number">2</span>),(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">2</span>,<span class="number">4</span>),(<span class="literal">True</span>,<span class="literal">False</span>)]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">sorted</span>(a)</span><br><span class="line">[(<span class="number">1</span>, <span class="number">0</span>), (<span class="literal">True</span>, <span class="literal">False</span>), (<span class="number">1</span>, <span class="number">2</span>), (<span class="number">2</span>, <span class="number">2</span>), (<span class="number">2</span>, <span class="number">4</span>)]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">sorted</span>(a,reverse=<span class="literal">True</span>)<span class="comment"># 注：反序 reverse=True</span></span><br><span class="line">[(<span class="number">2</span>, <span class="number">4</span>), (<span class="number">2</span>, <span class="number">2</span>), (<span class="number">1</span>, <span class="number">2</span>), (<span class="number">1</span>, <span class="number">0</span>), (<span class="literal">True</span>, <span class="literal">False</span>)]</span><br></pre></td></tr></table></figure></blockquote><h3 id="reduce">reduce<a class="header-anchor" href="#reduce"></a></h3><blockquote><p>○ reduce</p><p><strong>用Python-reduce代码实现：将列表[1,3,5,7,9]，变成整数13579</strong></p><p>○reduce把一个函数作用在一个序列[x1, x2, x3, …]上</p><p>○这个函数必须接收两个参数</p><p>○reduce把结果继续和序列的下一个元素做累积计算</p><p>○<mark>reduce(f, [x1, x2, x3, x4]) =&gt; f(f(f(x1, x2), x3), x4)</mark></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例1：[1,2,3,4] --&gt; 转化成1234</span></span><br><span class="line"><span class="keyword">from</span> functools <span class="keyword">import</span> reduce<span class="comment"># 注：导入模块</span></span><br><span class="line">a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func1</span>(<span class="params">x,y</span>):<span class="comment"># 注：这个函数接收2个参数</span></span><br><span class="line">    <span class="keyword">return</span> x*<span class="number">10</span>+y</span><br><span class="line"><span class="built_in">print</span>(reduce(func1,a))</span><br><span class="line"><span class="comment">#结果为 1234</span></span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例2：reduce 实现python的int功能</span></span><br><span class="line"><span class="keyword">from</span> functools <span class="keyword">import</span> reduce</span><br><span class="line">a = <span class="built_in">input</span>(<span class="string">&quot;输入想要转化的数字：&quot;</span>)</span><br><span class="line">b = &#123;<span class="string">&#x27;1&#x27;</span>:<span class="number">1</span>,<span class="string">&#x27;2&#x27;</span>:<span class="number">2</span>,<span class="string">&#x27;3&#x27;</span>:<span class="number">3</span>,<span class="string">&#x27;4&#x27;</span>:<span class="number">4</span>,<span class="string">&#x27;5&#x27;</span>:<span class="number">5</span>,<span class="string">&#x27;6&#x27;</span>:<span class="number">6</span>,<span class="string">&#x27;7&#x27;</span>:<span class="number">7</span>,<span class="string">&#x27;8&#x27;</span>:<span class="number">8</span>,<span class="string">&#x27;9&#x27;</span>:<span class="number">9</span>,<span class="string">&#x27;0&#x27;</span>:<span class="number">0</span>&#125;</span><br><span class="line">c = <span class="built_in">list</span>(<span class="built_in">map</span>(<span class="keyword">lambda</span> i:b.get(i),a))</span><br><span class="line"><span class="built_in">print</span>(c)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func</span>(<span class="params">x,y</span>):</span><br><span class="line">    <span class="keyword">return</span> x*<span class="number">10</span>+y</span><br><span class="line">result = reduce(func,c)</span><br><span class="line"><span class="built_in">print</span>(result,<span class="built_in">type</span>(result))</span><br><span class="line"></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># 示例3：实现阶乘</span></span><br><span class="line"><span class="keyword">from</span> functools <span class="keyword">import</span> reduce</span><br><span class="line">n = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;输入&quot;</span>))</span><br><span class="line">redu =reduce(<span class="keyword">lambda</span> x,y:x*y,<span class="built_in">range</span>(<span class="number">1</span>,n+<span class="number">1</span>))</span><br><span class="line"><span class="built_in">print</span>(redu)</span><br><span class="line"><span class="comment">#结果为 输入:4</span></span><br><span class="line"><span class="comment">#24</span></span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 函数 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>06_Python-CSDN_psutil模块</title>
      <link href="/posts/314.html"/>
      <url>/posts/314.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">介绍</span><br><span class="line">● process and system utilities</span><br><span class="line">● 能够轻松的实现获取系统运行的进程和系统利用率（CPU、内存、磁盘、网络等）信息，主要应用于系统监控</span><br><span class="line">● 实现了同等命令命令行实现的功能：ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等</span><br><span class="line">● 跨平台：linux、windows、OS X、FreeBSD和Sun Solaris等</span><br><span class="line">● 主要功能包含：CPU、磁盘、内存、网络、进程</span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="二-安装">二. 安装<a class="header-anchor" href="#二-安装"></a></h2><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><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><br><span class="line">● 源码安装：git <span class="built_in">clone</span> https://github.com/giampaolo/psutil.git</span><br><span class="line"><span class="built_in">cd</span> psutil</span><br><span class="line">python3 setup.py install</span><br><span class="line">● 先安装相关库：yum install python3-devel,(用yum list |grep python|grep dev  找到包名)， pip3 install psutil</span><br><span class="line">● 导入使用模块： import psutil</span><br><span class="line"></span><br><span class="line">[root@cPen_B ~]# yum list |grep python |grep dev</span><br><span class="line">python36-devel.x86_64                                3.6.8-2.module_el8.1.0+245+c39af44f              @AppStream</span><br><span class="line">[root@cPen_B ~]# yum install python36-devel.x86_64</span><br><span class="line">[root@cPen_B ~]# pip3 install psutil</span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="三-获取系统基本信息">三. 获取系统基本信息<a class="header-anchor" href="#三-获取系统基本信息"></a></h2><h3 id="CPU">CPU<a class="header-anchor" href="#CPU"></a></h3><blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="number">1</span>、cpu</span><br><span class="line">● psutil.cpu_count(,[logical]):默认返回逻辑CPU的个数,当设置logical的参数为<span class="literal">False</span>时，返回物理CPU的个数</span><br><span class="line">● psutil.cpu_percent(,[percpu],[interval])：返回CPU的利用率,percpu为<span class="literal">True</span>时显示所有物理核心的利用率,interval不为<span class="number">0</span>时,则阻塞时显示interval执行的时间内的平均利用率</span><br><span class="line">● psutil.cpu_times(,[percpu])：以命名元组(namedtuple)的形式返回cpu的时间花费,percpu=<span class="literal">True</span>表示获取每个CPU的时间花费</span><br><span class="line">user：执行用户进程的时间</span><br><span class="line">system：执行内核进程时间</span><br><span class="line">idle：闲置的时间</span><br><span class="line">iowait：等待io操作的时间</span><br><span class="line">irp：硬中断时间</span><br><span class="line">softirq：软中断时间</span><br><span class="line">● psutil.cpu_times_percent(,[percpu])：功能和cpu_times大致相同，返回耗时比例</span><br><span class="line">● psutil.cpu_stats(): 以命名元组的形式返回CPU的统计信息，包括上下文切换，中断，软中断和系统调用次数</span><br><span class="line">ctx_switches:上下文切换次数</span><br><span class="line">interrupts：中断次数</span><br><span class="line">soft_interrupts：软中断次数</span><br><span class="line">syscalls：系统调用次数，linux上始终为<span class="number">0</span></span><br><span class="line">● psutil.cpu_freq(): 返回cpu频率</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例1：返回CPU个数</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">import</span> psutil</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.cpu_count()<span class="comment"># 注：返回逻辑CPU个数</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.cpu_count(logical=<span class="literal">False</span>)<span class="comment"># 注：返回物理CPU个数</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="comment"># 示例2：CPU使用率 百分比利用率</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.cpu_percent()                                                                                                        </span><br><span class="line"><span class="number">0.1</span></span><br><span class="line"><span class="comment"># 示例3：cpu_times</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.cpu_times()<span class="comment"># 注：花费的时间占用总时间的百分比</span></span><br><span class="line">scputimes(user=<span class="number">105.27</span>, nice=<span class="number">0.1</span>, system=<span class="number">81.87</span>, idle=<span class="number">69229.05</span>, iowait=<span class="number">11.17</span>, irq=<span class="number">0.0</span>, softirq=<span class="number">5.25</span>, steal=<span class="number">0.0</span>, guest=<span class="number">0.0</span>, guest_nice=<span class="number">0.0</span>)</span><br><span class="line"><span class="comment"># 示例4：返回每个核的利用率</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.cpu_percent(percpu = <span class="literal">True</span>)</span><br><span class="line">[<span class="number">0.1</span>, <span class="number">0.1</span>]</span><br></pre></td></tr></table></figure></blockquote><h3 id="memory">memory<a class="header-anchor" href="#memory"></a></h3><blockquote><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="number">2</span>、memory</span><br><span class="line">● virtual_memory():以命名元组的形式返回内存使用情况,单位为字节</span><br><span class="line">total:总物理内存</span><br><span class="line">available:可用内存，available ～free + buffers + cached</span><br><span class="line">percent:使用率： percent = (total - available) / total * <span class="number">100</span></span><br><span class="line">used：使用的内存： used  =  total - free - buffers - cache</span><br><span class="line">free：完全没用使用内存</span><br><span class="line">active：最近被访问的内存</span><br><span class="line">inactive：长时间未被访问的内存</span><br><span class="line">buffers：缓存</span><br><span class="line">cached：缓存</span><br><span class="line">slab：内核数据结构缓存的内存</span><br><span class="line">● swap_memory：以命名元组的形式返回swap/memory使用情况，包含swap中页的换入和换出</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例1：virtual_memory</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.virtual_memory()</span><br><span class="line">svmem(total=<span class="number">3953979392</span>, available=<span class="number">3447025664</span>, percent=<span class="number">12.8</span>, used=<span class="number">249577472</span>, free=<span class="number">3045027840</span>, active=<span class="number">350208000</span>, inactive=<span class="number">329723904</span>, buffers=<span class="number">2162688</span>, cached=<span class="number">657211392</span>, shared=<span class="number">12365824</span>, slab=<span class="number">117297152</span>)</span><br></pre></td></tr></table></figure></blockquote><h3 id="disk">disk<a class="header-anchor" href="#disk"></a></h3><blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="number">3</span>、disk（linux命令：iostat，df）</span><br><span class="line">● psutil.disk_io_counters([perdisk])：以命名元组的形式返回磁盘io统计信息(汇总的)，包括读、写的次数，读、写的字节数等</span><br><span class="line">● psutil.disk_partitions(）:磁盘挂载分区信息</span><br><span class="line">device：分区</span><br><span class="line">mountpoint：挂载点</span><br><span class="line">fstype：文件系统格式（fat、ext4、 xfs）</span><br><span class="line">opts：挂载参数</span><br><span class="line">● disk_usage：磁盘使用情况，需要传入一个路径参数</span><br><span class="line">&gt;&gt;&gt; psutil.disk_usage(<span class="string">&#x27;/&#x27;</span>)</span><br><span class="line">sdiskusage(total=<span class="number">250685575168</span>, used=<span class="number">103938019328</span>, free=<span class="number">134242258944</span>, percent=<span class="number">43.6</span>)</span><br><span class="line">● iostat   ：  %util 数值越大越忙碌，到达了io瓶颈（安装包：yum install sysstat）</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例1：磁盘挂载分区信息 disk_partitions</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.disk_partitions()                                                                                                                </span><br><span class="line">[sdiskpart(device=<span class="string">&#x27;/dev/mapper/centos-root&#x27;</span>, mountpoint=<span class="string">&#x27;/&#x27;</span>, fstype=<span class="string">&#x27;xfs&#x27;</span>, opts=<span class="string">&#x27;rw,relatime,attr2,inode64,noquota&#x27;</span>), sdiskpart(device=<span class="string">&#x27;/dev/sda1&#x27;</span>, mountpoint=<span class="string">&#x27;/boot&#x27;</span>, fstype=<span class="string">&#x27;xfs&#x27;</span>, opts=<span class="string">&#x27;rw,relatime,attr2,inode64,noquota&#x27;</span>)]</span><br><span class="line"><span class="comment"># 示例2：磁盘使用情况 disk_usage</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.disk_usage(<span class="string">&quot;/&quot;</span>)<span class="comment"># 注：需要接挂载点</span></span><br><span class="line">sdiskusage(total=<span class="number">18238930944</span>, used=<span class="number">2300264448</span>, free=<span class="number">15938666496</span>, percent=<span class="number">12.6</span>)</span><br></pre></td></tr></table></figure></blockquote><h3 id="Network">Network<a class="header-anchor" href="#Network"></a></h3><blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="number">4</span>、Network（linux命令：ifconfig、who、uptime，netstat）</span><br><span class="line">● psutil.net_io_counters([pernic])：以命名元组的形式返回当前系统中每块网卡的网络io统计信息，包括收发字节数，收发包的数量、出错的情况和删包情况。当pernic为<span class="literal">True</span>时，则列出所有网卡的统计信息</span><br><span class="line">● psutil.net_connections([kind])：以列表的形式返回每个网络连接的详细信息(namedtuple)</span><br><span class="line">fd：文件描述符</span><br><span class="line">family：地址簇，ipv4（AF_INET），ipv6</span><br><span class="line"><span class="built_in">type</span>：SOCK_STREAM（tcp）、udp</span><br><span class="line">laddr:本地ip地址</span><br><span class="line">raddr</span><br><span class="line">status</span><br><span class="line">pid</span><br><span class="line">● psutil.net_if_addrs()：以字典的形式返回网卡的配置信息，包括IP地址和mac地址、子网掩码和广播地址</span><br><span class="line">● psutil.net_if_stats()：返回网卡的详细信息，包括是否启动、通信类型、传输速度与mtu</span><br><span class="line">mtu：最大传输单元</span><br><span class="line">● psutil.users()：以命名元组的方式返回当前登陆用户的信息，包括用户名，登陆时间，终端</span><br><span class="line">● psutil.boot_time()：以时间戳的形式返回系统的启动时间</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例1：psutil.users 以命名元组的方式返回当前登陆用户的信息，包括用户名，登陆时间，终端</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.users()<span class="comment"># 注：w、who命令</span></span><br><span class="line">[suser(name=<span class="string">&#x27;root&#x27;</span>, terminal=<span class="string">&#x27;tty1&#x27;</span>, host=<span class="string">&#x27;&#x27;</span>, started=<span class="number">1606217600.0</span>, pid=<span class="number">708</span>), suser(name=<span class="string">&#x27;root&#x27;</span>, terminal=<span class="string">&#x27;pts/0&#x27;</span>, host=<span class="string">&#x27;192.168.0.42&#x27;</span>, started=<span class="number">1606361216.0</span>, pid=<span class="number">5921</span>), suser(name=<span class="string">&#x27;root&#x27;</span>, terminal=<span class="string">&#x27;pts/2&#x27;</span>, host=<span class="string">&#x27;192.168.0.42&#x27;</span>, started=<span class="number">1606361216.0</span>, pid=<span class="number">5942</span>), suser(name=<span class="string">&#x27;root&#x27;</span>, terminal=<span class="string">&#x27;pts/6&#x27;</span>, host=<span class="string">&#x27;192.168.0.42&#x27;</span>, started=<span class="number">1606354816.0</span>, pid=<span class="number">5239</span>), suser(name=<span class="string">&#x27;root&#x27;</span>, terminal=<span class="string">&#x27;pts/7&#x27;</span>, host=<span class="string">&#x27;192.168.0.42&#x27;</span>, started=<span class="number">1606357120.0</span>, pid=<span class="number">5312</span>)]</span><br><span class="line"><span class="comment"># 示例2：net_if_addrs</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.net_if_addrs()<span class="comment"># 注：lo本地回环地址 127.0.0.1</span></span><br><span class="line">&#123;<span class="string">&#x27;lo&#x27;</span>: [snicaddr(family=&lt;AddressFamily.AF_INET: <span class="number">2</span>&gt;, address=<span class="string">&#x27;127.0.0.1&#x27;</span>, netmask=<span class="string">&#x27;255.0.0.0&#x27;</span>, broadcast=<span class="literal">None</span>, ptp=<span class="literal">None</span>), snicaddr(family=&lt;AddressFamily.AF_INET6: <span class="number">10</span>&gt;, address=<span class="string">&#x27;::1&#x27;</span>, netmask=<span class="string">&#x27;ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff&#x27;</span>, broadcast=<span class="literal">None</span>, ptp=<span class="literal">None</span>), snicaddr(family=&lt;AddressFamily.AF_PACKET: <span class="number">17</span>&gt;, address=<span class="string">&#x27;00:00:00:00:00:00&#x27;</span>, netmask=<span class="literal">None</span>, broadcast=<span class="literal">None</span>, ptp=<span class="literal">None</span>)], <span class="string">&#x27;ens33&#x27;</span>: [snicaddr(family=&lt;AddressFamily.AF_INET: <span class="number">2</span>&gt;, address=<span class="string">&#x27;192.168.0.21&#x27;</span>, netmask=<span class="string">&#x27;255.255.255.0&#x27;</span>, broadcast=<span class="string">&#x27;192.168.0.255&#x27;</span>, ptp=<span class="literal">None</span>), snicaddr(family=&lt;AddressFamily.AF_INET6: <span class="number">10</span>&gt;, address=<span class="string">&#x27;fe80::22d8:5740:d6d7:d1ff%ens33&#x27;</span>, netmask=<span class="string">&#x27;ffff:ffff:ffff:ffff::&#x27;</span>, broadcast=<span class="literal">None</span>, ptp=<span class="literal">None</span>), snicaddr(family=&lt;AddressFamily.AF_PACKET: <span class="number">17</span>&gt;, address=<span class="string">&#x27;00:0c:29:d1:80:fa&#x27;</span>, netmask=<span class="literal">None</span>, broadcast=<span class="string">&#x27;ff:ff:ff:ff:ff:ff&#x27;</span>, ptp=<span class="literal">None</span>)]&#125;</span><br></pre></td></tr></table></figure></blockquote><h3 id="进程管理">进程管理<a class="header-anchor" href="#进程管理"></a></h3><blockquote><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">5</span>、进程管理（linux命令：ps、kill）</span><br><span class="line">● psutil.pids()：以列表的形式返回当前正在运行的进程</span><br><span class="line">● psutil.pid_exists(<span class="number">1</span>)：判断给点定的pid是否存在</span><br><span class="line">● psutil.Process(<span class="number">1</span>)：对进程进行封装，可以使用该类的方法获取进行的详细信息，或者给进程发送信号</span><br><span class="line">● psutil.process_iter()：迭代当前正在运行的进程，返回的是每个进程的Process对象</span><br><span class="line">name：获取进程的名称</span><br><span class="line">cmdline：获取启动进程的命令行参数</span><br><span class="line">create_time：获取进程的创建时间</span><br><span class="line">uids：进程uid信息</span><br><span class="line">num_threads：开启的线程数</span><br><span class="line">exe：进程工作的绝对路径</span><br><span class="line">kill：发送SIGKILL信号结束进程</span><br><span class="line"></span><br><span class="line">示例：process_iter 迭代当前正在运行的进程</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>psutil.process_iter()                                                                                                                   </span><br><span class="line">&lt;generator <span class="built_in">object</span> process_iter at <span class="number">0x7f56eb912888</span>&gt;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>p = psutil.process_iter()</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">next</span>(p)</span><br><span class="line">psutil.Process(pid=<span class="number">1</span>, name=<span class="string">&#x27;systemd&#x27;</span>, status=<span class="string">&#x27;sleeping&#x27;</span>, started=<span class="string">&#x27;01:52:52&#x27;</span>)</span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 模块 </tag>
            
            <tag> Psutil </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>05_Python-CSDN_排序算法</title>
      <link href="/posts/49827.html"/>
      <url>/posts/49827.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-顺序查找">一. 顺序查找<a class="header-anchor" href="#一-顺序查找"></a></h2><blockquote><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></pre></td><td class="code"><pre><span class="line">● 顺序查找</span><br><span class="line">顺序查找：也叫线性查找，从列表第一个元素开始，顺序进行搜索，直到找到元素或搜索到列表最后一个元素为止。</span><br><span class="line">时间复杂度：O(n)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">Linear_search</span>(<span class="params">li, val</span>):     <span class="comment"># 注：li列表 ；val待查找的元素</span></span><br><span class="line">    <span class="keyword">for</span> ind, v <span class="keyword">in</span> <span class="built_in">enumerate</span>(li):       <span class="comment"># 注：因为要返回个下标 所以用 enumerate index和值都需要</span></span><br><span class="line">        <span class="keyword">if</span> v == val:    <span class="comment"># 注：如果v == 我们要找的那个值 那就返回 它的index</span></span><br><span class="line">            <span class="keyword">return</span> ind</span><br><span class="line">    <span class="keyword">else</span>:   <span class="comment"># 如果for循环结束后还没有找到 返回None</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=7">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=7</a><br><a href="https://www.runoob.com/python3/python-linear-search.html">菜鸟教程 Python线性查找<br>https://www.runoob.com/python3/python-linear-search.html</a></p></blockquote><hr><h2 id="二-二分查找">二. 二分查找<a class="header-anchor" href="#二-二分查找"></a></h2><blockquote><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">● 二分查找</span><br><span class="line">二分查找：又叫折半查找，从有序列表的初始候选区li[<span class="number">0</span>:n]开始，通过对待查找的值与候选区中间值的比较，可以使候选区减少一半。</span><br><span class="line"></span><br><span class="line">时间复杂度：O(logn)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">binary_search</span>(<span class="params">li, val</span>): <span class="comment"># li 列表  val待查找的值</span></span><br><span class="line">    left = <span class="number">0</span></span><br><span class="line">    right = <span class="built_in">len</span>(li) - <span class="number">1</span></span><br><span class="line">    <span class="keyword">while</span> left &lt;= right:    <span class="comment"># 注：循环条件 说明候选区有值</span></span><br><span class="line">        mid = (left + right) // <span class="number">2</span>   <span class="comment"># 注：中间值(下标) 是整除2</span></span><br><span class="line">        <span class="keyword">if</span> li[mid] == val:  <span class="comment"># 注：== 找到的情况   每次对比都是对比的li[mid]</span></span><br><span class="line">            <span class="keyword">return</span> mid      <span class="comment"># 注：返回下标 mid</span></span><br><span class="line">        <span class="keyword">elif</span> li[mid] &gt; val:  <span class="comment"># 注：代表 待查找的值val在 mid左边</span></span><br><span class="line">            right = mid - <span class="number">1</span>  <span class="comment"># 注：更新候选区了 这种情况就可以继续循环</span></span><br><span class="line">        <span class="keyword">else</span>:               <span class="comment"># 注：第3种情况 li[mid] &lt; val  待查找的值在mid右侧</span></span><br><span class="line">            left = mid + <span class="number">1</span>   <span class="comment"># 注：更新候选区  继续循环</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span>         <span class="comment"># 注：如果找不到的情况 即不满足 left &lt;= right 时</span></span><br><span class="line"></span><br><span class="line">li = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">8</span>,<span class="number">9</span>]</span><br><span class="line"><span class="built_in">print</span>(binary_search(li,<span class="number">3</span>))       <span class="comment"># 注：调用二分查找 查3</span></span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=8">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=8</a><br><a href="https://www.runoob.com/python3/python-binary-search.html">菜鸟教程 Python二分查找<br>https://www.runoob.com/python3/python-binary-search.html</a></p></blockquote><hr><h2 id="三-冒泡排序">三. 冒泡排序<a class="header-anchor" href="#三-冒泡排序"></a></h2><blockquote><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><br><span class="line">时间复杂度：O(n**<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bubble_sort2</span>(<span class="params">li</span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(li)-<span class="number">1</span>):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(li)-i-<span class="number">1</span>):</span><br><span class="line">            <span class="keyword">if</span> li[j] &gt; li[j+<span class="number">1</span>]:</span><br><span class="line">                li[j], li[j+<span class="number">1</span>] = li[j+<span class="number">1</span>], li[j]</span><br><span class="line"></span><br><span class="line">改进：如果冒泡排序中的一趟排序没有发生交换，则说明列表已经有序，可以直接结束算法。</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bubble_sort_1</span>(<span class="params">li</span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(li)-<span class="number">1</span>):</span><br><span class="line">        exchange = <span class="literal">False</span>        <span class="comment"># 在第i趟那加标志位</span></span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(li)-i-<span class="number">1</span>):</span><br><span class="line">            <span class="keyword">if</span> li[j] &gt; li[j+<span class="number">1</span>]:</span><br><span class="line">                li[j], li[j+<span class="number">1</span>] = li[j+<span class="number">1</span>], li[j]</span><br><span class="line">                exchange = <span class="literal">True</span> <span class="comment"># 注：如果有交换 把它识成True  交换这里也是1个标志位</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> exchange:    <span class="comment"># 注：如果每1趟结束后 exchange没有发生交换 (这个在for里面)</span></span><br><span class="line">            <span class="keyword">return</span>          <span class="comment"># 注：就直接结束掉这个函数</span></span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=12">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=12</a><br><a href="https://www.runoob.com/python3/python-bubble-sort.html">菜鸟教程 Python冒泡排序<br>https://www.runoob.com/python3/python-bubble-sort.html</a></p></blockquote><hr><h2 id="四-选择排序">四. 选择排序<a class="header-anchor" href="#四-选择排序"></a></h2><blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">选择排序：首先在未排序序列中找到最小（大）元素，存放到排序序列的起始位置，然后，再从剩余未排序元素中继续寻找最小（大）元素，然后放到已排序序列的末尾。以此类推，直到所有元素均排序完毕。</span><br><span class="line">时间复杂度：O(n**<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">select_sort</span>(<span class="params">li</span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(li) - <span class="number">1</span>):</span><br><span class="line">        min_loc = i</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(i+<span class="number">1</span>, <span class="built_in">len</span>(li)):</span><br><span class="line">            <span class="keyword">if</span> li[j] &lt; li[min_loc]:</span><br><span class="line">                min_loc = j</span><br><span class="line">        <span class="keyword">if</span> min_loc != i:</span><br><span class="line">            li[i], li[min_loc] = li[min_loc], li[i]</span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=14">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=14</a><br><a href="https://www.runoob.com/python3/python-selection-sort.html">菜鸟教程 Python选择排序<br>https://www.runoob.com/python3/python-selection-sort.html</a></p></blockquote><hr><h2 id="五-插入排序">五. 插入排序<a class="header-anchor" href="#五-插入排序"></a></h2><blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">插入排序：它的工作原理是通过构建有序序列，对于未排序数据，在已排序序列中从后向前扫描，找到相应位置并插入。</span><br><span class="line">时间复杂度：O(n**<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">insert_sort</span>(<span class="params">li</span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="built_in">len</span>(li)):</span><br><span class="line">        tmp = li[i]</span><br><span class="line">        j = i - <span class="number">1</span></span><br><span class="line">        <span class="keyword">while</span> j &gt;= <span class="number">0</span> <span class="keyword">and</span> tmp &lt; li[j]:</span><br><span class="line">            li[j + <span class="number">1</span>] = li[j]</span><br><span class="line">            j = j - <span class="number">1</span></span><br><span class="line">        li[j + <span class="number">1</span>] = tmp</span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=15">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=15</a><br><a href="https://www.runoob.com/python3/python-insertion-sort.html">菜鸟教程 Python插入排序<br>https://www.runoob.com/python3/python-insertion-sort.html</a></p></blockquote><hr><h2 id="六-快速排序">六. 快速排序<a class="header-anchor" href="#六-快速排序"></a></h2><blockquote><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></pre></td><td class="code"><pre><span class="line">快速排序：快速排序使用分治法（Divide <span class="keyword">and</span> conquer）策略来把一个序列（<span class="built_in">list</span>）分为较小和较大的<span class="number">2</span>个子序列，然后递归地排序两个子序列。</span><br><span class="line">时间复杂度：O(nlogn)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 快速排序-partition函数</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">partition</span>(<span class="params">li, left, right</span>):</span><br><span class="line">    tmp = li[left]</span><br><span class="line">    <span class="keyword">while</span> left &lt; right:</span><br><span class="line">        <span class="keyword">while</span> left &lt; right <span class="keyword">and</span> li[right] &gt;= tmp: <span class="comment"># 从右边找比tmp小的数</span></span><br><span class="line">            right -= <span class="number">1</span>          <span class="comment"># 往右走一步</span></span><br><span class="line">        li[left] = li[right]    <span class="comment"># 把右边的值写到左边空位上</span></span><br><span class="line">        <span class="keyword">while</span> left &lt; right <span class="keyword">and</span> li[left] &lt;= tmp:</span><br><span class="line">            left += <span class="number">1</span></span><br><span class="line">        li[right] = li[left]    <span class="comment"># 把左边的值写到右边空位上</span></span><br><span class="line">    li[left] = tmp              <span class="comment"># 把tmp归位</span></span><br><span class="line">    <span class="keyword">return</span> left     <span class="comment"># mid 是 这个函数返回left值的目的</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 快速排序-框架</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">quick_sort</span>(<span class="params">li, left, right</span>):</span><br><span class="line">    <span class="keyword">if</span> left &lt; right:    <span class="comment"># 至少2个元素</span></span><br><span class="line">        mid = partition(li, left, right)    <span class="comment"># 这个函数返回left值的目的</span></span><br><span class="line">        quick_sort(li, left, mid - <span class="number">1</span>)   <span class="comment"># 左边部分</span></span><br><span class="line">        quick_sort(li, mid + <span class="number">1</span>, right)  <span class="comment"># 右边部分</span></span><br><span class="line"></span><br><span class="line">li = [<span class="number">5</span>,<span class="number">7</span>,<span class="number">4</span>,<span class="number">6</span>,<span class="number">3</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">9</span>,<span class="number">8</span>]</span><br><span class="line">quick_sort(li, <span class="number">0</span>, <span class="built_in">len</span>(li)-<span class="number">1</span>)</span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=16">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=16</a><br><a href="https://www.runoob.com/python3/python-quicksort.html">菜鸟教程 Python快速排序<br>https://www.runoob.com/python3/python-quicksort.html</a></p></blockquote><hr><h2 id="七-堆排序">七. 堆排序<a class="header-anchor" href="#七-堆排序"></a></h2><blockquote><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">堆排序：堆排序（Heapsort）是指利用堆这种数据结构所设计的一种排序算法。</span><br><span class="line">时间复杂度：O(nlogn)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sift</span>(<span class="params">li, low, high</span>):   <span class="comment"># 向下调整函数</span></span><br><span class="line">    <span class="comment"># li：列表</span></span><br><span class="line">    <span class="comment"># low: 堆的根节点位置</span></span><br><span class="line">    <span class="comment"># high: 堆的最后一个元素的位置</span></span><br><span class="line">    i = low <span class="comment"># i最开始指向根节点</span></span><br><span class="line">    j = <span class="number">2</span> * i + <span class="number">1</span>   <span class="comment"># j开始是左孩子</span></span><br><span class="line">    tmp = li[low]   <span class="comment"># 把堆顶存起来</span></span><br><span class="line">    <span class="keyword">while</span> j &lt;= high:    <span class="comment"># 只要j位置有数</span></span><br><span class="line">        <span class="keyword">if</span> j + <span class="number">1</span> &lt;= high <span class="keyword">and</span> li[j+<span class="number">1</span>] &gt; li[j]: <span class="comment"># 如果有孩子有并且比较大</span></span><br><span class="line">            j = j + <span class="number">1</span>   <span class="comment"># j指向右孩子</span></span><br><span class="line">        <span class="keyword">if</span> li[j] &gt; tmp:</span><br><span class="line">            li[i] = li[j]</span><br><span class="line">            i = j       <span class="comment"># 往下看一层</span></span><br><span class="line">            j = <span class="number">2</span> * i + <span class="number">1</span></span><br><span class="line">        <span class="keyword">else</span>:   <span class="comment"># tmp更大，把tmp放到i的位置上</span></span><br><span class="line">            li[i] = tmp <span class="comment"># 该语句可省 # 把tmp放到某一级领导位置上</span></span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        li[i] = tmp <span class="comment"># 把tmp放到叶子节点上</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">heap_sort</span>(<span class="params">li</span>):    <span class="comment"># 建堆函数</span></span><br><span class="line">    n = <span class="built_in">len</span>(li)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>((n-<span class="number">2</span>)//<span class="number">2</span>, -<span class="number">1</span>, -<span class="number">1</span>):</span><br><span class="line">        <span class="comment"># i表示建堆的时候调整的部分的根的下标</span></span><br><span class="line">        sift(li, i, n-<span class="number">1</span>)    <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="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n-<span class="number">1</span>, -<span class="number">1</span>, -<span class="number">1</span>):</span><br><span class="line">        <span class="comment"># i指向当前堆的最后一个元素</span></span><br><span class="line">        li[<span class="number">0</span>], li[i] = li[i], li[<span class="number">0</span>]</span><br><span class="line">        sift(li, <span class="number">0</span>, i - <span class="number">1</span>)  <span class="comment"># i-1是新的high</span></span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=22">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=22</a><br><a href="https://www.runoob.com/python3/python-heap-sort.html">菜鸟教程 Python堆排序<br>https://www.runoob.com/python3/python-heap-sort.html</a></p></blockquote><hr><h2 id="八-归并排序">八. 归并排序<a class="header-anchor" href="#八-归并排序"></a></h2><blockquote><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></pre></td><td class="code"><pre><span class="line">归并排序：创建在归并操作上的一种有效的排序算法。</span><br><span class="line">时间复杂度：O(nlogn)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">merge</span>(<span class="params">li, low, mid, high</span>):</span><br><span class="line">    i = low</span><br><span class="line">    j = mid + <span class="number">1</span></span><br><span class="line">    ltmp = []</span><br><span class="line">    <span class="keyword">while</span> i&lt;=mid <span class="keyword">and</span> j&lt;=high:   <span class="comment"># 只要左右两边都有数</span></span><br><span class="line">        <span class="keyword">if</span> li[i] &lt; li[j]:</span><br><span class="line">            ltmp.append(li[i])</span><br><span class="line">            i +=<span class="number">1</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            ltmp.append(li[j])</span><br><span class="line">            j += <span class="number">1</span></span><br><span class="line">    <span class="comment"># while执行完，肯定有一部分没数了</span></span><br><span class="line">    <span class="keyword">while</span> i &lt;= mid:</span><br><span class="line">        ltmp.append(li[i])</span><br><span class="line">        i += <span class="number">1</span></span><br><span class="line">    <span class="keyword">while</span> j &lt;= high:</span><br><span class="line">        ltmp.append(li[j])</span><br><span class="line">        j += <span class="number">1</span></span><br><span class="line">    li[low:high+<span class="number">1</span>] = ltmp</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">merge_sort</span>(<span class="params">li, low, high</span>):</span><br><span class="line">    <span class="keyword">if</span> low &lt; high:  <span class="comment"># 至少有2个元素，递归</span></span><br><span class="line">        mid = (low + high) // <span class="number">2</span></span><br><span class="line">        merge_sort(li, low, mid)</span><br><span class="line">        merge_sort(li, mid+<span class="number">1</span>, high)</span><br><span class="line">        merge(li, low, mid, high)</span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=30">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=30</a><br><a href="https://www.runoob.com/python3/python-merge-sort.html">菜鸟教程 Python归并排序<br>https://www.runoob.com/python3/python-merge-sort.html</a></p></blockquote><hr><h2 id="九-希尔排序">九. 希尔排序<a class="header-anchor" href="#九-希尔排序"></a></h2><blockquote><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">希尔排序：希尔排序(Shell Sort)是一种分组插入排序算法。</span><br><span class="line">时间复杂度讨论比较复杂，并且和选取的gap序列有关。</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">insert_sort_gap</span>(<span class="params">li, gap</span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(gap, <span class="built_in">len</span>(li)):   <span class="comment"># i 表示摸到的牌的下标</span></span><br><span class="line">        tmp = li[i]</span><br><span class="line">        j = i - gap <span class="comment"># j指的是手里牌的下标</span></span><br><span class="line">        <span class="keyword">while</span> j &gt;= <span class="number">0</span> <span class="keyword">and</span> li[j] &gt; tmp:</span><br><span class="line">            li[j+gap] = li[j]</span><br><span class="line">            j = j - gap</span><br><span class="line">        li[j+gap] = tmp</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">shell_sort</span>(<span class="params">li</span>):</span><br><span class="line">    d = <span class="built_in">len</span>(li) // <span class="number">2</span></span><br><span class="line">    <span class="keyword">while</span> d &gt;= <span class="number">1</span>:</span><br><span class="line">        insert_sort_gap(li, d)</span><br><span class="line">        d //= <span class="number">2</span></span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=34">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=34</a><br><a href="https://www.runoob.com/python3/python-shellsort.html">菜鸟教程 Python希尔排序<br>https://www.runoob.com/python3/python-shellsort.html</a></p></blockquote><hr><h2 id="十-计数排序">十. 计数排序<a class="header-anchor" href="#十-计数排序"></a></h2><blockquote><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">计数排序：计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。</span><br><span class="line">时间复杂度：O(n)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">count_sort</span>(<span class="params">li, max_count=<span class="number">100</span></span>):</span><br><span class="line">    count = [<span class="number">0</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(max_count+<span class="number">1</span>)]</span><br><span class="line">    <span class="keyword">for</span> val <span class="keyword">in</span> li:</span><br><span class="line">        count[val] += <span class="number">1</span></span><br><span class="line">    li.clear()</span><br><span class="line">    <span class="keyword">for</span> ind, val <span class="keyword">in</span> <span class="built_in">enumerate</span>(count):</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(val):</span><br><span class="line">            li.append(ind)</span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=36">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=36</a><br><a href="https://www.runoob.com/python3/python-counting-sort.html">菜鸟教程 Python计数排序<br>https://www.runoob.com/python3/python-counting-sort.html</a></p></blockquote><hr><h2 id="十一-桶排序">十一. 桶排序<a class="header-anchor" href="#十一-桶排序"></a></h2><blockquote><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></pre></td><td class="code"><pre><span class="line">桶排序：首先将元素分在不同的桶中，在对每个桶中的元素排序。</span><br><span class="line">时间复杂度 取决于数据的分布</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bucket_sort</span>(<span class="params">li, n=<span class="number">100</span>, max_num=<span class="number">10000</span></span>):</span><br><span class="line">    buckets = [[] <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(n)]    <span class="comment"># 创建桶</span></span><br><span class="line">    <span class="keyword">for</span> var <span class="keyword">in</span> li:</span><br><span class="line">        i = <span class="built_in">min</span>(var // (max_num // n), n-<span class="number">1</span>) <span class="comment"># i表示var放到几号桶里</span></span><br><span class="line">        buckets[i].append(var)  <span class="comment"># 把var加到桶里面</span></span><br><span class="line">        <span class="comment"># 保持桶内的顺序</span></span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(buckets[i])-<span class="number">1</span>, <span class="number">0</span>, -<span class="number">1</span>):</span><br><span class="line">            <span class="keyword">if</span> buckets[i][j] &lt; buckets[i][j-<span class="number">1</span>]:</span><br><span class="line">                buckets[i][j], buckets[i][j-<span class="number">1</span>] = buckets[i][j-<span class="number">1</span>], buckets[i][j]</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">    sorted_li = []</span><br><span class="line">    <span class="keyword">for</span> buc <span class="keyword">in</span> buckets:</span><br><span class="line">        sorted_li.extend(buc)</span><br><span class="line">    <span class="keyword">return</span> sorted_li</span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=37">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=37</a><br><a href="https://www.runoob.com/w3cnote/bucket-sort.html">菜鸟教程 桶排序<br>https://www.runoob.com/w3cnote/bucket-sort.html</a></p></blockquote><hr><h2 id="十二-基数排序">十二. 基数排序<a class="header-anchor" href="#十二-基数排序"></a></h2><blockquote><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></pre></td><td class="code"><pre><span class="line">基数排序：基数排序是一种非比较型整数排序算法，其原理是将整数按位数切割成不同的数字，然后按每个位数分别比较。</span><br><span class="line">时间复杂度：O(kn)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">list_to_buckets</span>(<span class="params">li, base, iteration</span>):</span><br><span class="line">    buckets = [[] <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(base)]</span><br><span class="line">    <span class="keyword">for</span> number <span class="keyword">in</span> li:</span><br><span class="line">        digit = (number // (base ** iteration)) % base</span><br><span class="line">        buckets[digit].append(number)</span><br><span class="line">    <span class="keyword">return</span> buckets</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">buckets_to_list</span>(<span class="params">buckets</span>):</span><br><span class="line">    <span class="keyword">return</span> [x <span class="keyword">for</span> bucket <span class="keyword">in</span> buckets <span class="keyword">for</span> x <span class="keyword">in</span> bucket]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">radix_sort</span>(<span class="params">li, base=<span class="number">10</span></span>):</span><br><span class="line">    maxval = <span class="built_in">max</span>(li)</span><br><span class="line">    it = <span class="number">0</span></span><br><span class="line">    <span class="keyword">while</span> base ** it &lt;= maxval:</span><br><span class="line">        li = buckets_to_list(list_to_buckets(list_to_buckets(li, base, it)))</span><br><span class="line">        it += <span class="number">1</span></span><br><span class="line">    <span class="keyword">return</span> li</span><br></pre></td></tr></table></figure><p><a href="https://www.bilibili.com/video/BV1mp4y1D7UP?p=39">b站视频 路飞IT学城<br>https://www.bilibili.com/video/BV1mp4y1D7UP?p=39</a><br><a href="https://www.runoob.com/w3cnote/radix-sort.html">菜鸟教程 基数排序<br>https://www.runoob.com/w3cnote/radix-sort.html</a></p></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 算法 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>04_Python-CSDN_mail模块</title>
      <link href="/posts/33188.html"/>
      <url>/posts/33188.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-理论">一. 理论<a class="header-anchor" href="#一-理论"></a></h2><blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">mail模块作用</span><br><span class="line">1、邮件报警</span><br><span class="line">2、发送报表</span><br><span class="line"></span><br><span class="line">邮件协议</span><br><span class="line">1、smtp (simple mail transfer protocol) 简单邮件传输协议，主要用来发送文件  默认端口 25号</span><br><span class="line">2、pop3  主要用来接收邮件   默认端口 110    客户端的操作不会反馈到服务器端</span><br><span class="line">3、imap  主要用来接收邮件   默认端口 143    客户端的操作会反馈到服务器端</span><br><span class="line"></span><br><span class="line">[参考：菜鸟教程 https://www.runoob.com/python3/python3-smtp.html</span><br><span class="line">](https://www.runoob.com/python3/python3-smtp.html)</span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="二-步骤">二. 步骤<a class="header-anchor" href="#二-步骤"></a></h2><h3 id="QQ邮箱获取授权码">QQ邮箱获取授权码<a class="header-anchor" href="#QQ邮箱获取授权码"></a></h3><blockquote><p>○ QQ邮箱获取授权码</p><p>[参考：获取授权码]</p><p>(<a href="https://service.mail.qq.com/cgi-bin/help?subtype=1&amp;&amp;id=28&amp;&amp;no=1001256">https://service.mail.qq.com/cgi-bin/help?subtype=1&amp;&amp;id=28&amp;&amp;no=1001256</a>)</p><p>先进入设置 －&gt; 帐户页面找到入口</p><p>（1）点击“开启”</p><p>（2）验证密保</p><p>（3）获取授权码</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505035438263.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505035449933.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505035503147.png" alt=""></p><p>或者开启IMAP/SMTP服务，同理</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505035521956.png" alt=""></p></blockquote><h3 id="代码部分">代码部分<a class="header-anchor" href="#代码部分"></a></h3><blockquote><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><br><span class="line">□ 示例<span class="number">1</span></span><br><span class="line"><span class="keyword">from</span> smtplib <span class="keyword">import</span> SMTP    <span class="comment"># 导入smtplib模块的SMTP类</span></span><br><span class="line">s = SMTP(<span class="string">&quot;smtp.qq.com&quot;</span>)    <span class="comment"># 使用qq邮箱去发送</span></span><br><span class="line">s.login(<span class="string">&quot;848723505@qq.com&quot;</span>,<span class="string">&quot;hopo**secret**bbdj&quot;</span>)    <span class="comment"># 发件人邮箱账号、授权码</span></span><br><span class="line">tolist = [<span class="string">&quot;1533431376@qq.com&quot;</span>]      <span class="comment"># 收件人邮箱账号</span></span><br><span class="line">msg = <span class="string">&quot;&quot;&quot;\</span></span><br><span class="line"><span class="string">From: 848723505@qq.com@qq.com</span></span><br><span class="line"><span class="string">TO: 1533431376@qq.com</span></span><br><span class="line"><span class="string">Subject: mail module study</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">this is cPen test</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">s.sendmail(<span class="string">&quot;848723505@qq.com&quot;</span>,tolist, msg)</span><br></pre></td></tr></table></figure><p>效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505035651514.png" alt=""></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></pre></td><td class="code"><pre><span class="line">□ 示例<span class="number">2</span></span><br><span class="line"><span class="keyword">from</span> smtplib <span class="keyword">import</span> SMTP</span><br><span class="line"><span class="keyword">from</span> email.mime.text <span class="keyword">import</span> MIMEText</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第三方smtp服务设置</span></span><br><span class="line">mail_host = <span class="string">&quot;smtp.qq.com&quot;</span></span><br><span class="line">mail_user = <span class="string">&quot;848723505@qq.com&quot;</span>  <span class="comment"># 发件人邮箱账号</span></span><br><span class="line">mail_pass = <span class="string">&quot;hopo**secret**bbdj&quot;</span>  <span class="comment"># 发件人授权码</span></span><br><span class="line"></span><br><span class="line">recv = <span class="string">&quot;1533431376@qq.com&quot;</span>      <span class="comment"># 收件人邮箱账号</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 构造邮件内容</span></span><br><span class="line"><span class="comment"># 正文内容、正文内容类型、正文内容编码</span></span><br><span class="line">message = MIMEText(<span class="string">&quot;Hello World ~ cPen&quot;</span>, <span class="string">&quot;plain&quot;</span>, <span class="string">&quot;utf-8&quot;</span>)  <span class="comment"># plain是普通的文本</span></span><br><span class="line"></span><br><span class="line">message[<span class="string">&quot;From&quot;</span>] = mail_user <span class="comment"># 把对象像字典一样传参</span></span><br><span class="line">message[<span class="string">&quot;To&quot;</span>] = recv</span><br><span class="line">message[<span class="string">&quot;Subject&quot;</span>] = <span class="string">&quot;I Love Coding&quot;</span></span><br><span class="line"></span><br><span class="line">s = SMTP(<span class="string">&quot;smtp.qq.com&quot;</span>)    <span class="comment"># 使用qq邮箱去发送</span></span><br><span class="line">s.login(<span class="string">&quot;848723505@qq.com&quot;</span>,<span class="string">&quot;hopo**secret**bbdj&quot;</span>)    <span class="comment"># 登录</span></span><br><span class="line">s.sendmail(mail_user,recv,message.as_string())    <span class="comment"># 文件内容需要转换成字符型</span></span><br></pre></td></tr></table></figure><p>效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505035746706.png" alt=""></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></pre></td><td class="code"><pre><span class="line">□ 示例<span class="number">3</span></span><br><span class="line"><span class="keyword">from</span> smtplib <span class="keyword">import</span> SMTP</span><br><span class="line"><span class="keyword">from</span> email.mime.text <span class="keyword">import</span> MIMEText</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第三方smtp服务设置</span></span><br><span class="line">mail_host = <span class="string">&quot;smtp.qq.com&quot;</span></span><br><span class="line">mail_user = <span class="string">&quot;848723505@qq.com&quot;</span>  <span class="comment"># 发件人邮箱账号</span></span><br><span class="line">mail_pass = <span class="string">&quot;hopo**secret**bbdj&quot;</span>  <span class="comment"># 发件人授权码</span></span><br><span class="line"></span><br><span class="line">recv = <span class="string">&quot;1533431376@qq.com&quot;</span>      <span class="comment"># 收件人邮箱账号</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 把内容识别成网页传送</span></span><br><span class="line">html_msg = <span class="string">&quot; &lt;p&gt;Python mail module test&lt;/p&gt;&lt;p&gt;&lt;a href=&#x27;https://www.baidu.com&#x27;&gt;点击进入百度&lt;/a&gt;&lt;/p&gt;&quot;</span></span><br><span class="line">message = MIMEText(html_msg,<span class="string">&#x27;html&#x27;</span>,<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"></span><br><span class="line">message[<span class="string">&quot;From&quot;</span>] = mail_user <span class="comment"># 把对象像字典一样传参</span></span><br><span class="line">message[<span class="string">&quot;To&quot;</span>] = recv</span><br><span class="line">message[<span class="string">&quot;Subject&quot;</span>] = <span class="string">&quot;cPen mail&quot;</span></span><br><span class="line"></span><br><span class="line">s = SMTP(<span class="string">&quot;smtp.qq.com&quot;</span>)    <span class="comment"># 使用qq邮箱去发送</span></span><br><span class="line">s.login(<span class="string">&quot;848723505@qq.com&quot;</span>,<span class="string">&quot;hopo**secret**bbdj&quot;</span>)    <span class="comment"># 登录</span></span><br><span class="line">s.sendmail(mail_user,recv,message.as_string())    <span class="comment"># 文件内容转换成字符型</span></span><br></pre></td></tr></table></figure><p>效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505035846092.png" alt=""></p></blockquote><h3 id="Foxmail登录">Foxmail登录<a class="header-anchor" href="#Foxmail登录"></a></h3><blockquote><p>○ Foxmail登录</p><p>[下载Foxmail客户端](<a href="https://www.foxmail.com/">https://www.foxmail.com/</a>)</p><p>先进入设置 －&gt; 新建账号，填入E-mail地址和授权码</p><p>□ 使用POP3协议登录</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505040116717.png" alt=""></p><p>□ 使用IMAP协议登录</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505040144841.png" alt=""></p><p>效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220505040202531.png" alt=""></p></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 模块 </tag>
            
            <tag> Mail </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>03_Python-CSDN_数据类型2</title>
      <link href="/posts/37069.html"/>
      <url>/posts/37069.html</url>
      
        <content type="html"><![CDATA[<p>容器类型</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">4种内置数据结构（容器类型）</span><br><span class="line">列表：list=&gt;[val1,val2,val3,val4]</span><br><span class="line">元组：tuple=&gt;(val1,val2,val3,val4)</span><br><span class="line">字典：dict=&gt;&#123;key1:val1,key2:val2&#125;</span><br><span class="line">集合：set=&gt;&#123;key1,key2,key3,key4&#125;</span><br></pre></td></tr></table></figure><h2 id="一-列表（list）">一. 列表（list）<a class="header-anchor" href="#一-列表（list）"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">列表是处理一组有序项目的数据结构</span><br><span class="line">列表是python中最具灵活性的有序集合对象类型</span><br><span class="line">列表可以包含任何类型的对象：字符串、数字甚至其他列表</span><br><span class="line">列表是可变的数据类型，即这种类型的值是可以被修改的</span><br><span class="line">Example:表示一个购物清单</span><br><span class="line">goods=[&#x27;牛奶&#x27;、&#x27;运动鞋&#x27;、&#x27;咖啡&#x27;、&#x27;手机&#x27;、&#x27;羊肉&#x27;、&#x27;葡萄&#x27;、&#x27;桔子&#x27;]</span><br><span class="line"></span><br><span class="line">列表通过方括号中用逗号分割的项目定义</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"># 示例</span></span><br><span class="line"><span class="comment"># 定义空列表</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst = []</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(lst)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;list&#x27;</span>&gt;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst2 = <span class="built_in">list</span>()<span class="comment"># 注：工厂函数</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(lst2)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;list&#x27;</span>&gt;</span><br><span class="line"><span class="comment"># 列表可装入python的任何对象：</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst3 = <span class="built_in">list</span>(<span class="string">&quot;abc&quot;</span>)<span class="comment"># 注：字符串</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst3 </span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst = [<span class="number">1</span>,<span class="string">&#x27;abc&#x27;</span>,<span class="number">2.5</span>,<span class="literal">True</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst = [<span class="number">1</span>,<span class="string">&#x27;abc&#x27;</span>,<span class="number">2.5</span>,<span class="literal">True</span>,lst3]<span class="comment"># 注：其他列表</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst</span><br><span class="line">[<span class="number">1</span>, <span class="string">&#x27;abc&#x27;</span>, <span class="number">2.5</span>, <span class="literal">True</span>, [<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>]]</span><br></pre></td></tr></table></figure><h3 id="列表基本操作">列表基本操作<a class="header-anchor" href="#列表基本操作"></a></h3><h4 id="索引">索引<a class="header-anchor" href="#索引"></a></h4><p>​通过下标访问列表中的元素，下标从0开始计数，可取出一个元素</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="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(lst)</span><br><span class="line"><span class="number">140078683813384</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst += [<span class="number">4</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(lst)</span><br><span class="line"><span class="number">140078683813384</span><span class="comment"># 注：内存地址不变</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst[<span class="number">0</span>]</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst[<span class="number">0</span>] = <span class="string">&quot;a&quot;</span><span class="comment"># 注：改变列表里的元素值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(lst)</span><br><span class="line"><span class="number">140078683813384</span></span><br><span class="line"><span class="comment"># 下标不能越界（Index Error:list index out of range）</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst</span><br><span class="line">[<span class="string">&#x27;b&#x27;</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst[<span class="number">4</span>]<span class="comment"># 注：下标越界 会报错</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">IndexError: <span class="built_in">list</span> index out of <span class="built_in">range</span></span><br></pre></td></tr></table></figure><h4 id="切片">切片<a class="header-anchor" href="#切片"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">切片是通过下标访问列表中的元素，切片可以取出一个子列表</span><br><span class="line">起止区间：[ start,end )</span><br><span class="line">step:默认=&gt;1</span><br><span class="line">start:默认=&gt;step为正时，start为0；step为负时,start为-1</span><br><span class="line">end:默认=&gt;step为正时，end为列表结尾；step为负时,end为列表开始</span><br><span class="line">注意：三个值都为选填项</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><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="comment"># 示例：正切片</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">0</span>:<span class="number">4</span>]<span class="comment"># 注：切片，前4个</span></span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">str</span> = <span class="string">&quot;123456&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">str</span>[<span class="number">0</span>:<span class="number">4</span>]<span class="comment"># 注：切片，前4个</span></span><br><span class="line"><span class="string">&#x27;1234&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[:<span class="number">4</span>]<span class="comment"># 注：效果一样</span></span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例：负切片，步长为-1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[-<span class="number">1</span>:<span class="number">3</span>:-<span class="number">1</span>]<span class="comment"># 注：-1指向6， 3指向4，-1从右往左</span></span><br><span class="line">[<span class="number">6</span>, <span class="number">5</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[-<span class="number">1</span>:-<span class="number">4</span>:-<span class="number">1</span>]<span class="comment"># 注：-1指向6，-4指向3，-1从右往左</span></span><br><span class="line">[<span class="number">6</span>, <span class="number">5</span>, <span class="number">4</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[-<span class="number">1</span>:-<span class="number">44</span>:-<span class="number">1</span>]<span class="comment"># 注：-1指向6，-44越界，-1从右往左</span></span><br><span class="line">[<span class="number">6</span>, <span class="number">5</span>, <span class="number">4</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">1</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[-<span class="number">1</span>:<span class="number">4</span>:-<span class="number">1</span>]<span class="comment"># 注：-1指向6,  4指向5，-1从右往左</span></span><br><span class="line">[<span class="number">6</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[-<span class="number">3</span>:<span class="number">4</span>:-<span class="number">1</span>]<span class="comment"># 注：-3指向4， 4指向5，4向左取不到5</span></span><br><span class="line">[]<span class="comment"># 注：为空  起始位置有误时，切出来会是空(不会报错)</span></span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><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">切片对象(slice函数)</span><br><span class="line">slice函数的用途：生成一个slice对象，相当于可以给要切的内容取个名字。</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&quot;a&quot;</span>,<span class="string">&quot;b&quot;</span>,<span class="string">&quot;c&quot;</span>,<span class="string">&quot;d&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>, <span class="string">&#x27;d&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 = <span class="built_in">slice</span>(<span class="number">0</span>,<span class="number">3</span>,<span class="number">1</span>)<span class="comment"># 注：引用时需要传参进去</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[s1]<span class="comment"># 注：切片 前3个</span></span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b[s1]<span class="comment"># 注：切片 前3个</span></span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = [<span class="string">&quot;xx&quot;</span>,<span class="string">&quot;yy&quot;</span>,<span class="string">&quot;zz&quot;</span>,<span class="string">&quot;ee&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c[s1]<span class="comment"># 注：切片 前3个</span></span><br><span class="line">[<span class="string">&#x27;xx&#x27;</span>, <span class="string">&#x27;yy&#x27;</span>, <span class="string">&#x27;zz&#x27;</span>]</span><br></pre></td></tr></table></figure><h4 id="增加">增加<a class="header-anchor" href="#增加"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">增加列表元素的方式</span><br><span class="line">append:在末尾，作为整体追加，类型不限</span><br><span class="line">insert:在index位置插入元素</span><br><span class="line">extend:扩展列表</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><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="comment"># 示例</span></span><br><span class="line"><span class="comment"># append</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&quot;apple&quot;</span>, <span class="string">&quot;orange&quot;</span>, <span class="number">123</span>, <span class="number">0.1111</span>, <span class="string">&quot;cali&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.append(<span class="string">&quot;test&quot;</span>)<span class="comment"># 注：追加字符串</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;apple&#x27;</span>, <span class="string">&#x27;orange&#x27;</span>, <span class="number">123</span>, <span class="number">0.1111</span>, <span class="string">&#x27;cali&#x27;</span>, <span class="string">&#x27;test&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst2 = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst.append(lst2)<span class="comment"># 注：追加的类型是数组</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>, [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]]<span class="comment"># 注：追加的类型是数组</span></span><br><span class="line"><span class="comment"># insert</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst.insert(<span class="number">1</span>,<span class="string">&#x27;d&#x27;</span>)<span class="comment"># 注：在第2个元素前插入数据</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;d&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>]</span><br><span class="line"><span class="comment"># extend</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">str</span> = <span class="string">&quot;abc&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.extend(<span class="built_in">str</span>)<span class="comment"># 注：扩展字符串</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>]</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><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">extend与+</span><br><span class="line">注意：只限可转为list的类型(str,list,tuple)</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><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="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a2 = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.extend(a2)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a + [<span class="string">&quot;5&quot;</span>]<span class="comment"># 注：+ 法只能list 和 list 相加</span></span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="string">&#x27;5&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]<span class="comment"># 注：+ 法 运行结束后 数组a没有变化</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = a + [<span class="string">&quot;5&quot;</span>]<span class="comment"># 注：赋值给数组b</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b<span class="comment"># 注：可以通过 赋值给数组b的方法来保存 变化</span></span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="string">&#x27;5&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140273972677768</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a += [<span class="string">&quot;6&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140273972677768</span><span class="comment"># 注：a += [&quot;6&quot;] 内存地址不变   对象不变，内容改变</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = a + [<span class="string">&quot;7&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140273837551816</span><span class="comment"># 注：a = a + [&quot;7&quot;]内存地址改变</span></span><br></pre></td></tr></table></figure><h4 id="删除">删除<a class="header-anchor" href="#删除"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">删除列表元素的方式</span><br><span class="line">pop：删除元素，默认最后一个（指定index删除）</span><br><span class="line">remove：删除指定的元素（要删除的数据不存在时，会出错）</span><br><span class="line">del：根据下标删除</span><br><span class="line">del是python的一个关键字，用于删除变量(的引用)</span><br><span class="line">clear：清空列表</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># pop</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.pop()<span class="comment"># 注：默认删除最后1个</span></span><br><span class="line"><span class="string">&#x27;7&#x27;</span><span class="comment"># 注：返回值，删除的元素</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.pop(<span class="number">2</span>)<span class="comment"># 注：指定索引2 删除第3个元素</span></span><br><span class="line"><span class="string">&#x27;c&#x27;</span></span><br><span class="line"><span class="comment"># remove</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&quot;xx&quot;</span>,<span class="string">&quot;yy&quot;</span>,<span class="string">&quot;xx&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.remove(<span class="string">&quot;xx&quot;</span>)<span class="comment"># 注：删除指定元素，只删除第1个</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;yy&#x27;</span>, <span class="string">&#x27;xx&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;yy&#x27;</span>, <span class="string">&#x27;xx&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.remove(<span class="string">&quot;zz&quot;</span>)<span class="comment"># 注：要删除的数据不存在时，会报错</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">ValueError: <span class="built_in">list</span>.remove(x): x <span class="keyword">not</span> <span class="keyword">in</span> <span class="built_in">list</span></span><br><span class="line"><span class="comment"># del</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="string">&quot;xx&quot;</span>,<span class="string">&quot;yy&quot;</span>,<span class="string">&quot;zz&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">del</span> a[<span class="number">3</span>]<span class="comment"># 注：删除索引3  第4个</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="string">&#x27;yy&#x27;</span>, <span class="string">&#x27;zz&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">del</span> a[<span class="number">0</span>:<span class="number">2</span>]<span class="comment"># 注：切片删除</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = <span class="number">1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">del</span> c<span class="comment"># 注：del删除变量的引用</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">NameError: name <span class="string">&#x27;c&#x27;</span> <span class="keyword">is</span> <span class="keyword">not</span> defined</span><br><span class="line"><span class="comment"># clear</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">3</span>, <span class="string">&#x27;yy&#x27;</span>, <span class="string">&#x27;zz&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.clear()</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[]<span class="comment"># 注：clear清空</span></span><br></pre></td></tr></table></figure><h4 id="修改">修改<a class="header-anchor" href="#修改"></a></h4><p>修改元素主要是利用下标和切片来修改或增加、删除</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"># 示例</span><br><span class="line">&gt;&gt;&gt; a = [1,2,3,&#x27;a&#x27;,&#x27;b&#x27;,&#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; a</span><br><span class="line">[1, 2, 3, &#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; a[2] = &quot;x&quot;# 注：修改元素</span><br><span class="line">&gt;&gt;&gt; a</span><br><span class="line">[1, 2, &#x27;x&#x27;, &#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; a[1:1]# 注：[1,1)</span><br><span class="line">[]# 注：为空</span><br><span class="line">&gt;&gt;&gt; a[1:1] = &quot;abc&quot;# 注：在起始位置 索引为1 处之前 增加列表 str类型转换为列表</span><br><span class="line">&gt;&gt;&gt; a</span><br><span class="line">[1, &#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;, 2, &#x27;x&#x27;, &#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; b = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;]</span><br><span class="line">&gt;&gt;&gt; b[2:2] = [&quot;x&quot;,&quot;y&quot;]# 注：索引为2处之前  增加列表</span><br><span class="line">&gt;&gt;&gt; b</span><br><span class="line">[&#x27;a&#x27;, &#x27;b&#x27;, &#x27;x&#x27;, &#x27;y&#x27;, &#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; b[2:4] = [&quot;x&quot;,&quot;y&quot;,&quot;z&quot;]# 注：索引2、3 的值 替换</span><br><span class="line">&gt;&gt;&gt; b</span><br><span class="line">[&#x27;a&#x27;, &#x27;b&#x27;, &#x27;x&#x27;, &#x27;y&#x27;, &#x27;z&#x27;, &#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; b[1:5] = &quot;12&quot;# 注：切出来后，再转换为列表。str类型转换为列表</span><br><span class="line">&gt;&gt;&gt; b# 注：索引1、2、3、4 的值 替换 为 ‘1’‘2’</span><br><span class="line">[&#x27;a&#x27;, &#x27;1&#x27;, &#x27;2&#x27;, &#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; b</span><br><span class="line">[&#x27;a&#x27;, &#x27;1&#x27;, &#x27;2&#x27;, &#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; b[5:-3]</span><br><span class="line">[]</span><br><span class="line">&gt;&gt;&gt; b[3:-3]# 注：获取不到</span><br><span class="line">[]</span><br><span class="line">&gt;&gt;&gt; b[3:-3] = &quot;xy&quot;# 注：这个位置开始(start位置开始)，替换成其他的list</span><br><span class="line">&gt;&gt;&gt; b# 注：看 找出的元素是否为空</span><br><span class="line">[&#x27;a&#x27;, &#x27;1&#x27;, &#x27;2&#x27;, &#x27;x&#x27;, &#x27;y&#x27;, &#x27;c&#x27;]</span><br><span class="line">&gt;&gt;&gt; c = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;,&quot;1&quot;]</span><br><span class="line">&gt;&gt;&gt; c[1:4] = &quot;hello&quot;# 注：找出b c d  把bcd 替换成h e l l o</span><br><span class="line">&gt;&gt;&gt; c</span><br><span class="line">[&#x27;a&#x27;, &#x27;h&#x27;, &#x27;e&#x27;, &#x27;l&#x27;, &#x27;l&#x27;, &#x27;o&#x27;, &#x27;1&#x27;]</span><br><span class="line">&gt;&gt;&gt; c = [&#x27;a&#x27;, &#x27;h&#x27;, &#x27;e&#x27;, &#x27;l&#x27;, &#x27;l&#x27;, &#x27;o&#x27;, &#x27;1&#x27;]</span><br><span class="line">&gt;&gt;&gt; c[5:3]# 注：获取不到</span><br><span class="line">[]</span><br><span class="line">&gt;&gt;&gt; c[5:3] = [&quot;x&quot;,&quot;y&quot;]# 注：c[5:3]为空，在 o (下标5)处插入x y</span><br><span class="line">&gt;&gt;&gt; c</span><br><span class="line">[&#x27;a&#x27;, &#x27;h&#x27;, &#x27;e&#x27;, &#x27;l&#x27;, &#x27;l&#x27;, &#x27;x&#x27;, &#x27;y&#x27;, &#x27;o&#x27;, &#x27;1&#x27;]</span><br></pre></td></tr></table></figure><h4 id="反转">反转<a class="header-anchor" href="#反转"></a></h4><p>​反转列表-reverse 或 切片</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># 1.负切片 实现反转，输出的值反转</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[::-<span class="number">1</span>]<span class="comment"># 注：负切片</span></span><br><span class="line">[<span class="number">4</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">1</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a<span class="comment"># 注：a本身的值 没有反转</span></span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"><span class="comment"># 2.reverse 字符串的反转</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.reverse()</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a<span class="comment"># 注：a本身的值 反转</span></span><br><span class="line">[<span class="number">4</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">1</span>]</span><br></pre></td></tr></table></figure><h4 id="排序">排序<a class="header-anchor" href="#排序"></a></h4><p>​列表排序-sort</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">4</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">1</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.sort()</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]<span class="comment"># 注：排序后  a本身的值发生改变</span></span><br><span class="line"><span class="comment"># 反向排序</span></span><br><span class="line">a.sort(reverse=<span class="literal">True</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.sort(reverse=<span class="literal">True</span>)<span class="comment"># 注：反向排序，升序变成降序</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">4</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">1</span>]<span class="comment"># 注：从大到小排序</span></span><br><span class="line"><span class="comment"># 不支持int和str混合 的排序：</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&quot;a&quot;</span>,<span class="number">1</span>,<span class="string">&quot;b&quot;</span>,<span class="number">2</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.sort()</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">TypeError: <span class="string">&#x27;&lt;&#x27;</span> <span class="keyword">not</span> supported between instances of <span class="string">&#x27;str&#x27;</span> <span class="keyword">and</span> <span class="string">&#x27;int&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&quot;a&quot;</span>,<span class="string">&quot;1&quot;</span>,<span class="string">&quot;b&quot;</span>,<span class="string">&quot;2&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.sort()</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;1&#x27;</span>, <span class="string">&#x27;2&#x27;</span>, <span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>]</span><br><span class="line"><span class="comment"># 按 编码排序</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&quot;a&quot;</span>,<span class="string">&quot;1&quot;</span>,<span class="string">&quot;b&quot;</span>,<span class="string">&quot;2&quot;</span>,<span class="string">&quot;A&quot;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;1&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;2&#x27;</span>, <span class="string">&#x27;A&#x27;</span>]</span><br></pre></td></tr></table></figure><h4 id="统计">统计<a class="header-anchor" href="#统计"></a></h4><p>​len、count、index</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># len 总长度</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;中&#x27;</span>, <span class="string">&#x27;序&#x27;</span>, <span class="string">&#x27;排&#x27;</span>, <span class="string">&#x27;文&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">len</span>(a)</span><br><span class="line"><span class="number">5</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.append([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>])</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">len</span>(a)</span><br><span class="line"><span class="number">6</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;中&#x27;</span>, <span class="string">&#x27;序&#x27;</span>, <span class="string">&#x27;排&#x27;</span>, <span class="string">&#x27;文&#x27;</span>, [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.extend([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>])</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">len</span>(a)</span><br><span class="line"><span class="number">9</span></span><br><span class="line"><span class="comment"># count统计元素出现的次数</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;中&#x27;</span>, <span class="string">&#x27;序&#x27;</span>, <span class="string">&#x27;排&#x27;</span>, <span class="string">&#x27;文&#x27;</span>, [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>], <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.count(<span class="string">&quot;a&quot;</span>)</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.count(<span class="number">1</span>)</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="comment"># index返回元素所在的索引位置</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&quot;x&quot;</span>,<span class="string">&quot;y&quot;</span>,<span class="string">&quot;x&quot;</span>,<span class="number">1</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.count(<span class="string">&quot;x&quot;</span>)</span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.index(<span class="string">&quot;x&quot;</span>)</span><br><span class="line"><span class="number">0</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.index(<span class="string">&quot;z&quot;</span>)<span class="comment"># 注：index通过元素找索引，如果没有会报错</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">ValueError: <span class="string">&#x27;z&#x27;</span> <span class="keyword">is</span> <span class="keyword">not</span> <span class="keyword">in</span> <span class="built_in">list</span></span><br></pre></td></tr></table></figure><h4 id="遍历">遍历<a class="header-anchor" href="#遍历"></a></h4><p>​遍历：依次取出对象中的每一项数据</p><p>​list是一个可迭代对象（iterable），可以直接用for遍历</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1.for i in a:</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">&#x27;x&#x27;</span>, <span class="string">&#x27;y&#x27;</span>, <span class="string">&#x27;x&#x27;</span>, <span class="number">1</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> a:</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(<span class="string">f&quot;item is ---&gt;<span class="subst">&#123;i&#125;</span>&quot;</span>)</span><br><span class="line"><span class="meta">... </span></span><br><span class="line">item <span class="keyword">is</span> ---&gt;x</span><br><span class="line">item <span class="keyword">is</span> ---&gt;y</span><br><span class="line">item <span class="keyword">is</span> ---&gt;x</span><br><span class="line">item <span class="keyword">is</span> ---&gt;<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2.enumerate()函数  </span></span><br><span class="line"><span class="comment"># 特点：会返回元组，元组里包含每一个下标和值</span></span><br><span class="line"><span class="comment"># 注：用1个i去遍历，获取的是元组</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">enumerate</span>(a):</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(<span class="string">f&quot;item is ---&gt;<span class="subst">&#123;i&#125;</span>&quot;</span>)</span><br><span class="line"><span class="meta">... </span></span><br><span class="line">item <span class="keyword">is</span> ---&gt;(<span class="number">0</span>, <span class="string">&#x27;x&#x27;</span>)</span><br><span class="line">item <span class="keyword">is</span> ---&gt;(<span class="number">1</span>, <span class="string">&#x27;y&#x27;</span>)</span><br><span class="line">item <span class="keyword">is</span> ---&gt;(<span class="number">2</span>, <span class="string">&#x27;x&#x27;</span>)</span><br><span class="line">item <span class="keyword">is</span> ---&gt;(<span class="number">3</span>, <span class="number">1</span>)</span><br><span class="line"><span class="comment"># 用2个临时变量，获取enumerate(a)元组的返回</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i,j <span class="keyword">in</span> <span class="built_in">enumerate</span>(a):</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;i&#125;</span>--&gt;<span class="subst">&#123;j&#125;</span>&quot;</span>)</span><br><span class="line"><span class="meta">... </span></span><br><span class="line"><span class="number">0</span>--&gt;x</span><br><span class="line"><span class="number">1</span>--&gt;y</span><br><span class="line"><span class="number">2</span>--&gt;x</span><br><span class="line"><span class="number">3</span>--&gt;<span class="number">1</span></span><br></pre></td></tr></table></figure><h4 id="判断成员关系">判断成员关系<a class="header-anchor" href="#判断成员关系"></a></h4><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst = [<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>,<span class="string">&#x27;d&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(<span class="string">&#x27;a&#x27;</span> <span class="keyword">in</span> lst)</span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(<span class="string">&#x27;x&#x27;</span> <span class="keyword">in</span> lst)</span><br><span class="line"><span class="literal">False</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s = <span class="string">&#x27;a&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(s, <span class="string">&#x27;在&#x27;</span> <span class="keyword">if</span> s <span class="keyword">in</span> lst <span class="keyword">else</span> <span class="string">&#x27;不在&#x27;</span>,<span class="string">&#x27;列表里&#x27;</span>)</span><br><span class="line">a 在 列表里</span><br></pre></td></tr></table></figure><h4 id="类型转换">类型转换<a class="header-anchor" href="#类型转换"></a></h4><p>​字符串(str)转列表(list)</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"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">str</span> = <span class="string">&#x27;abc 123&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">list</span>(<span class="built_in">str</span>)</span><br><span class="line">[<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>, <span class="string">&#x27; &#x27;</span>, <span class="string">&#x27;1&#x27;</span>, <span class="string">&#x27;2&#x27;</span>, <span class="string">&#x27;3&#x27;</span>]</span><br></pre></td></tr></table></figure><hr><h2 id="二-元组（tuple）">二. 元组（tuple）<a class="header-anchor" href="#二-元组（tuple）"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">元组是处理一组有序项目的数据结构</span><br><span class="line">元组和字符串一样是不可变的,即你不能修改元组</span><br><span class="line">元组可以包含任何类型的对象：字符串、数字甚至其他列表</span><br><span class="line">适应场景：性别选择，数据库的查询结果</span><br><span class="line">Example:表示一个购物清单</span><br><span class="line">goods=(&#x27;牛奶&#x27;、&#x27;运动鞋&#x27;、&#x27;咖啡&#x27;、&#x27;手机&#x27;、&#x27;羊肉&#x27;、&#x27;葡萄&#x27;、&#x27;桔子&#x27;)</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><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="comment"># 示例</span></span><br><span class="line"><span class="comment"># 元组通过圆括号中用逗号分割的项目定义</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = ()</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(a)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;tuple&#x27;</span>&gt;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = (<span class="number">1</span>)<span class="comment"># 注：括号还可以代表集合</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(a)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;int&#x27;</span>&gt;</span><br><span class="line"><span class="comment"># 元组中只有一个元素的时候，需要在元素后面加个，区分这个括号是表示结合还是表示元组</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = (<span class="number">1</span>,)<span class="comment"># 注：元组中只有1个元素时，需要加逗号(,)表示元组</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(a)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;tuple&#x27;</span>&gt;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="built_in">tuple</span>()<span class="comment"># 注：定义空元组</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(a)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;tuple&#x27;</span>&gt;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">()</span><br><span class="line"><span class="comment"># 元组可装入python的任何对象</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = (<span class="string">&quot;a&quot;</span>,<span class="number">1</span>,<span class="number">1.2</span>,<span class="literal">True</span>,<span class="built_in">print</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">(<span class="string">&#x27;a&#x27;</span>, <span class="number">1</span>, <span class="number">1.2</span>, <span class="literal">True</span>, &lt;built-<span class="keyword">in</span> function <span class="built_in">print</span>&gt;)</span><br></pre></td></tr></table></figure><h3 id="元组基本操作">元组基本操作<a class="header-anchor" href="#元组基本操作"></a></h3><h4 id="索引-2">索引<a class="header-anchor" href="#索引-2"></a></h4><p>​通过下标访问列表中的元素，下标从0开始计数，可取出一个元素</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = (<span class="string">&quot;a&quot;</span>,<span class="number">1</span>,<span class="number">1.2</span>,<span class="literal">True</span>,<span class="built_in">print</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">4</span>]</span><br><span class="line">&lt;built-<span class="keyword">in</span> function <span class="built_in">print</span>&gt;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">3</span>]</span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="comment"># 下标不能越界，越界会报错</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = (<span class="string">&quot;a&quot;</span>,<span class="number">1</span>,<span class="number">1.2</span>,<span class="literal">True</span>,<span class="built_in">print</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">5</span>]</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">IndexError: <span class="built_in">tuple</span> index out of <span class="built_in">range</span></span><br></pre></td></tr></table></figure><h4 id="切片-2">切片<a class="header-anchor" href="#切片-2"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">切片是通过下标访问元组中的元素，切片可以取出一个子元组</span><br><span class="line">起止区间：[start,end)</span><br><span class="line">step:默认=&gt;1</span><br><span class="line">start:默认=&gt;step为正时，start为0；step为负时,start为-1</span><br><span class="line">end:默认=&gt;step为正时，end为列表结尾；step为负时,end为列表开始</span><br><span class="line">注意：三个值都为选填项</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = (<span class="string">&quot;a&quot;</span>,<span class="number">1</span>,<span class="number">1.2</span>,<span class="literal">True</span>,<span class="built_in">print</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">1</span>:<span class="number">3</span>]</span><br><span class="line">(<span class="number">1</span>, <span class="number">1.2</span>)</span><br></pre></td></tr></table></figure><h4 id="不可变性">不可变性<a class="header-anchor" href="#不可变性"></a></h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">(<span class="string">&#x27;a&#x27;</span>, <span class="number">1</span>, <span class="number">1.2</span>, <span class="literal">True</span>, &lt;built-<span class="keyword">in</span> function <span class="built_in">print</span>&gt;)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">0</span>] = <span class="number">1</span><span class="comment"># 注：报错</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">TypeError: <span class="string">&#x27;tuple&#x27;</span> <span class="built_in">object</span> does <span class="keyword">not</span> support item assignment</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>tu1 = (<span class="number">1</span>,<span class="number">2</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>tu2 = (<span class="number">3</span>,<span class="number">4</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>tu3 = tu1 + tu2</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>tu3</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>)</span><br></pre></td></tr></table></figure><h4 id="统计-2">统计<a class="header-anchor" href="#统计-2"></a></h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = (<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(<span class="built_in">len</span>(a))</span><br><span class="line"><span class="number">3</span></span><br></pre></td></tr></table></figure><h4 id="遍历-2">遍历<a class="header-anchor" href="#遍历-2"></a></h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">enumerate</span>(a):</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(i)</span><br><span class="line"><span class="meta">... </span></span><br><span class="line">(<span class="number">0</span>, <span class="number">1</span>)<span class="comment"># 注：返回值 是 元组</span></span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">(<span class="number">2</span>, <span class="number">3</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i,j <span class="keyword">in</span> <span class="built_in">enumerate</span>(a):</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;i&#125;</span>---<span class="subst">&#123;j&#125;</span>&quot;</span>)<span class="comment"># 注：用两个参数 来接收 返回值</span></span><br><span class="line"><span class="meta">... </span></span><br><span class="line"><span class="number">0</span>---<span class="number">1</span></span><br><span class="line"><span class="number">1</span>---<span class="number">2</span></span><br><span class="line"><span class="number">2</span>---<span class="number">3</span></span><br></pre></td></tr></table></figure><h4 id="成员关系">成员关系<a class="header-anchor" href="#成员关系"></a></h4><p>​成员关系： in , not in</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = (<span class="string">&quot;a&quot;</span>,<span class="string">&quot;b&quot;</span>,<span class="string">&quot;c&quot;</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="string">&quot;a&quot;</span> <span class="keyword">in</span> a</span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="string">&quot;d&quot;</span> <span class="keyword">not</span> <span class="keyword">in</span> a</span><br><span class="line"><span class="literal">True</span></span><br></pre></td></tr></table></figure><h2 id="三-字典（dict）">三. 字典（dict）<a class="header-anchor" href="#三-字典（dict）"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">字典是Python中一个键值映射的数据结构</span><br><span class="line">字典是无序的</span><br><span class="line">字典是可变对象</span><br><span class="line">key必须是唯一的,so天生去重</span><br><span class="line">example:</span><br><span class="line">singer=&#123;key1:value,key2:value&#125;</span><br><span class="line">singer=&#123;&quot;李圣杰&quot;:&#x27;痴心绝对&#x27;,&#x27;张韶涵&#x27;:&#x27;阿刁&#x27;,&#x27;汪峰&#x27;:&#x27;普通迪斯高&#x27;&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">字典的定义</span><br><span class="line">字典的key必须是可hash对象</span><br><span class="line">python中所有字符串、数字、元组、布尔值、None都是可hash对象</span><br><span class="line">字典的value可以是任何值</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><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># 定义空字典</span></span><br><span class="line"><span class="comment"># 方法1：</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;&#125;<span class="comment"># 注：定义空字典</span></span><br><span class="line"><span class="comment"># 方法2：</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="built_in">dict</span>()<span class="comment"># 注：定义空字典，工厂函数</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(a)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;dict&#x27;</span>&gt;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(b)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;dict&#x27;</span>&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = [(<span class="string">&#x27;root&#x27;</span>,<span class="string">&#x27;123456&#x27;</span>),(<span class="string">&#x27;admin&#x27;</span>,<span class="string">&#x27;admin&#x27;</span>)]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>d = <span class="built_in">dict</span>(c)<span class="comment"># 注：列表转换成字典  工厂函数</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>d</span><br><span class="line">&#123;<span class="string">&#x27;root&#x27;</span>: <span class="string">&#x27;123456&#x27;</span>, <span class="string">&#x27;admin&#x27;</span>: <span class="string">&#x27;admin&#x27;</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>e = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>e</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">dict</span>(e)<span class="comment"># 注：转换的对象要有 键值映射 的格式</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">TypeError: cannot convert dictionary update sequence element <span class="comment">#0 to a sequence</span></span><br></pre></td></tr></table></figure><h3 id="字典基本操作">字典基本操作<a class="header-anchor" href="#字典基本操作"></a></h3><h4 id="取值">取值<a class="header-anchor" href="#取值"></a></h4><figure class="highlight plaintext"><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">用法1：dicts[key]=&gt;当key不存在时，会引了KeyError错误</span><br><span class="line">用法2：dicts.get(key,default)=&gt;当key不存在时，返回default值</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><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="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="string">&quot;a&quot;</span>:<span class="number">4</span>,<span class="string">&quot;b&quot;</span>:<span class="number">2</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&#x27;a&#x27;</span>]=<span class="number">3</span><span class="comment"># 注：修改key=”a”的 value 值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;a&#x27;</span>: <span class="number">3</span>, <span class="string">&#x27;b&#x27;</span>: <span class="number">2</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&#x27;c&#x27;</span>]=<span class="number">4</span><span class="comment"># 注：增加键值对</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;a&#x27;</span>: <span class="number">3</span>, <span class="string">&#x27;b&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;c&#x27;</span>: <span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&#x27;c&#x27;</span>]<span class="comment"># 注：取值</span></span><br><span class="line"><span class="number">4</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&#x27;d&#x27;</span>]<span class="comment"># 注：key不存在，报错</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">KeyError: <span class="string">&#x27;d&#x27;</span></span><br><span class="line"><span class="comment"># 推荐使用get</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;a&#x27;</span>: <span class="number">3</span>, <span class="string">&#x27;b&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;c&#x27;</span>: <span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.get(<span class="string">&#x27;d&#x27;</span>)<span class="comment"># 注：不报错</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = a.get(<span class="string">&#x27;d&#x27;</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(c)</span><br><span class="line"><span class="literal">None</span><span class="comment"># 注：默认值没有设置</span></span><br></pre></td></tr></table></figure><h4 id="增加-修改">增加/修改<a class="header-anchor" href="#增加-修改"></a></h4><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">用法：dicts[key]=value</span><br><span class="line">当key不存在时，表示增加一个键值对</span><br><span class="line">当key存在时，表示修改对应的value值</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：修改</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;a&#x27;</span>: <span class="number">3</span>, <span class="string">&#x27;b&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;c&#x27;</span>: <span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&#x27;a&#x27;</span>] = <span class="number">5</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;a&#x27;</span>: <span class="number">5</span>, <span class="string">&#x27;b&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;c&#x27;</span>: <span class="number">4</span>&#125;</span><br><span class="line"><span class="comment"># 示例：新增</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="string">&#x27;d&#x27;</span>] = <span class="literal">False</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;a&#x27;</span>: <span class="number">5</span>, <span class="string">&#x27;b&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;c&#x27;</span>: <span class="number">4</span>, <span class="string">&#x27;d&#x27;</span>: <span class="literal">False</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="删除-2">删除<a class="header-anchor" href="#删除-2"></a></h4><figure class="highlight plaintext"><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">用法1：dicts.pop(key)</span><br><span class="line">用法2：dicts.popitem()</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><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：dicts.pop(key)</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="string">&#x27;a&#x27;</span>:<span class="number">5</span>,<span class="string">&#x27;b&#x27;</span>:<span class="number">2</span>,<span class="string">&#x27;c&#x27;</span>:<span class="number">4</span>,<span class="string">&#x27;d&#x27;</span>:<span class="literal">False</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.pop(<span class="string">&#x27;a&#x27;</span>)<span class="comment"># 注：删除 key=‘a’ 的元素</span></span><br><span class="line"><span class="number">5</span><span class="comment"># 注：pop有返回值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = a.pop(<span class="string">&#x27;b&#x27;</span>)<span class="comment"># 注：获取返回值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c</span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;c&#x27;</span>: <span class="number">4</span>, <span class="string">&#x27;d&#x27;</span>: <span class="literal">False</span>&#125;</span><br><span class="line"><span class="comment"># 示例：dicts.popitem()</span></span><br><span class="line"><span class="comment"># python3里面删除的是最后一个</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="string">&quot;x&quot;</span>:<span class="number">1</span>,<span class="string">&quot;y&quot;</span>:<span class="number">2</span>,<span class="string">&quot;z&quot;</span>:<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.popitem()</span><br><span class="line">(<span class="string">&#x27;z&#x27;</span>, <span class="number">3</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.popitem()</span><br><span class="line">(<span class="string">&#x27;y&#x27;</span>, <span class="number">2</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.popitem()</span><br><span class="line">(<span class="string">&#x27;x&#x27;</span>, <span class="number">1</span>)</span><br></pre></td></tr></table></figure><h4 id="合并">合并<a class="header-anchor" href="#合并"></a></h4><figure class="highlight plaintext"><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">用法1：dict1.update(dict2)=&gt;将dict2合并到dict1</span><br><span class="line">用法2：dict(dict1,**dict2)=&gt;将dict1与dict2合并生成一个新字典</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><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：dict1.update(dict2)</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="string">&quot;x&quot;</span>:<span class="number">1</span>,<span class="string">&quot;y&quot;</span>:<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = &#123;<span class="string">&quot;q&quot;</span>:<span class="number">2</span>,<span class="string">&quot;w&quot;</span>:<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.update(b)<span class="comment"># 注：a自带的属性</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;x&#x27;</span>: <span class="number">1</span>, <span class="string">&#x27;y&#x27;</span>: <span class="number">3</span>, <span class="string">&#x27;q&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;w&#x27;</span>: <span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b</span><br><span class="line">&#123;<span class="string">&#x27;q&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;w&#x27;</span>: <span class="number">3</span>&#125;</span><br><span class="line"><span class="comment"># 示例：dict(dict1, **dict2)</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="string">&quot;x&quot;</span>:<span class="number">1</span>,<span class="string">&quot;y&quot;</span>:<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = &#123;<span class="string">&quot;q&quot;</span>:<span class="number">2</span>,<span class="string">&quot;w&quot;</span>:<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">dict</span>(a,**b)<span class="comment"># 注：工厂函数，返回一个字典  a和b的合并</span></span><br><span class="line">&#123;<span class="string">&#x27;x&#x27;</span>: <span class="number">1</span>, <span class="string">&#x27;y&#x27;</span>: <span class="number">3</span>, <span class="string">&#x27;q&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;w&#x27;</span>: <span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a<span class="comment"># 注：a本身没有改变</span></span><br><span class="line">&#123;<span class="string">&#x27;x&#x27;</span>: <span class="number">1</span>, <span class="string">&#x27;y&#x27;</span>: <span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">dict</span>()</span><br><span class="line">&#123;&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = <span class="built_in">dict</span>(a,**b)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c</span><br><span class="line">&#123;<span class="string">&#x27;x&#x27;</span>: <span class="number">1</span>, <span class="string">&#x27;y&#x27;</span>: <span class="number">3</span>, <span class="string">&#x27;q&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;w&#x27;</span>: <span class="number">3</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="成员关系-2">成员关系<a class="header-anchor" href="#成员关系-2"></a></h4><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">item in dicts</span><br><span class="line">item not in dicts</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="string">&quot;x&quot;</span>:<span class="number">1</span>,<span class="string">&quot;y&quot;</span>:<span class="number">2</span>,<span class="string">&quot;z&quot;</span>:<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;x&#x27;</span>: <span class="number">1</span>, <span class="string">&#x27;y&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;z&#x27;</span>: <span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="string">&#x27;x&#x27;</span> <span class="keyword">in</span> a<span class="comment"># 注：in  默认 对比的是key值</span></span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="number">2</span> <span class="keyword">in</span> a</span><br><span class="line"><span class="literal">False</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="number">2</span> <span class="keyword">in</span> a.values()<span class="comment"># 注：a.values()对比的是value值</span></span><br><span class="line"><span class="literal">True</span></span><br></pre></td></tr></table></figure><h4 id="遍历-3">遍历<a class="header-anchor" href="#遍历-3"></a></h4><p>​默认遍历的是 key</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">&#x27;x&#x27;</span>: <span class="number">1</span>, <span class="string">&#x27;y&#x27;</span>: <span class="number">2</span>, <span class="string">&#x27;z&#x27;</span>: <span class="number">3</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 遍历key值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> a:</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(i)</span><br><span class="line"><span class="meta">... </span></span><br><span class="line">x              <span class="comment"># 注：遍历key值</span></span><br><span class="line">y</span><br><span class="line">z</span><br><span class="line"></span><br><span class="line"><span class="comment"># 遍历value值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> a.values():</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(i)</span><br><span class="line"><span class="meta">... </span></span><br><span class="line"><span class="number">1</span>               <span class="comment"># 注：遍历value值</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="number">3</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 既想获得key  也想获得value</span></span><br><span class="line"><span class="comment"># items返回的是元组</span></span><br><span class="line"><span class="comment"># 方式1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> a.items():</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(i)</span><br><span class="line"><span class="meta">... </span></span><br><span class="line">(<span class="string">&#x27;x&#x27;</span>, <span class="number">1</span>)</span><br><span class="line">(<span class="string">&#x27;y&#x27;</span>, <span class="number">2</span>)</span><br><span class="line">(<span class="string">&#x27;z&#x27;</span>, <span class="number">3</span>)</span><br><span class="line"><span class="comment"># 方式2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i,j <span class="keyword">in</span> a.items():<span class="comment"># 注：2个参数获取返回值key,value</span></span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(<span class="string">f&quot;key is <span class="subst">&#123;i&#125;</span>, value is <span class="subst">&#123;j&#125;</span>&quot;</span>)</span><br><span class="line"><span class="meta">... </span></span><br><span class="line">key <span class="keyword">is</span> x, value <span class="keyword">is</span> <span class="number">1</span></span><br><span class="line">key <span class="keyword">is</span> y, value <span class="keyword">is</span> <span class="number">2</span></span><br><span class="line">key <span class="keyword">is</span> z, value <span class="keyword">is</span> <span class="number">3</span></span><br><span class="line"><span class="comment"># 方式3</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> a.items():</span><br><span class="line"><span class="meta">... </span>    <span class="built_in">print</span>(<span class="string">f&quot;key is <span class="subst">&#123;i[<span class="number">0</span>]&#125;</span>, value is <span class="subst">&#123;i[<span class="number">1</span>]&#125;</span>&quot;</span>)<span class="comment"># 注：索引获取参数</span></span><br><span class="line"><span class="meta">... </span></span><br><span class="line">key <span class="keyword">is</span> x, value <span class="keyword">is</span> <span class="number">1</span></span><br><span class="line">key <span class="keyword">is</span> y, value <span class="keyword">is</span> <span class="number">2</span></span><br><span class="line">key <span class="keyword">is</span> z, value <span class="keyword">is</span> <span class="number">3</span></span><br></pre></td></tr></table></figure><hr><h2 id="四-集合（set）">四. 集合（set）<a class="header-anchor" href="#四-集合（set）"></a></h2><figure class="highlight plaintext"><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><br><span class="line">集合是一个只含有key的字典</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">集合的作用</span><br><span class="line">去重：把一个列表变成集合，就自动去重了</span><br><span class="line">关系测试：测试两组数据之前的交集、差集、并集等关系</span><br><span class="line">example:</span><br><span class="line">singer=&#123;&quot;李圣杰&quot;,&#x27;张韶涵&#x27;,&#x27;汪峰&#x27;&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">集合的定义</span><br><span class="line">集合通过花括号中，而各个元素用逗号分割</span><br><span class="line">集合元素必须是可hash对象，跟字典一样</span><br><span class="line">set和dict的唯一区别仅在于没有存储对应的value</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># 定义空集合（2种方式）</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = &#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>&#125;<span class="comment"># 注：第1种方式</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(a)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;set&#x27;</span>&gt;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="built_in">set</span>()<span class="comment"># 注：第2种方式</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line"><span class="built_in">set</span>()</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">type</span>(a)</span><br><span class="line">&lt;<span class="keyword">class</span> <span class="string">&#x27;set&#x27;</span>&gt;</span><br></pre></td></tr></table></figure><h3 id="集合基本操作">集合基本操作<a class="header-anchor" href="#集合基本操作"></a></h3><h4 id="添加">添加<a class="header-anchor" href="#添加"></a></h4><figure class="highlight plaintext"><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">用法：s.add(item)=&gt;添加一项</span><br><span class="line">用法：s.update(someitems)=&gt;添加多项</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s = &#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s.add(<span class="number">4</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s.update(<span class="string">&quot;str&quot;</span>)<span class="comment"># 注：str被扩展进来，是一个一个被扩展进来的</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="string">&#x27;t&#x27;</span>, <span class="string">&#x27;r&#x27;</span>, <span class="string">&#x27;s&#x27;</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s.update(&#123;<span class="string">&quot;x&quot;</span>:<span class="number">1</span>,<span class="string">&quot;y&quot;</span>:<span class="number">2</span>&#125;)<span class="comment"># 注：字典  扩展的是 key值</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="string">&#x27;x&#x27;</span>, <span class="string">&#x27;t&#x27;</span>, <span class="string">&#x27;y&#x27;</span>, <span class="string">&#x27;r&#x27;</span>, <span class="string">&#x27;s&#x27;</span>&#125;</span><br></pre></td></tr></table></figure><h4 id="移除">移除<a class="header-anchor" href="#移除"></a></h4><figure class="highlight plaintext"><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">用法1：s.remove(item)=&gt;移除一项(item不存在会出错KeyError)</span><br><span class="line">用法2：s.discard(item)=&gt;移除一项(item不存在则什么也不做)</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><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"># 示例</span></span><br><span class="line"><span class="comment"># remove</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="string">&#x27;x&#x27;</span>, <span class="string">&#x27;t&#x27;</span>, <span class="string">&#x27;y&#x27;</span>, <span class="string">&#x27;r&#x27;</span>, <span class="string">&#x27;s&#x27;</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s.remove(<span class="string">&#x27;r&#x27;</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="string">&#x27;x&#x27;</span>, <span class="string">&#x27;t&#x27;</span>, <span class="string">&#x27;y&#x27;</span>, <span class="string">&#x27;s&#x27;</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s.remove(<span class="string">&#x27;p&#x27;</span>)<span class="comment"># 注：“p”不存在，报错</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">KeyError: <span class="string">&#x27;p&#x27;</span></span><br><span class="line"><span class="comment"># discard</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="string">&#x27;x&#x27;</span>, <span class="string">&#x27;t&#x27;</span>, <span class="string">&#x27;y&#x27;</span>, <span class="string">&#x27;s&#x27;</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s.discard(<span class="string">&#x27;o&#x27;</span>)<span class="comment"># 注：不存在 不报错  什么也不做</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s.discard(<span class="string">&#x27;x&#x27;</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="string">&#x27;t&#x27;</span>, <span class="string">&#x27;y&#x27;</span>, <span class="string">&#x27;s&#x27;</span>&#125;</span><br><span class="line"><span class="comment"># pop</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a=&#123;<span class="string">&quot;a&quot;</span>,<span class="string">&quot;b&quot;</span>,<span class="string">&quot;c&quot;</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.pop()</span><br><span class="line"><span class="string">&#x27;c&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.pop()</span><br><span class="line"><span class="string">&#x27;a&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.pop()</span><br><span class="line"><span class="string">&#x27;b&#x27;</span></span><br></pre></td></tr></table></figure><h4 id="集合操作">集合操作<a class="header-anchor" href="#集合操作"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">并集：t和s的并集,返回一个新的set包含s和t中的每一个元素</span><br><span class="line">交集:t和s的交集,返回一个新的set包含s和t中的公共元素</span><br><span class="line">差集:返回一个新的set包含s中有但是t中没有的元素</span><br><span class="line">对称差集:返回一个新的set包含s和t中不重复的元素（在t或s中，但不会同时出现在二者中）</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><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"><span class="comment"># 创建集合</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">set</span>(<span class="string">&#x27;hello&#x27;</span>)</span><br><span class="line">&#123;<span class="string">&#x27;e&#x27;</span>, <span class="string">&#x27;o&#x27;</span>, <span class="string">&#x27;l&#x27;</span>, <span class="string">&#x27;h&#x27;</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 并集</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 = &#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s2 = &#123;<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 | s2</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1.union(s2)</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 交集</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 = &#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s2 = &#123;<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 &amp; s2</span><br><span class="line">&#123;<span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1.intersection(s2)</span><br><span class="line">&#123;<span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 差集</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 = &#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s2 = &#123;<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 - s2</span><br><span class="line">&#123;<span class="number">1</span>&#125;</span><br><span class="line"><span class="comment"># 注：s1里面有的,s2里面没有的</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s2 - s1</span><br><span class="line">&#123;<span class="number">4</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 对称差集</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 = &#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s2 = &#123;<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>&#125;</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>s1 ^ s2</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">4</span>&#125;</span><br><span class="line"><span class="comment"># 注：除了交集 的部分</span></span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 数据类型 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>02_Python-CSDN_数据类型1</title>
      <link href="/posts/4979.html"/>
      <url>/posts/4979.html</url>
      
        <content type="html"><![CDATA[<h2 id="基本类型">基本类型<a class="header-anchor" href="#基本类型"></a></h2><h3 id="Python数字">Python数字<a class="header-anchor" href="#Python数字"></a></h3><p>在Python中有3种类型的数——整数、浮点数和复数</p><table><thead><tr><th>数字类型</th><th>示例</th><th>说明</th></tr></thead><tbody><tr><td>整数</td><td>-2, 12389 <br/> 999999L, ∞ <br/> 0b1110, 0xabf, 0o126</td><td>python2中区分整型、长整型，长整型的整数可以 无穷大 <br/> python3中统称为整型 <br/> 整型的二进制，十六进制，八进制表示法</td></tr><tr><td>浮点数</td><td>-3.23, -52.3E-4</td><td>在 python 中可以用科学计数法表示浮点数</td></tr><tr><td>复数</td><td>-5+4j,2.3-4.6j</td><td>其中-5,4为实数，j为虚数</td></tr></tbody></table><ol><li class="lvl-3"><p><mark>int</mark></p><p>python3 中只有 int（可存超长数据）</p><table><thead><tr><th>整型进制表示法</th><th colspan="2"></th></tr></thead><tbody><tr><td>进制</td><td>表示方法</td><td>示例</td></tr><tr><td>二进制</td><td>以0b开头，只能包含0、1，逢2进1</td><td>0b11，0b12（错误的表示）</td></tr><tr><td>八进制</td><td>以0o开头，能包含0-7，逢8进1</td><td>0o11</td></tr><tr><td>十六进制</td><td>以0x开头，能包含0-F，逢16进1</td><td>0x11</td></tr><tr><td>十进制</td><td>直接由数字0-9组成，逢10进1</td><td>11</td></tr></tbody></table><p>整型进制操作</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">进制转换-bin:任意进制转2进制,接收一个int,返回一个str</span><br><span class="line">进制转换-oct:任意进制转8进制,接收一个int,返回一个str</span><br><span class="line">进制转换-hex:任意进制转16进制,接收一个int,返回一个str</span><br><span class="line">进制转换-int:任意进制转10进制,接收一个int/str,返回一个int</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">bin</span>(<span class="number">10</span>)<span class="comment"># 10进制转2进制</span></span><br><span class="line"><span class="string">&#x27;0b1010&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">bin</span>(<span class="number">0o71</span>)<span class="comment"># 8进制转2进制</span></span><br><span class="line"><span class="string">&#x27;0b111001&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">bin</span>(<span class="number">0x11</span>)<span class="comment"># 16进制转2进制</span></span><br><span class="line"><span class="string">&#x27;0b10001&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">int</span>(<span class="string">&quot;10&quot;</span>)</span><br><span class="line"><span class="number">10</span><span class="comment"># str 转换成 int</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">int</span>(<span class="string">&quot;0o11&quot;</span>,base=<span class="number">8</span>)<span class="comment"># 8进制的字符串，要指定一下</span></span><br><span class="line"><span class="number">9</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">int</span>(<span class="number">0o11</span>)<span class="comment"># 8进制整型 直接转换</span></span><br><span class="line"><span class="number">9</span></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p><mark>float</mark></p><p>float(浮点型)：浮点数即带有小数点的数字</p><p>​float由整数位，小数点，小数位组成，也可以用科学计数法表示，例如-3.23，-52.3E-4，6.23E12</p><p>​float是不精确的</p><p><strong>decimal模块</strong></p><p>​Decimal类型数据是精确的小数，可以传递给Decimal整型或者字符串参数</p><p>官方文档</p><p>​float<a href="https://docs.python.org/3/library/functions.html#float">https://docs.python.org/3/library/functions.html#float</a></p><p>​decimal<a href="https://docs.python.org/3/library/decimal.html?highlight=decimal">https://docs.python.org/3/library/decimal.html?highlight=decimal</a></p></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：浮点型数据float是不精确的</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i = <span class="number">1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i = i - <span class="number">0.1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i</span><br><span class="line"><span class="number">0.9</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i = i - <span class="number">0.1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i</span><br><span class="line"><span class="number">0.8</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i = i - <span class="number">0.1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i</span><br><span class="line"><span class="number">0.7000000000000001</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i = i - <span class="number">0.1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>i</span><br><span class="line"><span class="number">0.6000000000000001</span></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：Decimal类型数据是精确的小数，可以传递给Decimal整型或者字符串参数</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">from</span> decimal <span class="keyword">import</span> getcontext, Decimal, Context</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>mydec = Decimal.from_float(<span class="number">12.222</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>mydec</span><br><span class="line">Decimal(<span class="string">&#x27;12.2219999999999995310417943983338773250579833984375&#x27;</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>mydec = Decimal(<span class="number">0.9</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>mydec</span><br><span class="line">Decimal(<span class="string">&#x27;0.90000000000000002220446049250313080847263336181640625&#x27;</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>mydec = Decimal(<span class="string">&quot;3.14&quot;</span>)</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>mydec</span><br><span class="line">Decimal(<span class="string">&#x27;3.14&#x27;</span>)</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p><mark>complex</mark></p><p>复数complex：复数就是实数和虚数的统称</p><p>在数学中的表示：复数的基本形式是a+bi,其中a,b是实数,a称为实部,bi称为虚部,i是虚数单位</p><p>complex的组成：复数由实数部分和虚数部分组成，一般形式为x＋yj，其中的x是复数的实数部分，y是复数的虚数部分，这里的x和y都是实数</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="number">5</span> + <span class="number">4j</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.real</span><br><span class="line"><span class="number">5.0</span><span class="comment"># 存放的是浮点型</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a.imag</span><br><span class="line"><span class="number">4.0</span></span><br></pre></td></tr></table></figure></li></ol><h3 id="Python字符串">Python字符串<a class="header-anchor" href="#Python字符串"></a></h3><p>字符串：字符串是字符的序列</p><p>表示方法：单引号（‘）；双引号（“）；三引号（’''或”””）；原样输出</p><table><thead><tr><th>符号</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td>单引(')</td><td>可引用包含双引号的字符串</td><td>‘say“hello”’</td></tr><tr><td>双引号(“)</td><td>可引用包含单引号的字符串</td><td>“What’syourname?”</td></tr><tr><td>三号引(‘’'或”””)</td><td>可引用一个多行的字符串，在三引号中可自由使用单引号和双引号</td><td>‘’‘<br/>这是多行字符<br/>里面可包含单引号’和双引号”<br/>’‘’</td></tr><tr><td>特殊标记®</td><td>不使得转义字符，将字符原样输出</td><td>r”hello\tworld!”</td></tr></tbody></table><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&#x27;test&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="string">&quot;test&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line"><span class="string">&#x27;test&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b</span><br><span class="line"><span class="string">&#x27;test&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string"><span class="meta">... </span>t</span></span><br><span class="line"><span class="string"><span class="meta">... </span>e</span></span><br><span class="line"><span class="string"><span class="meta">... </span>s</span></span><br><span class="line"><span class="string"><span class="meta">... </span>t&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a</span><br><span class="line"><span class="string">&#x27;\nt\ne\ns\nt&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(a)</span><br><span class="line"></span><br><span class="line">t</span><br><span class="line">e</span><br><span class="line">s</span><br><span class="line">t</span><br><span class="line"><span class="comment"># print(a)按照规定的格式打印输出</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = <span class="string">&quot;t1\nt2&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c</span><br><span class="line"><span class="string">&#x27;t1\nt2&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(c)</span><br><span class="line">t1</span><br><span class="line">t2</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = <span class="string">&#x27;t1\nt2&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c</span><br><span class="line"><span class="string">&#x27;t1\nt2&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(c)</span><br><span class="line">t1</span><br><span class="line">t2</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = <span class="string">r&quot;t1\nt2&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(c)</span><br><span class="line">t1\nt2</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><mark>转义字符</mark></p><p>​转义字符是一种特殊的字符常量。转义字符以反斜线&quot;&quot;开头，后跟一个或几个字符。转义字符具有特定的含义，不同于字符原有的意义，故称“转义”字符。</p></li></ul><table><thead><tr><th>转义字符</th><th>描述</th><th>转义字符</th><th>描述</th><th>转义字符</th><th>描述</th></tr></thead><tbody><tr><td>\(在行尾时)</td><td>续行符</td><td>\n</td><td>换行</td><td>\oyy</td><td>八进制数，yy代表的字符，例如：\o12代表换行</td></tr><tr><td>\\</td><td>反斜杠符号</td><td>\v</td><td>纵向制表符</td><td>\xyy</td><td>十六进制数，yy代表的字符，例如：\x0a代表换行</td></tr><tr><td>\’</td><td>单引号</td><td>\t</td><td>横向制表符</td><td>\other</td><td>其它的字符以普通格式输出</td></tr><tr><td>\&quot;</td><td>双引号</td><td>\r</td><td>回车</td><td>\b</td><td>退格(Backspace)</td></tr><tr><td>\a</td><td>响铃</td><td>\f</td><td>换页</td><td>\e</td><td>转义</td></tr><tr></tr></tbody></table><ol><li class="lvl-3"><p><mark>字符串取值</mark></p><p>​下标取值法（注意：下标从0开始）</p><p>​切片取值法</p></li></ol><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"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;test&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">0</span>]</span><br><span class="line"><span class="string">&#x27;t&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;test&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">0</span>:<span class="number">2</span>]<span class="comment"># 取下标为0~2的数据。包括0，不包括2</span></span><br><span class="line"><span class="string">&#x27;te&#x27;</span><span class="comment"># 前面包括，后面不包括</span></span><br></pre></td></tr></table></figure><p>字符串的不可变的序列</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&quot;hello world&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a[<span class="number">4</span>] = <span class="string">&quot;1&quot;</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;&lt;stdin&gt;&quot;</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">TypeError: <span class="string">&#x27;str&#x27;</span> <span class="built_in">object</span> does <span class="keyword">not</span> support item assignment</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">id</span>(a)</span><br><span class="line"><span class="number">140585442705648</span></span><br></pre></td></tr></table></figure><p>级连字符串</p><p>如果把两个字符串相邻放着，它们会被python自动级连</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"><span class="comment"># 示例</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>info = <span class="string">&quot;chen&quot;</span><span class="string">&quot;peng&quot;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>info</span><br><span class="line"><span class="string">&#x27;chenpeng&#x27;</span></span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p><mark>字符串常用方法</mark></p><ol><li class="lvl-6"><mark>字符串常用方法——判断系列（True/False）</mark></li></ol></li></ol><table><thead><tr><th>方法</th><th>功能</th></tr></thead><tbody><tr><td>str.isdigit()</td><td>字符串中是否只包含数字</td></tr><tr><td>str.isnumeric()</td><td>字符串中是否只包含数字（包括中文一到九等）</td></tr><tr><td>str.isalnum()</td><td>字符串中是否只包含字母或数字</td></tr><tr><td>str.istitle()</td><td>字符串中是否每个单词首字母大写，其他字母小写</td></tr><tr><td>str.isalpha()</td><td>字符串中是否只包含字母（汉字会算作字母）</td></tr><tr><td>str.isupper()</td><td>字符串中是否全为大写</td></tr><tr><td>str.isidentifier()</td><td>字符串是否为合法标识符</td></tr><tr><td>str.isprintable()</td><td>字符串是否为可打印字符</td></tr><tr><td>str.islower()</td><td>字符串中是否全为小写</td></tr><tr><td>str.isspace()</td><td>字符串中是否只包含空格（tab也算空格）</td></tr><tr><td>str.startswith(prefix[,start[,end]])</td><td>字符串是否以某字符串开始，可以通过start和stop参数设置搜索范围</td></tr><tr><td>str.endswith(suffix[,start[,end]])</td><td>字符串是否以某个字符串结束，可以通过start和stop参数设置搜索范围</td></tr></tbody></table><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="comment"># 示例</span></span><br><span class="line">my_str = <span class="string">&quot;This Is TEST!&quot;</span></span><br><span class="line">my_title = <span class="string">&quot;This is My Title&quot;</span></span><br><span class="line">my_num = <span class="string">&quot;123&quot;</span></span><br><span class="line">my_num2 = <span class="string">&quot;一二三四&quot;</span></span><br><span class="line">my_str2 = <span class="string">&quot;hello&quot;</span></span><br><span class="line">my_str3 = <span class="string">&quot;hello123&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 判断系列</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;判断数字&quot;</span>, my_num.isdigit())     <span class="comment"># 字符串中是否只包含数字</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;判断数字&quot;</span>, my_num.isnumeric())   <span class="comment"># 字符串中是否只包含数字（包括中文一到九等）</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;判断数字&quot;</span>, my_num2.isdigit())    <span class="comment"># 只能判断阿拉伯数字</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;判断数字&quot;</span>, my_num2.isnumeric())  <span class="comment"># 可以判断中文数字</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;判断字母：&quot;</span>, my_str.isalpha())      <span class="comment"># 有空格/“!”会报错 # 判断字母（汉字会算作字母）</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;判断字母数字：&quot;</span>, my_str3.isalnum()) <span class="comment"># 有空格会报错 # 判断字母数字</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;判断字符串是否以This开始&quot;</span>, my_title.startswith(<span class="string">&quot;This&quot;</span>))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;判断字符串是否以This结束&quot;</span>, my_title.endswith(<span class="string">&quot;This&quot;</span>))</span><br></pre></td></tr></table></figure><p>​</p><p>​2. <mark>字符串常用方法——查找统计类</mark></p><table><thead><tr><th>方法</th><th>功能</th></tr></thead><tbody><tr><td>len(string)</td><td>统计字符串长度</td></tr><tr><td>str.index(sub[,start[,end]])</td><td>显示substring在字符串中第一次出现的下标位置，没有会报错</td></tr><tr><td>str.find(sub[,start[,end]])</td><td>查找substring,找到返回其起始位置，找不到返回-1</td></tr></tbody></table><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"># 示例</span></span><br><span class="line"><span class="comment"># 查找统计类</span></span><br><span class="line">my_str = <span class="string">&quot;This Is TEST!&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;长度：&quot;</span>, <span class="built_in">len</span>(my_str))<span class="comment"># 空格、！占长度</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;i 第一次出现的位置&quot;</span>, my_str.index(<span class="string">&quot;i&quot;</span>))<span class="comment"># 字符串“i”第一次出现的位置</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;i 第一次出现的位置&quot;</span>, my_str.find(<span class="string">&quot;i&quot;</span>))<span class="comment"># 字符串“i”第一次出现的位置，找不到返回-1</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;i 出现的次数&quot;</span>, my_str.count(<span class="string">&quot;i&quot;</span>))</span><br></pre></td></tr></table></figure><p>​3. <mark>字符串常用方法——字符串转换类（返回一个新对象）</mark></p><table><thead><tr><th>方法</th><th>功能</th></tr></thead><tbody><tr><td>str.upper()</td><td>将字符串转换为大写</td></tr><tr><td>str.lower()</td><td>将字符串转换为小写</td></tr><tr><td>str.title()</td><td>将字符串中的单词首字母大写，其他字母小写</td></tr><tr><td>str.split(‘sep’)</td><td>指定’sep’作为分隔符将字符串切割成列表，分隔符可以是任意字符（默认是空格）</td></tr><tr><td>‘str’.join(list)</td><td>将列表用str拼接成一个大字符串</td></tr><tr><td>str.strip([string])</td><td>去除字符串中首尾的字符串，不带参数默认去除空格</td></tr><tr><td>str.zfill(number)</td><td>返回指定长度的字符串，原字符串右对齐，前面填充0</td></tr><tr><td>str.replace(‘old’,‘new’[,count])</td><td>用新的字符替换老字符，还可以指定替换的个数，默认全部替换</td></tr><tr><td>str.capitalize()</td><td>句子首字母大写</td></tr><tr><td>str.center(width[,fillchar])str.ljust(width[,fillchar])str.rjust(width[,fillchar])</td><td>返回一个原字符串居中(靠左/靠右)对齐，width为总长度，两边用一个字符fillchar填充，如果指定的长度小于原字符串的长度则返回原字符串</td></tr><tr><td>str.expandtabs(number)</td><td>将\t转换成number个空格</td></tr></tbody></table><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># 字符串转换类</span></span><br><span class="line">msg = <span class="string">&quot;  hEllo World Chen   &quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;大写&quot;</span>, msg.upper())</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;小写&quot;</span>, msg.lower())</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;标题&quot;</span>, msg.title())</span><br><span class="line"></span><br><span class="line">msg2 = <span class="string">&quot;root:x:0:0:root:/root:/bin/bash&quot;</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;切割：&quot;</span>, msg2.split(<span class="string">&quot;:&quot;</span>))</span><br><span class="line">msg3 = msg2.split(<span class="string">&quot;:&quot;</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;拼接：&quot;</span>, <span class="string">&quot;#&quot;</span>.join(msg3))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;去除首尾空白&quot;</span>, msg.strip(), <span class="string">&quot;######&quot;</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;去除root首尾：&quot;</span>, msg2.strip(<span class="string">&quot;root&quot;</span>))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;字符串填充：&quot;</span>, msg.zfill(<span class="number">40</span>))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;字符串替换&quot;</span>, msg2.replace(<span class="string">&quot;:&quot;</span>, <span class="string">&quot;%&quot;</span>))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;整个字符串首字母大写&quot;</span>, msg.capitalize())</span><br><span class="line">msg4 = <span class="string">&quot;xxx&quot;</span></span><br><span class="line"><span class="built_in">print</span>(msg4.center(<span class="number">50</span>, <span class="string">&#x27; &#x27;</span>))</span><br><span class="line"><span class="built_in">print</span>(msg4.center(<span class="number">50</span>, <span class="string">&#x27;-&#x27;</span>))</span><br><span class="line"><span class="built_in">print</span>(msg4.ljust(<span class="number">50</span>, <span class="string">&quot;-&quot;</span>))</span><br><span class="line"><span class="built_in">print</span>(msg4.rjust(<span class="number">50</span>, <span class="string">&quot;-&quot;</span>))</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"><p><mark>字符串拼接</mark></p></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># 字符串拼接（+）</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="string">&#x27;I&#x27;</span> + <span class="string">&#x27;Love&#x27;</span> + <span class="string">&#x27;Python&#x27;</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(a)</span><br><span class="line">ILovePython</span><br><span class="line"></span><br><span class="line"><span class="comment">#字符串拼接（join）</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = [<span class="string">&#x27;I&#x27;</span>, <span class="string">&#x27;Love&#x27;</span>, <span class="string">&#x27;Python&#x27;</span>]</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(<span class="string">&#x27;&#x27;</span>.join(a))</span><br><span class="line">ILovePython</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">+ 与 join的效率问题</span><br><span class="line">一般来说，+ 拼接 效率比 join 拼接低</span><br><span class="line">+拼接，每一次出现都会在内存中开辟1个新的空间，所有效率低，比较耗时</span><br><span class="line">join一次性拼接成1个大的字符串</span><br></pre></td></tr></table></figure><ol start="4"><li class="lvl-3"><p><mark>字符串格式化</mark></p></li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">字符串格式化（%）</span><br><span class="line">基本格式</span><br><span class="line">%[(name)][flags][width].[precision]typecode</span><br><span class="line">-(name):命名</span><br><span class="line">-flags:+,-,&#x27;&#x27;或0。+表示右对齐；-表示左对齐；&#x27;&#x27;为一个空格，表示在正数的左侧填充一个空格，从而与负数对齐，0表示使用0填充</span><br><span class="line">-width表示显示宽度</span><br><span class="line">-precision表示小数点后精度</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># %格式化 </span></span><br><span class="line">name = <span class="string">&quot;wen&quot;</span></span><br><span class="line">age = <span class="number">18</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;姓名： %s, 年龄： %s&quot;</span>%(name, age))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;姓名： %s, 年龄： %s&quot;</span>%(age, <span class="string">&quot;wen2&quot;</span>))</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><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">字符串格式化(format)</span><br><span class="line">&#123;变量:[填充字符][对齐方式 &lt;^&gt;][宽度][格式]&#125;</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><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="comment"># 示例</span></span><br><span class="line"><span class="comment"># format 格式化</span></span><br><span class="line">name = <span class="string">&quot;wen&quot;</span></span><br><span class="line">age = <span class="number">18</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format01 --&gt; 姓名：&#123;&#125;， 年龄：&#123;&#125;&quot;</span>.<span class="built_in">format</span>(name, age))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format01 --&gt; 姓名：&#123;&#125;， 年龄：&#123;&#125;&quot;</span>.<span class="built_in">format</span>(age, name))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format02 --&gt; 姓名: &#123;1&#125;, 年龄：&#123;0&#125;&quot;</span>.<span class="built_in">format</span>(name, age))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format02 --&gt; 姓名: &#123;1&#125;, 年龄：&#123;0&#125;&quot;</span>.<span class="built_in">format</span>(age, name))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format03 --&gt; 姓名：&#123;name1&#125;, 年龄：&#123;age1&#125;&quot;</span>.<span class="built_in">format</span>(name1 = name, age1 = age))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format01 --&gt; &#123;0:*&gt;10&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">10</span>,<span class="number">20</span>))  <span class="comment"># 注：0 第1个变量</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format01 --&gt; &#123;1:*&gt;10&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">10</span>,<span class="number">20</span>))  <span class="comment"># 注：1 第2个变量</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format01 --&gt; &#123;1:*&lt;10&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">10</span>,<span class="number">20</span>))  <span class="comment"># 注：：执行 ; * 填充字符</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format01 --&gt; &#123;1:*^10&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">10</span>,<span class="number">20</span>))  <span class="comment"># 注：^ 居中 ; 10 填充宽度10字符</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format02 --&gt; &#123;0:.2f&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">1</span>/<span class="number">3</span>,<span class="number">5.333</span>))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format02 --&gt; &#123;1:06.2f&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">1</span>/<span class="number">3</span>,<span class="number">5.333</span>))</span><br><span class="line"><span class="comment"># 二进制</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format02 --&gt; &#123;0:b&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">10</span>))</span><br><span class="line"><span class="comment"># 八进制注：16进制是”&#123;0:x&#125;”.format(10)</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format02 --&gt; &#123;0:o&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">10</span>))</span><br><span class="line"><span class="comment"># 千分位格式化</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;format02 --&gt; &#123;0:,&#125;&quot;</span>.<span class="built_in">format</span>(<span class="number">123456789</span>))</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">字符串格式化-f</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line"><span class="comment"># f标志符  格式化</span></span><br><span class="line">a = <span class="string">&quot;I&quot;</span></span><br><span class="line">b = <span class="string">&quot;Love&quot;</span></span><br><span class="line">c = <span class="string">&quot;Python&quot;</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;a&#125;</span><span class="subst">&#123;b&#125;</span><span class="subst">&#123;c&#125;</span>&quot;</span>)</span><br><span class="line"><span class="comment">#结果 ILovePython</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;&#123;a&#125;&#123;b&#125;&#123;c&#125;&quot;</span>.<span class="built_in">format</span>(a = a, b = b, c = c))<span class="comment"># 注：效果等同</span></span><br><span class="line"><span class="comment">#结果 ILovePython</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;a&#125;</span><span class="subst">&#123;b&#125;</span><span class="subst">&#123;c:a^<span class="number">10</span>&#125;</span>&quot;</span>)<span class="comment"># 注：对字符串c的操作：用“a”填充宽度10，居中</span></span><br><span class="line"><span class="comment">#结果 ILoveaaPythonaa</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;&#123;a&#125;&#123;b&#125;&#123;c:a^10&#125;&quot;</span>.<span class="built_in">format</span>(a = a, b = b, c = c)) <span class="comment"># 注：效果等同</span></span><br><span class="line"><span class="comment">#结果 ILoveaaPythonaa</span></span><br></pre></td></tr></table></figure><h3 id="Python数字-Booleans">Python数字-Booleans<a class="header-anchor" href="#Python数字-Booleans"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">布尔值(Booleans)是一个逻辑值</span><br><span class="line">取值范围只有True和False(真和假)</span><br><span class="line">布尔值为假：</span><br><span class="line">&#x27;&#x27;,0,0.0,(),[],&#123;&#125;,None,False</span><br><span class="line">None是一个特殊的常量，表示一种特殊的数据类型（NoneType）</span><br><span class="line">值布尔值为真：</span><br><span class="line">除了为假的，其他的都为真</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例</span></span><br><span class="line">* 布尔值可以相互加减</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>a = <span class="number">1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>b = <span class="number">2</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">print</span>(a == b)</span><br><span class="line"><span class="literal">False</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c = (a == b) + (a == d)<span class="comment"># 注：c = 0 +1</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>c</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="comment"># 布尔值排序</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>lst=[(a==d),(a==b)]  <span class="comment"># 注：(a==d)为真，(a==b)为假</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="built_in">sorted</span>(lst)</span><br><span class="line">[<span class="literal">False</span>, <span class="literal">True</span>]  <span class="comment"># 注：因为默认情况下 0为假，1为真</span></span><br></pre></td></tr></table></figure><h3 id="Others">Others<a class="header-anchor" href="#Others"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">○常量</span><br><span class="line">常量是指一旦初始化后就不能修改的固定值</span><br><span class="line">注意：在Python中表示一个常量通常用大写（约定俗成，非强制）表示，如：PI=3.1415926</span><br><span class="line">○NoneType</span><br><span class="line">None表示什么也没有</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 数据类型 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_Python-CSDN_环境搭建</title>
      <link href="/posts/16756.html"/>
      <url>/posts/16756.html</url>
      
        <content type="html"><![CDATA[<h2 id="①-Python解释器-安装">① Python解释器 安装<a class="header-anchor" href="#①-Python解释器-安装"></a></h2><ol><li class="lvl-3"><p>Windows平台</p><p>下载地址：<a href="https://www.python.org/ftp/python/3.9.5/python-3.9.5-amd64.exe%EF%BC%883.9%E7%89%88%E6%9C%AC%EF%BC%89">https://www.python.org/ftp/python/3.9.5/python-3.9.5-amd64.exe（3.9版本）</a></p><p>安装python39</p><p>​exe安装：注意修改目录、环境变量</p><p>​安装路径：C:/python39（安装路径可以自定，但注意不要包含中文或空格等特殊字符）</p><p>​验证：按键盘“win+R”，输入“cmd” , 在命令行测试</p><p>​C:\Users\cPenadm&gt;<mark>python -V</mark></p><p>​Python 3.9.5</p></li><li class="lvl-3"><p>Linux平台</p><p>自带python（不同版本的操作系统带的python版本不一样）</p><p>centos-yum安装（3.6版本）</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">yum install epel-release</span><br><span class="line">yum install python36</span><br><span class="line">yum install python36-devel</span><br></pre></td></tr></table></figure></li></ol><h2 id="②-pip工具-设置">② pip工具 设置<a class="header-anchor" href="#②-pip工具-设置"></a></h2><p>pip是Python 包管理工具，该工具提供了对Python包的查找、下载、安装、卸载的功能。</p><p>配置国内源<br>解决安装慢的问题</p><ol><li class="lvl-3"><p>方法 1</p><p>升级pip到10.0以上版本</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">pip config <span class="built_in">set</span> global.index-url https://pypi.tuna.tsinghua.edu.cn/simple</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>方法 2</p><ol><li class="lvl-6"><p>Windows平台</p><ul class="lvl-4"><li class="lvl-8"><p>创建目录及文件 <mark>C:\Users&lt;你的用户名&gt;\pip\pip.ini</mark></p></li><li class="lvl-8"><p>pip.ini文件内容如下：修改成阿里的源，其他国内源也可以</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[global]</span><br><span class="line">index-url=http://mirrors.aliyun.com/pypi/simple/</span><br><span class="line">[install]</span><br><span class="line">trusted-host=mirrors.aliyun.com</span><br></pre></td></tr></table></figure></li></ul></li><li class="lvl-6"><p>Linux平台</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="built_in">mkdir</span>  ~/.pip</span><br><span class="line">vim  ~/.pip/pip.conf</span><br><span class="line"><span class="comment">#输入以下内容</span></span><br><span class="line">[global]</span><br><span class="line">index-url = https://pypi.tuna.tsinghua.edu.cn/simple</span><br></pre></td></tr></table></figure></li></ol></li></ol><h2 id="③-PyCharm-安装">③ PyCharm 安装<a class="header-anchor" href="#③-PyCharm-安装"></a></h2><p>PyCharm是由JetBrains打造的一款PythonIDE，支持macOS、Windows、Linux系统</p><p>集成开发环境（IDE,IntegratedDevelopmentEnviroment）是用于提供程序开发环境的应用程序，一般包括代码编辑器、编译器、调试器和图形用户界面等工具</p><p>优点：界面友好、调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等</p><ol><li class="lvl-3"><p>下载地址</p><p>官网：<a href="http://www.jetbrains.com/pycharm/">http://www.jetbrains.com/pycharm/</a></p></li><li class="lvl-3"><p>安装</p><p>社区版：免费使用，不用激活</p><p>专业版：功能更丰富，需要激活</p></li><li class="lvl-3"><p>激活</p><p>打开pycharm，执行：Help-Register</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203052147100.png" alt=""></p></li><li class="lvl-3"><p>配置Python解释器</p><p>参考：<a href="https://zhuanlan.zhihu.com/p/40716785">https://zhuanlan.zhihu.com/p/40716785</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203052148253.png" alt=""></p></li></ol><hr>]]></content>
      
      
      <categories>
          
          <category> Python </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Python </tag>
            
            <tag> 环境 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>04_Django-模板变量/标签/过滤器/继承-url反向解析</title>
      <link href="/posts/65154.html"/>
      <url>/posts/65154.html</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1vK4y1o7jH">视频链接：https://www.bilibili.com/video/BV1vK4y1o7jH</a></p><h2 id="一-模板层-变量和标签">一. 模板层 - 变量和标签<a class="header-anchor" href="#一-模板层-变量和标签"></a></h2><h3 id="变量">变量<a class="header-anchor" href="#变量"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>视图函数中可以将Python变量封装到 <strong>字典</strong> 中传递到模板上</p></li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">xxx_view</span>(<span class="params">request</span>):</span><br><span class="line">    dic = &#123;</span><br><span class="line">        <span class="string">&quot;变量1&quot;</span>: <span class="string">&quot;值1&quot;</span>,</span><br><span class="line">        <span class="string">&quot;变量2&quot;</span>: <span class="string">&quot;值2&quot;</span>,</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;xxx.html&#x27;</span>, dic)</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>能传递到模板中的 <strong>数据类型</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">str-字符串int-整型</span><br><span class="line">list-数组tuple-元组</span><br><span class="line">dict-字典func-方法</span><br><span class="line">obj-类实例化的对象</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>在模板中使用变量语法</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">- &#123;&#123; 变量名 &#125;&#125;</span><br><span class="line">- &#123;&#123; 变量名.index &#125;&#125;</span><br><span class="line">- &#123;&#123; 变量名.key &#125;&#125;</span><br><span class="line">- &#123;&#123; 对象.方法 &#125;&#125;</span><br><span class="line">- &#123;&#123; 函数名 &#125;&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>演示：</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_html_param</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160138597.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;test_html&#x27;</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html_param</span>(<span class="params">request</span>):</span><br><span class="line">    dic = &#123;&#125;</span><br><span class="line">    dic[<span class="string">&#x27;int&#x27;</span>] = <span class="number">88</span></span><br><span class="line">    dic[<span class="string">&#x27;str&#x27;</span>] = <span class="string">&#x27;peng&#x27;</span></span><br><span class="line">    dic[<span class="string">&#x27;lst&#x27;</span>] = [<span class="string">&#x27;Tom&#x27;</span>, <span class="string">&#x27;Jack&#x27;</span>, <span class="string">&#x27;Lily&#x27;</span>]</span><br><span class="line">    dic[<span class="string">&#x27;dict&#x27;</span>] = &#123;<span class="string">&#x27;a&#x27;</span>:<span class="number">9</span>, <span class="string">&#x27;b&#x27;</span>:<span class="number">8</span>&#125;</span><br><span class="line">    dic[<span class="string">&#x27;func&#x27;</span>] = say_hi</span><br><span class="line">    dic[<span class="string">&#x27;class_obj&#x27;</span>] = Dog()</span><br><span class="line">    dic[<span class="string">&#x27;script&#x27;</span>] = <span class="string">&#x27;&lt;script&gt;alert(1111)&lt;/script&gt;&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_html_param.html&#x27;</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">say_hi</span>():</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;hahaha&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">say</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;wangwang&#x27;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_html_param.html</span></span><br><span class="line">&lt;h3&gt;<span class="built_in">int</span> 是 &#123;&#123; <span class="built_in">int</span>|add:<span class="string">&quot;2&quot;</span> &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;<span class="built_in">str</span> 是 &#123;&#123; <span class="built_in">str</span>|upper &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;lst 是 &#123;&#123; lst &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;lst 是 &#123;&#123; lst<span class="number">.0</span> &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;<span class="built_in">dict</span> 是 &#123;&#123; <span class="built_in">dict</span> &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;<span class="built_in">dict</span>[<span class="string">&#x27;a&#x27;</span>] 是 &#123;&#123; <span class="built_in">dict</span>.a &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;function 是 &#123;&#123; func &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;class_obj 是 &#123;&#123; class_obj.say &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;script 是 &#123;&#123; script|safe &#125;&#125;&lt;/h3&gt;</span><br></pre></td></tr></table></figure><hr><h3 id="标签">标签<a class="header-anchor" href="#标签"></a></h3><p><strong>模板标签</strong></p><ul class="lvl-0"><li class="lvl-2"><p>作用：将一些服务器端的功能嵌入到模板中，例如流程控制等</p></li><li class="lvl-2"><p>标签语法：</p></li></ul><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">&#123;% 标签 %&#125;</span><br><span class="line">...</span><br><span class="line">&#123;% 结束标签 %&#125;</span><br></pre></td></tr></table></figure><h4 id="if标签">if标签<a class="header-anchor" href="#if标签"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>语法</strong>：</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#123;% if 条件表达式1 %&#125;</span><br><span class="line">...</span><br><span class="line">&#123;% elif 条件表达式2 %&#125;</span><br><span class="line">...</span><br><span class="line">&#123;% elif 条件表达式3 %&#125;</span><br><span class="line">...</span><br><span class="line">&#123;% else %&#125;</span><br><span class="line">...</span><br><span class="line">&#123;% endif %&#125;- 需要有结束标签</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>注意</strong>：</p></li></ul><ol><li class="lvl-3"><p>if条件表达式里可以用的运算符 ==, !=, &lt;, &gt; , &lt;=, &gt;=, in, not in, is, is not, not、and、or</p></li><li class="lvl-3"><p>在if标记中使用实际括号是无效的语法。如果需要它们指示优先级，则应使用嵌套的if标记。</p></li></ol><p>官方文档：<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#if">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#if</a></p><ul class="lvl-0"><li class="lvl-2"><p><strong>演示：</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_if_for</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160204292.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;test_if_for&#x27;</span>, views.test_if_for),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_if_for</span>(<span class="params">request</span>):</span><br><span class="line">    dic = &#123;&#125;</span><br><span class="line">    dic[<span class="string">&#x27;x&#x27;</span>] = <span class="number">20</span></span><br><span class="line">    dic[<span class="string">&#x27;lst&#x27;</span>] = [<span class="string">&#x27;Tom&#x27;</span>, <span class="string">&#x27;Jack&#x27;</span>, <span class="string">&#x27;Lily&#x27;</span>]</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_if_for.html&#x27;</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_if_for.html</span></span><br><span class="line">&#123;% <span class="keyword">if</span> x &gt; <span class="number">10</span> %&#125;</span><br><span class="line">今天天气很好</span><br><span class="line">&#123;% <span class="keyword">else</span> %&#125;</span><br><span class="line">今天天气非常好</span><br><span class="line">&#123;% endif %&#125;</span><br><span class="line"></span><br><span class="line">&lt;br&gt;</span><br><span class="line"></span><br><span class="line">&#123;% <span class="keyword">for</span> name <span class="keyword">in</span> lst %&#125;</span><br><span class="line">    &#123;% <span class="keyword">if</span> forloop.first %&#125; &amp;&amp;&amp;&amp;&amp; &#123;% endif %&#125;</span><br><span class="line">    &lt;p&gt; &#123;&#123; forloop.counter &#125;&#125;  &#123;&#123; name &#125;&#125;&lt;/p&gt;</span><br><span class="line">    &#123;% <span class="keyword">if</span> forloop.last %&#125; ===== &#123;% endif %&#125;</span><br><span class="line">&#123;% empty %&#125;</span><br><span class="line">    当前没数据</span><br><span class="line">&#123;% endfor %&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>模板标签 - if标签 - 练习</strong></p><p>写一个简单的计算器页面，能够在服务端进行简单加减乘除计算（需记录用户上次填写状态、下拉列表选择状态）</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160209924.png" alt=""></p><ul class="lvl-2"><li class="lvl-4"><p>前端参考代码：</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160215265.png" alt=""></p></li><li class="lvl-4"><p><strong>演示：</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/mycal</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160235992.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;mycal&#x27;</span>, views.test_mycal),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_mycal</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">if</span> request.method == <span class="string">&#x27;GET&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> render(request, <span class="string">&#x27;mycal.html&#x27;</span>)</span><br><span class="line">    <span class="keyword">elif</span> request.method == <span class="string">&#x27;POST&#x27;</span>:</span><br><span class="line">        <span class="comment">#处理计算</span></span><br><span class="line">        x = <span class="built_in">int</span>(request.POST[<span class="string">&#x27;x&#x27;</span>])</span><br><span class="line">        y = <span class="built_in">int</span>(request.POST[<span class="string">&#x27;y&#x27;</span>])</span><br><span class="line">        op = request.POST[<span class="string">&#x27;op&#x27;</span>]</span><br><span class="line"></span><br><span class="line">        result = <span class="number">0</span></span><br><span class="line">        <span class="keyword">if</span> op == <span class="string">&#x27;add&#x27;</span>:</span><br><span class="line">            result = x + y</span><br><span class="line">        <span class="keyword">elif</span> op == <span class="string">&#x27;sub&#x27;</span>:</span><br><span class="line">            result = x - y</span><br><span class="line">        <span class="keyword">elif</span> op == <span class="string">&#x27;mul&#x27;</span>:</span><br><span class="line">            result = x * y</span><br><span class="line">        <span class="keyword">elif</span> op == <span class="string">&#x27;div&#x27;</span>:</span><br><span class="line">            result = x / y</span><br><span class="line"></span><br><span class="line">        <span class="comment">#dic=&#123;&#x27;x&#x27;:x, &#x27;y&#x27;:y, &#x27;op&#x27;:op&#125;</span></span><br><span class="line">        <span class="keyword">return</span> render(request, <span class="string">&#x27;mycal.html&#x27;</span>, <span class="built_in">locals</span>())<span class="comment"># locals方法-局部变量直接封装成字典（Python自带方法）</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/mycal.html</span></span><br><span class="line">&lt;form action=<span class="string">&#x27;/mycal&#x27;</span> method=<span class="string">&#x27;post&#x27;</span>&gt;</span><br><span class="line">    &lt;<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">&#x27;text&#x27;</span> name=<span class="string">&quot;x&quot;</span> value=<span class="string">&quot;&#123;&#123; x &#125;&#125;&quot;</span>&gt;</span><br><span class="line">    &lt;select name=<span class="string">&#x27;op&#x27;</span>&gt;</span><br><span class="line">    &lt;option value=<span class="string">&quot;add&quot;</span>  &#123;% <span class="keyword">if</span> op == <span class="string">&#x27;add&#x27;</span> %&#125;selected&#123;% endif %&#125; &gt; +加&lt;/option&gt;<span class="comment"># ☆ 记录op状态，option selected属性，使用了if标签</span></span><br><span class="line">    &lt;option value=<span class="string">&quot;sub&quot;</span>  &#123;% <span class="keyword">if</span> op == <span class="string">&#x27;sub&#x27;</span> %&#125;selected&#123;% endif %&#125;&gt; -减&lt;/option&gt;</span><br><span class="line">    &lt;option value=<span class="string">&quot;mul&quot;</span>  &#123;% <span class="keyword">if</span> op == <span class="string">&#x27;mul&#x27;</span> %&#125;selected&#123;% endif %&#125;&gt; *乘&lt;/option&gt;</span><br><span class="line">    &lt;option value=<span class="string">&quot;div&quot;</span>  &#123;% <span class="keyword">if</span> op == <span class="string">&#x27;div&#x27;</span> %&#125;selected&#123;% endif %&#125;&gt; /除&lt;/option&gt;</span><br><span class="line">    &lt;/select&gt;</span><br><span class="line">    &lt;<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">&#x27;text&#x27;</span> name=<span class="string">&quot;y&quot;</span> value=<span class="string">&quot;&#123;&#123; y &#125;&#125;&quot;</span>&gt; = &lt;span&gt;&#123;&#123; result &#125;&#125;&lt;/span&gt;</span><br><span class="line">    &lt;div&gt;&lt;<span class="built_in">input</span> <span class="built_in">type</span>=<span class="string">&quot;submit&quot;</span> value=<span class="string">&#x27;开始计算&#x27;</span>&gt;&lt;/div&gt;</span><br><span class="line">&lt;/form&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul><h4 id="for标签">for标签<a class="header-anchor" href="#for标签"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>语法：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;% for 变量 in 可迭代对象 %&#125;</span><br><span class="line">    ... 循环语句</span><br><span class="line">&#123;% empty %&#125;</span><br><span class="line">    ... 可迭代对象无数据时填充的语句</span><br><span class="line">&#123;% endfor %&#125;</span><br></pre></td></tr></table></figure><p>官方文档：<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#for">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#for</a></p></li><li class="lvl-2"><p><strong>内置变量 - forloop</strong></p></li></ul><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160246199.png" alt=""></p><ul class="lvl-0"><li class="lvl-2"><p><strong>演示：</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_if_for</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160254425.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;test_if_for&#x27;</span>, views.test_if_for),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_if_for</span>(<span class="params">request</span>):</span><br><span class="line">    dic = &#123;&#125;</span><br><span class="line">    dic[<span class="string">&#x27;lst&#x27;</span>] = [<span class="string">&#x27;Tom&#x27;</span>, <span class="string">&#x27;Jack&#x27;</span>, <span class="string">&#x27;Lily&#x27;</span>]</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_if_for.html&#x27;</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_if_for.html</span></span><br><span class="line">&#123;% <span class="keyword">for</span> name <span class="keyword">in</span> lst %&#125;</span><br><span class="line">    &#123;% <span class="keyword">if</span> forloop.first %&#125; &amp;&amp;&amp;&amp;&amp; &#123;% endif %&#125;</span><br><span class="line">    &lt;p&gt; &#123;&#123; forloop.counter &#125;&#125;  &#123;&#123; name &#125;&#125;&lt;/p&gt;</span><br><span class="line">    &#123;% <span class="keyword">if</span> forloop.last %&#125; ===== &#123;% endif %&#125;</span><br><span class="line">&#123;% empty %&#125;</span><br><span class="line">    当前没数据</span><br><span class="line">&#123;% endfor %&#125;</span><br></pre></td></tr></table></figure><h3 id="小节">小节<a class="header-anchor" href="#小节"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>变量调用 - 点大法</p></li><li class="lvl-2"><p>标签语法 {% 标签 %} {% 结束标签 %}</p></li></ul><hr><h2 id="二-模板层-过滤器和继承">二. 模板层 - 过滤器和继承<a class="header-anchor" href="#二-模板层-过滤器和继承"></a></h2><h3 id="过滤器">过滤器<a class="header-anchor" href="#过滤器"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>定义：在变量输出时对变量的值进行处理</p></li><li class="lvl-2"><p>作用：可以通过使用 过滤器 来改变变量的输出显示</p></li><li class="lvl-2"><p>语法：**{{ 变量 | 过滤器1:'参数1' | 过滤器2:'参数2' ... }}**</p></li></ul><p>官方文档：<a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/">https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/</a></p><ul class="lvl-0"><li class="lvl-2"><p><strong>常用过滤器：</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160307400.png" alt=""></p></li><li class="lvl-2"><p>演示：</p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test_html_param</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160312462.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160313992.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;test_html&#x27;</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html_param</span>(<span class="params">request</span>):</span><br><span class="line">    dic = &#123;&#125;</span><br><span class="line">    dic[<span class="string">&#x27;int&#x27;</span>] = <span class="number">88</span></span><br><span class="line">    dic[<span class="string">&#x27;script&#x27;</span>] = <span class="string">&#x27;&lt;script&gt;alert(1111)&lt;/script&gt;&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_html_param.html&#x27;</span>, dic)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">say_hi</span>():</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;hahaha&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">say</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;wangwang&#x27;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_html_param.html</span></span><br><span class="line">&lt;h3&gt;<span class="built_in">int</span> 是 &#123;&#123; <span class="built_in">int</span>|add:<span class="string">&quot;2&quot;</span> &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;<span class="built_in">str</span> 是 &#123;&#123; <span class="built_in">str</span>|upper &#125;&#125;&lt;/h3&gt;</span><br><span class="line">&lt;h3&gt;script 是 &#123;&#123; script|safe &#125;&#125;&lt;/h3&gt;</span><br></pre></td></tr></table></figure><h3 id="继承">继承<a class="header-anchor" href="#继承"></a></h3><p><strong>模板的继承</strong></p><p>​如下样例：</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202160321750.png" alt=""></p><ul class="lvl-0"><li class="lvl-2"><p>模板继承可以使父模板的内容重用，子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块</p></li><li class="lvl-2"><p>语法 - 父模板中：</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox6" checked="true"><label for="checkbox6">定义父模板中的**块 block **标签</label></li><li class="lvl-4"><input type="checkbox" id="checkbox7" checked="true"><label for="checkbox7">表时出哪些在</label><strong>子模块</strong>中是允许被<strong>修改</strong>的</li><li class="lvl-4"><input type="checkbox" id="checkbox8" checked="true"><label for="checkbox8">block 标签：</label><strong>在父模板中定义，可以在子模板中覆盖</strong></li></ul></li><li class="lvl-2"><p>语法 - 子模板中：</p><ul class="lvl-2"><li class="lvl-4"><p><input type="checkbox" id="checkbox9" checked="true"><label for="checkbox9">继承模板 </label><code>extends</code> 标签（写在模板文件的第一行）</p><p>例如 <code>&#123;% extends 'base.html' %&#125;</code></p></li><li class="lvl-4"><p><input type="checkbox" id="checkbox10" checked="true"><label for="checkbox10">子模板 重写父模板中的内容块</label></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">&#123;% block block_name %&#125;</span><br><span class="line">子模板块用来覆盖父模板中 block_name 块的内容</span><br><span class="line">&#123;% endblock block_name %&#125;- block_name 可写可不写</span><br></pre></td></tr></table></figure></li></ul></li><li class="lvl-2"><p>重写的覆盖规则</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox11" checked="true"><label for="checkbox11">不重写，将按照父模板中的效果显示</label></li><li class="lvl-4"><input type="checkbox" id="checkbox12" checked="true"><label for="checkbox12">重写，则按照重写效果显示</label></li></ul></li><li class="lvl-2"><p>注意</p><ul class="lvl-2"><li class="lvl-4"><input type="checkbox" id="checkbox13" checked="true"><label for="checkbox13">模板继承时，服务器端的动态内容无法继承</label></li></ul></li><li class="lvl-2"><p><strong>演示：</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/base_index</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161504056.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161504615.png" alt=""></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;base_index&#x27;</span>, views.base_view, name=<span class="string">&#x27;base_index&#x27;</span>),</span><br><span class="line">    path(<span class="string">&#x27;music_index&#x27;</span>, views.music_view),</span><br><span class="line">    path(<span class="string">&#x27;sport_index&#x27;</span>, views.sport_view),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">base_view</span>(<span class="params">request</span>):</span><br><span class="line">    lst = [<span class="string">&#x27;Tom&#x27;</span>, <span class="string">&#x27;Jack&#x27;</span>]</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;base.html&#x27;</span>, <span class="built_in">locals</span>())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">music_view</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;music.html&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sport_view</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;sport.html&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># mysite1/templates/base.html# 父模板</span></span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html lang=<span class="string">&quot;en&quot;</span>&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">    &lt;meta charset=<span class="string">&quot;UTF-8&quot;</span>&gt;</span><br><span class="line">    &#123;% block mytitle %&#125;</span><br><span class="line">    &lt;title&gt;主页&lt;/title&gt;<span class="comment"># 子模板能改的地方</span></span><br><span class="line">    &#123;% endblock %&#125;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&#123;&#123; lst &#125;&#125;<span class="comment"># 子模板无法继承变量（动态内容）</span></span><br><span class="line">&lt;a href=<span class="string">&quot;/music_index&quot;</span>&gt;音乐频道&lt;/a&gt;<span class="comment"># 子模板不能改</span></span><br><span class="line">&lt;a href=<span class="string">&quot;/sport_index&quot;</span>&gt;体育频道&lt;/a&gt;</span><br><span class="line">&lt;br&gt;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#123;% block info %&#125;</span><br><span class="line">    这是主页<span class="comment"># 子模板能改的地方</span></span><br><span class="line">&#123;% endblock %&#125;</span><br><span class="line"></span><br><span class="line">&lt;br&gt;</span><br><span class="line"></span><br><span class="line">&lt;h3&gt;有任何问题联系xxxx&lt;/h3&gt;<span class="comment"># 子模板不能改</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/music.html# 子模板</span></span><br><span class="line">&#123;% extends <span class="string">&#x27;base.html&#x27;</span> %&#125;<span class="comment"># 继承父模板</span></span><br><span class="line"></span><br><span class="line">&#123;% block mytitle %&#125;</span><br><span class="line">    &lt;title&gt;音乐频道&lt;/title&gt;<span class="comment"># 子模板重写block</span></span><br><span class="line">&#123;% endblock %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% block info %&#125;</span><br><span class="line">    欢迎来到音乐频道</span><br><span class="line">&#123;% endblock %&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/sport.html</span></span><br><span class="line">&#123;% extends <span class="string">&#x27;base.html&#x27;</span> %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% block mytitle %&#125;</span><br><span class="line">    &lt;title&gt;体育频道&lt;/title&gt;</span><br><span class="line">&#123;% endblock %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% block info %&#125;</span><br><span class="line">    欢迎来到体育频道</span><br><span class="line">&#123;% endblock %&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="小节-2">小节<a class="header-anchor" href="#小节-2"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><strong>过滤器</strong></p><p>{ <code>变量</code> | <code>过滤器</code>1:‘<code>参数值</code>1’ | 过滤器2:‘参数值2’ … }</p></li><li class="lvl-2"><p><strong>模板的继承</strong></p><p>父模板 - <code>定义可被修改的block</code></p><p>子模板 - 继承<code>父模板</code>；按需修改<code>父模板中定义的block</code></p></li></ul><hr><h2 id="三-url反向解析">三. url反向解析<a class="header-anchor" href="#三-url反向解析"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><strong>代码中 url 出现位置</strong></p><ol><li class="lvl-5"><p><mark>模板</mark> 【html中】</p><ol><li class="lvl-8"><p>&lt;a <mark>href</mark>=‘url’&gt;超链接&lt;/a&gt;</p><p>点击后 页面跳转至 url</p></li><li class="lvl-8"><p>&lt;form <mark>action</mark>=‘url’ method=‘post’&gt;</p><p>form表单中的数据 用post方法提交至 url</p></li></ol></li><li class="lvl-5"><p><mark>视图函数</mark>中 - 302跳转    HttpResponseRedirect(‘url’)</p><p>将用户地址栏中的地址跳转到 url</p></li></ol></li><li class="lvl-2"><p><strong>代码中 url 书写规范</strong></p><ol><li class="lvl-5"><p><mark>绝对地址</mark></p><p>​<a href="http://127.0.0.1:8000/page/1">http://127.0.0.1:8000/page/1</a></p></li><li class="lvl-5"><p><mark>相对地址</mark></p><ol><li class="lvl-8">‘==/==page/1’ -<mark>‘/’ 开头的相对地址</mark>，浏览器会把当前地址栏里的 协议，ip 和 端口 加上这个地址，作为最终访问地址，即如果当前页面地址栏为 <a href="http://127.0.0.1:8000/page/3%EF%BC%9B%E5%BD%93%E5%89%8D%E7%9B%B8%E5%AF%B9%E5%9C%B0%E5%9D%80%E6%9C%80%E7%BB%88%E7%BB%93%E6%9E%9C%E4%B8%BA">http://127.0.0.1:8000/page/3；当前相对地址最终结果为</a> <mark><code>http://127.0.0.1:8000</code></mark> + /page/1（☆ 高频使用）</li><li class="lvl-8">‘page/1’ -<mark>没有 ‘/’ 开头的相对地址</mark>，浏览器会根据<code>当前 url 的最后一个 / 之前的内容 加上 该相对地址</code> 作为最终访问地址，例如当前地址栏地址为 ==<a href="http://127.0.0.1:8000/topic/==detail%EF%BC%9B%E5%88%99%E8%AF%A5%E7%9B%B8%E5%AF%B9%E5%9C%B0%E5%9D%80%E6%9C%80%E7%BB%88%E7%BB%93%E6%9E%9C%E4%B8%BA">http://127.0.0.1:8000/topic/==detail；则该相对地址最终结果为</a> <mark><code>http://127.0.0.1:8000/topic/</code></mark> + page/1</li></ol></li></ol></li><li class="lvl-2"><p><strong>演示：</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test/url</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161656031.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161657095.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161702913.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line">    path(<span class="string">&#x27;test/url&#x27;</span>, views.test_url),</span><br><span class="line">    path(<span class="string">&#x27;test_url_result&#x27;</span>, views.test_url_result)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_url.html&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url_result</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">return</span> HttpResponse(<span class="string">&#x27;---test url res is ok&#x27;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_url.html</span></span><br><span class="line">&lt;a href=<span class="string">&quot;http://127.0.0.1:8000/test_url_result&quot;</span>&gt;绝对地址&lt;/a&gt;</span><br><span class="line">&lt;a href=<span class="string">&quot;/test_url_result&quot;</span>&gt;带<span class="string">&#x27;/&#x27;</span>的相对地址&lt;/a&gt;</span><br><span class="line">&lt;a href=<span class="string">&quot;test_url_result&quot;</span>&gt;不带<span class="string">&#x27;/&#x27;</span>的相对地址&lt;/a&gt;<span class="comment"># 浏览器解析为 http://127.0.0.1:8000/test/test_url_result</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>url 反向解析</strong></p><ul class="lvl-2"><li class="lvl-4"><p>url 反向解析是指在视图或者模板中，用 <mark>path 定义的名称</mark>来<mark>动态查找或计算出相应的路由</mark></p></li><li class="lvl-4"><p><strong>path 函数的语法</strong></p><ul class="lvl-4"><li class="lvl-6"><input type="checkbox" id="checkbox14" checked="true"><label for="checkbox14">path(route, views, </label><mark>name</mark>=“别名”)</li><li class="lvl-6"><input type="checkbox" id="checkbox15" checked="true"><label for="checkbox15">path(‘page’, views.page_view, name=“page_url”)</label></li><li class="lvl-6">根据 path 中的 ‘name=’ 关键字传给 url 确定了个唯一确定的名字，在模板或视图中，可以通过这个名字反向推断出此 url 信息</li></ul></li><li class="lvl-4"><p><mark>模板中</mark> - 通过 url 标签实现地址的反向解析</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;% url &#x27;别名&#x27; %&#125;</span><br><span class="line">&#123;% url &#x27;别名&#x27; &#x27;参数值1&#x27; &#x27;参数值2&#x27; %&#125;</span><br><span class="line">ex:</span><br><span class="line">&#123;% url &#x27;pagen&#x27; &#x27;400&#x27; %&#125;--- 传参一律是 str</span><br><span class="line">&#123;% url &#x27;person&#x27; age=&#x27;18&#x27; name=&#x27;gxn&#x27; %&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-4"><li class="lvl-6"><p><strong>演示：在模板中使用</strong></p></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://127.0.0.1:8000/test/url</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161725987.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line">    path(<span class="string">&#x27;test/url&#x27;</span>, views.test_url),</span><br><span class="line">    path(<span class="string">&#x27;test_urls_result/&lt;int:age&gt;&#x27;</span>, views.test_url_result, name=<span class="string">&#x27;tr&#x27;</span>)<span class="comment"># 起别名 tr</span></span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_url.html&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_urls_result</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">return</span> HttpResponse(<span class="string">&#x27;---test url res is ok&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/test_url.html</span></span><br><span class="line">&lt;a href=<span class="string">&quot;&#123;% url &#x27;tr&#x27; &#x27;100&#x27; %&#125;&quot;</span>&gt;url反向解析版本&lt;/a&gt;<span class="comment"># ☆ 模板中使用别名</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li class="lvl-4"><p>在<mark>视图函数</mark>中 → 可调用 django 中的 <mark>reverse</mark> 方法进行反向解析</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"><span class="keyword">from</span> django.urls <span class="keyword">import</span> reverse</span><br><span class="line">reverse(<span class="string">&#x27;别名&#x27;</span>, args=[], kwargs=&#123;&#125;)</span><br><span class="line">ex:</span><br><span class="line"><span class="built_in">print</span>(reverse(<span class="string">&#x27;pagen&#x27;</span>, args=[<span class="number">300</span>]))</span><br><span class="line"><span class="built_in">print</span>(reverse(<span class="string">&#x27;person&#x27;</span>, kwargs=</span><br><span class="line">&#123;<span class="string">&#x27;name&#x27;</span>:<span class="string">&#x27;peng&#x27;</span>, <span class="string">&#x27;age&#x27;</span>:<span class="number">23</span>&#125;))</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-4"><li class="lvl-6"><p>演示：</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">http://127.0.0.1:8000/test/url</span><br><span class="line"></span><br><span class="line"># 302跳转 - 响应头里的 location 标记跳转地址</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161742771.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202202161745717.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment"># mysite1/mysite1/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;base_index&#x27;</span>, views.base_view, name=<span class="string">&#x27;base_index&#x27;</span>),<span class="comment"># 起别名 base_index</span></span><br><span class="line">    <span class="comment"># http://127.0.0.1:8000/test/url</span></span><br><span class="line">    path(<span class="string">&#x27;test/url&#x27;</span>, views.test_url),</span><br><span class="line">    path(<span class="string">&#x27;test_urls_result/&lt;int:age&gt;&#x27;</span>, views.test_url_result, name=<span class="string">&#x27;tr&#x27;</span>)<span class="comment"># 起别名 tr</span></span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/mysite1/views.py</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">base_view</span>(<span class="params">request</span>):</span><br><span class="line">    lst = [<span class="string">&#x27;Tom&#x27;</span>, <span class="string">&#x27;Jack&#x27;</span>]</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;base.html&#x27;</span>, <span class="built_in">locals</span>())</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_url.html&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_url_result</span>(<span class="params">request, age</span>):</span><br><span class="line">    <span class="comment">#302跳转</span></span><br><span class="line">    <span class="keyword">from</span> django.urls <span class="keyword">import</span> reverse</span><br><span class="line">    url = reverse(<span class="string">&#x27;base_index&#x27;</span>)<span class="comment"># ☆ 视图函数中使用别名</span></span><br><span class="line">    <span class="keyword">return</span> HttpResponseRedirect(url)</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="comment"># mysite1/templates/test_url.html</span></span><br><span class="line">&lt;a href=<span class="string">&quot;&#123;% url &#x27;tr&#x27; &#x27;100&#x27; %&#125;&quot;</span>&gt;url反向解析版本&lt;/a&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># mysite1/templates/base.html</span></span><br><span class="line">略</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul></li></ul></li></ul><h2 id="四-总结">四. 总结<a class="header-anchor" href="#四-总结"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>请求（request）和响应（HttpResponseqing）</p></li><li class="lvl-2"><p>GET/POST处理 - request.GET/POST</p></li><li class="lvl-2"><p>MVC 和 MTV</p></li><li class="lvl-2"><p>模板层基础配置</p></li><li class="lvl-2"><p>模板变量/标签/过滤器/继承</p></li><li class="lvl-2"><p>url反向解析</p></li></ul><hr>]]></content>
      
      
      <categories>
          
          <category> Django </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Django </tag>
            
            <tag> URL </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>03_Django-GET请求和POST请求-设计模式及模板层</title>
      <link href="/posts/42935.html"/>
      <url>/posts/42935.html</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1vK4y1o7jH">视频链接：https://www.bilibili.com/video/BV1vK4y1o7jH</a></p><h2 id="一-GET请求和POST请求">一. GET请求和POST请求<a class="header-anchor" href="#一-GET请求和POST请求"></a></h2><h3 id="定义">定义<a class="header-anchor" href="#定义"></a></h3><blockquote><p>·无论是GET还是POST，统一都由<code>视图函数</code>接收请求，通过判断request.method区分具体的请求动作</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> requests.method == <span class="string">&#x27;GET&#x27;</span>:</span><br><span class="line">    处理GET请求时的业务逻辑</span><br><span class="line"><span class="keyword">elif</span> requests.method == <span class="string">&#x27;POST&#x27;</span>:</span><br><span class="line">    处理POST请求的业务逻辑</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    其他请求业务逻辑</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><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><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">if</span> request.method == <span class="string">&#x27;GET&#x27;</span>:</span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">elif</span> request.method == <span class="string">&#x27;POST&#x27;</span>:</span><br><span class="line">        <span class="comment">#处理用户提交数据</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">return</span> HttpResponse(<span class="string">&#x27;--test get post is ok--&#x27;</span>)</span><br></pre></td></tr></table></figure></blockquote><h3 id="GET处理">GET处理<a class="header-anchor" href="#GET处理"></a></h3><blockquote><p>·GET请求动作，一般用于向服务器<code>获取数据</code></p><p>·能够产生GET请求的场景：</p><p>​- 浏览器地址栏中输入URL，回车后</p><p>​- &lt;<code>a href</code>=“地址?参数=值&amp;参数=值”&gt;</p><p>​- <code>form表单</code>中的<code>method为get</code></p><p>------------------------------------------------------------------</p><p>GET请求方式中，如果有数据需要传递给服务器，通常会用<code>查询字符串（Query String）</code>传递【注意：<code>不要传递敏感数据</code>】</p><p>URL格式：xxx<code>?参数名1=值1&amp;参数名2=值2...</code></p><p>- 如：<a href="http://127.0.0.1:8000/page1%60?a=100&amp;b=200%60">http://127.0.0.1:8000/page1`?a=100&amp;b=200`</a></p><p>服务器端接收参数</p><p>获取客户端请求GET请求提交的数据</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></pre></td><td class="code"><pre><span class="line">request.GET[<span class="string">&#x27;参数名&#x27;</span>] <span class="comment"># QueryDict</span></span><br><span class="line">request.GET.get(<span class="string">&#x27;参数名&#x27;</span>, <span class="string">&#x27;默认值&#x27;</span>)</span><br><span class="line">request.GET.getlist(<span class="string">&#x27;参数名&#x27;</span>)</span><br><span class="line"><span class="comment"># mypage?a=100&amp;b=200&amp;c=300&amp;b=400</span></span><br><span class="line"><span class="comment"># request.GET=QueryDict(&#123;&#x27;a&#x27;: [&#x27;100&#x27;], &#x27;b&#x27;: [&#x27;200&#x27;, &#x27;400&#x27;], &#x27;c&#x27;: [&#x27;300&#x27;]&#125;)</span></span><br><span class="line"><span class="comment"># a = request.GET[&#x27;a&#x27;]</span></span><br><span class="line"><span class="comment"># b = request.GET[&#x27;b&#x27;] # Error</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><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">演示</span><br><span class="line"></span><br><span class="line">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/test_get_post?a=<span class="number">400</span></span><br><span class="line">--test get post <span class="keyword">is</span> ok--</span><br><span class="line">终端</span><br><span class="line">&lt;QueryDict: &#123;<span class="string">&#x27;a&#x27;</span>: [<span class="string">&#x27;400&#x27;</span>, <span class="string">&#x27;200&#x27;</span>, <span class="string">&#x27;100&#x27;</span>]&#125;&gt;</span><br><span class="line"><span class="number">100</span></span><br><span class="line">[<span class="string">&#x27;400&#x27;</span>, <span class="string">&#x27;200&#x27;</span>, <span class="string">&#x27;100&#x27;</span>]</span><br><span class="line">no c</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;test_get_post&#x27;</span>, views.test_get_post)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">if</span> request.method == <span class="string">&#x27;GET&#x27;</span>:</span><br><span class="line">        <span class="built_in">print</span>(request.GET)</span><br><span class="line">        <span class="built_in">print</span>(request.GET[<span class="string">&#x27;a&#x27;</span>])</span><br><span class="line">        <span class="comment"># 问卷调查 = form get   兴趣爱好 - 复选框</span></span><br><span class="line">        <span class="built_in">print</span>(request.GET.getlist(<span class="string">&#x27;a&#x27;</span>))</span><br><span class="line">        <span class="built_in">print</span>(request.GET.get(<span class="string">&#x27;c&#x27;</span>, <span class="string">&#x27;no c&#x27;</span>))</span><br><span class="line">    <span class="keyword">elif</span> request.method == <span class="string">&#x27;POST&#x27;</span>:</span><br><span class="line">        <span class="comment">#处理用户提交数据</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">return</span> HttpResponse(<span class="string">&#x27;--test get post is ok--&#x27;</span>)</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p>·思考：之前的计算器功能，能否拿查询字符串做？</p><p>​<a href="http://127.0.0.1:8000/%E6%95%B4%E6%95%B0/%E6%93%8D%E4%BD%9C%E7%AC%A6/%E6%95%B4%E6%95%B0">http://127.0.0.1:8000/整数/操作符/整数</a></p><p>​<a href="http://127.0.0.1:8000/cal?x=10&amp;y=20&amp;op=add">http://127.0.0.1:8000/cal?x=10&amp;y=20&amp;op=add</a></p></blockquote><h3 id="POST处理">POST处理<a class="header-anchor" href="#POST处理"></a></h3><blockquote><p>·POST请求动作，一般用于<code>向服务器提交大量/隐私数据</code></p><p>·客户端通过表单等POST请求将数据传递给服务器端，如：</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052323569.png" alt=""></p><p>·服务器端<code>接收参数</code></p><p>​通过request.method来判断是否为POST请求，如：</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"><span class="keyword">if</span> request.method == <span class="string">&#x27;POST&#x27;</span>:</span><br><span class="line"> 处理POST请求的数据并响应</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> 处理非POST请求的响应</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p><strong>使用post方式接收客户端数据</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">request.POST[<span class="string">&#x27;参数名&#x27;</span>] <span class="comment"># request.POST  绑定QueryDict</span></span><br><span class="line">request.POST.get(<span class="string">&#x27;参数名&#x27;</span>, <span class="string">&#x27;&#x27;</span>)</span><br><span class="line">request.POST.getlist(<span class="string">&#x27;参数名&#x27;</span>)</span><br></pre></td></tr></table></figure><p><strong><code>取消csrf验证，否则Django将会拒绝客户端发来的POST请求，报403响应</code></strong></p><p>------------------------------------------------------------------</p><p><strong>取消csrf验证</strong></p><p>​- 禁止掉settings.py中MIDDLEWARE中的CsrfviewsMiddleWare的中间件</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">MIDDLEWARE = [</span><br><span class="line">...</span><br><span class="line"> <span class="comment"># &#x27;django.middleware.csrf.CsrfViewMiddleware&#x27;,</span></span><br><span class="line"> ...</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>------------------------------------------------------------------</p><p>演示</p><p><a href="http://127.0.0.1:8000/test_get_post">http://127.0.0.1:8000/test_get_post</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052336498.png" alt=""></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 <span class="keyword">is</span> ok</span><br><span class="line">终端</span><br><span class="line">uname <span class="keyword">is</span> cpen</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;test_get_post&#x27;</span>, views.test_get_post)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line">POST_FORM = <span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">&lt;form method=&#x27;post&#x27; action=&#x27;/test_get_post&#x27;&gt;</span></span><br><span class="line"><span class="string">    用户名: &lt;input type=&#x27;text&#x27; name=&#x27;uname&#x27;&gt;</span></span><br><span class="line"><span class="string">    &lt;input type=&#x27;submit&#x27; value=&#x27;提交&#x27;&gt;</span></span><br><span class="line"><span class="string">&lt;/form&gt;</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_get_post</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">if</span> request.method == <span class="string">&#x27;GET&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> HttpResponse(POST_FORM)</span><br><span class="line">    ...</span><br></pre></td></tr></table></figure><p>---------------------------------------------------------------------------------------------------------------------------------</p><p>小节</p><p>·Django处理GET请求</p><p>​查询字符串 - 少量数据传递</p><p>·Django处理POST请求</p><p>​专用于浏览器提交数据</p></blockquote><hr><h2 id="二-Django的设计模式及模板层">二. Django的设计模式及模板层<a class="header-anchor" href="#二-Django的设计模式及模板层"></a></h2><h3 id="MVC和MTV">MVC和MTV<a class="header-anchor" href="#MVC和MTV"></a></h3><h4 id="传统的MVC">传统的MVC<a class="header-anchor" href="#传统的MVC"></a></h4><blockquote><p>MVC代表<code>Model-View-Controller</code>（模型-视图-控制器）模式。</p><ul class="lvl-1"><li class="lvl-2"><p><input type="checkbox" id="checkbox0" checked="true"><label for="checkbox0"></label><code>M模型层（Model）</code>，主要用于对数据库层的封装</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox1" checked="true"><label for="checkbox1"></label><code>V视图层（View）</code>，用于向用户展示结果（WHAT + HOW）</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox2" checked="true"><label for="checkbox2"></label><code>C控制（Controller）</code>，用于处理请求、获取数据、返回结果（重要）</p></li></ul><p>作用：<code>降低模块间的耦合度（解耦）</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052338248.png" alt=""></p></blockquote><h4 id="Django的MTV模式">Django的MTV模式<a class="header-anchor" href="#Django的MTV模式"></a></h4><blockquote><p>MTV代表<code>Model-Template-View</code>（模型-模板-视图）模式。</p><ul class="lvl-1"><li class="lvl-2"><p><input type="checkbox" id="checkbox3" checked="true"><label for="checkbox3"></label><code>M模型层（Model）</code>负责与数据库交互</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox4" checked="true"><label for="checkbox4"></label><code>T模板层（Template）</code>负责呈现内容到浏览器（HOW）</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox5" checked="true"><label for="checkbox5"></label><code>V视图层（View）</code>是核心，负责接收请求、获取数据、返回结果（WHAT）</p></li></ul><p>作用：<code>降低模块间的耦合度（解耦）</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052340887.png" alt=""></p><p>---------------------------------------------------------------------------------------------------------------------------------</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052341004.jpg" alt=""></p></blockquote><h3 id="模板层">模板层<a class="header-anchor" href="#模板层"></a></h3><h4 id="什么是模板">什么是模板<a class="header-anchor" href="#什么是模板"></a></h4><blockquote><p>1、模板是可以根据<code>字典</code>数据动态变化的<code>html网页</code></p><p>2、模板可以<code>根据视图中传递的字典数据动态生成相应的HTML网页</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052342133.png" alt=""></p></blockquote><h4 id="模板配置">模板配置<a class="header-anchor" href="#模板配置"></a></h4><blockquote><p>创建模板文件夹 <code>&lt;项目名&gt;/templates</code></p><p>在<code>settings.py</code>中<code>TEMPLATES</code>配置项</p><p>​1.BACKEND：指定模板的引擎</p><p>​2.<code>DIRS</code>：模板的搜索目录（可以是一个或多个）</p><p>​3.APP_DIRS：是否要在应用中的templates文件夹中搜索模板文件</p><p>​4.OPTIONS：有关模板的选项</p><p>·配置项中 需要修改部分</p><p>​设置DIRS - <code>'DIRS': [os.path.join(BASE_DIR, 'templates')],</code></p><p>------------------------------------------------------------------</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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/settings.py</span><br><span class="line">TEMPLATES = [</span><br><span class="line">    &#123;</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">&#x27;DIRS&#x27;</span>: [os.path.join(BASE_DIR, <span class="string">&#x27;templates&#x27;</span>)],</span><br><span class="line">        ...</span><br></pre></td></tr></table></figure></blockquote><h4 id="模板的加载方式">模板的加载方式<a class="header-anchor" href="#模板的加载方式"></a></h4><blockquote><p><strong>方案1</strong> - 通过loader获取模板，通过HttpResponse进行响应（特点：麻烦）</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.template <span class="keyword">import</span> loader</span><br><span class="line"><span class="comment"># 1.通过 loader 加载模板</span></span><br><span class="line">t = loader.get_template(<span class="string">&quot;模板文件名&quot;</span>)</span><br><span class="line"><span class="comment"># 2.将 t 转换成 HTML 字符串</span></span><br><span class="line">html = t.reader(字典数据)</span><br><span class="line"><span class="comment"># 3.用响应对象将转换的字符串内容返回给浏览器</span></span><br><span class="line"><span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052345270.png" alt=""></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"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;test_html&#x27;</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">from</span> django.template <span class="keyword">import</span> loader</span><br><span class="line">    t = loader.get_template(<span class="string">&#x27;test_html.html&#x27;</span>)</span><br><span class="line">    html = t.render()</span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br><span class="line"></span><br><span class="line"> &lt;项目文件夹下&gt;/templates/test_html.html</span><br><span class="line">&lt;h3&gt;我是模板层的~~~~&lt;/h3&gt;</span><br></pre></td></tr></table></figure><p>---------------------------------------------------------------------------------------------------------------------------------</p><p><strong>方案2</strong> - 通过render() 直接加载并响应模板（特点：方便，大量使用这种）</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line"><span class="keyword">return</span> render(request, <span class="string">&#x27;模板文件名&#x27;</span>, 字典数据)</span><br></pre></td></tr></table></figure><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052346308.png" alt=""></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"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="comment"># 方案2</span></span><br><span class="line">    <span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_html.html&#x27;</span>)</span><br></pre></td></tr></table></figure></blockquote><h4 id="视图层与模板层之间的交互">视图层与模板层之间的交互<a class="header-anchor" href="#视图层与模板层之间的交互"></a></h4><blockquote><p>1、视图函数中可以将Python<code>变量</code>封装到字典中传递到模板</p><p>样例：</p><p>def xxx_view(request):<br>dic = {<br>“变量1”: “值1”,<br>“变量2”: “值2”,<br>}<br>return render(request, ‘xxx.html’, <code>dic</code>)</p><p>2、模板中，我们可以用 <strong></strong> 的语法 调用视图传进来的变量</p><p>--------------------------------------------------------------------------------------</p><p><strong>演示</strong></p><p><a href="http://127.0.0.1:8000/test_html">http://127.0.0.1:8000/test_html</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052348278.png" alt=""></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></pre></td><td class="code"><pre><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    ...</span><br><span class="line">    path(<span class="string">&#x27;test_html&#x27;</span>, views.test_html)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_html</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render</span><br><span class="line">    dic = &#123;<span class="string">&#x27;username&#x27;</span>: <span class="string">&#x27;peng&#x27;</span>, <span class="string">&#x27;age&#x27;</span>: <span class="number">23</span>&#125;</span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">&#x27;test_html.html&#x27;</span>, dic)</span><br><span class="line"></span><br><span class="line"> &lt;项目文件夹下&gt;/templates/test_html.html</span><br><span class="line">&lt;h3&gt;&#123;&#123; username &#125;&#125;是模板层的~~~~&lt;/h3&gt;</span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Django </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Django </tag>
            
            <tag> MTV </tag>
            
            <tag> HTTP </tag>
            
            <tag> GET </tag>
            
            <tag> POST </tag>
            
            <tag> MVC </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>02_Django-路由配置-HTTP协议的请求和响应</title>
      <link href="/posts/57095.html"/>
      <url>/posts/57095.html</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1vK4y1o7jH">视频链接：https://www.bilibili.com/video/BV1vK4y1o7jH</a></p><h2 id="一-路由配置">一. 路由配置<a class="header-anchor" href="#一-路由配置"></a></h2><blockquote><p><mark>settings.py</mark>中的 <mark>`ROOT_URLCONF`</mark> 指定了主路由配置列表 <mark>urlpatterns</mark> 的文件位置</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># file: &lt;项目同名文件夹下&gt;/urls.py</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    path(<span class="string">&#x27;page/2003/&#x27;</span>, views.page_2003_view),</span><br><span class="line">    ... <span class="comment"># 此处配置主路由</span></span><br><span class="line">]</span><br></pre></td></tr></table></figure></blockquote><h3 id="path">path()<a class="header-anchor" href="#path"></a></h3><h4 id="path-函数">path()函数<a class="header-anchor" href="#path-函数"></a></h4><blockquote><p>path()函数</p><p>导入 - from django.urls import path</p><p>语法 - <mark>path(route, views, name=None)</mark></p><p>参数:</p><p>​1.<mark>route</mark>: 字符串类型，匹配的请求<mark>路径</mark></p><p>​2.<mark>views</mark>: 指定路径所对应的<mark>视图处理函数的名称</mark></p><p>​3.<strong>name</strong>: 为地址起 <strong>别名</strong>，在模块中地址反向解析时使用</p></blockquote><blockquote><p>练习 - 建立一个小网站：</p><p>​输入网址：<a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a>, 在网页中输出：这是我的首页</p><p>​输入网址：<a href="http://127.0.0.1:8000/page/1">http://127.0.0.1:8000/page/1</a>, 在网页中输出：这是编号为1的网页</p><p>​输入地址：<a href="http://127.0.0.1:8000/page/2">http://127.0.0.1:8000/page/2</a>, 在网页中输出：这是编号为2的网页</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">http://127.0.0.1:8000</span><br><span class="line">http://127.0.0.1:8000/page/1</span><br><span class="line">http://127.0.0.1:8000/page/2</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><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"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000</span></span><br><span class="line">    path(<span class="string">&#x27;&#x27;</span>, views.index_view),</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000/page/1</span></span><br><span class="line">    path(<span class="string">&#x27;page/1&#x27;</span>, views.page1_view),</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000/page/2</span></span><br><span class="line">    path(<span class="string">&#x27;page/2&#x27;</span>, views.page2_view)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">index_view</span>(<span class="params">request</span>):</span><br><span class="line">    html = <span class="string">&#x27;这是我的首页&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">page1_view</span>(<span class="params">request</span>):</span><br><span class="line">    html = <span class="string">&#x27;这是编号为1的网页&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">page2_view</span>(<span class="params">request</span>):</span><br><span class="line">    html = <span class="string">&#x27;这是编号为2的网页&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure></blockquote><blockquote><p>思考</p><p>建立如上一百个网页该怎么办？</p><p>例如：</p><p>​<a href="http://127.0.0.1:8000/page/3">http://127.0.0.1:8000/page/3</a></p><p>​<a href="http://127.0.0.1:8000/page/4">http://127.0.0.1:8000/page/4</a></p><p>​…</p><p>​<a href="http://127.0.0.1:8000/page/100">http://127.0.0.1:8000/page/100</a></p></blockquote><h4 id="path转换器">path转换器<a class="header-anchor" href="#path转换器"></a></h4><blockquote><p>语法：<mark>&lt;转换器类型: 自定义名&gt;</mark></p><p>作用：若转换器类型匹配到对应类型的<mark>数据</mark>，则将数据按照<mark>关键字传参</mark>的方式传递给<mark>视图函数</mark></p><p>例子：path(‘page/<mark>&lt;int:page&gt;</mark>’, <a href="http://view.xxx">view.xxx</a>)</p><p><mark><strong>转换器类型</strong>：str、int、slug、path</mark></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205042137686.png" alt=""></p></blockquote><blockquote><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></pre></td><td class="code"><pre><span class="line">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/page/<span class="number">30</span></span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000/page/3-100</span></span><br><span class="line">    path(<span class="string">&#x27;page/&lt;int:pg&gt;&#x27;</span>, views.pagen_view)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pagen_view</span>(<span class="params">request, pg</span>):</span><br><span class="line">    html = <span class="string">&#x27;这是编号为%s的网页!&#x27;</span>%(pg)</span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure></blockquote><blockquote><p>练习：小计算器</p><p>​定义一个路由的格式为：</p><p>​==<a href="http://127.0.0.1:8000/%E6%95%B4%E6%95%B0/%E6%93%8D%E4%BD%9C%E5%AD%97%E7%AC%A6%E4%B8%B2%5Badd/sub/mul%5D/%E6%95%B4%E6%95%B0==">http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数==</a></p><p>​从路由中提取数据，做相应的操作后返回给浏览器</p><p>​效果如下：</p><p>​输入：<mark>127.0.0.1:8000/100/add/200</mark></p><p>​页面显示结果：<mark>300</mark></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">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/<span class="number">100</span>/add/<span class="number">200</span></span><br><span class="line">结果为：<span class="number">300</span></span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000/整数/操作符/整数</span></span><br><span class="line">    path(<span class="string">&#x27;&lt;int:n&gt;/&lt;str:op&gt;/&lt;int:m&gt;&#x27;</span>, views.cal_view)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">cal_view</span>(<span class="params">request, n, op, m</span>):</span><br><span class="line">    <span class="keyword">if</span> op <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">&#x27;add&#x27;</span>, <span class="string">&#x27;sub&#x27;</span>, <span class="string">&#x27;mul&#x27;</span>]:</span><br><span class="line">        <span class="keyword">return</span> HttpResponse(<span class="string">&#x27;Your op is wrong&#x27;</span>)</span><br><span class="line">    result = <span class="number">0</span></span><br><span class="line">    <span class="keyword">if</span> op == <span class="string">&#x27;add&#x27;</span>:</span><br><span class="line">        result = n + m</span><br><span class="line">    <span class="keyword">elif</span> op == <span class="string">&#x27;sub&#x27;</span>:</span><br><span class="line">        result = n - m</span><br><span class="line">    <span class="keyword">elif</span> op == <span class="string">&#x27;mul&#x27;</span>:</span><br><span class="line">        result = n * m</span><br><span class="line">    <span class="keyword">return</span> HttpResponse(<span class="string">&#x27;结果为：%s&#x27;</span>%(result))</span><br></pre></td></tr></table></figure></blockquote><h3 id="re-path">re_path()<a class="header-anchor" href="#re-path"></a></h3><h4 id="re-path-函数">re_path()函数<a class="header-anchor" href="#re-path-函数"></a></h4><blockquote><p>re_path()函数</p><p>在 url 的匹配过程中可以使用<mark>正则</mark>表达式进行精确匹配</p><p>语法：</p><p>​re_path(<mark>reg</mark>, view, name=xxx)</p><p>​正则表达式为<mark>命名分组模式(**?P&lt;name&gt;**pattern)</mark>; 匹配提取参数后用关键字传参方式传递给视图函数</p></blockquote><blockquote><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></pre></td><td class="code"><pre><span class="line">样例</span><br><span class="line"><span class="comment"># 可匹配 http://127.0.0.1:8000/20/mul/40</span></span><br><span class="line"><span class="comment"># 不可匹配 http://127.0.0.1:8000/200/mul/400</span></span><br><span class="line"></span><br><span class="line">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/<span class="number">10</span>/add/<span class="number">20</span>  -&gt;  x:<span class="number">10</span> op:add y:<span class="number">20</span></span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line"><span class="keyword">from</span> django.urls <span class="keyword">import</span> path, re_path</span><br><span class="line"></span><br><span class="line">urlpatterns = [</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000/整数2/操作符/整数2</span></span><br><span class="line">    re_path(<span class="string">r&#x27;^(?P&lt;x&gt;\d&#123;1,2&#125;)/(?P&lt;op&gt;\w+)/(?P&lt;y&gt;\d&#123;1,2&#125;)$&#x27;</span>, views.cal2_view),</span><br><span class="line">]<span class="comment"># \d 整数; \w 字符</span></span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">cal2_view</span>(<span class="params">request, x, op, y</span>):</span><br><span class="line">    html = <span class="string">&#x27;x:%s op:%s y:%s&#x27;</span>%(x, op, y)</span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure></blockquote><blockquote><p>练习</p><p>访问地址：</p><p>​<a href="http://127.0.0.1:8000/birthday/%E5%9B%9B%E4%BD%8D%E6%95%B0%E5%AD%97/%E4%B8%80%E5%88%B0%E4%B8%A4%E4%BD%8D%E6%95%B0%E5%AD%97/%E4%B8%80%E5%88%B0%E4%B8%A4%E4%BD%8D%E6%95%B0%E5%AD%97">http://127.0.0.1:8000/birthday/四位数字/一到两位数字/一到两位数字</a></p><p>​<a href="http://127.0.0.1:8000/birthday/%E4%B8%80%E5%88%B0%E4%B8%A4%E4%BD%8D%E6%95%B0%E5%AD%97/%E4%B8%80%E5%88%B0%E4%B8%A4%E4%BD%8D%E6%95%B0%E5%AD%97/%E5%9B%9B%E4%BD%8D%E6%95%B0%E5%AD%97">http://127.0.0.1:8000/birthday/一到两位数字/一到两位数字/四位数字</a></p><p>最终输出：生日为：xxxx年xx月xx日</p><blockquote><p>效果样例：</p><p>​输入网址：<a href="http://127.0.0.1:8000/birthday/2015/12/11">http://127.0.0.1:8000/birthday/2015/12/11</a></p><p>​显示为：生日为：2015年12月11日</p><p>​输入网址：<a href="http://127.0.0.1:8000/birthday/2/28/2008">http://127.0.0.1:8000/birthday/2/28/2008</a></p><p>​显示为：生日为：2008年2月28日</p></blockquote><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">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/birthday/<span class="number">1992</span>/01/01</span><br><span class="line">生日为<span class="number">1992</span>年01月01日</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000/birthday/年4/月2/日2</span></span><br><span class="line">    re_path(<span class="string">r&#x27;^birthday/(?P&lt;y&gt;\d&#123;4&#125;)/(?P&lt;m&gt;\d&#123;1,2&#125;)/(?P&lt;d&gt;\d&#123;1,2&#125;)$&#x27;</span>, views.birthday_view),</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000/birthday/月2/日2/年4</span></span><br><span class="line">    re_path(<span class="string">r&#x27;^birthday/(?P&lt;m&gt;\d&#123;1,2&#125;)/(?P&lt;d&gt;\d&#123;1,2&#125;)/(?P&lt;y&gt;\d&#123;4&#125;)$&#x27;</span>, views.birthday_view),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">birthday_view</span>(<span class="params">request, y, m, d</span>):</span><br><span class="line">    html = <span class="string">&quot;生日为%s年%s月%s日&quot;</span>%(y, m, d)</span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure></blockquote><hr><p><strong>Django Day02</strong></p><blockquote><p>请求和响应</p><p>GET请求和POST请求</p><p>Django的设计模式及模板层</p><p>模板层 - 变量和标签</p><p>模板层 - 过滤器和继承</p><p>url反向解析</p></blockquote><hr><h2 id="二-HTTP协议的请求和响应">二. HTTP协议的请求和响应<a class="header-anchor" href="#二-HTTP协议的请求和响应"></a></h2><blockquote><p>定义</p><p>​<mark>请求</mark>是指浏览器端通过<mark>HTTP协议</mark>发送给服务器端的数据</p><p>​响应是指<mark>服务器端接收到请求后</mark>做相应的处理后再<mark>回复给浏览器端的数据</mark></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052203494.png" alt=""></p></blockquote><h3 id="请求">请求<a class="header-anchor" href="#请求"></a></h3><h4 id="请求样例">请求样例<a class="header-anchor" href="#请求样例"></a></h4><blockquote><p><strong>请求样例</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052257694.png" alt=""></p></blockquote><h4 id="请求中的方法">请求中的方法<a class="header-anchor" href="#请求中的方法"></a></h4><blockquote><p>根据HTTP标准，HTTP请求可以使用多种请求方法</p><p><code>HTTP1.0</code>定义了三种请求方法：GET，POST和HEAD方法（最常用）</p><p><code>HTTP1.1</code>新增了五种请求方法：OPTIONS，PUT，DELETE，TRACE和CONNECT方法</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052258651.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052259640.png" alt=""></p></blockquote><h4 id="Django中的请求">Django中的请求<a class="header-anchor" href="#Django中的请求"></a></h4><blockquote><p>请求在Django中实则就是 <code>视图函数的第一个参数</code>，即HttpRequest对象</p><p><code>Django接收到http协议的请求后</code>，会根据<code>请求数据</code>报文创建<code>HttpRequest对象</code></p><p>HttpRequest对象 通过<code>属性</code> 描述了 请求的 所有相关信息</p></blockquote><blockquote><p><code>·path_info</code>：URL字符串</p><p><code>·method</code>：字符串，表示HTTP请求方法，常用值：<mark>`GET`</mark>、<mark>`POST`</mark></p><p><code>·GET</code>：<code>QueryDict</code>查询字典的对象，包含get请求方法的所有数据</p><p><code>·POST</code>：QueryDict查询字典的对象，包含post请求方式的所有数据</p><p><code>·FILES</code>：类似于字典的对象，包含所有的上传文件信息</p><p>·COOKIES：Python字典，包含所有的cookie，键和值都为字符串</p><p>·session：似于字典的对象，表示当前的会话</p><p>·body：字符串，请求体的内容（POST或PUT）</p><p>·scheme：请求协议（‘http’/‘https’）</p><p>·request.get_full_path()：请求的完整路径</p><p>·request.META：请求中的元数据（消息头）</p><p>​- request.META[‘REMOTE_ADDR’]：客户端IP地址</p></blockquote><blockquote><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">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/test_request?a=<span class="number">1</span>&amp;b=<span class="number">1</span></span><br><span class="line">test request ok</span><br><span class="line">终端</span><br><span class="line">path info <span class="keyword">is</span> /test_request</span><br><span class="line">method <span class="keyword">is</span> GET</span><br><span class="line">querystring <span class="keyword">is</span> &lt;QueryDict: &#123;<span class="string">&#x27;a&#x27;</span>: [<span class="string">&#x27;1&#x27;</span>], <span class="string">&#x27;b&#x27;</span>: [<span class="string">&#x27;1&#x27;</span>]&#125;&gt;</span><br><span class="line">full path <span class="keyword">is</span> /test_request?a=<span class="number">1</span>&amp;b=<span class="number">1</span></span><br><span class="line">[<span class="number">20</span>/Dec/<span class="number">2021</span> <span class="number">23</span>:<span class="number">27</span>:09] <span class="string">&quot;GET /test_request?a=1&amp;b=1 HTTP/1.1&quot;</span> <span class="number">200</span> <span class="number">15</span></span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    path(<span class="string">&#x27;test_request&#x27;</span>, views.test_request)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_request</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;path info is&#x27;</span>, request.path_info)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;method is&#x27;</span>, request.method)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;querystring is&#x27;</span>, request.GET)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;full path is&#x27;</span>, request.get_full_path())</span><br><span class="line">    <span class="keyword">return</span> HttpResponse(<span class="string">&#x27;test request ok&#x27;</span>)</span><br></pre></td></tr></table></figure></blockquote><h3 id="响应">响应<a class="header-anchor" href="#响应"></a></h3><h4 id="响应样例">响应样例<a class="header-anchor" href="#响应样例"></a></h4><blockquote><p><strong>响应样例</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052307158.png" alt=""></p></blockquote><h4 id="响应状态码">响应状态码<a class="header-anchor" href="#响应状态码"></a></h4><blockquote><p>HTTP状态码的英文为HTTP Status Code</p><p>下面是常见的HTTP状态码：</p><p>- <code>200</code> - 请求成功</p><p>- <code>301</code> - 永久重定向-资源（网页等）被永久转移到其它URL</p><p>- <code>302</code> - 临时重定向</p><p>- <code>404</code> - 请求的资源（网页等）不存在</p><p>- <code>500</code> - 内部服务器错误</p><p>HTTP状态码由三个十进制数字组成，第一个十进制数字定义了状态码的类型，后两个数字没有分类的作用。HTTP状态码共分为5种类型：</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052308576.png" alt=""></p></blockquote><h4 id="Django中的响应对象">Django中的响应对象<a class="header-anchor" href="#Django中的响应对象"></a></h4><blockquote><p>构造函数格式：</p><p>​HttpResponse(content=<code>响应体</code>, <code>content_type</code>=响应体数据类型, status=<code>状态码</code>)</p><p>作用：</p><p>​向客户端浏览器返回响应，同时携带响应体内容</p><p>常用的**<code>Conten-Type</code>**如下</p><p>- ‘<code>text/html</code>’（默认的，html文件）</p><p>- ‘text/plain’（纯文本）</p><p>- ‘text/css’（css文件）</p><p>- ‘<code>text/javascript</code>’（js文件）</p><p>- ‘multipart/form-data’（文件提交）</p><p>- ‘application/<code>json</code>’（json传输）</p><p>- ‘application/xml’（xml文件）</p><p>------------------------------------------------------------------</p><p>HttpResponse子类</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205052310989.png" alt=""></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></pre></td><td class="code"><pre><span class="line">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/test_request</span><br><span class="line">  =&gt; http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/page/<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line">urlpatterns = [</span><br><span class="line">    path(<span class="string">&#x27;test_request&#x27;</span>, views.test_request)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">from</span> django.http <span class="keyword">import</span> HttpResponse, HttpResponseRedirect</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">test_request</span>(<span class="params">request</span>):</span><br><span class="line">    <span class="keyword">return</span> HttpResponseRedirect(<span class="string">&#x27;/page/1&#x27;</span>)</span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Django </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Django </tag>
            
            <tag> HTTP </tag>
            
            <tag> 状态码 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_Django-介绍-项目结构-URL和视图函数</title>
      <link href="/posts/14763.html"/>
      <url>/posts/14763.html</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1vK4y1o7jH">视频链接：https://www.bilibili.com/video/BV1vK4y1o7jH</a></p><h2 id="一-课程目录">一. 课程目录<a class="header-anchor" href="#一-课程目录"></a></h2><blockquote><p>Django介绍</p><p>Django项目结构</p><p>URL和视图函数</p><p>路由配置</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205042042834.jpg" alt=""></p></blockquote><hr><h2 id="二-Django介绍">二. Django介绍<a class="header-anchor" href="#二-Django介绍"></a></h2><h3 id="起源">起源<a class="header-anchor" href="#起源"></a></h3><blockquote><p><strong>2005年发布，采用Python语言编写的开源web框架</strong></p><p><strong>早期的时候Django主做新闻和内容管理的</strong></p><p><strong>重量级的Python Web框架，Django配备了常用的大部分组件</strong></p></blockquote><h3 id="组件">组件<a class="header-anchor" href="#组件"></a></h3><blockquote><p>包含组件如下：</p><p>​基本配置文件/路由系统</p><p>​<mark>模型层(M)/模块层(T)/视图层(V)</mark></p><p>​Cookies和Session</p><p>​分页及发邮件</p><p>​Admin管理后台</p></blockquote><h3 id="用途">用途<a class="header-anchor" href="#用途"></a></h3><blockquote><p>用途一：网站/微信公众号/小程序后端开发</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205042044041.jpg" alt=""></p><p>用途二：人工智能平台融合</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205042044045.jpg" alt=""></p></blockquote><h3 id="版本">版本<a class="header-anchor" href="#版本"></a></h3><blockquote><p>Django官网：<a href="http://www.djangoproject.com">http://www.djangoproject.com</a></p><p>Django中文文档参考网站：<a href="https://yiyibooks.cn/">https://yiyibooks.cn/</a></p><p>版本</p><p>​最新版本3.0.x</p><p>​当前教学版本2.2.12</p></blockquote><h3 id="安装">安装<a class="header-anchor" href="#安装"></a></h3><blockquote><p>支持Python的版本 - 3.5，3.6，3.7，3.8</p><p><mark>在线安装</mark></p><p>​虚拟机执行 <mark>sudo pip3 install django==2.2.12</mark></p><p>​检查是否成功 sudo pip3 freeze |grep -i ‘Django’</p><p><mark>离线安装</mark> - 官方下载离线安装包</p><p>​将安装包复制到虚拟机</p><p>​解压缩 tar -xvf Django-2.2.12.tar.gz</p><p>​进入目录 cd Django-2.2.12</p><p>​执行安装 sudo python3 <a href="http://setup.py">setup.py</a> install</p><p>​检查是否成功 sudo pip3 freeze |grep -i ‘Django’</p></blockquote><hr><h2 id="三-Django项目结构">三. Django项目结构<a class="header-anchor" href="#三-Django项目结构"></a></h2><h3 id="创建项目">创建项目<a class="header-anchor" href="#创建项目"></a></h3><blockquote><p>成功安装 Django 后，虚拟机终端会有 django-admin 命令</p><p>执行 <mark>django-admin startproject 项目名</mark> 即可创建出对应项目文件夹</p><p>例如 终端执行 django-admin startproject mysite1; 则创建出mysite1项目</p></blockquote><h3 id="启动服务">启动服务<a class="header-anchor" href="#启动服务"></a></h3><blockquote><p>启动[测试开发阶段]</p><p>​1.终端cd进入到项目文件夹，例如 cd mysite1</p><p>​2.进入到项目文件夹后，执行 <mark><strong>python3 <a href="http://manage.py">manage.py</a> runserver</strong></mark> 启动django服务完【注：该启动方式下，Django在前台启动服务，默认监听8000端口】</p><p>​3.浏览器访问 <strong><a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a></strong> 可看到django的启动页面</p><p>​注：【如果想更换端口，则可以用 python3 <a href="http://manage.py">manage.py</a> runserver 端口号】</p></blockquote><h3 id="关闭服务">关闭服务<a class="header-anchor" href="#关闭服务"></a></h3><blockquote><p>方式1：在runserver启动终端下</p><p>​执行 <mark>Ctrl + c</mark> 可关闭Django服务</p><p>方式2：在取它终端下</p><p>​执行 sudo lsof -i:8000 查询出Django的进程id</p><p>​执行 <mark>kill -9</mark> 对应Django进程id</p></blockquote><h3 id="启动常见问题">启动常见问题<a class="header-anchor" href="#启动常见问题"></a></h3><blockquote><p>问题：启动时报错</p><p>​<mark>Error: That port is already in use.</mark></p><p>问题原因：端口已被使用，证明当前Django启动时，默认监听的8000端口已被其他进程占用</p><p>解决方案：参考关闭服务</p></blockquote><h3 id="结构解析">结构解析<a class="header-anchor" href="#结构解析"></a></h3><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><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">展开mysite1项目，结构如下</span><br><span class="line">$ tree mysite1</span><br><span class="line">mysite1</span><br><span class="line">├── db.sqlite3<span class="comment">#注：默认django数据库存储文件</span></span><br><span class="line">├── manage.py<span class="comment"># *</span></span><br><span class="line">└── mysite1<span class="comment"># *</span></span><br><span class="line">    ├── __init__.py</span><br><span class="line">    ├── __pycache__</span><br><span class="line">    │   ├── __init__.cpython-39.pyc</span><br><span class="line">    │   ├── settings.cpython-39.pyc</span><br><span class="line">    │   ├── urls.cpython-39.pyc</span><br><span class="line">    │   └── wsgi.cpython-39.pyc</span><br><span class="line">    ├── settings.py</span><br><span class="line">    ├── urls.py</span><br><span class="line">    └── wsgi.py</span><br></pre></td></tr></table></figure></blockquote><h4 id="manage-py"><a href="http://manage.py">manage.py</a><a class="header-anchor" href="#manage-py"></a></h4><blockquote><p><mark>manage.py包含项目管理的子命令</mark>，如：</p><p>​python3 <a href="http://manage.py">manage.py</a> runserver 启动服务</p><p>​python3 <a href="http://manage.py">manage.py</a> startapp 创建应用</p><p>​python3 <a href="http://manage.py">manage.py</a> migrate 数据库迁移</p><p>​…</p><p>​直接执行python3 <a href="http://manage.py">manage.py</a> 可列出所有的Django子命令</p></blockquote><h4 id="项目同名文件夹">项目同名文件夹<a class="header-anchor" href="#项目同名文件夹"></a></h4><blockquote><p>项目同名文件夹 - mysite1/mysite1</p><p>​<mark>__init__</mark>: Python包的初始化文件</p><p>​<mark>wsgi.py</mark>: WEB服务网关的配置文件 - Django正式启动时，需要用到</p><p>​<mark>urls.py</mark>: 项目的主路由配置 - HTTP请求进入Django时，优先调用该文件</p><p>​<mark>settings.py</mark>: 项目的配置文件 - 包含项目启动时需要的配置</p></blockquote><h4 id="settings-py"><a href="http://settings.py">settings.py</a><a class="header-anchor" href="#settings-py"></a></h4><blockquote><p>settings.py包含了Django项目启动的所有配置项</p><p>配置项分为 公有配置 和 自定义配置</p><p>配置项格式例：BASE_DIR = ‘xxxx’</p><p>公有配置 - Django官网提供的基础配置</p><p>​<a href="https://docs/djangoproject.com/en/2.2/ref/settings/">https://docs/djangoproject.com/en/2.2/ref/settings/</a></p></blockquote><h5 id="公有配置">公有配置<a class="header-anchor" href="#公有配置"></a></h5><blockquote><p><mark><strong>BASE_DIR</strong></mark></p><p>​用于绑定当前项目的绝对路径（动态计算出来的），所有文件夹都可以依赖此路径</p><p><mark><strong>DEBUG</strong></mark></p><p>​用于配置Django项目的启动模式，取值：</p><p>​True表示开发环境中使用 开发调试模式（用于开发中）</p><p>​False表示当前项目运行在 生产环境中</p><p><mark><strong>ALLOWED_HOSTS</strong></mark></p><p>设置允许访问到本项目的host头值</p><p>​[]空列表, 表示只有请求头中host为 127.0.0.1, localhost 能访问本项目 - DEBUG = True时生效</p><p>​[‘*’], 表示任何请求头的host都能访问到当前项目</p><p>​[‘192.168.1.3’, ‘127.0.0.1’] 表示只有当前两个host头的值能访问当前项目</p><p>示例：如果要在局域网其它主机也能访问此主机的Django服务，启动方式如下：</p><p>​<mark>python3 <a href="http://manage.py">manage.py</a> runserver 0.0.0.0:5000</mark></p><p>​指定网络设备如果内网环境下其它主机想正常访问该站点，需要加ALLOWED_HOSTS=[‘内网ip’]</p><p><mark><strong>INSTALLED_APPS</strong></mark> - 指定当前项目中安装的应用列表</p><p><mark><strong>MIDDLEWARE</strong></mark> - 用于注册中间件</p><p><mark><strong>TEMPLATES</strong></mark> - 用于指定模板的配置信息</p><p><mark><strong>DATABASES</strong></mark> - 用于指定数据库的配置信息</p><p><mark><strong>LANGUAGE_CODE</strong></mark> - 用于指定语言配置</p><p>​英语: “en-us”</p><p>​中文: “zh-Hans”</p><p><mark><strong>TIME_ZONE</strong></mark> - 用于指定当前服务器端时区</p><p>​世界标准时间: “UTC”</p><p>​中国时区: “Asia/Shanghai”</p><p><mark><strong>ROOT_URLCONF</strong></mark> - 用于配置主url配置 ‘mysite1.urls’</p><p>​ROOT_URLCONF = ‘mysite1.urls’</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#项目绝对路径</span></span><br><span class="line">BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))</span><br><span class="line"></span><br><span class="line">DEBUG = <span class="literal">True</span></span><br><span class="line"><span class="comment"># 启动模式</span></span><br><span class="line"><span class="comment"># True - 调试模式</span></span><br><span class="line"><span class="comment"># 1,检测代码改动后，立刻重启服务</span></span><br><span class="line"><span class="comment"># 2,报错页面</span></span><br><span class="line"><span class="comment"># False - 正式启动模式 / 上线模式</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#请求头Host头</span></span><br><span class="line">ALLOWED_HOSTS = [<span class="string">&#x27;127.0.0.1&#x27;</span>]</span><br><span class="line"><span class="comment">#ALLOWED_HOSTS = [&#x27;www.tedu1.com&#x27;]</span></span><br></pre></td></tr></table></figure></blockquote><h5 id="自定义配置">自定义配置<a class="header-anchor" href="#自定义配置"></a></h5><blockquote><p>settings.py中也可以添加 开发人员 <mark>自定义的配置</mark></p><p>配置建议：名字尽量个性化 - 以防覆盖掉公有配置</p><p>​例如：ALIPAY_KEY = ‘xxxxxx’</p><p>settings.py中的所有配置项，都可以按需的在代码中引入</p><p>引入方式：<mark>from django.conf import settings</mark></p></blockquote><hr><h2 id="四-URL和视图函数">四. URL和视图函数<a class="header-anchor" href="#四-URL和视图函数"></a></h2><h3 id="URL-结构">URL - 结构<a class="header-anchor" href="#URL-结构"></a></h3><blockquote><p>定义 - 即统一资源定位符 Uniform Resource Locator</p><p>作用 - 用来表示互联网上某个资源的地址</p><p>URL的一般语法格式为（注：[] 代表其中的内容可省略）：</p><p>​<mark>protocol://hostname[:port]/path[?query][#fragment]</mark></p><p>​<a href="http://tts.tmooc.cn/video/showVideo?menuld=657421&amp;version=AID999#subject">http://tts.tmooc.cn/video/showVideo?menuld=657421&amp;version=AID999#subject</a></p></blockquote><h4 id="protocol（协议）">protocol（协议）<a class="header-anchor" href="#protocol（协议）"></a></h4><blockquote><p><strong>==<a href="http://==tts.tmooc.cn">http://==tts.tmooc.cn</a></strong></p><p>http 通过HTTP访问该资源。格式 http://</p><p>https 通过安全的HTTPS访问该资源。格式 https://</p><p>file资源是本地计算机上的文件。格式 file:///</p></blockquote><h4 id="hostname（主机名）">hostname（主机名）<a class="header-anchor" href="#hostname（主机名）"></a></h4><blockquote><p><strong>http:// <mark><a href="http://tts.tmooc.cn">tts.tmooc.cn</a></mark></strong></p><p>是指存放资源的服务器的域名系统（DNS）主机名、域名 或 IP地址</p></blockquote><h4 id="port（端口号）">port（端口号）<a class="header-anchor" href="#port（端口号）"></a></h4><blockquote><p><strong><a href="http://tts.tmooc.cn">http://tts.tmooc.cn</a> <mark>:80</mark></strong></p><p>整数，可选，省略时使用方案的默认端口</p><p>各种传输协议都有默认的端口号，如http的默认端口为80</p></blockquote><h4 id="path（路由地址）">path（路由地址）<a class="header-anchor" href="#path（路由地址）"></a></h4><blockquote><p><strong><a href="http://tts.tmooc.cn/">http://tts.tmooc.cn/</a> <mark>video/showVideo</mark></strong></p><p>由零或多个 “/” 符号隔开的字符串，一般用来表示主机上的一个目录或文件地址。路由地址决定了服务器端如何处理这个请求</p></blockquote><h4 id="query（查询）">query（查询）<a class="header-anchor" href="#query（查询）"></a></h4><blockquote><p><strong>video/showVideo==?menuld=657421&amp;version=AID999==</strong></p><p>可选，用于给动态网页传递参数，可有多个参数，用 “&amp;” 符号隔开，每个参数的名和值用 “=” 符号隔开</p></blockquote><h4 id="fragment（信息片段）">fragment（信息片段）<a class="header-anchor" href="#fragment（信息片段）"></a></h4><blockquote><p><strong>Version=AID999==#subject==</strong></p><p><a href="https://docs.djangoproject.com/en/2.2/">https://docs.djangoproject.com/en/2.2/</a> <mark>#the-template-layer</mark></p><p>字符串，用于指定网络资源中的片段。例如一个网页中有多个名词解释，可使用fragment直接定位到某一名词解释</p></blockquote><h3 id="处理URL请求">处理URL请求<a class="header-anchor" href="#处理URL请求"></a></h3><blockquote><p>浏览器 地址栏 -&gt; <strong><a href="http://127.0.0.1:8000/page/2003/">http://127.0.0.1:8000/page/2003/</a></strong></p><p>​1.Django从配置文件中 根据 <mark>ROOT_URLCONF</mark> 找到 主路由文件；默认情况下，该文件在 项目同名目录下的urls；例如 <mark>mysite1/mysite1/urls.py</mark></p><p>​2.Django加载 主路由文件中的 <mark>urlpatterns</mark> 变量【包含很多路由的数组】</p><p>​3.依次匹配 urlpatterns 中的 URL，匹配到第一个合适的中断后续匹配</p><p>​4.匹配成功 - 调用对应的视图函数处理请求，返回响应</p><p>​5.匹配失败 - 返回404响应</p></blockquote><h3 id="主路由-urls-py">主路由 - <a href="http://urls.py">urls.py</a><a class="header-anchor" href="#主路由-urls-py"></a></h3><blockquote><p>主路由 - <a href="http://urls.py">urls.py</a> 样例</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="keyword">from</span> django.urls <span class="keyword">import</span> path</span><br><span class="line">form . <span class="keyword">import</span> views</span><br><span class="line"></span><br><span class="line">urlpatterns = [</span><br><span class="line">    path(<span class="string">&#x27;admin/&#x27;</span>, admin.site.urls),</span><br><span class="line">    path(<span class="string">&#x27;page/2003/&#x27;</span>, views.page_2003),</span><br><span class="line">    path(<span class="string">&#x27;page/2004/&#x27;</span>, views.page_2004),</span><br><span class="line">]</span><br></pre></td></tr></table></figure></blockquote><h3 id="视图函数">视图函数<a class="header-anchor" href="#视图函数"></a></h3><blockquote><p>视图函数是用于<mark>接收一个浏览器请求</mark>（<mark>HttpRequest</mark>对象）并通过<mark>HttpRequest</mark>对象<mark>返回响应</mark>的函数。此函数可以接收浏览器请求并根据业务逻辑返回相应的响应内容给浏览器</p><p>语法</p><p>​def xxx_view(<strong><mark>request</mark></strong>[, 其它参数…]):</p><p>​<strong><mark>return HttpResponse对象</mark></strong></p><blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># file: &lt;项目同名文件夹下&gt;/views.py</span></span><br><span class="line"><span class="keyword">from</span> django.http <span class="keyword">import</span> HttpResponse</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">page1_view</span>(<span class="params">request</span>):</span><br><span class="line">    html = <span class="string">&quot;&lt;h1&gt;这是第1个页面&lt;/h1&gt;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure></blockquote></blockquote><h3 id="示例">示例<a class="header-anchor" href="#示例"></a></h3><blockquote><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">http://<span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span>:<span class="number">8000</span>/page/<span class="number">2003</span>/</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/urls.py</span><br><span class="line"><span class="keyword">from</span> . <span class="keyword">import</span> views</span><br><span class="line"></span><br><span class="line">urlpatterns = [</span><br><span class="line">    path(<span class="string">&#x27;admin/&#x27;</span>, admin.site.urls),</span><br><span class="line">    <span class="comment">#http://127.0.0.1:8000/page/2003/</span></span><br><span class="line">    path(<span class="string">&#x27;page/2003/&#x27;</span>, views.page_2003_view)</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"> &lt;项目同名文件夹下&gt;/views.py</span><br><span class="line"><span class="keyword">from</span> django.http <span class="keyword">import</span> HttpResponse</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">page_2003_view</span>(<span class="params">request</span>):</span><br><span class="line">    html = <span class="string">&quot;&lt;h1&gt;这是第1个页面&lt;/h1&gt;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> HttpResponse(html)</span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Django </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Django </tag>
            
            <tag> MTV </tag>
            
            <tag> URL </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>03_Java-运算符-标识符命名规则规范-键盘输入-进制</title>
      <link href="/posts/62652.html"/>
      <url>/posts/62652.html</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1fh411y7R8">视频链接：https://www.bilibili.com/video/BV1fh411y7R8</a></p><h2 id="运算符">运算符<a class="header-anchor" href="#运算符"></a></h2><p><strong>运算符</strong></p><ul class="lvl-0"><li class="lvl-2"><p>运算符介绍</p></li></ul><p>​运算符是一种特殊的符号，用以表示数据的运算、赋值和比较等。</p><ol><li class="lvl-3"><p>算术运算符</p></li><li class="lvl-3"><p>赋值运算符</p></li><li class="lvl-3"><p>关系运算符 [比较运算符]</p></li><li class="lvl-3"><p>逻辑运算符</p></li><li class="lvl-3"><p>位运算符 [需要二进制基础]</p></li><li class="lvl-3"><p>三元运算符</p></li></ol><hr><h3 id="一-算术运算符">一. 算术运算符<a class="header-anchor" href="#一-算术运算符"></a></h3><p><strong>算术运算符</strong></p><ul class="lvl-0"><li class="lvl-2"><p>介绍</p><p>算术运算符是对数值类型的变量进行运算的，在 Java 程序中使用的非常多。</p></li><li class="lvl-2"><p>算术运算符一览</p></li></ul><blockquote><p><code>% 的本质看一个公式：a % b = a - a / b * b</code></p><p><code>a % b当 a 是小数时，公式 = a - (int)a / b * b</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082301910.png" alt="image-20220508230138805" style="zoom: 67%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092131114.png" alt="image-20220509213107049" style="zoom:67%;" /></blockquote><hr><ul class="lvl-0"><li class="lvl-2"><p>案例演示</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082304543.png" alt="image-20220508230401456" style="zoom: 67%;" /></blockquote><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><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">/**</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="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArithmeticOperator</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">// /使用</span></span><br><span class="line">System.out.println(<span class="number">10</span> / <span class="number">4</span>); <span class="comment">//从数学来看是2.5, java中 2</span></span><br><span class="line">System.out.println(<span class="number">10.0</span> / <span class="number">4</span>); <span class="comment">//java是2.5</span></span><br><span class="line"><span class="comment">// 注释快捷键 ctrl + /, 再次输入 ctrl + / 取消注释</span></span><br><span class="line"><span class="type">double</span> <span class="variable">d</span> <span class="operator">=</span> <span class="number">10</span> / <span class="number">4</span>;<span class="comment">//java中10 / 4 = 2, 2=&gt;2.0 </span></span><br><span class="line">System.out.println(d);<span class="comment">// 是2.0</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// % 取模 ,取余</span></span><br><span class="line"><span class="comment">// 在 % 的本质 看一个公式!!!! a % b = a - a / b * b</span></span><br><span class="line"><span class="comment">// -10 % 3 =&gt; -10 - (-10) / 3 * 3 = -10 + 9 = -1</span></span><br><span class="line"><span class="comment">// 10 % -3 = 10 - 10 / (-3) * (-3) = 10 - 9 = 1</span></span><br><span class="line"><span class="comment">// -10 % -3 =  (-10) - (-10) / (-3) * (-3) = -10 + 9 = -1</span></span><br><span class="line">System.out.println(<span class="number">10</span> % <span class="number">3</span>); <span class="comment">//1</span></span><br><span class="line"></span><br><span class="line">System.out.println(-<span class="number">10</span> % <span class="number">3</span>); <span class="comment">// -1</span></span><br><span class="line">System.out.println(<span class="number">10</span> % -<span class="number">3</span>); <span class="comment">//1</span></span><br><span class="line">System.out.println(-<span class="number">10</span> % -<span class="number">3</span>);<span class="comment">//-1</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="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line">i++;<span class="comment">//自增 等价于 i = i + 1; =&gt; i = 11</span></span><br><span class="line">++i;<span class="comment">//自增 等价于 i = i + 1; =&gt; i = 12</span></span><br><span class="line">System.out.println(<span class="string">&quot;i=&quot;</span> + i);<span class="comment">//12</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">        前++：++i先自增后赋值</span></span><br><span class="line"><span class="comment">        后++：i++先赋值后自增</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">8</span>;</span><br><span class="line"><span class="comment">//int k = ++j; //等价 j=j+1;k=j; </span></span><br><span class="line"><span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> j++; <span class="comment">// 等价 k =j;j=j+1;</span></span><br><span class="line">System.out.println(<span class="string">&quot;k=&quot;</span> + k + <span class="string">&quot;j=&quot;</span> + j);<span class="comment">//8 9</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>细节说明</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082326729.png" alt="image-20220508232614621" style="zoom:67%;" /></blockquote><hr><p>算数运算符使用</p><ul class="lvl-0"><li class="lvl-2"><p>面试题</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082326225.png" alt="image-20220508232646110" style="zoom: 67%;" /><ul class="lvl-1"><li class="lvl-2">自增，自减课堂练习, 看看输出什么</li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082338509.png" alt="image-20220508233829424" style="zoom:67%;" /></blockquote></blockquote><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//练习</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArithmeticOperatorExercise01</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">// int i = 1;//i-&gt;1</span></span><br><span class="line"><span class="comment">// i = i++; //规则使用临时变量: (1) temp=i;(2) i=i+1;(3)i=temp;</span></span><br><span class="line"><span class="comment">// System.out.println(i); // 1</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// int i=1;</span></span><br><span class="line"><span class="comment">// i=++i; //规则使用临时变量: (1) i=i+1;(2) temp=i;(3)i=temp;</span></span><br><span class="line"><span class="comment">// System.out.println(i); //2</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="type">int</span> <span class="variable">i1</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line">    <span class="type">int</span> <span class="variable">i2</span> <span class="operator">=</span> <span class="number">20</span>;</span><br><span class="line">        <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> i1++;</span><br><span class="line">        System.out.print(<span class="string">&quot;i=&quot;</span>+i);<span class="comment">//10</span></span><br><span class="line">        System.out.println(<span class="string">&quot;i2=&quot;</span>+i2);<span class="comment">//20</span></span><br><span class="line">        i = --i2; </span><br><span class="line">        System.out.print(<span class="string">&quot;i=&quot;</span>+i);<span class="comment">//19</span></span><br><span class="line">        System.out.println(<span class="string">&quot;i2=&quot;</span>+i2);<span class="comment">//19</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>课堂练习 2<a href="//ArithmeticOperatorExercise02.java">//ArithmeticOperatorExercise02.java</a></p></li></ul><ol><li class="lvl-3"><p>假如还有 59 天放假，问：合 xx 个星期零 xx 天</p></li><li class="lvl-3"><p>定义一个变量保存华氏温度，华氏温度转换摄氏温度的公式为：5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度。 [234.5]</p></li><li class="lvl-3"><p>代码</p></li></ol><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><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="comment">//课堂练习</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArithmeticOperatorExercise02</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//1.需求:</span></span><br><span class="line"><span class="comment">//假如还有59天放假，问：合xx个星期零xx天</span></span><br><span class="line"><span class="comment">//2.思路分析</span></span><br><span class="line"><span class="comment">//(1) 使用int 变量 days 保存 天数</span></span><br><span class="line"><span class="comment">//(2) 一个星期是7天 星期数weeks： days / 7 零xx天leftDays days % 7</span></span><br><span class="line"><span class="comment">//(3) 输出</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//3.走代码</span></span><br><span class="line"><span class="type">int</span> <span class="variable">days</span> <span class="operator">=</span> <span class="number">25911</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">weeks</span> <span class="operator">=</span> days / <span class="number">7</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">leftDays</span> <span class="operator">=</span> days % <span class="number">7</span>;</span><br><span class="line">System.out.println(days + <span class="string">&quot;天 合&quot;</span> + weeks + <span class="string">&quot;星期零&quot;</span> </span><br><span class="line">+ leftDays + <span class="string">&quot;天&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//1.需求</span></span><br><span class="line"><span class="comment">//定义一个变量保存华氏温度，华氏温度转换摄氏温度的公式为</span></span><br><span class="line"><span class="comment">//：5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//2思路分析</span></span><br><span class="line"><span class="comment">//(1) 先定义一个double huaShi 变量保存 华氏温度</span></span><br><span class="line"><span class="comment">//(2) 根据给出的公式，进行计算即可5/9*(华氏温度-100)</span></span><br><span class="line"><span class="comment">//    考虑数学公式和java语言的特性</span></span><br><span class="line"><span class="comment">//(3) 将得到的结果保存到double sheShi</span></span><br><span class="line"><span class="comment">//3走代码</span></span><br><span class="line"><span class="type">double</span> <span class="variable">huaShi</span> <span class="operator">=</span> <span class="number">1234.6</span>;</span><br><span class="line"><span class="type">double</span> <span class="variable">sheShi</span> <span class="operator">=</span> <span class="number">5.0</span> / <span class="number">9</span> * (huaShi - <span class="number">100</span>);</span><br><span class="line">System.out.println(<span class="string">&quot;华氏温度&quot;</span> + huaShi </span><br><span class="line">+ <span class="string">&quot; 对应的摄氏温度=&quot;</span> + sheShi);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="二-关系运算符-比较运算符">二. 关系运算符(比较运算符)<a class="header-anchor" href="#二-关系运算符-比较运算符"></a></h3><p>**关系运算符(比较运算符) **</p><ul class="lvl-0"><li class="lvl-2"><p><strong>介绍</strong></p></li></ul><ol><li class="lvl-3"><p>关系运算符的结果都是 boolean 型，也就是要么是 true，要么是 false</p></li><li class="lvl-3"><p>关系表达式 经常用在 if 结构的条件中或循环结构的条件中</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p><strong>关系运算符一览</strong></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205090011985.png" alt="image-20220509001153917" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><strong>案例演示</strong></p></li></ul><p>案例演示关系运算符的使用(RelationalOperator.java)。</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205090015981.png" alt="image-20220509001501843" style="zoom: 67%;" /></blockquote><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></pre></td><td class="code"><pre><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"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RelationalOperator</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="variable">a</span> <span class="operator">=</span> <span class="number">9</span>;  <span class="comment">//老韩提示:  开发中，不可以使用  a, b </span></span><br><span class="line"><span class="type">int</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">8</span>;</span><br><span class="line">System.out.println(a &gt; b);<span class="comment">//T </span></span><br><span class="line">System.out.println(a &gt;= b); <span class="comment">//T</span></span><br><span class="line">System.out.println(a &lt;= b); <span class="comment">//F</span></span><br><span class="line">System.out.println(a &lt; b);  <span class="comment">//F</span></span><br><span class="line">System.out.println(a == b); <span class="comment">//F</span></span><br><span class="line">System.out.println(a != b); <span class="comment">//T</span></span><br><span class="line"><span class="type">boolean</span> <span class="variable">flag</span> <span class="operator">=</span> a &gt; b; <span class="comment">//T</span></span><br><span class="line">System.out.println(<span class="string">&quot;flag=&quot;</span> + flag);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>细节说明</strong></p></li></ul><ol><li class="lvl-3"><p>关系运算符的结果都是 boolean 型，也就是要么是 true，要么是 false。</p></li><li class="lvl-3"><p>关系运算符组成的表达式，我们称为关系表达式。 a &gt; b</p></li><li class="lvl-3"><p>比较运算符&quot;==“不能误写成”=&quot;</p></li></ol><hr><h3 id="三-逻辑运算符">三. 逻辑运算符<a class="header-anchor" href="#三-逻辑运算符"></a></h3><p><strong>逻辑运算符</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>介绍</strong></p></li></ul><p>​用于连接多个条件（多个关系表达式），最终的结果也是一个 boolean 值。</p><ul class="lvl-0"><li class="lvl-2"><p><strong>逻辑运算符一览</strong></p></li></ul><p>分为两组学习</p><ol><li class="lvl-3"><p><code>短路与 &amp;&amp; ， 短路或 ||，取反 ! </code></p></li><li class="lvl-3"><p><code>逻辑与 &amp;，逻辑或 |，^ 逻辑异或 </code></p></li></ol><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205090021561.png" alt="image-20220509002134483" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><input type="checkbox" id="checkbox17" checked="true"><label for="checkbox17"></label><strong>说明逻辑运算规则</strong>：</p></li></ul><ol><li class="lvl-3"><p>a&amp;b : &amp; 叫逻辑与：规则：当 a 和 b 同时为 true ,则结果为 true, 否则为 false</p></li><li class="lvl-3"><p>a&amp;&amp;b : &amp;&amp; 叫短路与：规则：当 a 和 b 同时为 true ,则结果为 true,否则为 false</p></li><li class="lvl-3"><p>a|b : | 叫逻辑或，规则：当 a 和 b ，有一个为 true ,则结果为 true,否则为 false</p></li><li class="lvl-3"><p>a||b : || 叫短路或，规则：当 a 和 b ，有一个为 true ,则结果为 true,否则为 false</p></li><li class="lvl-3"><p>!a : 叫取反，或者非运算。当 a 为 true, 则结果为 false, 当 a 为 false 是，结果为 true</p></li><li class="lvl-3"><p>a^b: 叫逻辑异或，当 a 和 b 不同时，则结果为 true, 否则为 false</p></li></ol><hr><h4 id="短路与逻辑与">短路与逻辑与<a class="header-anchor" href="#短路与逻辑与"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>&amp;&amp; 和 &amp; 基本规则</strong></p></li></ul><table><thead><tr><th>名称</th><th>语法</th><th>特点</th></tr></thead><tbody><tr><td>短路与&amp;&amp;</td><td>条件 1&amp;&amp;条件 2</td><td rowspan="2">两个条件都为 true，结果为 true,否则 false</td></tr><tr><td>逻辑与&amp;</td><td>条件 1&amp;条件 2</td></tr></tbody></table><ul class="lvl-0"><li class="lvl-2"><p><strong>&amp;&amp; 和 &amp; 案例演示</strong></p></li></ul><p>案例演示&amp;&amp; 和 &amp; 运算符的使用(LogicOperator01.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><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">/**</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"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LogicOperator01</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//&amp;&amp;短路与  和 &amp; 案例演示</span></span><br><span class="line"><span class="type">int</span> <span class="variable">age</span> <span class="operator">=</span> <span class="number">50</span>;</span><br><span class="line"><span class="keyword">if</span>(age &gt; <span class="number">20</span> &amp;&amp; age &lt; <span class="number">90</span>) &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;ok100&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//&amp;逻辑与使用</span></span><br><span class="line"><span class="keyword">if</span>(age &gt; <span class="number">20</span> &amp; age &lt; <span class="number">90</span>) &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;ok200&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="type">int</span> <span class="variable">a</span> <span class="operator">=</span> <span class="number">4</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">9</span>;</span><br><span class="line"><span class="comment">//对于&amp;&amp;短路与而言，如果第一个条件为false ,后面的条件不再判断</span></span><br><span class="line"><span class="comment">//对于&amp;逻辑与而言，如果第一个条件为false ,后面的条件仍然会判断</span></span><br><span class="line"><span class="keyword">if</span>(a &lt; <span class="number">1</span> &amp; ++b &lt; <span class="number">50</span>) &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;ok300&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">System.out.println(<span class="string">&quot;a=&quot;</span> + a + <span class="string">&quot; b=&quot;</span> + b);<span class="comment">// 4 10</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>&amp;&amp; 和 &amp; 使用区别</strong></p></li></ul><ol><li class="lvl-3"><p>&amp;&amp;短路与：如果第一个条件为 false，则第二个条件不会判断，最终结果为 false，效率高</p></li><li class="lvl-3"><p>&amp; 逻辑与：不管第一个条件是否为 false，第二个条件都要判断，效率低</p></li><li class="lvl-3"><p>开发中， 我们使用的基本是使用短路与<code>&amp;&amp;</code>, 效率高</p></li></ol><hr><h4 id="短路或逻辑或">短路或逻辑或<a class="header-anchor" href="#短路或逻辑或"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>|| 和 | 基本规则</strong></p></li></ul><table><thead><tr><th>名称</th><th>语法</th><th>特点</th></tr></thead><tbody><tr><td>短路或||</td><td>条件 1||条件2</td><td>两个条件中只要有一个成立，结果为 true,否则为 false</td></tr><tr><td>逻辑或|</td><td>条件 1|条件2</td><td>只要有一个条件成立，结果为 true,否则为 false</td></tr></tbody></table><ul class="lvl-0"><li class="lvl-2"><p><strong>|| 和 | 案例演示</strong></p></li></ul><p>案例演示&amp;&amp; || !运算符的使用(LogicOperator02.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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//演示| || 使用</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LogicOperator02</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//||短路或  和 |逻辑或 案例演示</span></span><br><span class="line"><span class="comment">//|| 规则: 两个条件中只要有一个成立，结果为true,否则为false</span></span><br><span class="line"><span class="comment">//| 规则: 两个条件中只要有一个成立，结果为true,否则为false</span></span><br><span class="line"><span class="type">int</span> <span class="variable">age</span> <span class="operator">=</span> <span class="number">50</span>;</span><br><span class="line"><span class="keyword">if</span>(age &gt; <span class="number">20</span> || age &lt; <span class="number">30</span>) &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;ok100&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//|逻辑或使用</span></span><br><span class="line"><span class="keyword">if</span>(age &gt; <span class="number">20</span> | age &lt; <span class="number">30</span>) &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;ok200&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="comment">//(1)||短路或：如果第一个条件为true，</span></span><br><span class="line"><span class="comment">//则第二个条件不会判断，最终结果为true，效率高</span></span><br><span class="line"><span class="comment">//(2)| 逻辑或：不管第一个条件是否为true，第二个条件都要判断，效率低</span></span><br><span class="line"><span class="type">int</span> <span class="variable">a</span> <span class="operator">=</span> <span class="number">4</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">9</span>;</span><br><span class="line"><span class="keyword">if</span>( a &gt; <span class="number">1</span> || ++b &gt; <span class="number">4</span>) &#123; <span class="comment">// 可以换成 | 测试</span></span><br><span class="line">System.out.println(<span class="string">&quot;ok300&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">System.out.println(<span class="string">&quot;a=&quot;</span> + a + <span class="string">&quot; b=&quot;</span> + b); <span class="comment">//4 9</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>|| 和 | 使用区别</strong></p></li></ul><ol><li class="lvl-3"><p>||短路或：如果第一个条件为 true，则第二个条件不会判断，最终结果为 true，效率高</p></li><li class="lvl-3"><p>| 逻辑或：不管第一个条件是否为 true，第二个条件都要判断，效率低</p></li><li class="lvl-3"><p>开发中，我们基本使用 <code>||</code></p></li></ol><hr><h4 id="逻辑非逻辑异或">逻辑非逻辑异或<a class="header-anchor" href="#逻辑非逻辑异或"></a></h4><ul class="lvl-0"><li class="lvl-2"><p><strong>! 取反 基本规则</strong></p></li></ul><table><thead><tr><th>名称</th><th>语法</th><th>特点</th></tr></thead><tbody><tr><td>! 非（取反）</td><td>!条件</td><td>如果条件本身成立，结果为 false，否则为 true</td></tr></tbody></table><ul class="lvl-0"><li class="lvl-2"><p><strong>! 案例演示</strong></p></li></ul><p>案例演示 !运算符的使用(InverseOperator.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><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">//!和^案例演示</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">InverseOperator</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//! 操作是取反 T-&gt;F  , F -&gt; T</span></span><br><span class="line">System.out.println(<span class="number">60</span> &gt; <span class="number">20</span>); <span class="comment">//T</span></span><br><span class="line">System.out.println(!(<span class="number">60</span> &gt; <span class="number">20</span>)); <span class="comment">//F</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//a^b: 叫逻辑异或，当 a 和 b 不同时，则结果为true, 否则为false</span></span><br><span class="line"><span class="type">boolean</span> <span class="variable">b</span> <span class="operator">=</span> (<span class="number">10</span> &gt; <span class="number">1</span>) ^ ( <span class="number">3</span> &gt; <span class="number">5</span>);</span><br><span class="line">System.out.println(<span class="string">&quot;b=&quot;</span> + b);<span class="comment">//T</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>^ 案例演示</strong></p></li></ul><p>a^b: 叫逻辑异或，当 a 和 b 不同时，则结果为 true, 否则为 false</p><p>^逻辑异或，System.out.println( (4 &lt; 1) ^ (6 &gt; 3) ); // T</p><hr><p><strong>逻辑运算符练习</strong></p><ul class="lvl-0"><li class="lvl-2"><p>练习题 1 请写出每题的输出结果</p></li></ul><blockquote><p>x ++== 6，先比较，再自增</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091319381.png" alt="image-20220509131958291" style="zoom:67%;" /></blockquote><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//验证</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">// int x = 5;</span></span><br><span class="line"><span class="comment">// int y=5;</span></span><br><span class="line"><span class="comment">// if(x++==6 &amp; ++y==6)&#123; //逻辑与</span></span><br><span class="line"><span class="comment">// x = 11;</span></span><br><span class="line"><span class="comment">// &#125;</span></span><br><span class="line"><span class="comment">// System.out.println(&quot;x=&quot;+x+&quot;,y=&quot;+y);</span></span><br><span class="line"><span class="comment">// //6, 6</span></span><br><span class="line"><span class="comment">// int x = 5,y = 5;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// if(x++==6 &amp;&amp; ++y==6)&#123;</span></span><br><span class="line"><span class="comment">// x = 11;</span></span><br><span class="line"><span class="comment">// &#125;</span></span><br><span class="line"><span class="comment">// System.out.println(&quot;x=&quot;+x+&quot;,y=&quot;+y);</span></span><br><span class="line"><span class="comment">// //6, 5</span></span><br><span class="line"><span class="comment">// </span></span><br><span class="line"><span class="comment">// int x = 5,y = 5;</span></span><br><span class="line"><span class="comment">// if(x++==5 | ++y==5)&#123;</span></span><br><span class="line"><span class="comment">// x =11;</span></span><br><span class="line"><span class="comment">// &#125;</span></span><br><span class="line"><span class="comment">// System.out.println(&quot;x=&quot;+x+&quot;,y=&quot;+y);</span></span><br><span class="line"><span class="comment">//11, 6</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// int x = 5,y = 5;</span></span><br><span class="line"><span class="comment">// if(x++==5 || ++y==5)&#123;</span></span><br><span class="line"><span class="comment">// x =11;</span></span><br><span class="line"><span class="comment">// &#125;</span></span><br><span class="line"><span class="comment">// System.out.println(&quot;x=&quot;+x+&quot;,y=&quot;+y);</span></span><br><span class="line"><span class="comment">//11, 5</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="type">boolean</span> x=<span class="literal">true</span>;</span><br><span class="line"><span class="type">boolean</span> y=<span class="literal">false</span>;</span><br><span class="line"><span class="type">short</span> z=<span class="number">46</span>;</span><br><span class="line"><span class="keyword">if</span>( (z++==<span class="number">46</span>)&amp;&amp; (y=<span class="literal">true</span>) )   z++;  </span><br><span class="line"><span class="keyword">if</span>((x=<span class="literal">false</span>) || (++z==<span class="number">49</span>))  z++; </span><br><span class="line">System. out.println(<span class="string">&quot;z=&quot;</span>+z); <span class="comment">//50 </span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>练习题 2 请写输出结果</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091324402.png" alt="image-20220509132450314" style="zoom:67%;" /></blockquote><hr><h3 id="四-赋值运算符">四. 赋值运算符<a class="header-anchor" href="#四-赋值运算符"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><strong>介绍</strong></p></li></ul><p>赋值运算符就是将某个运算后的值，赋给指定的变量。</p><ul class="lvl-0"><li class="lvl-2"><p><strong>赋值运算符的分类</strong></p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox18" checked="true"><label for="checkbox18">基本赋值运算符 =      int a = 10;</label></p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox19" checked="true"><label for="checkbox19">复合赋值运算符</label></p></li></ul><p>​+= ，-= ，*= ， /= ，%= 等 , 重点讲解一个 += ，其它的使用是一个道理</p><p>​a += b; [等价 a = a + b; ]</p><p>​a -= b;  [等价 a = a - b; ]</p><ul class="lvl-0"><li class="lvl-2"><p><strong>案例演示</strong></p></li></ul><p>案例演示赋值运算符的基本使用。AssignOperator.java</p><ol><li class="lvl-3"><p>赋值基本案例 [int num1 = 10]</p></li><li class="lvl-3"><p>+= 的使用案例</p></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//演示赋值运算符的使用</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AssignOperator</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line">n1 += <span class="number">4</span>;<span class="comment">// n1 = n1 + 4;</span></span><br><span class="line">System.out.println(n1); <span class="comment">// 14</span></span><br><span class="line">n1 /= <span class="number">3</span>;<span class="comment">// n1 = n1 / 3;//4</span></span><br><span class="line">System.out.println(n1); <span class="comment">// 4</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//复合赋值运算符会进行类型转换</span></span><br><span class="line"><span class="type">byte</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">3</span>;</span><br><span class="line">b += <span class="number">2</span>; <span class="comment">// 等价 b = (byte)(b + 2);</span></span><br><span class="line">b++; <span class="comment">// b = (byte)(b+1);</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>赋值运算符特点</strong></p></li></ul><ol><li class="lvl-3"><p>运算顺序从右往左        int num = a + b + c;</p></li><li class="lvl-3"><p>赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值</p></li></ol><p>​int num = 20; int num2= 78 * 34 - 10; int num3 = a;</p><ol start="3"><li class="lvl-3"><p>复合赋值运算符等价于下面的效果</p></li></ol><p>​比如：a+=3;等价于 a=a+3; 其他类推</p><ol start="4"><li class="lvl-3"><p>复合赋值运算符会进行类型转换。</p></li></ol><p>​byte b = 2; b+=3; b++;</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091347006.png" alt="image-20220509134732958" style="zoom: 67%;" /></blockquote><hr><h3 id="五-三元运算符">五. 三元运算符<a class="header-anchor" href="#五-三元运算符"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><strong>基本语法</strong></p></li></ul><p>条件表达式 ? 表达式 1: 表达式 2;</p><p><code>运算规则</code>：</p><ol><li class="lvl-3"><p>如果条件表达式为 true，运算后的结果是表达式 1；</p></li><li class="lvl-3"><p>如果条件表达式为 false，运算后的结果是表达式 2；</p></li></ol><p>口诀: [一灯大师：<strong>一真大师</strong>]</p><ul class="lvl-0"><li class="lvl-2"><p><strong>案例演示</strong> TernaryOperator.java</p></li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//三元运算符使用</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TernaryOperator</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="variable">a</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">99</span>;</span><br><span class="line"><span class="comment">// 解读</span></span><br><span class="line"><span class="comment">// 1. a &gt; b 为 false</span></span><br><span class="line"><span class="comment">// 2. 返回 b--, 先返回 b的值,然后在 b-1</span></span><br><span class="line"><span class="comment">// 3. 返回的结果是99 </span></span><br><span class="line"><span class="type">int</span> <span class="variable">result</span> <span class="operator">=</span> a &gt; b ? a++ : b--;</span><br><span class="line">System.out.println(<span class="string">&quot;result=&quot;</span> + result);</span><br><span class="line">System.out.println(<span class="string">&quot;a=&quot;</span> + a);</span><br><span class="line">System.out.println(<span class="string">&quot;b=&quot;</span> + b);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><ul class="lvl-0"><li class="lvl-2"><p><strong>使用细节</strong> TernaryOperatorDetail.java</p></li></ul><ol><li class="lvl-3"><p>表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换)</p></li><li class="lvl-3"><p>三元运算符可以转成 if–else 语句</p></li></ol><p>​int res = a &gt; b ? a++ : --b;</p><p>​if ( a &gt; b) res = a++;</p><p>​else res = --b;</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></pre></td><td class="code"><pre><span class="line"><span class="comment">//三元运算符细节</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TernaryOperatorDetail</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//表达式1和表达式2要为可以赋给接收变量的类型</span></span><br><span class="line"><span class="comment">//(或可以自动转换/或者强制转换)</span></span><br><span class="line"><span class="type">int</span> <span class="variable">a</span> <span class="operator">=</span> <span class="number">3</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">8</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">c</span> <span class="operator">=</span> a &gt; b ? (<span class="type">int</span>)<span class="number">1.1</span> : (<span class="type">int</span>)<span class="number">3.4</span>;<span class="comment">//可以的</span></span><br><span class="line"><span class="type">double</span> <span class="variable">d</span> <span class="operator">=</span> a &gt; b ? a : b + <span class="number">3</span>;<span class="comment">//可以的，满足 int -&gt; double</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>课堂练习</strong></p></li></ul><p><strong>案例：实现三个数的最大值</strong> TernaryOperatorExercise.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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TernaryOperatorExercise</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//案例：实现三个数的最大值</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> <span class="number">553</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">n2</span> <span class="operator">=</span> <span class="number">33</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">n3</span> <span class="operator">=</span> <span class="number">123</span>;</span><br><span class="line"><span class="comment">//思路</span></span><br><span class="line"><span class="comment">//1. 先得到 n1 和 n2 中最大数 , 保存到 max1</span></span><br><span class="line"><span class="comment">//2. 然后再 求出 max1 和  n3中的最大数，保存到 max2</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="variable">max1</span> <span class="operator">=</span> n1 &gt; n2 ? n1 : n2;</span><br><span class="line"><span class="type">int</span> <span class="variable">max2</span> <span class="operator">=</span> max1 &gt; n3 ? max1 : n3;</span><br><span class="line">System.out.println(<span class="string">&quot;最大数=&quot;</span> + max2);</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">// int max = (n1 &gt; n2 ? n1 : n2) &gt; n3 ? </span></span><br><span class="line"><span class="comment">// (n1 &gt; n2 ? n1 : n2) : n3;</span></span><br><span class="line"><span class="comment">// System.out.println(&quot;最大数=&quot; + max);</span></span><br><span class="line"><span class="comment">// </span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="六-运算符优先级">六. 运算符优先级<a class="header-anchor" href="#六-运算符优先级"></a></h3><p><strong>运算符优先级</strong></p><ol><li class="lvl-3"><p>运算符有不同的优先级，所谓优先级就是表达式运算中的运算顺序。如右表，上一行运算符总优先于下一行。</p></li><li class="lvl-3"><p>只有单目运算符、赋值运算符是从右向左运算的。</p></li><li class="lvl-3"><p>一览表, 不要背，使用多了，就熟悉了</p></li></ol><blockquote><p><strong>梳理小节</strong>：小伙伴有一个大致印象，使用多了，就熟悉</p><ol><li class="lvl-3">() , {} 等</li><li class="lvl-3">单目运算  ++ –</li><li class="lvl-3">算数运算符</li><li class="lvl-3">位移运算符</li><li class="lvl-3">比较运算符</li><li class="lvl-3">逻辑运算符</li><li class="lvl-3">三元运算符</li><li class="lvl-3">赋值运算符</li></ol><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091622856.png" alt="image-20220509162226749" style="zoom: 67%;" /></blockquote><hr><h2 id="标识符命名规则和规范">标识符命名规则和规范<a class="header-anchor" href="#标识符命名规则和规范"></a></h2><h3 id="七-标识符规则">七. 标识符规则<a class="header-anchor" href="#七-标识符规则"></a></h3><p><strong>标识符的命名<code>规则</code>和<code>规范</code></strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091628391.png" alt="image-20220509162810243" style="zoom:67%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="variable">abcclass</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> <span class="number">40</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">N</span> <span class="operator">=</span> <span class="number">50</span>;</span><br><span class="line">System.out.println(<span class="string">&quot;n=&quot;</span> + n);<span class="comment">//40</span></span><br><span class="line">System.out.println(<span class="string">&quot;N=&quot;</span> + N);<span class="comment">//50</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//? abc 和 aBc 是两个不同变量</span></span><br><span class="line"><span class="type">int</span> <span class="variable">abc</span> <span class="operator">=</span> <span class="number">100</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">aBc</span> <span class="operator">=</span> <span class="number">200</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//int a b = 300;//x</span></span><br><span class="line"><span class="comment">//int a-b=10;</span></span><br><span class="line"><span class="type">int</span> <span class="variable">goto1</span> <span class="operator">=</span> <span class="number">10</span>;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>判断下面变量名是否正确</strong></p></li></ul><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></pre></td><td class="code"><pre><span class="line">hsp<span class="comment">//ok </span></span><br><span class="line">hsp12<span class="comment">//ok </span></span><br><span class="line">1hsp<span class="comment">//错误, 数字不能开头 </span></span><br><span class="line">h-s<span class="comment">// 错误 , 不能有 - </span></span><br><span class="line">x h<span class="comment">// 错误， 有空格 </span></span><br><span class="line">h$<span class="number">4</span><span class="comment">// ok </span></span><br><span class="line">class<span class="comment">//错误，class 关键字 </span></span><br><span class="line"><span class="type">int</span> <span class="comment">// 错误 ,int 是关键字 </span></span><br><span class="line"><span class="type">double</span><span class="comment">//错误 ,double 是关键字 </span></span><br><span class="line"><span class="keyword">public</span><span class="comment">//错误 ,public 是关键字 </span></span><br><span class="line"><span class="keyword">static</span><span class="comment">//错误 ,static 是关键字 </span></span><br><span class="line"><span class="keyword">goto</span><span class="comment">//错误, goto 是保留字 </span></span><br><span class="line">stu_name<span class="comment">//ok</span></span><br></pre></td></tr></table></figure><hr><h3 id="八-标识符规范">八. 标识符规范<a class="header-anchor" href="#八-标识符规范"></a></h3><p><strong>标识符命名规范[更加专业]</strong></p><ol><li class="lvl-3"><p>包名：多单词组成时所有字母都小写：aaa.bbb.ccc //比如 com.hsp.crm</p></li><li class="lvl-3"><p>类名、接口名：多单词组成时，所有单词的首字母大写：XxxYyyZzz [大驼峰]</p></li></ol><p>​比如： TankShotGame</p><ol start="3"><li class="lvl-3"><p>变量名、方法名：多单词组成时，第一个单词首字母小写，第二个单词开始每个单词首字母大写：xxxYyyZzz [小驼峰， 简称 驼峰法]</p></li></ol><p>​比如： tankShotGame</p><ol start="4"><li class="lvl-3"><p>常量名：所有字母都大写。多单词时每个单词用下划线连接：XXX_YYY_ZZZ</p></li></ol><p>​比如 ：定义一个所得税率 TAX_RATE</p><ol start="5"><li class="lvl-3"><p>后面我们学习到 类，包，接口，等时，我们的命名规范要这样遵守,更加详细的看文档.</p></li></ol><hr><h3 id="九-关键字保留字">九. 关键字保留字<a class="header-anchor" href="#九-关键字保留字"></a></h3><p><strong>关键字</strong></p><p>关键字的定义和特点 (<strong><code>不用背</code></strong>)</p><p>定义：被 Java 语言赋予了特殊含义，用做 <strong>专门用途的字符串</strong>（单词）</p><p>特点：关键字中所有字母都为小写</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091647948.png" alt="image-20220509164734847" style="zoom: 67%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091647396.png" alt="image-20220509164755233" style="zoom:67%;" /></blockquote><hr><p><strong>保留字</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>介绍</strong></p></li></ul><p>​Java 保留字：现有 Java 版本<strong>尚未使用</strong>，但<strong>以后版本可能会作为关键字使用</strong>。自己命名标识符时要避免使用这些保留字</p><p>byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const</p><hr><h2 id="键盘输入">键盘输入<a class="header-anchor" href="#键盘输入"></a></h2><h3 id="十-键盘输入">十. 键盘输入<a class="header-anchor" href="#十-键盘输入"></a></h3><p><strong>键盘输入语句</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>介绍</strong></p></li></ul><p>在编程中，需要接收用户输入的数据，就可以使用键盘输入语句来获取。Input.java , 需要一个 扫描器(对象), 就是 Scanner</p><ul class="lvl-0"><li class="lvl-2"><p><strong>步骤 ：</strong></p></li></ul><ol><li class="lvl-3"><p>导入该类的所在包, java.util.*</p></li><li class="lvl-3"><p>创建该类对象（声明变量）</p></li><li class="lvl-3"><p>调用里面的功能</p></li></ol><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091653715.png" alt="image-20220509165317654" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><strong>案例演示：</strong></p></li></ul><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><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="keyword">import</span> java.util.Scanner;<span class="comment">//表示把java.util下的Scanner类导入 </span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Input</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</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">//Scanner类 表示 简单文本扫描器，在java.util 包</span></span><br><span class="line"><span class="comment">//1. 引入/导入 Scanner类所在的包</span></span><br><span class="line"><span class="comment">//2. 创建 Scanner 对象 , new 创建一个对象,体会</span></span><br><span class="line"><span class="comment">//   myScanner 就是 Scanner类的对象</span></span><br><span class="line"><span class="type">Scanner</span> <span class="variable">myScanner</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"><span class="comment">//3. 接收用户输入了， 使用 相关的方法</span></span><br><span class="line">System.out.println(<span class="string">&quot;请输入名字&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//当程序执行到 next 方法时，会等待用户输入~~~</span></span><br><span class="line"><span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> myScanner.next(); <span class="comment">//接收用户输入字符串</span></span><br><span class="line">System.out.println(<span class="string">&quot;请输入年龄&quot;</span>);</span><br><span class="line"><span class="type">int</span> <span class="variable">age</span> <span class="operator">=</span> myScanner.nextInt(); <span class="comment">//接收用户输入int</span></span><br><span class="line">System.out.println(<span class="string">&quot;请输入薪水&quot;</span>);</span><br><span class="line"><span class="type">double</span> <span class="variable">sal</span> <span class="operator">=</span> myScanner.nextDouble(); <span class="comment">//接收用户输入double</span></span><br><span class="line">System.out.println(<span class="string">&quot;人的信息如下:&quot;</span>);</span><br><span class="line">System.out.println(<span class="string">&quot;名字=&quot;</span> + name </span><br><span class="line">+ <span class="string">&quot; 年龄=&quot;</span> + age + <span class="string">&quot; 薪水=&quot;</span> + sal);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091705772.png" alt="image-20220509170543727" style="zoom:67%;" /></blockquote><hr><h2 id="进制">进制<a class="header-anchor" href="#进制"></a></h2><h3 id="十一-四种进制介绍">十一. 四种进制介绍<a class="header-anchor" href="#十一-四种进制介绍"></a></h3><p><strong>进制(程序员的基本功)</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>进制介绍</strong></p></li></ul><p>对于整数，有四种表示方式：</p><p>二进制：0,1 ，满 2 进 1.以 0b 或 0B 开头。</p><p>十进制：0-9 ，满 10 进 1。</p><p>八进制：0-7 ，满 8 进 1. 以数字 0 开头表示。</p><p>十六进制：0-9 及 A(10)-F(15)，满 16 进 1. 以 <strong>0x</strong> <strong>或</strong> <strong>0X</strong> 开头表示。此处的 A-F 不区分大小写。</p><ul class="lvl-0"><li class="lvl-2"><p><strong>举例说明</strong> BinaryTest.java</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091711778.png" alt="image-20220509171113729" style="zoom: 80%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091713548.png" alt="image-20220509171329500" style="zoom: 80%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//演示四种进制</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BinaryTest</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//n1 二进制</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> <span class="number">0b1010</span>;</span><br><span class="line"><span class="comment">//n2 10进制</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n2</span> <span class="operator">=</span> <span class="number">1010</span>;</span><br><span class="line"><span class="comment">//n3 8进制</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n3</span> <span class="operator">=</span> <span class="number">01010</span>;</span><br><span class="line"><span class="comment">//n4 16进制</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n4</span> <span class="operator">=</span> <span class="number">0X10101</span>;</span><br><span class="line">System.out.println(<span class="string">&quot;n1=&quot;</span> + n1);</span><br><span class="line">System.out.println(<span class="string">&quot;n2=&quot;</span> + n2);</span><br><span class="line">System.out.println(<span class="string">&quot;n3=&quot;</span> + n3);</span><br><span class="line">System.out.println(<span class="string">&quot;n4=&quot;</span> + n4);</span><br><span class="line">System.out.println(<span class="number">0x23A</span>);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p><strong>进制的图示</strong></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091714710.png" alt="image-20220509171412620" style="zoom: 67%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091715746.png" alt="image-20220509171547659" style="zoom:67%;" /></blockquote><hr><p><strong>进制的转换(基本功)</strong></p><p><strong>进制转换的介绍</strong></p><ul class="lvl-0"><li class="lvl-2"><p>第一组：</p></li></ul><ol><li class="lvl-3"><p>二进制转十进制</p></li><li class="lvl-3"><p>八进制转十进制</p></li><li class="lvl-3"><p>十六进制转十进制</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>第二组：</p></li></ul><ol><li class="lvl-3"><p>十进制转二进制</p></li><li class="lvl-3"><p>十进制转八进制</p></li><li class="lvl-3"><p>十进制转十六进制</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>第三组</p></li></ul><ol><li class="lvl-3"><p>二进制转八进制</p></li><li class="lvl-3"><p>二进制转十六进制</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>第四组</p></li></ul><ol><li class="lvl-3"><p>八进制转二进制</p></li><li class="lvl-3"><p>十六进制转二进制</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p><strong>其他进制转十进制</strong></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091721120.png" style="zoom: 67%;" /></blockquote><h3 id="十二-2进制转10进制">十二. 2进制转10进制<a class="header-anchor" href="#十二-2进制转10进制"></a></h3><p><strong>二进制转换成十进制示例</strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091722031.png" alt="image-20220509172209929" style="zoom: 67%;" /></blockquote><h3 id="十三-8进制转10进制">十三. 8进制转10进制<a class="header-anchor" href="#十三-8进制转10进制"></a></h3><p><strong>八进制转换成十进制示例</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091726949.png" alt=""></p></blockquote><h3 id="十四-16进制转10进制">十四. 16进制转10进制<a class="header-anchor" href="#十四-16进制转10进制"></a></h3><p><strong>十六进制转换成十进制示例</strong></p><p>规则：<code>从最低位(右边)开始，将每个位上的数提取出来，乘以 16 的(位数-1)次方，然后求和</code>。</p><p>案例：请将 0x23A 转成十进制的数</p><p>0x23A = 10 * 16^0 + 3 * 16 ^ 1 + 2 * 16^2 = 10 + 48 + 512 = 570</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">System.out.println(<span class="number">0x23A</span>);<span class="comment">//570</span></span><br></pre></td></tr></table></figure><p>课堂练习：请将</p><p>0b110001100 转成 十进制</p><p>02456 转成十进制</p><p>0xA45 转成十进制</p><hr><p><strong>十进制转其它进制</strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091733796.png" alt="image-20220509173320742" style="zoom: 67%;" /></blockquote><h3 id="十五-10进制转2进制">十五. 10进制转2进制<a class="header-anchor" href="#十五-10进制转2进制"></a></h3><p><strong>十进制转换成二进制</strong></p><p>规则：<code>将该数不断除以 2，直到商为 0 为止，然后将每步得到的余数倒过来，就是对应的二进制</code>。</p><p>案例：请将 <code>34</code> 转成二进制 = <code>0B00100010</code></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091941102.png" alt="image-20220509194122002" style="zoom:50%;" /></blockquote><h3 id="十六-10进制转8进制">十六. 10进制转8进制<a class="header-anchor" href="#十六-10进制转8进制"></a></h3><p><strong>十进制转换成八进制</strong></p><p>规则：<code>将该数不断除以 8，直到商为 0 为止，然后将每步得到的余数倒过来，就是对应的八进制</code>。</p><p>案例：请将 <code>131</code> 转成八进制 =&gt; <code>0203</code></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091945088.png" alt="image-20220509194522001" style="zoom:50%;" /></blockquote><h3 id="十七-10进制转16进制">十七. 10进制转16进制<a class="header-anchor" href="#十七-10进制转16进制"></a></h3><p><strong>十进制转换成十六进制</strong></p><p>规则：<code>将该数不断除以 16，直到商为 0 为止，然后将每步得到的余数倒过来，就是对应的十六进制</code>。</p><p>案例：请将 <code>237</code> 转成十六进制 =&gt; <code>0xED</code></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091946894.png" alt="image-20220509194651804" style="zoom:50%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p>课堂练习：(一定练习，使用计算器/用程序去验证)</p></li></ul><p>​123 转成 二进制 =&gt; ?</p><p>​678 转成八进制 =&gt; 04126</p><p>​8912 转成十六进制 =&gt; ?</p><hr><p><strong>二进制转换成八进制、十六进制</strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091950138.png" alt="image-20220509195013056" style="zoom:67%;" /></blockquote><h3 id="十八-2进制转8进制">十八. 2进制转8进制<a class="header-anchor" href="#十八-2进制转8进制"></a></h3><p>规则：<code>从低位开始,将二进制数每三位一组，转成对应的八进制数即可</code>。</p><p>案例：请将 <code>ob11010101</code> 转成八进制</p><p>ob11(3)010(2)101(5) =&gt; <code>0325</code></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091954021.png" alt="image-20220509195435973" style="zoom: 67%;" /></blockquote><h3 id="十九-2进制转16进制">十九. 2进制转16进制<a class="header-anchor" href="#十九-2进制转16进制"></a></h3><p>规则：<code>从低位开始，将二进制数每四位一组，转成对应的十六进制数即可</code>。</p><p>案例：请将 <code>ob11010101</code> 转成十六进制</p><p>ob1101(D)0101(5) = <code>0xD5 </code></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091957282.png" alt="image-20220509195728223" style="zoom:67%;" /></blockquote><p>课堂练习：请将</p><p>​0b11100101 转成 八进制</p><p>​0b1110010110 转成 十六进制 =&gt; 0x396</p><hr><p><strong>八进制、十六进制转成二进制</strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205091959650.png" alt="image-20220509195905562" style="zoom:67%;" /></blockquote><h3 id="二十-8进制转2进制">二十. 8进制转2进制<a class="header-anchor" href="#二十-8进制转2进制"></a></h3><p>规则：<code>将八进制数每 1 位，转成对应的一个 3 位的二进制数即可</code>。</p><p>案例：请将 <code>0237</code> 转成二进制</p><p>02(010)3(011)7(111) = <code>0b10011111 </code></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092004043.png" alt="image-20220509200424994" style="zoom: 67%;" /></blockquote><h3 id="二一-16进制转2进制">二一. 16进制转2进制<a class="header-anchor" href="#二一-16进制转2进制"></a></h3><p>规则：<code>将十六进制数每 1 位，转成对应的</code> <strong><code>4 位的一个二进制数</code></strong><code>即可</code>。</p><p>案例：请将 <code>0x23B</code> 转成二进制</p><p>0x2(0010)3(0011)B(1011) = <code>0b001000111011</code></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092015230.png" alt="image-20220509201525174" style="zoom:67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p>课堂练习：请将</p></li></ul><p>01230 转成 二进制</p><p>0xAB29 转成二进制 =&gt; 0xA(1010)B(1011)2(0010)9(1001) =&gt;0b1010101100101001</p><hr><h3 id="二二-位运算思考题">二二. 位运算思考题<a class="header-anchor" href="#二二-位运算思考题"></a></h3><p><strong>位运算的思考题</strong></p><ol><li class="lvl-3"><p>请看下面的代码段，回答 a,b,c,d,e 结果是多少?</p></li></ol><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><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">maiin</span><span class="params">(String []args)</span> </span><br><span class="line">&#123; </span><br><span class="line"></span><br><span class="line"><span class="type">int</span> a=<span class="number">1</span>&gt;&gt;<span class="number">2</span>;<span class="comment">// 1 向右位移 2 位 </span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> b=-<span class="number">1</span>&gt;&gt;<span class="number">2</span>;<span class="comment">//算术右移 </span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> c=<span class="number">1</span>&lt;&lt;<span class="number">2</span>;<span class="comment">//算术左移 </span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> d=-<span class="number">1</span>&lt;&lt;<span class="number">2</span>;<span class="comment">// </span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> e=<span class="number">3</span>&gt;&gt;&gt;<span class="number">2</span>;<span class="comment">//无符号右移 </span></span><br><span class="line"></span><br><span class="line"><span class="comment">//a,b,c,d,e 结果是多少 </span></span><br><span class="line"></span><br><span class="line">System.out.println(<span class="string">&quot;a=&quot;</span>+a); </span><br><span class="line"></span><br><span class="line">System.out.println(<span class="string">&quot;b=&quot;</span>+b); </span><br><span class="line"></span><br><span class="line">System.out.println(<span class="string">&quot;c=&quot;</span>+c); </span><br><span class="line"></span><br><span class="line">System.out.println(<span class="string">&quot;d=&quot;</span>+d); </span><br><span class="line"></span><br><span class="line">System.out.println(<span class="string">&quot;e=&quot;</span>+e); </span><br><span class="line"></span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"><p>请回答在 java 中，下面的表达式运算的结果是: (位操作)， 晚上练习</p></li></ol><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></pre></td><td class="code"><pre><span class="line">~<span class="number">2</span>=?<span class="comment">// 按位取反 </span></span><br><span class="line"></span><br><span class="line"><span class="number">2</span>&amp;<span class="number">3</span>=?<span class="comment">// 2 按位与 3 </span></span><br><span class="line"></span><br><span class="line"><span class="number">2</span>|<span class="number">3</span>=? </span><br><span class="line"></span><br><span class="line">~-<span class="number">5</span>=? </span><br><span class="line"></span><br><span class="line"><span class="number">13</span>&amp;<span class="number">7</span>=? </span><br><span class="line"></span><br><span class="line"><span class="number">5</span>|<span class="number">4</span>=? </span><br><span class="line"></span><br><span class="line">-<span class="number">3</span>^<span class="number">3</span>=?<span class="comment">//^ 按位异或</span></span><br></pre></td></tr></table></figure><hr><h3 id="二三-原码反码补码">二三. 原码反码补码<a class="header-anchor" href="#二三-原码反码补码"></a></h3><p><strong>二进制在运算中的说明</strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092025779.png" alt="image-20220509202541652" style="zoom: 67%;" /></blockquote><p><strong><code>原码、反码、补码(重点 难点)</code></strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092027076.png" alt="image-20220509202730922" style="zoom:67%;" /><p>第 7 点，因为补码把正数、负数统一起来了</p></blockquote><hr><h3 id="二四-位运算">二四. 位运算<a class="header-anchor" href="#二四-位运算"></a></h3><p><strong>位运算符</strong></p><ul class="lvl-0"><li class="lvl-2"><p>java 中有 7 个位运算(&amp;、|、^、~、&gt;&gt;、&lt;&lt;和 &gt;&gt;&gt;)</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092039745.png" alt="image-20220509203957600" style="zoom: 50%;" /></blockquote><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><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="comment">//位运算</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BitOperator</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 2&amp;3</span></span><br><span class="line"><span class="comment">//看老师的推导过程</span></span><br><span class="line"><span class="comment">//1. 先得到 2的补码 =&gt; 2的原码 00000000 00000000 00000000 00000010</span></span><br><span class="line"><span class="comment">//   2的补码 00000000 00000000 00000000 00000010</span></span><br><span class="line"><span class="comment">//2. 3的补码 3的原码 00000000 00000000 00000000 00000011</span></span><br><span class="line"><span class="comment">//   3的补码 00000000 00000000 00000000 00000011</span></span><br><span class="line"><span class="comment">//3. 按位&amp;</span></span><br><span class="line"><span class="comment">//   00000000 00000000 00000000 00000010</span></span><br><span class="line"><span class="comment">//   00000000 00000000 00000000 00000011 </span></span><br><span class="line"><span class="comment">//   00000000 00000000 00000000 00000010 &amp; 运算后的补码</span></span><br><span class="line"><span class="comment">//   运算后的原码 也是  00000000 00000000 00000000 00000010</span></span><br><span class="line"><span class="comment">//   结果就是  2</span></span><br><span class="line">System.out.println(<span class="number">2</span>&amp;<span class="number">3</span>);<span class="comment">//2</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">// ~-2</span></span><br><span class="line"><span class="comment">//推导</span></span><br><span class="line"><span class="comment">//1. 先得到 -2的原码 10000000 00000000 00000000 00000010</span></span><br><span class="line"><span class="comment">//2. -2的 反码     11111111 11111111 11111111 11111101</span></span><br><span class="line"><span class="comment">//3. -2的 补码       11111111 11111111 11111111 11111110</span></span><br><span class="line"><span class="comment">//4. ~-2操作        00000000 00000000 00000000 00000001运算后的补码</span></span><br><span class="line"><span class="comment">//5. 运算后的原码 就是 00000000 00000000 00000000 00000001 =&gt; 1</span></span><br><span class="line">System.out.println(~-<span class="number">2</span>);<span class="comment">//1</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//推导</span></span><br><span class="line"><span class="comment">//1. 得到2的补码 00000000 00000000 00000000 00000010</span></span><br><span class="line"><span class="comment">//2. ~2操作     11111111 11111111 11111111 11111101  运算后的补码</span></span><br><span class="line"><span class="comment">//3. 运算后的反码  11111111 11111111 11111111 11111100</span></span><br><span class="line"><span class="comment">//4. 运算后的原码  10000000 00000000 00000000 00000011=&gt;-3</span></span><br><span class="line">System.out.println(~<span class="number">2</span>); <span class="comment">//-3</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>位运算符</strong></p><ul class="lvl-0"><li class="lvl-2"><p>还有 3 个位运算符 <code>&gt;&gt;、&lt;&lt; 和 &gt;&gt;&gt;</code> , 运算规则:</p></li></ul><ol><li class="lvl-3"><p>算术右移 &gt;&gt;：低位溢出,符号位不变,并用符号位补溢出的高位</p></li><li class="lvl-3"><p>算术左移 &lt;&lt;: 符号位不变,低位补 0</p></li><li class="lvl-3"><p>&gt;&gt;&gt; 逻辑右移也叫无符号右移,运算规则是: 低位溢出，高位补 0</p></li><li class="lvl-3"><p>特别说明：没有 &lt;&lt;&lt; 符号</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>应用案例 BitOperator02.java</p></li></ul><ol><li class="lvl-3"><p>int a=1&gt;&gt;2; //1 =&gt; 00000001 =&gt; 00000000 本质 1 / 2 / 2 =0</p></li><li class="lvl-3"><p>int c=1&lt;&lt;2; //1 =&gt; 00000001 =&gt; 00000100 本质 1 * 2 * 2 = 4</p></li></ol><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092121652.png" alt="image-20220509212136583" style="zoom:67%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BitOperator02</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">System.out.println(<span class="number">1</span> &gt;&gt; <span class="number">2</span>); <span class="comment">//0</span></span><br><span class="line">System.out.println(<span class="number">1</span> &lt;&lt; <span class="number">2</span>); <span class="comment">//4</span></span><br><span class="line">System.out.println(<span class="number">4</span> &lt;&lt; <span class="number">3</span>); <span class="comment">// 4 * 2 * 2 * 2 = 32</span></span><br><span class="line">System.out.println(<span class="number">15</span> &gt;&gt; <span class="number">2</span>); <span class="comment">// 15 / 2 / 2 = 3</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>完成前面的案例</p></li></ul><p>建议：掌握老师讲解的即可，不用再深入</p><hr><p><strong>本章作业</strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092125669.png" alt="image-20220509212539569" style="zoom:50%;" /></blockquote><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">System.out.println(-<span class="number">10.4</span>%<span class="number">3</span>); <span class="comment">// -1.4近似值</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> i=<span class="number">66</span>;</span><br><span class="line">System.out.println(++i+i); <span class="comment">//134</span></span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092135664.png" alt="image-20220509213557540" style="zoom:50%;" /></blockquote><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205092137307.png" alt="image-20220509213758196" style="zoom:50%;" /></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Java </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Java </tag>
            
            <tag> 运算符 </tag>
            
            <tag> 进制 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>02_Java-变量-数据类型</title>
      <link href="/posts/47697.html"/>
      <url>/posts/47697.html</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1fh411y7R8">视频链接：https://www.bilibili.com/video/BV1fh411y7R8</a></p><h2 id="一-变量">一. 变量<a class="header-anchor" href="#一-变量"></a></h2><h3 id="变量原理">变量原理<a class="header-anchor" href="#变量原理"></a></h3><p><strong>变量</strong></p><ul class="lvl-0"><li class="lvl-2"><p>为什么需要变量</p></li></ul><blockquote><p>一个程序就是一个世界</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081522508.png" alt="image-20220508152241409" style="zoom:50%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><code>变量是程序的基本组成单位</code></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081525550.png" alt="image-20220508152541414" style="zoom:50%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><strong><code>简单的原理示意图</code></strong></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081526570.png" alt="image-20220508152603437" style="zoom:67%;" /></blockquote><hr><h3 id="变量概念">变量概念<a class="header-anchor" href="#变量概念"></a></h3><p>**变(变化)量(值)的介绍 **</p><ul class="lvl-0"><li class="lvl-2"><p>概念</p></li></ul><p>​<strong><code>变量相当于内存中一个数据存储空间</code><strong>的表示，你可以把变量看做是一个房间的门牌号，通过</strong>门牌号</strong>我们可以找到房</p><p>间，而通过变量名可以访问到变量(值)。</p><ul class="lvl-0"><li class="lvl-2"><p>变量使用的基本步骤</p></li></ul><ol><li class="lvl-3"><p>声明变量</p></li></ol><p>​int a;</p><ol start="2"><li class="lvl-3"><p>赋值</p></li></ol><p>​a = 60; //应该这么说: 把 60 赋给 a</p><ol start="3"><li class="lvl-3"><p>使用 System.out.println(a);</p></li></ol><p>​//也可以一步到位[int a = 60; 通常我们是一步完成]</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Var01</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//声明变量</span></span><br><span class="line"><span class="type">int</span> a;</span><br><span class="line">a = <span class="number">100</span>;</span><br><span class="line">System.out.println(a); </span><br><span class="line"></span><br><span class="line"><span class="comment">//还可以这样使用</span></span><br><span class="line"><span class="type">int</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">800</span>;</span><br><span class="line">System.out.println(b); </span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="变量入门">变量入门<a class="header-anchor" href="#变量入门"></a></h3><p><strong>变量快速入门</strong></p><p>变量使用入门案例</p><p>看演示并对代码进行说明， <strong>演示记录 人的信息的代码</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081541203.png" alt=""></p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Var02</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//记录人的信息</span></span><br><span class="line"><span class="type">int</span> <span class="variable">age</span> <span class="operator">=</span> <span class="number">30</span>;</span><br><span class="line"><span class="type">double</span> <span class="variable">score</span> <span class="operator">=</span> <span class="number">88.9</span>;</span><br><span class="line"><span class="type">char</span> <span class="variable">gender</span> <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span>;</span><br><span class="line"><span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> <span class="string">&quot;king&quot;</span>;</span><br><span class="line"><span class="comment">//输出信息, 快捷键</span></span><br><span class="line">System.out.println(<span class="string">&quot;人的信息如下:&quot;</span>);</span><br><span class="line">System.out.println(name);</span><br><span class="line">System.out.println(age);</span><br><span class="line">System.out.println(score);</span><br><span class="line">System.out.println(gender);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="变量细节">变量细节<a class="header-anchor" href="#变量细节"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>变量使用注意事项</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081544320.png" alt="image-20220508154442205" style="zoom: 50%;" /></blockquote><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">public</span> <span class="keyword">class</span> <span class="title class_">VarDetail</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//变量必须先声明，后使用, 即有顺序</span></span><br><span class="line"><span class="type">int</span> <span class="variable">a</span> <span class="operator">=</span> <span class="number">50</span>;<span class="comment">//int</span></span><br><span class="line">System.out.println(a);<span class="comment">//50</span></span><br><span class="line"><span class="comment">//该区域的数据/值可以在同一类型范围内不断变化</span></span><br><span class="line"><span class="comment">//a = &quot;jack&quot;; //×</span></span><br><span class="line">a = <span class="number">88</span>; <span class="comment">//对</span></span><br><span class="line">System.out.println(a);<span class="comment">//88</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//变量在同一个作用域内不能重名</span></span><br><span class="line"><span class="comment">//int a = 77;//错误</span></span><br><span class="line"></span><br><span class="line"></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">class</span> <span class="title class_">Dog</span> &#123;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="type">int</span> <span class="variable">a</span> <span class="operator">=</span> <span class="number">666</span>;<span class="comment">//对</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="加号使用">加号使用<a class="header-anchor" href="#加号使用"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><strong><code>程序中 +号的使用</code></strong></p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081556066.png" alt=""></p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Plus</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">System.out.println(<span class="number">100</span> + <span class="number">98</span>); <span class="comment">//198</span></span><br><span class="line">System.out.println(<span class="string">&quot;100&quot;</span> + <span class="number">98</span>);<span class="comment">//10098</span></span><br><span class="line"></span><br><span class="line">System.out.println(<span class="number">100</span> + <span class="number">3</span> + <span class="string">&quot;hello&quot;</span>);<span class="comment">//103hello</span></span><br><span class="line">System.out.println(<span class="string">&quot;hello&quot;</span> + <span class="number">100</span> +<span class="number">3</span>); <span class="comment">//hello1003</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="二-数据类型">二. 数据类型<a class="header-anchor" href="#二-数据类型"></a></h2><p><strong>数据类型</strong></p><p>每一种数据都定义了明确的数据类型，在内存中分配了不同大小的内存空间(字节)。</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081601014.png" alt="image-20220508160100958" style="zoom: 67%;" /><hr><ul class="lvl-1"><li class="lvl-2"><p><input type="checkbox" id="checkbox16" checked="true"><label for="checkbox16"></label><code>上图说明 [老韩要求小伙伴，背下来!!!!] </code></p></li></ul><ol><li class="lvl-3"><p><strong>java 数据类型分为两大类 <code>基本数据类型， 引用类型</code></strong></p></li><li class="lvl-3"><p>**基本数据类型有 <code>8 种 数值型 [byte , short , int , long , float ,double] char , boolean</code> **</p></li><li class="lvl-3"><p><strong><code>引用类型 [类，接口， 数组]</code></strong></p></li></ol></blockquote><hr><h3 id="整型">整型<a class="header-anchor" href="#整型"></a></h3><p><strong>整数类型</strong></p><ul class="lvl-0"><li class="lvl-2"><p>基本介绍</p></li></ul><blockquote><p>Java 的整数类型就是用于存放整数值的，比如 12 , 30, 3456 等等</p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>案例演示：</p></li></ul><blockquote><p>byte n1 = 10;</p><p>short n2 = 10;</p><p>int n3 = 10;//4 个字节</p><p>long n4 = 10; //8 个字节</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081615524.png" alt="image-20220508161536496" style="zoom: 80%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><strong><code>整型的类型</code></strong></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081612814.png" alt="image-20220508161227727" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><strong><code>整型的使用细节</code></strong> IntDetail.java</p></li></ul><blockquote><p><code>bit：计算机中的最小存储单位</code> ；<code>byte：计算机中基本存储单位</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081740262.png" alt="image-20220508174011108" style="zoom: 50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081749504.png" alt="image-20220508174900285" style="zoom: 67%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">IntDetail</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//Java的整型常量（具体值）默认为 int 型，声明long型常量须后加‘l’或‘L’</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> <span class="number">1</span>;<span class="comment">//4个字节</span></span><br><span class="line"><span class="comment">//int n2 = 1L;//不对</span></span><br><span class="line"><span class="type">long</span> <span class="variable">n3</span> <span class="operator">=</span> <span class="number">1L</span>;<span class="comment">//对</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="浮点数">浮点数<a class="header-anchor" href="#浮点数"></a></h3><p><strong>浮点类型</strong></p><ul class="lvl-0"><li class="lvl-2"><p>基本介绍</p></li></ul><blockquote><p>Java 的浮点类型可以表示一个小数，比如 123.4 ，7.8 ，0.12 等等</p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>案例演示</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081756499.png" alt="image-20220508175600469" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><code>浮点型的分类</code></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081756711.png" alt="image-20220508175638655" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><strong>说明一下</strong></p></li></ul><ol><li class="lvl-3"><p>关于浮点数在机器中存放形式的简单说明,<strong><code>浮点数=符号位+指数位+尾数位 </code></strong></p></li><li class="lvl-3"><p>尾数部分可能丢失，<code>造成精度损失</code>(小数都是近似值)。</p></li></ol><hr><p><strong>浮点数细节</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>浮点型使用细节</code> FloatDetail.java</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081759392.png" alt="image-20220508175933221" style="zoom: 50%;" /></blockquote><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><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">public</span> <span class="keyword">class</span> <span class="title class_">FloatDetail</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//Java 的浮点型常量(具体值)默认为double型，声明float型常量，须后加‘f’或‘F&#x27;</span></span><br><span class="line"><span class="comment">//float num1 = 1.1; //错误</span></span><br><span class="line"><span class="type">float</span> <span class="variable">num2</span> <span class="operator">=</span> <span class="number">1.1F</span>; <span class="comment">//对的</span></span><br><span class="line"><span class="type">double</span> <span class="variable">num3</span> <span class="operator">=</span> <span class="number">1.1</span>; <span class="comment">//对</span></span><br><span class="line"><span class="type">double</span> <span class="variable">num4</span> <span class="operator">=</span> <span class="number">1.1f</span>; <span class="comment">//对</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//十进制数形式：如：5.12       512.0f        .512   (必须有小数点）</span></span><br><span class="line"><span class="type">double</span> <span class="variable">num5</span> <span class="operator">=</span> <span class="number">.123</span>; <span class="comment">//等价 0.123</span></span><br><span class="line">System.out.println(num5);</span><br><span class="line"><span class="comment">//科学计数法形式:如：5.12e2 [5.12 * 10的2次方 ]      5.12E-2   [5.12 / 10的2次方] </span></span><br><span class="line">System.out.println(<span class="number">5.12e2</span>);<span class="comment">//512.0</span></span><br><span class="line">System.out.println(<span class="number">5.12E-2</span>);<span class="comment">//0.0512</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//通常情况下，应该使用double型，因为它比float型更精确。</span></span><br><span class="line"><span class="comment">//[举例说明]double num9 = 2.1234567851;float num10 =  2.1234567851F;</span></span><br><span class="line"><span class="type">double</span> <span class="variable">num9</span> <span class="operator">=</span>  <span class="number">2.1234567851</span>;</span><br><span class="line"><span class="type">float</span> <span class="variable">num10</span> <span class="operator">=</span>  <span class="number">2.1234567851F</span>;</span><br><span class="line">System.out.println(num9);</span><br><span class="line">System.out.println(num10);</span><br><span class="line"></span><br><span class="line"><span class="comment">//浮点数使用陷阱: 2.7 和 8.1 / 3  比较</span></span><br><span class="line"><span class="comment">//看看一段代码</span></span><br><span class="line"><span class="type">double</span> <span class="variable">num11</span> <span class="operator">=</span> <span class="number">2.7</span>;</span><br><span class="line"><span class="type">double</span> <span class="variable">num12</span> <span class="operator">=</span> <span class="number">2.7</span>;<span class="comment">//8.1 / 3; //2.7</span></span><br><span class="line">System.out.println(num11);<span class="comment">//2.7</span></span><br><span class="line">System.out.println(num12);<span class="comment">//接近2.7的一个小数，而不是2.7</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="keyword">if</span>( num11 == num12) &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;num11 == num12 相等&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//正确的写法 , ctrl + / 注释快捷键, 再次输入就取消注释</span></span><br><span class="line"><span class="keyword">if</span>(Math.abs(num11 - num12) &lt; <span class="number">0.000001</span> ) &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;差值非常小，到我的规定精度，认为相等...&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 可以通过java API  来看 下一个视频介绍如何使用API</span></span><br><span class="line">System.out.println(Math.abs(num11 - num12));</span><br><span class="line"><span class="comment">//细节:如果是直接查询得的的小数或者直接赋值，是可以判断相等</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081810094.png" alt="image-20220508181024027" style="zoom: 67%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081819949.png" alt="image-20220508181900845" style="zoom:67%;" /></blockquote><hr><h3 id="Java-API文档">Java API文档<a class="header-anchor" href="#Java-API文档"></a></h3><p><strong>Java API 文档</strong></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081822551.png" alt="image-20220508182220368" style="zoom:50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081851674.png" alt="image-20220508185115534" style="zoom: 67%;" /></blockquote><hr><h3 id="字符型">字符型<a class="header-anchor" href="#字符型"></a></h3><p><strong>字符类型(char)</strong></p><ul class="lvl-0"><li class="lvl-2"><p>基本介绍</p></li></ul><p>​字符类型可以表示<code>单个字符</code>,字符类型是 char，char 是两个字节(可以存放汉字)，多个字符我们用字符串 String(我们后面详细讲解 String)</p><ul class="lvl-0"><li class="lvl-2"><p><strong>案例演示</strong> Char01.java</p></li></ul><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">#代码 </span><br><span class="line"><span class="type">char</span> <span class="variable">c1</span> <span class="operator">=</span> <span class="string">&#x27;a&#x27;</span>; </span><br><span class="line"><span class="type">char</span> <span class="variable">c2</span> <span class="operator">=</span> <span class="string">&#x27;\t&#x27;</span>; </span><br><span class="line"><span class="type">char</span> <span class="variable">c3</span> <span class="operator">=</span> <span class="string">&#x27;韩&#x27;</span>; </span><br><span class="line"><span class="type">char</span> <span class="variable">c4</span> <span class="operator">=</span> <span class="number">97</span>;</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//演示char的基本使用</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Char01</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="type">char</span> <span class="variable">c1</span> <span class="operator">=</span> <span class="string">&#x27;a&#x27;</span>;</span><br><span class="line"><span class="type">char</span> <span class="variable">c2</span> <span class="operator">=</span> <span class="string">&#x27;\t&#x27;</span>;</span><br><span class="line"><span class="type">char</span> <span class="variable">c3</span> <span class="operator">=</span> <span class="string">&#x27;韩&#x27;</span>;</span><br><span class="line"><span class="type">char</span> <span class="variable">c4</span> <span class="operator">=</span> <span class="number">97</span>; <span class="comment">//说明: 字符类型可以直接存放一个数字</span></span><br><span class="line"></span><br><span class="line">System.out.println(c1);</span><br><span class="line">System.out.println(c2);</span><br><span class="line">System.out.println(c3);</span><br><span class="line">System.out.println(c4);<span class="comment">//当输出c4时候，会输出97表示的字符 =&gt; 编码的概念（输出为 a）</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><p><strong>字符型细节</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong><code>字符类型使用细节</code></strong></p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081910193.png" alt=""></p></blockquote><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><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="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CharDetail</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//在java中，char的本质是一个整数，在默认输出时，是unicode码对应的字符</span></span><br><span class="line"><span class="comment">//要输出对应的数字，可以(int)字符</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c1</span> <span class="operator">=</span> <span class="number">97</span>;</span><br><span class="line">System.out.println(c1); <span class="comment">// a</span></span><br><span class="line"></span><br><span class="line"><span class="type">char</span> <span class="variable">c2</span> <span class="operator">=</span> <span class="string">&#x27;a&#x27;</span>; <span class="comment">//输出&#x27;a&#x27; 对应的 数字</span></span><br><span class="line">System.out.println((<span class="type">int</span>)c2);<span class="comment">//强转为 int类型</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c3</span> <span class="operator">=</span> <span class="string">&#x27;韩&#x27;</span>;</span><br><span class="line">System.out.println((<span class="type">int</span>)c3);<span class="comment">//38889</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c4</span> <span class="operator">=</span> <span class="number">38889</span>;</span><br><span class="line">System.out.println(c4);<span class="comment">//韩</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//char类型是可以进行运算的，相当于一个整数，因为它都对应有Unicode码.</span></span><br><span class="line"></span><br><span class="line">System.out.println(<span class="string">&#x27;a&#x27;</span> + <span class="number">10</span>);<span class="comment">//107</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//课堂小测试</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c5</span> <span class="operator">=</span> <span class="string">&#x27;b&#x27;</span> + <span class="number">1</span>;<span class="comment">//98+1==&gt; 99</span></span><br><span class="line">System.out.println((<span class="type">int</span>)c5); <span class="comment">//99</span></span><br><span class="line">System.out.println(c5); <span class="comment">//99 -&gt; 对应的字符 -&gt; 编码表ASCII(规定好的) =&gt; c</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081912794.png" alt="image-20220508191250728" style="zoom: 67%;" /><hr><p>ASCII码对照表：</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081920627.png" alt="ASCII码对照表" style="zoom:50%;" /></blockquote><hr><p><strong>字符型本质</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong><code>字符类型本质探讨</code></strong></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081923962.png" alt="image-20220508192303779" style="zoom:67%;" /></blockquote><hr><p><strong>常用编码</strong></p><blockquote><ul class="lvl-1"><li class="lvl-2"><p><code>ASCII 码介绍(了解) </code></p></li></ul><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081938505.png" alt="image-20220508193828402" style="zoom:67%;" /><ul class="lvl-1"><li class="lvl-2"><p><code>Unicode 编码介绍(了解)</code></p></li></ul><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081939699.png" alt="image-20220508193912565" style="zoom:67%;" /><ul class="lvl-1"><li class="lvl-2"><p><code>UTF-8 编码介绍(了解) </code></p></li></ul><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081939863.png" alt="image-20220508193948746" style="zoom:67%;" /></blockquote><hr><h3 id="布尔类型">布尔类型<a class="header-anchor" href="#布尔类型"></a></h3><p><strong>布尔类型</strong></p><ul class="lvl-0"><li class="lvl-2"><p>布尔类型：boolean</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081949760.png" alt="image-20220508194909551" style="zoom: 50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081958309.png" alt="image-20220508195843226" style="zoom:50%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Boolean01</span> &#123; </span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</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="type">boolean</span> <span class="variable">isPass</span> <span class="operator">=</span> <span class="literal">true</span>;<span class="comment">//</span></span><br><span class="line"><span class="keyword">if</span>(isPass == <span class="literal">true</span>) &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;考试通过，恭喜&quot;</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;考试没有通过，下次努力&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="基本数据类型转换">基本数据类型转换<a class="header-anchor" href="#基本数据类型转换"></a></h3><h4 id="自动类型转">自动类型转<a class="header-anchor" href="#自动类型转"></a></h4><p><strong>自动类型转换基础</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong><code>自动类型转换</code></strong></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082000505.png" alt="image-20220508200046295" style="zoom:50%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AutoConvert</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//演示自动转换</span></span><br><span class="line"><span class="type">int</span> <span class="variable">num</span> <span class="operator">=</span> <span class="string">&#x27;a&#x27;</span>;<span class="comment">//ok char -&gt; int</span></span><br><span class="line"><span class="type">double</span> <span class="variable">d1</span> <span class="operator">=</span> <span class="number">80</span>; <span class="comment">//ok int -&gt; double</span></span><br><span class="line">System.out.println(num);<span class="comment">//97</span></span><br><span class="line">System.out.println(d1);<span class="comment">//80.0</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><p><strong>自动类型转换细节</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>自动类型转换注意和细节</code></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082001882.png" alt="image-20220508200129693" style="zoom:50%;" /></blockquote><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//自动类型转换细节</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AutoConvertDetail</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//细节1： 有多种类型的数据混合运算时，</span></span><br><span class="line"><span class="comment">//系统首先自动将所有数据转换成容量最大的那种数据类型，然后再进行计算</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> <span class="number">10</span>; <span class="comment">//ok</span></span><br><span class="line"><span class="comment">//float d1 = n1 + 1.1;//错误 n1 + 1.1 =&gt; 结果类型是 double</span></span><br><span class="line"><span class="comment">//double d1 = n1 + 1.1;//对 n1 + 1.1 =&gt; 结果类型是 double</span></span><br><span class="line"><span class="type">float</span> <span class="variable">d1</span> <span class="operator">=</span> n1 + <span class="number">1.1F</span>;<span class="comment">//对 n1 + 1.1 =&gt; 结果类型是 float</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//细节2: 当我们把精度(容量)大 的数据类型赋值给精度(容量)小 的数据类型时，</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">//int n2 = 1.1;//错误 double -&gt; int </span></span><br><span class="line"></span><br><span class="line"><span class="comment">//细节3: (byte, short) 和 char之间不会相互自动转换</span></span><br><span class="line"><span class="comment">//当把具体数赋给 byte 时，(1)先判断该数是否在byte范围内，如果是就可以</span></span><br><span class="line"><span class="type">byte</span> <span class="variable">b1</span> <span class="operator">=</span> <span class="number">10</span>; <span class="comment">//对  , -128-127</span></span><br><span class="line"><span class="comment">// int n2 = 1; //n2 是int </span></span><br><span class="line"><span class="comment">// byte b2 = n2; //错误，原因： 如果是变量赋值，判断类型</span></span><br><span class="line"><span class="comment">// </span></span><br><span class="line"><span class="comment">// char c1 = b1; //错误， 原因 byte 不能自动转成 char</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"><span class="comment">//细节4: byte，short，char  他们三者可以计算，在计算时首先转换为int类型</span></span><br><span class="line"></span><br><span class="line"><span class="type">byte</span> <span class="variable">b2</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="type">byte</span> <span class="variable">b3</span> <span class="operator">=</span> <span class="number">2</span>;</span><br><span class="line"><span class="type">short</span> <span class="variable">s1</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="comment">//short s2 = b2 + s1;//错, b2 + s1 =&gt; int</span></span><br><span class="line"><span class="type">int</span> <span class="variable">s2</span> <span class="operator">=</span> b2 + s1;<span class="comment">//对, b2 + s1 =&gt; int</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//byte b4 = b2 + b3; //错误: b2 + b3 =&gt; int</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//boolean 不参与转换</span></span><br><span class="line"><span class="type">boolean</span> <span class="variable">pass</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"><span class="comment">//int num100 = pass;// boolean 不参与类型的自动转换</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><br><span class="line"><span class="type">byte</span> <span class="variable">b4</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="type">short</span> <span class="variable">s3</span> <span class="operator">=</span> <span class="number">100</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">num200</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="type">float</span> <span class="variable">num300</span> <span class="operator">=</span> <span class="number">1.1F</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">double</span> <span class="variable">num500</span> <span class="operator">=</span> b4 + s3 + num200 + num300; <span class="comment">//float -&gt; double</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="强制类型转换">强制类型转换<a class="header-anchor" href="#强制类型转换"></a></h4><p><strong><code>强制类型转换</code></strong></p><ul class="lvl-0"><li class="lvl-2"><p>介绍</p></li></ul><p>​自动类型转换的逆过程，<strong>将容量大的数据类型转换为容量小的数据类型</strong>。使用时要加上强制转换符 ( )，但可能造成 <strong>精度降低或溢出</strong>,<code>格外要注意</code>。</p><ul class="lvl-0"><li class="lvl-2"><p>案例演示 ForceConvert.java</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082035050.png" alt="image-20220508203534000" style="zoom: 67%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ForceConvert</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//演示强制类型转换</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> (<span class="type">int</span>)<span class="number">1.9</span>;</span><br><span class="line">System.out.println(<span class="string">&quot;n1=&quot;</span> + n1);<span class="comment">//1, 造成精度损失</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="variable">n2</span> <span class="operator">=</span> <span class="number">2000</span>;</span><br><span class="line"><span class="type">byte</span> <span class="variable">b1</span> <span class="operator">=</span> (<span class="type">byte</span>)n2;</span><br><span class="line">System.out.println(<span class="string">&quot;b1=&quot;</span> + b1);<span class="comment">//造成 数据溢出</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><ul class="lvl-0"><li class="lvl-2"><p><code>强制类型转换细节说明</code></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082040412.png" alt="image-20220508204000221" style="zoom:67%;" /></blockquote><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"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ForceConvertDetail</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</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">//int x = (int)10*3.5+6*1.5;//编译错误： double -&gt; int </span></span><br><span class="line"><span class="type">int</span> <span class="variable">x</span> <span class="operator">=</span> (<span class="type">int</span>)(<span class="number">10</span>*<span class="number">3.5</span>+<span class="number">6</span>*<span class="number">1.5</span>);<span class="comment">// (int)44.0 -&gt; 44</span></span><br><span class="line">System.out.println(x);<span class="comment">//44</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="type">char</span> <span class="variable">c1</span> <span class="operator">=</span> <span class="number">100</span>; <span class="comment">//ok</span></span><br><span class="line"><span class="type">int</span> <span class="variable">m</span> <span class="operator">=</span> <span class="number">100</span>; <span class="comment">//ok</span></span><br><span class="line"><span class="comment">//char c2 = m; //错误</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c3</span> <span class="operator">=</span> (<span class="type">char</span>)m; <span class="comment">//ok</span></span><br><span class="line">System.out.println(c3);<span class="comment">//100对应的字符, d字符</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="类型转换练习">类型转换练习<a class="header-anchor" href="#类型转换练习"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>基本数据类型转换-练习题</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082047938.png" alt="image-20220508204706715" style="zoom:67%;" /></blockquote><hr><h3 id="基本数据类型和String类型的转换">基本数据类型和String类型的转换<a class="header-anchor" href="#基本数据类型和String类型的转换"></a></h3><p><strong>基本数据类型和 String 类型的转换</strong></p><ul class="lvl-0"><li class="lvl-2"><p>介绍和使用</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082051513.png" alt="image-20220508205109331" style="zoom:67%;" /></blockquote><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><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">public</span> <span class="keyword">class</span> <span class="title class_">StringToBasic</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//基本数据类型 -&gt; String</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> <span class="number">100</span>;</span><br><span class="line"><span class="type">float</span> <span class="variable">f1</span> <span class="operator">=</span> <span class="number">1.1F</span>;</span><br><span class="line"><span class="type">double</span> <span class="variable">d1</span> <span class="operator">=</span> <span class="number">4.5</span>;</span><br><span class="line"><span class="type">boolean</span> <span class="variable">b1</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"><span class="type">String</span> <span class="variable">s1</span> <span class="operator">=</span> n1 + <span class="string">&quot;&quot;</span>;</span><br><span class="line"><span class="type">String</span> <span class="variable">s2</span> <span class="operator">=</span> f1 + <span class="string">&quot;&quot;</span>;</span><br><span class="line"><span class="type">String</span> <span class="variable">s3</span> <span class="operator">=</span> d1 + <span class="string">&quot;&quot;</span>;</span><br><span class="line"><span class="type">String</span> <span class="variable">s4</span> <span class="operator">=</span> b1 + <span class="string">&quot;&quot;</span>;</span><br><span class="line">System.out.println(s1 + <span class="string">&quot; &quot;</span> + s2 + <span class="string">&quot; &quot;</span> + s3 + <span class="string">&quot; &quot;</span> + s4);<span class="comment">// 100  1.1  4.5  true</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//String -&gt; 对应的基本数据类型</span></span><br><span class="line"><span class="type">String</span> <span class="variable">s5</span> <span class="operator">=</span> <span class="string">&quot;123&quot;</span>;</span><br><span class="line"><span class="comment">//会在OOP 讲对象和方法的时候回详细</span></span><br><span class="line"><span class="comment">//解读 使用 基本数据类型对应的包装类，的相应方法，得到基本数据类型</span></span><br><span class="line"><span class="type">int</span> <span class="variable">num1</span> <span class="operator">=</span> Integer.parseInt(s5);</span><br><span class="line"><span class="type">double</span> <span class="variable">num2</span> <span class="operator">=</span> Double.parseDouble(s5);</span><br><span class="line"><span class="type">float</span> <span class="variable">num3</span> <span class="operator">=</span> Float.parseFloat(s5);</span><br><span class="line"><span class="type">long</span> <span class="variable">num4</span> <span class="operator">=</span> Long.parseLong(s5);</span><br><span class="line"><span class="type">byte</span> <span class="variable">num5</span> <span class="operator">=</span> Byte.parseByte(s5);</span><br><span class="line"><span class="type">boolean</span> <span class="variable">b</span> <span class="operator">=</span> Boolean.parseBoolean(<span class="string">&quot;true&quot;</span>);</span><br><span class="line"><span class="type">short</span> <span class="variable">num6</span> <span class="operator">=</span> Short.parseShort(s5);</span><br><span class="line"></span><br><span class="line">System.out.println(<span class="string">&quot;===================&quot;</span>);</span><br><span class="line">System.out.println(num1);<span class="comment">//123</span></span><br><span class="line">System.out.println(num2);<span class="comment">//123.0</span></span><br><span class="line">System.out.println(num3);<span class="comment">//123.0</span></span><br><span class="line">System.out.println(num4);<span class="comment">//123</span></span><br><span class="line">System.out.println(num5);<span class="comment">//123</span></span><br><span class="line">System.out.println(num6);<span class="comment">//123</span></span><br><span class="line">System.out.println(b);<span class="comment">//true</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//怎么把字符串转成字符char -&gt; 含义是指 把字符串的第一个字符得到</span></span><br><span class="line"><span class="comment">//解读  s5.charAt(0) 得到 s5字符串的第一个字符 &#x27;1&#x27;</span></span><br><span class="line">System.out.println(s5.charAt(<span class="number">0</span>));</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082126362.png" alt="image-20220508212639235" style="zoom:67%;" /></blockquote><hr><p><strong>String转基本类型细节</strong></p><ul class="lvl-0"><li class="lvl-2"><p>注意事项</p></li></ul><p>案例演示: StringToBasicDetail.java</p><ol><li class="lvl-3"><p>在将 String 类型转成 基本数据类型时，<code>要确保 String 类型能够转成有效的数据</code>，比如 我们可以把 “123” , 转成一个整数，但是不能把 “hello” 转成一个整数</p></li><li class="lvl-3"><p>如果格式不正确，就会 <strong>抛出异常，程序就会终止</strong>， 这个问题在异常处理章节中，会处理</p></li></ol><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></pre></td><td class="code"><pre><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="keyword">public</span> <span class="keyword">class</span> <span class="title class_">StringToBasicDetail</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="type">String</span> <span class="variable">str</span> <span class="operator">=</span> <span class="string">&quot;hello&quot;</span>;</span><br><span class="line"><span class="comment">//转成int</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> Integer.parseInt(str);<span class="comment">// 抛异常</span></span><br><span class="line">System.out.println(n1);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="本章作业">本章作业<a class="header-anchor" href="#本章作业"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>本章作业</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082139428.png" alt="image-20220508213920336" style="zoom: 67%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082139032.png" alt="image-20220508213940898" style="zoom:67%;" /></blockquote><ol><li class="lvl-3"></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Homework01</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> n1;</span><br><span class="line">        n1 = <span class="number">13</span>;</span><br><span class="line">        <span class="type">int</span> n2;</span><br><span class="line">        n2 = <span class="number">17</span>;</span><br><span class="line">        <span class="type">int</span> n3;</span><br><span class="line">        n3 = n1 + n2;</span><br><span class="line">        System.out.println(<span class="string">&quot;n3 = &quot;</span> + n3);<span class="comment">//30</span></span><br><span class="line">        <span class="type">int</span> <span class="variable">n4</span> <span class="operator">=</span> <span class="number">38</span>;</span><br><span class="line">        <span class="type">int</span> <span class="variable">n5</span> <span class="operator">=</span> n4 - n3;</span><br><span class="line">        System.out.println(<span class="string">&quot;n5 = &quot;</span> + n5);<span class="comment">//8</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li class="lvl-3"></li></ol><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"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Homework02</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//使用 char 类型，分别保存 \n \t \r  \\  1  2  3等字符，并打印输出</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c1</span> <span class="operator">=</span> <span class="string">&#x27;\n&#x27;</span>; <span class="comment">//换行</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c2</span> <span class="operator">=</span> <span class="string">&#x27;\t&#x27;</span>; <span class="comment">//制表位</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c3</span> <span class="operator">=</span> <span class="string">&#x27;\r&#x27;</span>; <span class="comment">//回车</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c4</span> <span class="operator">=</span> <span class="string">&#x27;\\&#x27;</span>; <span class="comment">//输出\</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c5</span> <span class="operator">=</span> <span class="string">&#x27;1&#x27;</span>; <span class="comment">//换行</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c6</span> <span class="operator">=</span> <span class="string">&#x27;2&#x27;</span>; <span class="comment">//换行</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c7</span> <span class="operator">=</span> <span class="string">&#x27;3&#x27;</span>; <span class="comment">//换行</span></span><br><span class="line">System.out.println(c1);</span><br><span class="line">System.out.println(c2);</span><br><span class="line">System.out.println(c3);</span><br><span class="line">System.out.println(c4);</span><br><span class="line">System.out.println(c5);</span><br><span class="line">System.out.println(c6);</span><br><span class="line">System.out.println(c7);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-3"></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Homework03</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</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"><span class="type">String</span> <span class="variable">book1</span> <span class="operator">=</span> <span class="string">&quot;天龙八部&quot;</span>;</span><br><span class="line"><span class="type">String</span> <span class="variable">book2</span> <span class="operator">=</span> <span class="string">&quot;笑傲江湖&quot;</span>;</span><br><span class="line">System.out.println(book1 + book2);<span class="comment">//天龙八部笑傲江湖</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//性别应该使用char保存</span></span><br><span class="line"><span class="type">char</span> <span class="variable">c1</span> <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span>;</span><br><span class="line"><span class="type">char</span> <span class="variable">c2</span> <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span>;</span><br><span class="line">System.out.println(c1 + c2);<span class="comment">//得到  男 字符码值 + 女 字符码值</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//保存两本书价格</span></span><br><span class="line"><span class="type">double</span> <span class="variable">price1</span> <span class="operator">=</span> <span class="number">123.56</span>;</span><br><span class="line"><span class="type">double</span> <span class="variable">price2</span> <span class="operator">=</span> <span class="number">100.11</span>;</span><br><span class="line">System.out.println(price1 + price2);<span class="comment">//就是 123.56+100.11</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082200764.png" alt="image-20220508220036706" style="zoom: 67%;" /></blockquote><ol start="4"><li class="lvl-3"></li></ol><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><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Homework04</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</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">     xxxxxxxxxx</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">1) 用变量将姓名、年龄、成绩、性别、爱好存储</span></span><br><span class="line"><span class="comment">2) 使用+</span></span><br><span class="line"><span class="comment">3) 添加适当的注释</span></span><br><span class="line"><span class="comment">4) 添加转义字符, 使用一条语句输出</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">//姓名</span></span><br><span class="line"><span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> <span class="string">&quot;jack&quot;</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">age</span> <span class="operator">=</span> <span class="number">20</span>;</span><br><span class="line"><span class="type">double</span> <span class="variable">score</span> <span class="operator">=</span> <span class="number">80.9</span>;</span><br><span class="line"><span class="type">char</span> <span class="variable">gender</span> <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span>;</span><br><span class="line"><span class="type">String</span> <span class="variable">hobby</span> <span class="operator">=</span> <span class="string">&quot;打篮球&quot;</span>;</span><br><span class="line"><span class="comment">//输出了信息, 可以使用换行</span></span><br><span class="line">System.out.println(<span class="string">&quot;姓名\t年龄\t成绩\t性别\t爱好\n&quot;</span> + name + <span class="string">&quot;\t&quot;</span> </span><br><span class="line">+ age + <span class="string">&quot;\t&quot;</span> + score + <span class="string">&quot;\t&quot;</span> + gender + <span class="string">&quot;\t&quot;</span> + hobby);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205082205511.png" alt="image-20220508220526449" style="zoom: 67%;" /></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Java </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Java </tag>
            
            <tag> 编码 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_Java-特性-jdk-运行机制-转义字符-注释-代码规范</title>
      <link href="/posts/12907.html"/>
      <url>/posts/12907.html</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.bilibili.com/video/BV1fh411y7R8">视频链接：https://www.bilibili.com/video/BV1fh411y7R8</a></p><h2 id="一-就业方向">一. 就业方向<a class="header-anchor" href="#一-就业方向"></a></h2><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080320118.png" alt="image-20220508032024978" style="zoom:50%;" /><hr><h2 id="二-开发场景">二. 开发场景<a class="header-anchor" href="#二-开发场景"></a></h2><p>Java 开发场景举例 1-<code>SSM</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080322295.png" alt=""></p><p>Java 开发场景举例 2：<code>Android 核心代码</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080324796.png" alt=""></p><p>Java 开发场景举例 3：<code>大数据-hadoop </code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080325177.png" alt=""></p><hr><h2 id="三-应用领域">三. 应用领域<a class="header-anchor" href="#三-应用领域"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>企业级应用</p></li></ul><p>主要指复杂的大企业的**<code>软件系统</code><strong>、各种类型的</strong><code>网站</code>**。应用领域包括金融、电信、交通、电子商务等。</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080327015.png" alt="image-20220508032702906" style="zoom:50%;" /><ul class="lvl-0"><li class="lvl-2"><p>Android 平台应用</p></li></ul><p>Android 应用程序使用 Java 语言编写。Android 开发水平的高低很大程度上取决于 Java 语言核心能力是否扎实。</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080327181.png" alt="image-20220508032750052" style="zoom:50%;" /><ul class="lvl-0"><li class="lvl-2"><p>移动领域应用</p></li></ul><p>主要表现在消费和嵌入式领域，是指在各种小型设备上的应用，包括机顶盒、车载的大屏影音娱乐设备、汽车通信设备、扫码的 POS 机等。</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080329788.png" alt="image-20220508032900704" style="zoom:50%;" /><hr><h2 id="四-程序举例">四. 程序举例<a class="header-anchor" href="#四-程序举例"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><strong>什么是程序</strong></p></li></ul><p>程序：计算机执行某些操作或解决某个问题而 <strong><code>编写的一系列有序指令的集合</code></strong></p><p>举例说明:</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080343728.png" alt="image-20220508034312623" style="zoom:50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080343441.png" alt="image-20220508034326323" style="zoom: 67%;" /></blockquote><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">//老师写的最简单的程序，完成 1+1, 体会</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> <span class="number">1</span> + <span class="number">1</span>;</span><br><span class="line">        <span class="comment">// 显示</span></span><br><span class="line">System.out.print(<span class="string">&quot;结果=&quot;</span> + res);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080403773.png" alt=""></p><hr><h2 id="五-故事">五. 故事<a class="header-anchor" href="#五-故事"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>Java 诞生小故事</p></li></ul><ol><li class="lvl-3"><p><code>1995年 第1个版本</code></p></li><li class="lvl-3"><p><code>Java之父 gosling</code></p></li><li class="lvl-3"><p><code>最新版本：15</code></p></li><li class="lvl-3"><p><code>公司里用的最多的版本：8、11</code></p></li><li class="lvl-3"><p><code>Java 所有权：甲骨文</code></p></li></ol><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080344966.png" alt="image-20220508034456860" style="zoom: 67%;" /><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080408088.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>Java 技术体系平台</p></li></ul><blockquote><p><code>标准版、企业版、小型版</code></p><p><code>Java SE、Java EE、Java ME</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080412778.png" style="zoom:50%;" /></blockquote><hr><h2 id="六-特性">六. 特性<a class="header-anchor" href="#六-特性"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><strong>Java 重要特点</strong></p></li></ul><ol><li class="lvl-3"><p>Java 语言是面向对象的(<strong><code>oop</code></strong>)</p></li><li class="lvl-3"><p>Java <code>语言是健壮的</code>。Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证</p></li><li class="lvl-3"><p>Java 语言是**<code>跨平台性的</code>**。[即: <strong>一个编译好的.class 文件可以在多个系统下运行，这种特性称为跨平台</strong>]</p></li></ol><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080415181.png" style="zoom:50%;" /></blockquote><ol start="4"><li class="lvl-3"><p>Java 语言是解释型的[了解]</p></li></ol><p>​<strong>解释性语言：javascript,PHP, java 编译性语言: c / c++</strong></p><p>​区别是：<code>解释性语言</code>，编译后的代码，<code>不能直接被机器执行,需要解释器来执行</code>, <code>编译性语言</code>, 编译后的代码, 可以<code>直接被机器执行</code>, c /c++</p><hr><ul class="lvl-0"><li class="lvl-2"><p><strong>Java 的开发工具</strong></p><ul class="lvl-2"><li class="lvl-4"><p>工具选择</p><ul class="lvl-4"><li class="lvl-6"><p>如何选择开发工具</p><p>​我们先选择用文本编辑器本 sublime，到大家对 java 有一定了解后，我们再使用 IDEA 和 Eclipse 开发工具。</p></li><li class="lvl-6"><p>这是为什么呢</p><p>​更深刻的理解 java 技术,培养代码感。【面试时，往往程序员手写代码】</p><p>​有利于公司面试</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080421152.png" alt="image-20220508042124961" style="zoom:50%;" /></blockquote></li></ul></li></ul></li></ul><hr><h2 id="七-jdk介绍、安装、配置">七. jdk介绍、安装、配置<a class="header-anchor" href="#七-jdk介绍、安装、配置"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><strong>Java 运行机制及运行过程</strong></p><ul class="lvl-2"><li class="lvl-4"><p>Java 语言的特点：<code>跨平台性</code></p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080428588.png" alt="image-20220508042849189" style="zoom:50%;" /></blockquote></li><li class="lvl-4"><p>Java 核心机制-Java 虚拟机 [<code>JVM</code> java virtual machine]</p></li></ul></li><li class="lvl-2"><p><code>Java 核心机制-Java 虚拟机 [JVM java virtual machine]</code></p></li></ul><p><strong>基本介绍</strong></p><ol><li class="lvl-3"><p>JVM 是一个虚拟的计算机，具有指令集并使用不同的存储区域。负责执行指令，管理数据、内存、寄存器，包含在 <strong><code>JDK 中</code></strong>.</p></li><li class="lvl-3"><p>对于不同的平台，有不同的虚拟机。</p></li><li class="lvl-3"><p>Java 虚拟机机制屏蔽了底层运行平台的差别，实现了“一次**<code>编译</code><strong>，到处</strong><code>运行</code>**” [说明]</p></li></ol><p><strong>示意图</strong></p><blockquote><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"><span class="comment">//指令</span></span><br><span class="line">javac<span class="comment">// 编译</span></span><br><span class="line">java<span class="comment">// 运行</span></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080434503.png" alt="image-20220508043429400" style="zoom: 67%;" /></blockquote><hr><p><strong><code>什么是 JDK，JRE</code></strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>JDK 基本介绍 </code></p></li></ul><ol><li class="lvl-3"><p>JDK 的全称(Java Development Kit   <strong><code>Java 开发工具包</code></strong>)</p></li></ol><p>​JDK = JRE + java 的开发工具 [java, javac,javadoc,javap 等]</p><ol start="2"><li class="lvl-3"><p>JDK 是提供给 Java 开发人员使用的，其中包含了 java 的开发工具，也包括了 JRE。所以安装了 JDK，就不用在单独安装 JRE 了。</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p><code>JRE 基本介绍</code></p></li></ul><ol><li class="lvl-3"><p>JRE(Java Runtime Environment  <code> Java 运行环境</code>)</p></li></ol><p>​JRE = JVM + Java 的核心类库[类]</p><ol start="2"><li class="lvl-3"><p>包括 Java 虚拟机(JVM Java Virtual Machine)和 Java 程序所需的核心类库等，如果想要运行一个开发好的 Java 程序，计算机中只需要安装 JRE 即可。</p></li></ol><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080445424.png" style="zoom:67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><code>JDK、JRE 和 JVM 的包含关系</code></p></li></ul><ol><li class="lvl-3"><p><strong><code>JDK = JRE + 开发工具集</code></strong>（例如 Javac,java 编译工具等)</p></li><li class="lvl-3"><p><strong><code>JRE = JVM + Java SE</code></strong> <strong><code>标准类库</code></strong>（java 核心类库）</p></li><li class="lvl-3"><p>如果只想运行开发好的 .class 文件 只需要 JRE</p></li></ol><hr><p><strong>下载、安装 JDK</strong></p><blockquote><p><a href="https://www.oracle.com/java/technologies/downloads/">https://www.oracle.com/java/technologies/downloads/</a></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080450598.png" alt=""></p></blockquote><p><strong>配置环境变量 path</strong></p><ul class="lvl-0"><li class="lvl-2"><p>为什么要配置 path</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080507309.png" alt="image-20220508050732153" style="zoom:50%;" /></blockquote></li><li class="lvl-2"><p>配置环境变量 path 的步骤</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080512224.png" style="zoom:50%;" /></blockquote><hr><p>安装 JDK 的练习</p><blockquote><p>请同学们安装好 JDK，配置好 path 环境变量。可以在控制台下正确的执行, (10min)</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080520103.png" alt="image-20220508052000041" style="zoom:50%;" /><p>环境变量配置细节说明:</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080520181.png" alt="image-20220508052022102" style="zoom:50%;" /><hr><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080521628.png" alt="image-20220508052141440" style="zoom: 50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080528717.png" alt="image-20220508052824602" style="zoom:50%;" /><hr><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080529498.png" alt="image-20220508052931384" style="zoom:50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080533822.png" alt="image-20220508053340793" style="zoom: 67%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080534562.png" alt="image-20220508053443524" style="zoom:67%;" /></blockquote><hr><h2 id="八-快速入门">八. 快速入门<a class="header-anchor" href="#八-快速入门"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>需求说明</p></li></ul><p>要求开发一个 Hello.java 程序，可以输出 “hello,world!”</p><ul class="lvl-0"><li class="lvl-2"><p>开发步骤</p></li></ul><ol><li class="lvl-3"><p>将 Java 代码编写到扩展名为 <code>Hello.java 的文件</code>中。[代码说明]</p></li><li class="lvl-3"><p>通过 <code>javac</code> 命令对该 java 文件进行<code>编译</code>，生成 <code>.class</code> 文件。</p></li><li class="lvl-3"><p>通过 <code>java</code> 命令对生成的 class 文件进行<code>运行</code>。</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>运行原理示意图</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080545433.png" alt="image-20220508054554366" style="zoom: 67%;" /></blockquote><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080607424.png" alt="image-20220508060705278" style="zoom:50%;" /></blockquote><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//这是java的快速入门， 演示java的开发步骤</span></span><br><span class="line"><span class="comment">//对代码的相关说明</span></span><br><span class="line"><span class="comment">//1. public class Hello 表示Hello是一个类,是一个public公有的类</span></span><br><span class="line"><span class="comment">//2. Hello&#123; &#125; 表示一个类的开始和结束</span></span><br><span class="line"><span class="comment">//3. public static void main(String[] args) 表示一个主方法,即我们程序的入口</span></span><br><span class="line"><span class="comment">//4. main() &#123;&#125; 表示方法的开始和结束</span></span><br><span class="line"><span class="comment">//5. System.out.println(&quot;hello,world~&quot;); 表示输出&quot;hello,world~&quot;到屏幕</span></span><br><span class="line"><span class="comment">//6. ;表示语句结束</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Hello</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;韩顺平教育 hello&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//一个源文件中最多只能有一个public类。其它类的个数不限。[演示]</span></span><br><span class="line"><span class="comment">//Dog 是一个类</span></span><br><span class="line"><span class="comment">//编译后，每一个类，都对于一个.class</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//一个源文件中最多只能有一个public类。其它类的个数不限，也可以将main方法写在非public类中，</span></span><br><span class="line"><span class="comment">//然后指定运行非public 类，这样入口方法就是非public 的main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;hello, 小狗狗~&quot;</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="keyword">class</span> <span class="title class_">Tiger</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;hello, 小老虎~&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080611636.png" alt="image-20220508061152606" style="zoom:67%;" /></blockquote><hr><h2 id="九-运行机制">九. 运行机制<a class="header-anchor" href="#九-运行机制"></a></h2><p><strong>Java 开发快速入门</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>Java执行流程分析</code></p></li></ul><blockquote><p>.java文件源文件</p><p>.class文件字节码文件</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080612745.png" alt="image-20220508061231609" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><code>什么是编译</code></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080619173.png" alt="image-20220508061953033" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><code>什么是运行</code></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080623909.png" alt="image-20220508062339779" style="zoom:67%;" /></blockquote><hr><h2 id="十-开发细节">十. 开发细节<a class="header-anchor" href="#十-开发细节"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><strong><code>Java开发注意事项和细节说明</code></strong></p></li></ul><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080627135.png" alt="image-20220508062754938" style="zoom: 50%;" /><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><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Hello</span> &#123;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;韩顺平教育 hello&quot;</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">//一个源文件中最多只能有一个public类。其它类的个数不限。[演示]</span></span><br><span class="line"><span class="comment">//Dog 是一个类</span></span><br><span class="line"><span class="comment">//编译后，每一个类，都对于一个.class</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Dog</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//一个源文件中最多只能有一个public类。其它类的个数不限，也可以将main方法写在非public类中，</span></span><br><span class="line"><span class="comment">//然后指定运行非public 类，这样入口方法就是非public 的main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;hello, 小狗狗~&quot;</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="keyword">class</span> <span class="title class_">Tiger</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">System.out.println(<span class="string">&quot;hello, 小老虎~&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205080638351.png" alt="image-20220508063831299" style="zoom: 67%;" /></blockquote><hr><h2 id="十一-学习方法">十一. 学习方法<a class="header-anchor" href="#十一-学习方法"></a></h2><blockquote><ul class="lvl-1"><li class="lvl-2"><p>老韩聊: 如何快速掌握技术或知识点</p></li></ul><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081310765.png" alt="image-20220508131030628" style="zoom: 80%;" /></blockquote><hr><h2 id="十二-转义字符">十二. 转义字符<a class="header-anchor" href="#十二-转义字符"></a></h2><p><strong>Java 转义字符</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>Java 常用的转义字符</code></p></li></ul><p>在控制台，输入 tab 键，可以实现命令补全</p><ol><li class="lvl-3"><p><code>\t</code> ：一个<code>制表位</code>，实现对齐的功能</p></li><li class="lvl-3"><p><code>\n</code> ：<code>换行符</code></p></li><li class="lvl-3"><p><code>\\</code> ：<code>一个\ </code></p></li><li class="lvl-3"><p><code>\&quot;</code> :<code>一个&quot; </code></p></li><li class="lvl-3"><p><code>\'</code> ：<code>一个' </code></p></li><li class="lvl-3"><p><strong><code>\r</code></strong> :<strong><code>一个回车</code></strong> System.out.println(“韩顺平教育\r 北京”);</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>说明</p></li></ul><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//演示转义字符的使用</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ChangeChar</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">// \t  ：一个制表位，实现对齐的功能</span></span><br><span class="line">System.out.println(<span class="string">&quot;北京\t天津\t上海&quot;</span>);</span><br><span class="line"><span class="comment">// \n  ：换行符</span></span><br><span class="line">System.out.println(<span class="string">&quot;jack\nsmith\nmary&quot;</span>);</span><br><span class="line"><span class="comment">// \\  ：一个\  \\</span></span><br><span class="line">System.out.println(<span class="string">&quot;C:\\Windows\\System32\\cmd.exe&quot;</span>);</span><br><span class="line"><span class="comment">// \&quot;  :一个&quot;</span></span><br><span class="line">System.out.println(<span class="string">&quot;老韩说:\&quot;要好好学习java,有前途\&quot;&quot;</span>);</span><br><span class="line"><span class="comment">// \&#x27;  ：一个&#x27;</span></span><br><span class="line">System.out.println(<span class="string">&quot;老韩说:\&#x27;要好好学习java,有前途\&#x27;&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// \r  :一个回车  System.out.println(&quot;韩顺平教育\r北京&quot;);</span></span><br><span class="line"><span class="comment">// 解读</span></span><br><span class="line"><span class="comment">// 1. 输出  韩顺平教育</span></span><br><span class="line"><span class="comment">// 2. \r表示回车 </span></span><br><span class="line">System.out.println(<span class="string">&quot;韩顺平教育\r北京&quot;</span>); <span class="comment">// 北京平教育</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081323663.png" alt="image-20220508132315623" style="zoom: 67%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081327844.png" alt="image-20220508132732792" style="zoom: 67%;" /><hr><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081328387.png" alt="image-20220508132852344" style="zoom:67%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081329085.png" alt="image-20220508132927045" style="zoom:67%;" /></blockquote><hr><ul class="lvl-0"><li class="lvl-2"><p>课堂练习</p></li></ul><p>要求：请使用一句输出语句，达到输入如下图形的效果 2min</p><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081331278.png" alt="image-20220508133105218" style="zoom:67%;" /></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ChangeCharExer01</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//完成代码</span></span><br><span class="line">System.out.println(<span class="string">&quot;书名\t作者\t价格\t销量\n三国\t罗贯中\t120\t1000&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//示意 =&gt; 可读性很好</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="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">n2</span> <span class="operator">=</span> <span class="number">30</span>;</span><br><span class="line"><span class="comment">//求和</span></span><br><span class="line"><span class="type">int</span> <span class="variable">sum</span> <span class="operator">=</span> n1 + n2;</span><br><span class="line"><span class="comment">//输出结果</span></span><br><span class="line">System.out.println(<span class="string">&quot;结果=&quot;</span> + sum);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="十三-易犯错误">十三. 易犯错误<a class="header-anchor" href="#十三-易犯错误"></a></h2><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081335827.png" alt="image-20220508133503644" style="zoom: 50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081336546.png" alt="image-20220508133644384" style="zoom:50%;" /></blockquote><hr><h2 id="十四-注释">十四. 注释<a class="header-anchor" href="#十四-注释"></a></h2><p><strong>注释(comment)</strong></p><ul class="lvl-0"><li class="lvl-2"><p>介绍：</p></li></ul><p>​用于注解说明解释程序的文字就是注释，注释提高了代码的阅读性（可读性）；注释是<code>一个程序员必须要具有的良好编程习惯</code>。将自己的思想通过注释先整理出来，再用代码去体现。 [举例]</p><ul class="lvl-0"><li class="lvl-2"><p><strong><code>Java 中的注释类型</code></strong></p></li></ul><ol><li class="lvl-3"><p><code>单行注释 // </code></p></li><li class="lvl-3"><p><code>多行注释 /* */ </code></p></li><li class="lvl-3"><p><code>文档注释 /** */ </code></p></li></ol><ul class="lvl-0"><li class="lvl-2"><p><code>单行注释： </code></p></li></ul><p>基本格式</p><p>格式： //注释文字</p><ul class="lvl-0"><li class="lvl-2"><p><code>多行注释： </code></p></li></ul><p>基本格式</p><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><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="comment">//演示注释使用</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Comment01</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//单行注释</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//多行注释</span></span><br><span class="line"><span class="comment">/* 示意 =&gt; 可读性很好</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"></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">int n1 = 10;... </span></span><br><span class="line"><span class="comment">System.out.println(&quot;ok~~&quot;);</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="type">int</span> <span class="variable">n1</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">n2</span> <span class="operator">=</span> <span class="number">30</span>;</span><br><span class="line"><span class="comment">//求和</span></span><br><span class="line"><span class="type">int</span> <span class="variable">sum</span> <span class="operator">=</span> n1 + n2;</span><br><span class="line"><span class="comment">//输出结果</span></span><br><span class="line">System.out.println(<span class="string">&quot;结果=&quot;</span> + sum);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>使用细节</p></li></ul><ol><li class="lvl-3"><p>被注释的文字，不会被 JVM（java 虚拟机）解释执行</p></li><li class="lvl-3"><p>多行注释里面不允许有多行注释嵌套</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p><code>文档注释：</code></p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081402422.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span>  韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span>  1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Comment02</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081404635.png" alt="image-20220508140443548" style="zoom:50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081405177.png" alt="image-20220508140522118" style="zoom:50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081405617.png" alt="image-20220508140555554" style="zoom:50%;" /></blockquote><hr><ul class="lvl-0"><li class="lvl-2"><p><strong>javadoc 标签</strong></p></li></ul><p>javadoc 工具软件识别以下标签：</p><table><thead><tr><th>标签</th><th>描述</th><th>示例</th></tr></thead><tbody><tr><td>@author</td><td>标识一个类的作者</td><td>@author description</td></tr><tr><td>@deprecated</td><td>指名一个过期的类或成员</td><td>@deprecated description</td></tr><tr><td @docRoot=""></td><td>指明当前文档根目录的路径</td><td>Directory Path</td></tr><tr><td>@exception</td><td>标志一个类抛出的异常</td><td>@exception exception-name explanation</td></tr><tr><td @inheritDoc=""></td><td>从直接父类继承的注释</td><td>Inherits a comment from the immediate surperclass.</td></tr><tr><td @link=""></td><td>插入一个到另一个主题的链接</td><td @link="" name="" text=""></td></tr><tr><td @linkplain=""></td><td>插入一个到另一个主题的链接，但是该链接显示纯文本字体</td><td>Inserts an in-line link to another topic.</td></tr><tr><td>@param</td><td>说明一个方法的参数</td><td>@param parameter-name explanation</td></tr><tr><td>@return</td><td>说明返回值类型</td><td>@return explanation</td></tr><tr><td>@see</td><td>指定一个到另一个主题的链接</td><td>@see anchor</td></tr><tr><td>@serial</td><td>说明一个序列化属性</td><td>@serial description</td></tr><tr><td>@serialData</td><td>说明通过writeObject( ) 和 writeExternal( )方法写的数据</td><td>@serialData description</td></tr><tr><td>@serialField</td><td>说明一个ObjectStreamField组件</td><td>@serialField name type description</td></tr><tr><td>@since</td><td>标记当引入一个特定的变化时</td><td>@since release</td></tr><tr><td>@throws</td><td>和 @exception标签一样.</td><td>The @throws tag has the same meaning as the @exception tag.</td></tr><tr><td @value=""></td><td>显示常量的值，该常量必须是static属性。</td><td>Displays the value of a constant, which must be a static field.</td></tr><tr><td>@version</td><td>指定类的版本</td><td>@version info</td></tr></tbody></table><hr><ul class="lvl-0"><li class="lvl-2"><p>代码演示</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081414164.png" alt="image-20220508141428106" style="zoom:50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081414376.png" alt="image-20220508141447322" style="zoom:50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081415068.png" alt="image-20220508141519015" style="zoom:50%;" /><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081415355.png" alt="image-20220508141539312" style="zoom:50%;" /></blockquote><hr><h2 id="十五-代码规范">十五. 代码规范<a class="header-anchor" href="#十五-代码规范"></a></h2><ul class="lvl-0"><li class="lvl-2"><p><code>Java 代码规范</code></p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081416659.png" alt=""></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081421585.png" alt="image-20220508142107515" style="zoom:50%;" /></blockquote><hr><h2 id="十六-DOS原理-路径-DOS指令">十六. DOS原理-路径-DOS指令<a class="header-anchor" href="#十六-DOS原理-路径-DOS指令"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>DOS 命令(了解)</p></li></ul><p>DOS 介绍</p><p>Dos： Disk Operating System 磁盘操作系统, 简单说一下 windows 的目录结构。[<strong>原理图</strong>]</p><blockquote><p><strong>原理图</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081427390.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>相关的知识补充: <strong><code>相对路径， 绝对路径</code></strong></p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081429068.png" alt="image-20220508142920905" style="zoom: 67%;" /></blockquote><ul class="lvl-0"><li class="lvl-2"><p><strong><code>常用的</code></strong> <code>dos 命令 </code></p></li></ul><ol><li class="lvl-3"><p>查看<code>当前目录是有什么内容</code> dir</p></li></ol><p>​dir <code>dir d:\abc2\test200 </code></p><ol start="2"><li class="lvl-3"><p>切换到其他盘下：盘符号 cd : change directory</p></li></ol><p>​案例演示：切换到 c 盘 <code>cd /D c: </code></p><ol start="3"><li class="lvl-3"><p>切换到当前盘的其他目录下 (使用相对路径和绝对路径演示), …\表示上一级目录</p></li></ol><p>​案例演示： <code>cd d:\abc2\test200 </code>cd …\…\abc2\test200</p><ol start="4"><li class="lvl-3"><p>切换到上一级：</p></li></ol><p>​案例演示： <code>cd .. </code></p><ol start="5"><li class="lvl-3"><p>切换到根目录：<code>cd \ </code></p></li></ol><p>​案例演示：cd \</p><ol start="6"><li class="lvl-3"><p>查看指定的目录下所有的子级目录 <code>tree </code></p></li><li class="lvl-3"><p><code>清屏 cls</code></p></li><li class="lvl-3"><p>退出 DOS <code>exit </code></p></li><li class="lvl-3"><p>说明: <strong>因为小伙伴后面使用</strong> <strong>DOS</strong> <strong>非常少</strong>，所以对下面的几个指令，老韩给大家演示下, 大家了解即可 (<code>md[创建目录],rd[删除目录],copy[拷贝文件],del[删除文件],echo[输入内容到文件],type,move[剪切]</code>) =&gt; <strong>Linux</strong>,</p></li></ol><hr><h2 id="十七-本章作业">十七. 本章作业<a class="header-anchor" href="#十七-本章作业"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>本章作业</p></li></ul><blockquote><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205081452380.png" alt="image-20220508145216238" style="zoom:50%;" /><hr><ul class="lvl-1"><li class="lvl-2"><p>1</p></li></ul></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Homework01</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//编写hello, world程序</span></span><br><span class="line">System.out.println(<span class="string">&quot;hello,world&quot;</span>); </span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><ul class="lvl-1"><li class="lvl-2"><p>2</p></li></ul></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//将个人的基本信息（姓名、性别、籍贯、住址）打印到控制台上输出。各条信息分别占一行</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Homework02</span> &#123; </span><br><span class="line"></span><br><span class="line"><span class="comment">//编写一个main方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"><span class="comment">//考察对转义字符</span></span><br><span class="line">System.out.println(<span class="string">&quot;姓名\t性别\t籍贯\t住址\n顺平\t男\t四川\t北京&quot;</span>); </span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><ul class="lvl-1"><li class="lvl-2"><p>3</p></li></ul><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"><span class="comment">//JDK,JRE,JVM的关系</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line">答：</span><br><span class="line"><span class="number">1.</span> JDK = JRE + java开发工具</span><br><span class="line"><span class="number">2.</span> JRE = JVM + 核心类库</span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2"><p>4</p></li></ul><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"><span class="comment">//环境变量path配置及其作用</span></span><br><span class="line"><span class="number">1.</span> 环境变量的作用是为了在 dos 的任意目录，可以去使用 java 和 javac 命令</span><br><span class="line"><span class="number">2.</span> 先配置 JAVA_HOME = 指向 jdk 安装的主目录</span><br><span class="line"><span class="number">3.</span> 编辑 path 环境变量，增加 %JAVA_HOME%\bin </span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2"><p>5</p></li></ul><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"><span class="comment">//Java编写步骤</span></span><br><span class="line"><span class="number">1.</span> 编写java的源代码</span><br><span class="line"><span class="number">2.</span> javac 编译 ,得到对应的 .class 字节码文件</span><br><span class="line"><span class="number">3.</span> java 运行, 本质就是把 .class 加载到 jvm 运行</span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2"><p>6</p></li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//Java编写7个规范</span></span><br><span class="line"><span class="number">1.</span> 类,方法的注释，使用javadoc的方式，即文档注释</span><br><span class="line"><span class="number">2.</span> 非javadoc注释，往往是对代码的说明(给程序的维护者),说明如何修改，注意事项</span><br><span class="line"><span class="number">3.</span> 使用tab ，整体将代码右移, 使用 shift+tab 整体左移</span><br><span class="line"><span class="number">4.</span> 运算符和 = 的两边，给空格，代码看上去清楚 <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> <span class="number">1</span> + <span class="number">4</span>;</span><br><span class="line"><span class="number">5.</span> 源码文件使用 utf-<span class="number">8</span> 编码</span><br><span class="line"><span class="number">6.</span> 行宽字符不要超过 <span class="number">80</span></span><br><span class="line"><span class="number">7.</span> 代码编程风格有两种 次行风格，行尾风格(推荐)</span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2"><p>7</p></li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//初学者java易犯错误 </span></span><br><span class="line"><span class="number">1.</span> 编译或者运行时，找不到文件 javac Hell0.java, 把文件名或者目录找对</span><br><span class="line"><span class="number">2.</span> 主类名和文件名不一致 , 修改时保持一致即可</span><br><span class="line"><span class="number">3.</span> 缺少;</span><br><span class="line"><span class="number">4.</span> 拼写错误，比如 <span class="number">1</span> -&gt; l <span class="number">0</span>-&gt;<span class="number">0</span>, <span class="keyword">void</span> -&gt; viod , 要求写代码时，一定要小心</span><br><span class="line"></span><br><span class="line">强调: 先思考-&gt;自己练习-&gt;看老师评讲</span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Java </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Java </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_Hexo-Hexo + Pure搭建博客-自定义</title>
      <link href="/posts/8236.html"/>
      <url>/posts/8236.html</url>
      
        <content type="html"><![CDATA[<h1 id="Hexo-搭建私人博客">Hexo 搭建私人博客<a class="header-anchor" href="#Hexo-搭建私人博客"></a></h1><h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><h3 id="1-1-Hexo">1.1 Hexo<a class="header-anchor" href="#1-1-Hexo"></a></h3><blockquote><p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。<a href="https://hexo.io">Hexo 官网</a></p></blockquote><h3 id="1-2-Pure-主题">1.2 Pure 主题<a class="header-anchor" href="#1-2-Pure-主题"></a></h3><p><a href="https://github.com/cofess/hexo-theme-pure">https://github.com/cofess/hexo-theme-pure</a></p><p><a href="https://blog.cofess.com/">https://blog.cofess.com/</a></p><hr><h2 id="二-参考">二. 参考<a class="header-anchor" href="#二-参考"></a></h2><p>Hexo 官网<a href="https://hexo.io/zh-cn/docs/index.html">https://hexo.io/zh-cn/docs/index.html</a></p><p>Pure 项目地址<a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md</a></p><h3 id="搭建-魔改">搭建 &amp; 魔改<a class="header-anchor" href="#搭建-魔改"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">Pure 项目中文文档</a></p></li><li class="lvl-2"><p><a href="https://hwame.top/20200520/hello-hexo-setup-deploy.html">https://hwame.top</a></p></li><li class="lvl-2"><p><a href="https://blog.cofess.com/2017/11/01/hexo-blog-theme-pure-usage-description.html">作者: Hexo博客主题pure使用说明</a></p></li><li class="lvl-2"><p><a href="https://www.cnblogs.com/zzk31/p/14062887.html">https://www.cnblogs.com/zzk31/p/14062887.html</a></p></li><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_42983502/article/details/106745567">https://blog.csdn.net/qq_42983502/article/details/106745567</a></p></li><li class="lvl-2"><p>gitalk</p><ul class="lvl-2"><li class="lvl-4"><a href="https://www.jianshu.com/p/b1161eb3f848">https://www.jianshu.com/p/b1161eb3f848</a></li><li class="lvl-4"><a href="https://cors-anywhere.herokuapp.com/corsdemo">https://cors-anywhere.herokuapp.com/corsdemo</a></li><li class="lvl-4"><a href="https://www.cnblogs.com/qisi007/p/13731562.html">https://www.cnblogs.com/qisi007/p/13731562.html</a></li><li class="lvl-4"><a href="https://www.jianshu.com/p/02fc71f3633f">https://www.jianshu.com/p/02fc71f3633f</a></li></ul></li></ul><hr><h2 id="三-命令">三. 命令<a class="header-anchor" href="#三-命令"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean ; hexo g ; hexo d ; hexo s</span><br></pre></td></tr></table></figure><hr><h2 id="四-评论-收录">四. 评论 &amp; 收录<a class="header-anchor" href="#四-评论-收录"></a></h2><p>Valine 评论<a href="https://www.leancloud.cn/">https://www.leancloud.cn/</a></p><p>Valine 评论<a href="https://www.leancloud.app/">https://www.leancloud.app/</a>国外站点，国内账号受限，域名没白嫖成功，可能是这个原因 → <a href="https://forum.leancloud.cn/t/2022-8/25408">https://forum.leancloud.cn/t/2022-8/25408</a></p><p>谷歌收录<a href="">https://search.google.com/search-console</a></p><p>百度收录<a href="https://ziyuan.baidu.com">https://ziyuan.baidu.com</a></p><p>MD5 在线加密<a href="https://md5jiami.bmcx.com/">https://md5jiami.bmcx.com/</a>评论区通过密文，识别博主身份</p><hr><h2 id="五-相关路径">五. 相关路径<a class="header-anchor" href="#五-相关路径"></a></h2><figure class="highlight markdown"><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="symbol">文章路径</span>]: </span><br><span class="line"><span class="link">\source\_posts</span></span><br><span class="line">[<span class="symbol">站点配置文件</span>]: </span><br><span class="line"><span class="link">\_config.yml</span></span><br><span class="line">[<span class="symbol">主题配置文件</span>]: </span><br><span class="line"><span class="link">\themes\pure\_config.yml&quot;关于、个人介绍、公告&quot;</span></span><br><span class="line">[<span class="symbol">友链文件</span>]: </span><br><span class="line"><span class="link">\source\_data\links.yml</span></span><br><span class="line">[<span class="symbol">语言</span>]: </span><br><span class="line"><span class="link">\themes\pure\languages</span></span><br><span class="line">[<span class="symbol">左下角运行时间</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_common\footer.ejs&quot;时间、版权&quot;</span></span><br><span class="line">[<span class="symbol">评论角色配置</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_script\_comment\valine.ejs</span></span><br><span class="line">[<span class="symbol">css样式</span>]:</span><br><span class="line"><span class="link">\themes\pure\source\css\style.css</span></span><br><span class="line">[<span class="symbol">搜索栏限制</span>]: </span><br><span class="line"><span class="link">\themes\pure\source\js\insight.js&quot;160行&quot;</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-内容样例">六. 内容样例<a class="header-anchor" href="#六-内容样例"></a></h2><figure class="highlight markdown"><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><br><span class="line">title: Test</span><br><span class="line">date: 2022-08-28 00:09:00</span><br><span class="line">updated: 2022-08-28 00:09:01</span><br><span class="line">thumbnail: https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-elcfumuvhm/image/test.png</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet">    -</span> Test</span><br><span class="line">category:</span><br><span class="line"><span class="bullet">    -</span> Test</span><br><span class="line">toc: true</span><br><span class="line"><span class="section">top: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">描述&lt;!-- more --&gt;</span><br></pre></td></tr></table></figure><h3 id="文章指定多个-category">文章指定多个 category<a class="header-anchor" href="#文章指定多个-category"></a></h3><blockquote><p>多个分类</p><p>如果我们的要求是将文章同时分到两个或者多个不同的类目下呢？官方给出的方法是：</p><figure class="highlight css"><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">categories:</span><br><span class="line">  - [Sports]</span><br><span class="line">  - [Baseball]</span><br></pre></td></tr></table></figure><p>参考文章：<a href="https://www.jianshu.com/p/4438c417611e">Hexo 一篇文章多个 categories    https://www.jianshu.com/p/4438c417611e</a></p></blockquote><hr><h2 id="七-自定义">七. 自定义<a class="header-anchor" href="#七-自定义"></a></h2><h3 id="7-1-搜索框索引突破-5">7.1 搜索框索引突破 5<a class="header-anchor" href="#7-1-搜索框索引突破-5"></a></h3><ol><li class="lvl-3"><p><code>F12</code> 定位到搜索框的 类选择器 为 ins-section-header</p></li><li class="lvl-3"><p>grep，定位到配置文件为 <code>\themes\pure\source\js\insight.js</code></p></li><li class="lvl-3"><p>Ctrl + F，搜索 5，定位到第 160 行，修改限制</p></li></ol><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075511578.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075224471.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075722865.png" alt=""></p></blockquote><h3 id="7-2-左侧头像链接，target-修改为-self">7.2 左侧头像链接，target 修改为 _self<a class="header-anchor" href="#7-2-左侧头像链接，target-修改为-self"></a></h3><p>a 标签，修改 target: ‘_blank’ → ‘_self’</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080811356.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080916410.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080945424.png" alt=""></p></blockquote><hr><h3 id="7-3-文章目录，一级标题不跳转">7.3 文章目录，一级标题不跳转<a class="header-anchor" href="#7-3-文章目录，一级标题不跳转"></a></h3><p>有时发现一级标题不会跳转</p><p><s>配置文件<code>\node_modules\hexo\lib\plugins\helper\toc.js</code></s></p><p><s>更新下 <code>\node_modules\hexo\lib\plugins\helper\toc.js</code> 文件，又正常了。时灵时不灵的。。。</s></p><p><s>参考<a href="https://hwame.top/20200520/hello-hexo-troubleshooting.html#3-%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E7%9A%84%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7">https://hwame.top/如何取消文章目录的自动编号</a></s></p><p>修改 “.\node_modules\hexo-renderer-markdown-it\index.js” level 为 1</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906033013691.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>参考文章：</p><p><a href="https://blog.csdn.net/Fosu_Chenai/article/details/111192850">https://blog.csdn.net/Fosu_Chenai/article/details/111192850 评论</a></p></li></ul><hr><h3 id="7-4-滚动条加粗-加小箭头">7.4 滚动条加粗 + 加小箭头<a class="header-anchor" href="#7-4-滚动条加粗-加小箭头"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>修改 css 样式，路径 <code>.\hexo-source\themes\pure\source\css\style.css</code></p><ol><li class="lvl-5"><code>Ctlrl + F</code> 定位 <code>scrollbar</code>；</li><li class="lvl-5">调高 <code>height</code>，使代码框 右拉滚动条加粗；</li><li class="lvl-5">右侧下拉条变粗；</li></ol><blockquote><p><strong>7.4.1 代码框加粗</strong></p><figure class="highlight css"><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">/*</span></span><br><span class="line"><span class="comment"> * scrollbar</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">14px</span>;# 调高</span><br><span class="line">  <span class="attribute">background</span>: transparent;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164700329.png" alt=""></p><p><strong>7.4.2 右侧下拉条变粗 + 添加小箭头</strong></p><figure class="highlight css"><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">/*</span></span><br><span class="line"><span class="comment"> * 滚动条箭头</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">::-webkit-scrollbar-button &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">0px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">4px</span>;</span><br><span class="line">    <span class="attribute">display</span>: block; </span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#c3c3c3</span>;</span><br><span class="line">&#125;</span><br><span class="line">::-webkit-scrollbar &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">5px</span> solid white;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-thumb &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#b0b0b0</span>;</span><br><span class="line">  <span class="attribute">background-clip</span>: padding-box;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">0.05em</span> solid <span class="number">#eeeeee</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-track &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Buttons */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  <span class="attribute">border-style</span>: solid;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Up */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement &#123;</span><br><span class="line">  <span class="attribute">border-width</span>: <span class="number">0px</span> <span class="number">8px</span> <span class="number">8px</span> <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">border-color</span>: transparent transparent <span class="number">#555555</span> transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement:hover &#123;</span><br><span class="line">  <span class="attribute">border-color</span>: transparent transparent <span class="number">#777777</span> transparent;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Down */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:increment &#123;</span><br><span class="line">  <span class="attribute">border-width</span>: <span class="number">8px</span> <span class="number">8px</span> <span class="number">0</span> <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">border-color</span>: <span class="number">#555555</span> transparent transparent transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:vertical:single-button:increment:hover &#123;</span><br><span class="line">  <span class="attribute">border-color</span>: <span class="number">#777777</span> transparent transparent transparent;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164914382.png" alt=""></p></blockquote></li></ul><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="http://www.qianduanheidong.com/blog/article/27901/a1c9346c7830d6ffa3f2/">右侧下拉条新增箭头</a></p></li><li class="lvl-2"><p><a href="https://www.php.cn/css-tutorial-475268.html">:-webkit-scrollbar 滚动条整体部分     https://www.php.cn/css-tutorial-475268.html</a></p></li></ul><h3 id="7-5-Valine-评论框添加一言">7.5 Valine 评论框添加一言<a class="header-anchor" href="#7-5-Valine-评论框添加一言"></a></h3><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a></p></li></ul><p>偶然看到的文章，然后自己就加了这个功能。</p><ul class="lvl-0"><li class="lvl-2"><p>路径：<code>.\themes\pure\layout\_script\_comment\valine.ejs</code>；</p></li><li class="lvl-2"><p>加到最后 <code>&lt;/script&gt;</code> 标签之前；c=j 请求获得网易云的句子，开始网抑云吧；</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fetch(&#x27;https://v1.hitokoto.cn/?c=j&#x27;)</span><br><span class="line">.then(response =&gt; response.json())</span><br><span class="line">.then(data =&gt; &#123;</span><br><span class="line">  document.getElementById(&quot;veditor&quot;).setAttribute(&quot;placeholder&quot;,data.hitokoto+&quot;__&quot;+data.from);</span><br><span class="line">&#125;)</span><br><span class="line">.catch(console.error)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>修改方法：</p><ol><li class="lvl-3"><p>找到博客对应添加valine的位置，例如Ayer主题的位于hexo\themes\ayer\layout_partial\post\valine.ejs</p></li><li class="lvl-3"><p>在内部添加一段代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;script type=&quot;text/javascript&quot;&gt;</span><br><span class="line">   fetch(&#x27;https://v1.hitokoto.cn&#x27;)</span><br><span class="line">    .then(response =&gt; response.json())</span><br><span class="line">    .then(data =&gt; &#123;</span><br><span class="line">      document.getElementById(&quot;veditor&quot;).setAttribute(&quot;placeholder&quot;,data.hitokoto+&quot;__&quot;+data.from);</span><br><span class="line">    &#125;)</span><br><span class="line">    .catch(console.error)</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>Api接口说明：<br>（1）<a href="https://v1.hitokoto.cn/">https://v1.hitokoto.cn/</a> （从7种分类中随机抽取）<br>（2）<a href="https://v1.hitokoto.cn/?c=b">https://v1.hitokoto.cn/?c=b</a> （请求获得一个分类是漫画的句子）<br>参数说明<br>a动画<br>b漫画<br>c游戏<br>d文学<br>e原创<br>f来自网络<br>g其他<br>h影视<br>i诗词<br>j网易云<br>k哲学<br>l抖机灵<br>其他作为动画类型处理<br>可选择多个分类，例如： ?c=a&amp;c=c</p></li></ol><p>（3）<a href="https://v1.hitokoto.cn/?c=f&amp;encode=text">https://v1.hitokoto.cn/?c=f&amp;encode=text</a> （请求获得一个来自网络的句子，并以纯文本格式输出）</p><ol start="4"><li class="lvl-3"><p>返回的格式说明<br>返回参数名称描述<br>id一言标识<br>hitokoto一言正文。编码方式 unicode。使用 utf-8。<br>type类型<br>from一言的出处<br>from_who一言的作者<br>creator添加者<br>creator_uid添加者用户标识<br>reviewer审核员标识<br>uuid一言唯一标识；可以链接到 <a href="https://hitokoto.cn?uuid=%5Buuid%5D">https://hitokoto.cn?uuid=[uuid]</a> 查看这个一言的完整信息<br>commit_from提交方式<br>created_at添加时间<br>length句子长度<br>例如：返回的data,通过data.hitokoto获取句子正文</p></li></ol><p>作者: Justlovesmile<br>链接: <a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a><br>来源: Justlovesmile’s BLOG<br>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p></blockquote><p>PS：这位大佬的博客真好看~~</p><h3 id="7-6-左侧-归档、分类-改为默认收起">7.6 左侧 归档、分类 改为默认收起<a class="header-anchor" href="#7-6-左侧-归档、分类-改为默认收起"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>默认是展开的</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203849607.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203907981.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>修改以下文件，改为收起状态。如图</p><ul class="lvl-2"><li class="lvl-4">style=“height: 0px” 应该可以不用写，收起状态默认就是 0 ~~</li></ul></li></ul><blockquote><p><code>.\themes\pure\layout\categories.ejs</code></p><p><code>.\themes\pure\layout\_partial\archive.ejs</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203746673.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203807739.png" alt=""></p></blockquote><hr><h2 id="八-未解决的小需求">八. 未解决的小需求<a class="header-anchor" href="#八-未解决的小需求"></a></h2><ol><li class="lvl-3"><p>（已解决，#7.3）一级目录，右侧导航栏 有时跳转失败；</p></li><li class="lvl-3"><p>Valine 评论系统，下面的评论 被@后，未显示 @信息，而别人的是成功的；</p><blockquote><p>我的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171817579.png" alt=""></p><p>其他大佬的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171912131.png" alt=""></p></blockquote></li><li class="lvl-3"><p>引用时 使用 #，会被导航目录误认为 一级标题；</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172133945.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172316157.png" alt=""></p></blockquote></li><li class="lvl-3"><p>（已解决）生成在 /public 目录的静态文件都被压缩了，<s>我看别人的没被压缩，不清楚啥原因。</s> 因为配置了这个 <a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md#%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md 博客优化</a> 压缩了文件</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901175404486.png" alt=""></p></blockquote></li><li class="lvl-3"><p>（已解决）文章内部一级、二级…标题左侧无锚点</p><blockquote><p>理想效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906034109271.png" alt=""></p><p><s>似乎是环境配置问题，我用虚拟机推送静态文件，就有显示；用真实 win机 推送 就没有锚点，重装 git 也没显示（可能不是 git 的问题）。。。</s></p><p>因为压缩了静态文件，全部注释 <code>hexo-neat</code> 配置。<br>参考<br><a href="https://github.com/cofess/hexo-theme-pure#hexo-neat">https://github.com/cofess/hexo-theme-pure#hexo-neat</a><br><a href="https://github.com/rozbo/hexo-neat#options">https://github.com/rozbo/hexo-neat#options</a></p></blockquote></li></ol><p>无伤大雅，<s>我一般一级标题写的是文章标题</s>；评论区也就是个摆设；<s>静态文件被压缩，可能别人还觉得我是故意，嘿</s>~~</p><p>最后总结：魔改要适量，太费时 还得不到提升，不如多看几个前端视频 多写几篇文章。。。</p><hr>]]></content>
      
      
      <categories>
          
          <category> Hexo </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Hexo </tag>
            
            <tag> Pure </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>22_Linux基础-ansible1</title>
      <link href="/posts/22091.html"/>
      <url>/posts/22091.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-selinux、established">一. selinux、established<a class="header-anchor" href="#一-selinux、established"></a></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><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">示例1：永久修改selinux</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A ~]# vim /etc/selinux/config </span><br><span class="line">SELINUX=disabled</span><br><span class="line">============================================================================================</span><br><span class="line">示例：排查连接不上4.00 - 9.00没写完</span><br><span class="line">ps -ef igrep sshd</span><br><span class="line">lsof -i:2233</span><br><span class="line"><span class="built_in">cat</span> /etc/services</span><br><span class="line"></span><br><span class="line">[root@cPen_B ~]# netstat -anplut igrep ssh</span><br><span class="line">Active Internet connections (servers and established)</span><br><span class="line">Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    </span><br><span class="line">tcp        0      0 0.0.0.0:2233            0.0.0.0:*               LISTEN      911/sshd            </span><br><span class="line">tcp        0     36 192.168.0.31:2233       192.168.0.42:54290      ESTABLISHED 1402/sshd: root [<span class="built_in">pr</span> </span><br><span class="line">tcp6       0      0 :::2233                 :::*                    LISTEN      911/sshd            </span><br><span class="line">udp        0      0 192.168.0.31:68         192.168.0.250:67        ESTABLISHED 893/NetworkManager  </span><br><span class="line">[root@cPen_B ~]# netstat -aplut igrep ssh</span><br><span class="line">Active Internet connections (servers and established)</span><br><span class="line">Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    </span><br><span class="line">tcp        0      0 0.0.0.0:infocrypt       0.0.0.0:*               LISTEN      911/sshd            </span><br><span class="line">tcp        0     36 cPen_B:infocrypt        192.168.0.42:54290      ESTABLISHED 1402/sshd: root [<span class="built_in">pr</span> </span><br><span class="line">tcp6       0      0 [::]:infocrypt          [::]:*                  LISTEN      911/sshd            </span><br><span class="line">udp        0      0 cPen_B:bootpc           192.168.0.250:bootps    ESTABLISHED 893/NetworkManager </span><br><span class="line"><span class="comment">##############################################################################################################</span></span><br><span class="line">示例2：看当前系统有多少连接 (establish)</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_B ~]# netstat -anplut|grep -E <span class="string">&quot;ESTABLISHED|LISTEN|TIME_WAIT&quot;</span>|awk -F<span class="string">&quot; &quot;</span> &#123;<span class="string">&#x27;print $6&#x27;</span>&#125;|<span class="built_in">sort</span>|<span class="built_in">uniq</span> -c</span><br><span class="line">      2 ESTABLISHED</span><br><span class="line">      2 LISTEN</span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------</span></span><br><span class="line">[root@cPen_B ~]# netstat -anplut</span><br><span class="line">Active Internet connections (servers and established)</span><br><span class="line">Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    </span><br><span class="line">tcp        0      0 0.0.0.0:2233            0.0.0.0:*               LISTEN      911/sshd            </span><br><span class="line">tcp        0    232 192.168.0.31:2233       192.168.0.42:54290      ESTABLISHED 1402/sshd: root [<span class="built_in">pr</span> </span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment"># pstree查看进程之间的关系</span></span><br><span class="line"><span class="comment"># netstat查看当前网络连接</span></span><br></pre></td></tr></table></figure><hr><h2 id="二-SSH访问控制">二. SSH访问控制<a class="header-anchor" href="#二-SSH访问控制"></a></h2><blockquote><p><strong>SSH使用TCP Wrappers实现访问控制 # 注：做访问控制</strong></p><p><strong>主要配置文件</strong></p><ul class="lvl-1"><li class="lvl-2"><p>/etc/hosts.allow</p></li><li class="lvl-2"><p>/etc/hosts.deny</p></li></ul><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220826172246758.png" alt=""></p></blockquote><blockquote><p><strong>TCP Wrappers可以控制哪些服务</strong></p><ul class="lvl-1"><li class="lvl-2">受super daemon（xinetd）管理的服务 # 注：守护进程的服务</li><li class="lvl-2">支持libwrap.so模块的服务</li></ul></blockquote><blockquote><p><strong>TCP Wrappers的访问控制原则</strong></p><ul class="lvl-1"><li class="lvl-2">首先检查 hosts.allow 文件，若找到相匹配的策略，则允许访问</li><li class="lvl-2">否则继续检查 hosts.deny 文件，若找到相匹配的策略，则拒绝访问</li><li class="lvl-2">如果两个文件中都没有相匹配的策略，则允许访问</li></ul><p>#注：守护进程层面的控制</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220826172422236.png" alt=""></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">示例：/etc/hosts.deny</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_A ~]# vim /etc/hosts.deny </span><br><span class="line">sshd:192.168.0.31</span><br><span class="line"><span class="comment"># 注：访问控制，拒绝192.168.0.31 不需要重启服务，有守护进程帮它控制</span></span><br></pre></td></tr></table></figure><blockquote><p>#注：主机公钥在 /etc/ssh/下面默认使用ecdsa模式</p><p>#注：known_hosts文件里有什么前面是ip地址，后面是公钥</p><p>#注：authorized_keys放受信任的公钥</p></blockquote><hr><h2 id="三-ssh隧道">三. ssh隧道<a class="header-anchor" href="#三-ssh隧道"></a></h2><blockquote><p><strong>#注：本地端口转发</strong></p><p>CSDN<a href="https://www.cnblogs.com/keerya/p/7612715.html">https://www.cnblogs.com/keerya/p/7612715.html</a></p><p>端口转发：A、C、B主机。主机B起了个nginx服务 端口号80；主机A不能直接访问主机B，但主机A可以访问主机C，主机C可以访问主机B <strong>(A–&gt;C–&gt;B)</strong>；A可以ssh到C，A跳到C，然后访问B的80端口 (nginx)。现在 在主机C上面建立一个隧道，隧道开启15577端口连接B的80端口，A去访问15577端口相当于去访问B的80映射</p><p>#注：ssh隧道 第一个用于不能直接访问的情况；第二个考虑密文传输</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><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">[root@cPen_C ~]# lsof -i:15577 <span class="comment"># 注：在C主机上操作，15577端口未被占用</span></span><br><span class="line">[root@cPen_C ~]# ssh -g -L 15577:192.168.0.39:80 sanchuang@192.168.0.39 -p 2233</span><br><span class="line"><span class="comment">#注：192.168.0.39 右边B主机ip地址   # 注：在C主机上开通一个隧道 端口为15577</span></span><br><span class="line">[root@cPen_A ~]# curl 192.168.0.48:15577<span class="comment"># 注：模仿网络访问 (80端口nginx网页使用curl访问)</span></span><br><span class="line">&lt;!DOCTYPE html PUBLIC <span class="string">&quot;-//W3C//DTD XHTML 1.1//EN&quot;</span> <span class="string">&quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;</span>&gt;<span class="comment"># 注：返回的内容</span></span><br><span class="line"><span class="comment">#注：192.168.0.48 中间C主机ip地址# 注：注意防火墙iptables -F</span></span><br><span class="line"><span class="comment">#注：访问中间C主机的15577端口 转接成右边B主机的80端口</span></span><br><span class="line"><span class="comment">#注：注意 不能绑定到本地的回环地址 127.0.0.1只能访问自己 (所以 -g) -g作用 本地所有ip都是访问</span></span><br><span class="line"><span class="comment">#注：- L是本地端口转发</span></span><br><span class="line"><span class="comment">#注：一般可以开启65535个端口</span></span><br></pre></td></tr></table></figure><blockquote><p><strong>#总结：ssh隧道</strong></p><p><strong>端口转发</strong></p><p>1、关闭防火墙</p><p>2、关闭selinux</p><p><strong>#本地端口转发</strong></p><p># ssh -g -L 15577:192.168.0.39:80 192.168.0.39 -p 2233# 注：<strong>C主机上执行 把B主机80端口映射本地15577端口</strong>*</p><p>​<strong>B主机80端口</strong><strong>B主机</strong></p><p>实验环境：</p><p>A主机：192.168.0.132</p><p>C主机：192.168.0.48</p><p>B主机：192.168.0.39</p><p>在C主机上执行：[root@cPen_C ~]# ssh -g -L 15577:192.168.0.39:80 192.168.0.39 -p 2233</p><p>把B主机的80端口映射到本地的15577端口</p><p>访问C主机的15577端口就是访问B主机的80端口</p></blockquote><blockquote><p><strong>#远程端口转发</strong></p><p># ssh -R 15566:192.168.0.39:80 -fN 192.168.0.132 -p 2233 # 注：<strong>C主机上 把B主机80端口 映射到 A主机15566端口</strong></p><p>​<strong>B主机</strong><strong>80端口</strong><strong>A主机</strong></p><p>远程端口转发：在C主机上执行：[root@C .ssh]# ssh -R 15566:192.168.0.39:80 -fN 192.168.0.132 -p 2233</p><p>把B主机的80端口映射到A主机的15566端口</p><p>访问A主机的15566就是访问B主机的80</p><p>#注：A主机 192.168.0.132</p><p>#注：B主机 192.168.0.39</p><p>#注：在C主机上建立远程通道，在C主机上为A主机启动15566端口，映射到B主机</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">[root@cPen_A ~]# lsof -i:15566<span class="comment"># 注：A主机开启15566端口</span></span><br><span class="line">sshd    2067 root    8u  IPv6  38604      0t0  TCP localhost:15566 (LISTEN)<span class="comment"># 注：监听的是本地回环地址</span></span><br><span class="line">sshd    2067 root    9u  IPv4  38605      0t0  TCP localhost:15566 (LISTEN)</span><br><span class="line">[root@cPen_A ~]# curl 127.0.0.1:15566<span class="comment"># 注：访问本地15566端口映射到B主机的80端口</span></span><br><span class="line">&lt;!DOCTYPE html PUBLIC <span class="string">&quot;-//W3C//DTD XHTML 1.1//EN&quot;</span> <span class="string">&quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;</span>&gt; <span class="comment"># 返回的内容</span></span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="四-ansible服务">四. ansible服务<a class="header-anchor" href="#四-ansible服务"></a></h2><blockquote><p>ansible是一个自动化运维工具的名称</p><p>基于Python开发，集合了众多运维工具的优点（puppet,fabric,slatstack），实现批量系统配置，程序的部署，批量运行命令等</p></blockquote><p>.--------------------------------------------------------------------------------------------------------------------------------------------</p><blockquote><p>Linux运维：自动化（脚本），智能化，平台化</p><p>Linux运维人员，人肉运维不可取</p><p>诞生了一系列的运维工具，ansible就是其中之一</p></blockquote><p>.--------------------------------------------------------------------------------------------------------------------------------------------</p><blockquote><p>日常运维：</p><p>1、软件安装</p><p>2、服务的配置</p><p>3、运行脚本</p><p>4、升级</p><p>5、备份</p></blockquote><p>.--------------------------------------------------------------------------------------------------------------------------------------------</p><blockquote><p>ansible基于Python开发，依赖于：paramiko,PyYaml和jinja三个关键组件</p><p>基于ssh协议，只要……没写完</p><p>#其他服务需要部署agent，而ansible只需要部署到server，只要十万台的key都上传到其他机器上</p><p>#注：glibc内核底层的库</p></blockquote><p>.--------------------------------------------------------------------------------------------------------------------------------------------</p><blockquote><p><strong>#实验环境</strong></p><p>a： 192.168.0.132（ansible）</p><p>c: 192.168.0.48</p><p>b:  192.168.0.39</p><p>实验前提，做好免密码认证，详见ssh服务</p><p>a --&gt; b , a --&gt; c a可以免密码登录到b和c</p><p><strong>1、在a上安装ansible</strong></p><p>[root@cPen_A .ssh]# yum install epel-release# 注：安装epel源</p><p>[root@cPen_A .ssh]# yum install ansible # 注：安装ansible</p><p><strong>2、配置</strong></p><p>配置目录：</p><p>/etc/ansible/ansible.cfg</p><p>ansible的主配置文件，这个文件主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改</p><p>/etc/ansible/hosts</p><p>这个配置文件就是默认的主机清单配置文件，可以通过ansible.cfg重新定义</p><p>备份/etc/ansible/hosts文件</p><p>编辑/etc/ansible/hosts文件</p><p>#将需要管理的主机添加到webser组</p><p>#如果通过ssh登录的端口不是22号端口，就需要在配置文件中指明端口号</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">[root@cPen_A ansible]# <span class="built_in">cp</span> hosts&#123;,.bak&#125;<span class="comment"># 注：备份</span></span><br><span class="line">[root@cPen_A ansible]# <span class="built_in">ls</span></span><br><span class="line">ansible.cfg  hosts  hosts.bak  roles</span><br><span class="line">[root@cPen_A ansible]# &gt;hosts<span class="comment"># 注：老的清空</span></span><br><span class="line">[root@cPen_A ansible]# vim hosts</span><br><span class="line">[webser]</span><br><span class="line">192.168.0.31:2233</span><br><span class="line">192.168.0.55</span><br></pre></td></tr></table></figure></blockquote><blockquote><p><strong>ansible组成：</strong></p><p>​1、host inventory--#定义客户机，可以对客户机进行分类：db类，web类…等等</p><p>​2、playbook  --#剧本 让主机按照我给定的剧本去完成一些事情</p><p>​3、module --#模块 实现一个个功能的程序</p><p>​4、pluging --#插件 实现一些额外的小功能</p></blockquote><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></pre></td><td class="code"><pre><span class="line">[root@cPen_A /]# <span class="built_in">cd</span> /etc</span><br><span class="line">[root@cPen_A etc]# <span class="built_in">ls</span> |grep ansible</span><br><span class="line">ansible</span><br><span class="line">[root@cPen_A etc]# <span class="built_in">cd</span> ansible</span><br><span class="line">[root@cPen_A ansible]# <span class="built_in">ls</span></span><br><span class="line">ansible.cfg  hosts  roles<span class="comment"># 注：host定义主机清单</span></span><br><span class="line">[root@cPen_A ansible]# less ansible.cfg </span><br><span class="line"><span class="comment">#inventory      = /etc/ansible/hosts# 注：主机清单</span></span><br><span class="line"><span class="comment">#library        = /usr/share/my_modules/</span></span><br><span class="line"><span class="comment">#module_utils   = /usr/share/my_module_utils/</span></span><br><span class="line"><span class="comment">#remote_tmp     = ~/.ansible/tmp</span></span><br><span class="line">……</span><br><span class="line">[root@cPen_A ansible]# less hosts </span><br><span class="line"><span class="comment">## [webservers]# 注：[中括号]里webservers 组名  对这个组进行访问控制</span></span><br><span class="line"><span class="comment">## alpha.example.org</span></span><br><span class="line"><span class="comment">## beta.example.org</span></span><br><span class="line"><span class="comment">## 192.168.1.100</span></span><br><span class="line"><span class="comment">## 192.168.1.110</span></span><br><span class="line"></span><br><span class="line">3、ansible使用</span><br><span class="line">-m指定模块名</span><br><span class="line"></span><br><span class="line">HOST-PATTERN         <span class="comment">#匹配主机模式,如all表示所有主机</span></span><br><span class="line">-m MOD_NAME          <span class="comment">#模块名   如:ping</span></span><br><span class="line">-a MOD_ARGS         <span class="comment">#模块执行的参数</span></span><br><span class="line">-f FORKS            <span class="comment">#生成几个子进行程执行</span></span><br><span class="line">-C                   <span class="comment">#(不执行，模拟跑)</span></span><br><span class="line">-u Username         <span class="comment">#某主机的用户名</span></span><br><span class="line">-c  CONNection      <span class="comment">#连接方式（default smart）    </span></span><br></pre></td></tr></table></figure><p>.--------------------------------------------------------------------------------------------------------------------------------------------</p><blockquote><p>ansible 主执行程序,一般用于命令行下执行<br>ansible-playbook 执行playbook中的任务<br>ansible-doc 获取各模块的帮助信息</p></blockquote><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></pre></td><td class="code"><pre><span class="line">[root@cPen_A ~]# ansible -h<span class="comment"># 注：ansible -h帮助文档</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------</span></span><br><span class="line">[root@cPen_A ~]# ansible</span><br><span class="line">………………</span><br><span class="line">ansible: error: too few arguments</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">which</span> ansible</span><br><span class="line">/usr/bin/ansible</span><br><span class="line">[root@cPen_A ~]# <span class="built_in">ls</span> -al /bin/ansible</span><br><span class="line">lrwxrwxrwx 1 root root 20 11月 24 16:41 /bin/ansible -&gt; /usr/bin/ansible-2.7</span><br><span class="line">Ansible</span><br><span class="line">[root@cPen_A ~]# ansible all -m shell -a <span class="string">&quot;ip a&quot;</span><span class="comment"># 注：匹配所有主机 使用shell模块 执行ip a</span></span><br><span class="line"><span class="comment">#注：指定ansible……没写完都执行命令</span></span><br><span class="line">[root@cPen_A ~]# ansible all -m shell -a <span class="string">&quot;mkdir /tmp/sc&quot;</span></span><br><span class="line">……</span><br><span class="line">192.168.0.55 | CHANGED | rc=0 &gt;&gt;<span class="comment"># 注：返回0 执行执行成功</span></span><br><span class="line">……</span><br><span class="line">[root@cPen_A ~]# ansible webser -m shell -a <span class="string">&quot;mkdir /tmp/sc&quot;</span><span class="comment"># 注：匹配webser组</span></span><br><span class="line">192.168.0.55 | FAILED | rc=1 &gt;&gt;<span class="comment"># 注：返回1 表示执行失败</span></span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Ansible </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>21_Linux基础-ssh服务3</title>
      <link href="/posts/57744.html"/>
      <url>/posts/57744.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-回顾">一. 回顾<a class="header-anchor" href="#一-回顾"></a></h2><h3 id="1-1-ssh">1.1 ssh<a class="header-anchor" href="#1-1-ssh"></a></h3><p><strong>ssh</strong></p><p>secure shell</p><ul class="lvl-0"><li class="lvl-2"><p>远程登录连接，控制主机</p></li><li class="lvl-2"><p>数据的传输都是加密的</p></li><li class="lvl-2"><p>基于非对称加密技术</p></li></ul><h3 id="1-2-加密技术">1.2 加密技术<a class="header-anchor" href="#1-2-加密技术"></a></h3><p><strong>加密技术</strong></p><p><strong>对称加密</strong></p><ul class="lvl-0"><li class="lvl-2"><p>双方共同拥有一把钥匙，其中一方拿着加密，另外一方就拿着解密</p></li><li class="lvl-2"><p>弊端：这个公钥的钥匙很容易被有心人获取</p></li></ul><p><strong>非对称加密</strong></p><ul class="lvl-0"><li class="lvl-2"><p>使用公钥对进行加解密</p></li><li class="lvl-2"><p>生成一对钥匙，其中一方作为私钥，另一方就是公钥</p></li><li class="lvl-2"><p>私钥是只有自己知道，私钥保存在本地</p></li><li class="lvl-2"><p>公钥是给需要通信的人，公钥可以给其他人</p></li><li class="lvl-2"><p>使用公钥加密，私钥解密，一般用在数据加密传输<br>(A、B 2个人，B给A用加密的方式传输数据，私钥在A手里，B用A的公钥对数据加密)</p></li><li class="lvl-2"><p>使用私钥加密，公钥解密，一般用于认证<br>(A向B发送数据，B用于确认是不是A发送的数据，客户端A用A的私钥对数据进行加密，服务端B拿A的公钥进行解密。只管认证，不管加密性)</p></li></ul><h3 id="1-3-ssh登录">1.3 ssh登录<a class="header-anchor" href="#1-3-ssh登录"></a></h3><p><strong>ssh登录</strong></p><p>登录方式</p><ul class="lvl-0"><li class="lvl-3"><p>密码登录<br>流程<br>1、客户端发送登录请求<br>2、服务器发送机器的公钥发送给客户端<br>3、客户端用服务器的公钥对密码进行加密，发送给服务端<br>4、服务器收到密文之后，用私钥进行解密，与/etc/shadow进行验证<br>5、返回验证结果</p></li><li class="lvl-3"><p>密钥登录，公钥认证<br>1、客户端生成公钥对<br>2、将客户端的用户公钥发送给服务器，保存在目标用户~/.ssh/authorized_keys<br>3、客户端发送请求，服务器返回1个随机字符串<br>4、客户端收到随机字符串之后，用自己的私钥加密，发送给服务器<br>5、服务器收到密文之后，用客户端的公钥进行解密，拿到随机字符串与生成的字符串比较。返回认证结果(随机字符串其他人拿到了就拿到了，没有任何关系，因为A的公钥很多人都可以有)</p></li><li class="lvl-3"><p>弊端</p><ul class="lvl-2"><li class="lvl-5">第三方攻击</li><li class="lvl-5">A无法判定收到的这个公钥是不是B的</li><li class="lvl-5">为了解决这个问题<ul class="lvl-4"><li class="lvl-7">第一次登录的时候会进行人为确认</li><li class="lvl-7">确认了之后，将B机器主机公钥存放在~/.ssh/known_hosts，以后每次登录都会进行对比(如果系统重装后，登录不上，提示known_hosts……，将known_hosts删掉)</li></ul></li></ul></li></ul><p><strong>公钥认证</strong></p><p>1、使用命令生成公钥对</p><p>​ssh-keygen</p><p>​-t 选项 指定生成的加密算法</p><p>​默认是rsa算法加密，过程中一直敲回车就可以了</p><p>2、客户端将公钥发送给服务器</p><p>​保存在目标用户的~/.ssh/authorized_keys</p><p>3、检测权限</p><p>​authorized_keys 600权限</p><p>​.ssh 以及家目录都给755以下权限</p><p>或者 允许密码验证登录时(前提条件) # ssh-copy-id <a href="mailto:wy@192.168.0.39">wy@192.168.0.39</a> -p 2233 把公钥发送过去</p><p>[root@cPen_python ~]# ssh-copy-id <a href="mailto:wy@192.168.0.39">wy@192.168.0.39</a> -p 2233# 注：需要可以支持密码登录</p><h3 id="1-4-ssh远程操作工具">1.4 ssh远程操作工具<a class="header-anchor" href="#1-4-ssh远程操作工具"></a></h3><p><strong>ssh远程操作工具</strong></p><blockquote><ul class="lvl-1"><li class="lvl-3"><p>ssh</p><ul class="lvl-3"><li class="lvl-5">远程执行命令，远程登录</li><li class="lvl-5">登录方式<ul class="lvl-5"><li class="lvl-7">ssh 服务器ip地址<ul class="lvl-7"><li class="lvl-9">使用当前用户和默认端口登录</li><li class="lvl-9">使用客户端的当前用户名，登录到远端服务器的同名用户下，默认端口22<br>(没有同名用户，登录失败)</li></ul></li><li class="lvl-7">ssh 用户名@服务器ip地址<ul class="lvl-7"><li class="lvl-9">登录到远端服务器的指定用户下，使用默认端口22登录</li></ul></li><li class="lvl-7">ssh 服务器地址 -l 用户名 -p 端口号<ul class="lvl-7"><li class="lvl-9">指定用户名和端口去登录</li></ul></li><li class="lvl-7">ssh -o 接一些配置选项 服务器的ip地址<br>#无序输入yes，自动保存hostkey<br>ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223</li><li class="lvl-7">ssh -i /tmp/id_rsa 指定私钥认证文件<br>默认情况在~/.ssh/这下面找私钥</li><li class="lvl-7">ssh -vvv<br>打印登录过程的详细信息</li></ul></li></ul></li></ul></blockquote><h3 id="1-5-服务配置">1.5 服务配置<a class="header-anchor" href="#1-5-服务配置"></a></h3><p><strong>服务配置</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>服务安装包</strong></p><ul class="lvl-2"><li class="lvl-4"><h2 id="oepnssh">oepnssh<a class="header-anchor" href="#oepnssh"></a></h2>[root@cPen_python ~]# which ssh<br>/usr/bin/ssh<br>[root@cPen_python ~]# rpm -qf /usr/bin/ssh<br>openssh-clients-7.4p1-21.el7.x86_64</li></ul></li><li class="lvl-2"><p><strong>配置文件</strong></p><ul class="lvl-2"><li class="lvl-4">/etc/ssh/sshd_config服务端配置文件</li><li class="lvl-4">/etc/ssh/ssh_config   客户端配置</li></ul></li><li class="lvl-2"><p><strong>主程序</strong><br>服务端 /usr/sbin/sshd<br>客户端 /usr/bin/ssh</p></li><li class="lvl-2"><p>重新加载配置<br>重启服务 service sshd restart/reload<br>kill -1 sshd的pid<br>kill -HUP sshd的pid号</p></li></ul><h3 id="1-6-查看ssh服务启动情况">1.6 查看ssh服务启动情况<a class="header-anchor" href="#1-6-查看ssh服务启动情况"></a></h3><p><strong>查看ssh服务启动情况</strong></p><p>1、ps -aux/-ef</p><p>2、pidof sshd</p><p>3、netstat -autpln所有接口(a)的udp tcp连接，显示出所有程序(p) 监听状态(l) n数字显示端口号</p><p>​# 注：查看网络连接状态</p><p>​# ps -eo pid,uid,comm|grep sshd# 注：<strong>-eo查看特定字段信息</strong></p><p>4、lsof -i:22打印出程序所需要的文件</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">[root@localhost ~]# ps aux |grep sshd</span><br><span class="line">root       1066  0.0  0.1 112924  4316 ?        Ss   09:41   0:00 /usr/sbin/sshd -D</span><br><span class="line">root       1608  0.0  0.1 158928  5608 ?        Ss   09:43   0:00 sshd: root@pts/0</span><br><span class="line">root       9546  0.0  0.0 112824   980 pts/0    S+   11:26   0:00 grep --color=auto sshd</span><br><span class="line">[root@localhost ~]# ps -ef |grep sshd</span><br><span class="line">root       1066      1  0 09:41 ?        00:00:00 /usr/sbin/sshd -D</span><br><span class="line">root       1608   1066  0 09:43 ?        00:00:00 sshd: root@pts/0</span><br><span class="line">root       9550   1612  0 11:26 pts/0    00:00:00 grep --color=auto sshd</span><br><span class="line">[root@localhost ~]# ps -eo pid,uid,<span class="built_in">comm</span>|grep sshd<span class="comment"># 注：-eo查看特定字段信息</span></span><br><span class="line">  1066     0 sshd</span><br><span class="line">  1608     0 sshd</span><br></pre></td></tr></table></figure><h3 id="1-7-ssh-agent">1.7 ssh-agent<a class="header-anchor" href="#1-7-ssh-agent"></a></h3><p><strong>ssh-agent</strong></p><p>​管理密钥</p><p>​在你自己的机器上开启这个服务</p><p>​配置: xshell–&gt; 主机属性–》ssh --》勾选 使用xagent进行身份验证 ;勾选 使用代理转发</p><p>#注：自己的机器是Windows，在Windows上开启ssh-agent服务，现在有A、B 2台机器，A、B两台机器都有Windows的公钥，这种情况开启ssh-agent(xshell里面开启)，A登录B时默认情况会拿windows的公钥进行加密，B机器用Windows的私钥进行解密必须在xshell里进行操作，这都是xshell的行为</p><hr><h2 id="二-跳板机">二. 跳板机<a class="header-anchor" href="#二-跳板机"></a></h2><blockquote><p>#注：跳板机给办公人员用的 跳板机/堡垒机 为了保护系统的安全</p><p>#注：使用ssh-agent 访问跳板机和想要访问的主机</p><p>#注：使用场景 阿里的业务 本来有10万台主机(在局域网里面，没有外网，外部不能访问)，我在家里，十万台机器捞出一台，这1台主机可以访问外网(跳板机/堡垒机)，这1台跳板机的配置尤其重要</p><p>开启ssh-agent，把自己主机的公钥添加到目标主机和堡垒机下 (目标主机的权限和堡垒机的权限)</p><p>#注：连到A上，从A跳到B上，B不一定有当前主机的公私钥</p><p>#跳板机 安全加固：</p><p>不能使用root直接登录，使用sudo赋予相应权限</p><p>不能使用默认端口登录</p><p>不能使用密码登录，都使用公钥登录</p><p>添加防火墙配置</p></blockquote><blockquote><p>总结：</p><p>#跳板机</p><p>#安全加固</p><p>​1、不能使用密码登录</p><p>​2、不能使用root登录</p><p>​3、修改默认端口</p><p>​4、添加防火墙配置</p><p>​5、使用跳板机登录</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br></pre></td><td class="code"><pre><span class="line">示例1：查看路由 ip r</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_python ~]# ip r<span class="comment"># 注：查看路由</span></span><br><span class="line">default via 192.168.0.1 dev ens33 proto dhcp metric 100 </span><br><span class="line">192.168.0.0/24 dev ens33 proto kernel scope <span class="built_in">link</span> src 192.168.0.32 metric 100 </span><br><span class="line">[root@cPen_python ~]# ip r delete default via 192.168.0.1<span class="comment"># 注：删除网关</span></span><br><span class="line">[root@cPen_python ~]# ip r</span><br><span class="line">192.168.0.0/24 dev ens33 proto kernel scope <span class="built_in">link</span> src 192.168.0.32 metric 100 </span><br><span class="line">[root@cPen_python ~]# ping www.baidu.com<span class="comment"># 注：删除后ping不通外网</span></span><br><span class="line">connect: 网络不可达</span><br><span class="line">[root@cPen_python ~]# ping 8.8.8.8</span><br><span class="line">connect: 网络不可达</span><br><span class="line">[root@cPen_python ~]# ip r add default via 192.168.0.1<span class="comment"># 注：还原</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例2：A机器登录到B机器(简化登录) vim .ssh/config</span><br><span class="line"><span class="comment">#以后会遇到很多机器，ip地址是记不住的</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#A机器登录到B机器，操作前需要先把A机器公钥放到B机器上 进行授权</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">#注：意思是将机器root@192.168.0.31 -p 2233 取个别名叫B</span></span><br><span class="line"><span class="comment">#ForwardAgent yes# 注：转发 开启</span></span><br><span class="line"><span class="comment">#StrictHostKeyChecking no# 注：不需要输入yes 直接把key保存在known_hosts里面</span></span><br><span class="line"><span class="comment">#ServerAliveInterval 60# 注：存活状态，检测服务存活状态</span></span><br><span class="line"><span class="comment">#IdentityFile ~/.ssh/id_rsa# 注：指定认证私钥</span></span><br><span class="line"><span class="comment">#示例如下</span></span><br><span class="line">[root@cPen_python ~]# vim .ssh/config</span><br><span class="line"><span class="comment">###############################################</span></span><br><span class="line">ForwardAgent <span class="built_in">yes</span></span><br><span class="line">StrictHostKeyChecking no</span><br><span class="line">ServerAliveInterval 60</span><br><span class="line">IdentityFile ~/.ssh/id_rsa</span><br><span class="line"><span class="comment">###############################################</span></span><br><span class="line">Host B</span><br><span class="line">    HostName 192.168.0.31</span><br><span class="line">    User    cPen</span><br><span class="line">    Port    2233</span><br><span class="line">[root@cPen_python .ssh]# <span class="built_in">chmod</span> 600 config<span class="comment"># 注：授予权限 不执行这条语句 可能会报错</span></span><br><span class="line">[root@cPen_python .ssh]# ssh B</span><br><span class="line">Last login: Mon Nov 23 15:05:16 2020 from 192.168.0.32<span class="comment"># 注：登录成功</span></span><br><span class="line">[root@cPen_centos8 ~]# </span><br><span class="line"><span class="comment">#注：即简化 # ssh 192.168.0.31 -l root -p 2233 操作 (比如登录到ftp服务器 ssh ftp)</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例3：查看端口连接状态 (客户机想访问服务器的时候使用 客户机上telnet) telnet 192.168.0.31 2233</span><br><span class="line"><span class="comment">#注：这个命令只能测tcp的 udp的测不了，但是大部分服务都是tcp的</span></span><br><span class="line"><span class="comment">#查看端口是否可以访问(即服务是否可达) telnet 192.168.0.31 2233</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#ping命令 是查看2台机器网络是否连通</span></span><br><span class="line"><span class="comment">#查看服务是否可达使用 telnet命令</span></span><br><span class="line"><span class="comment">#示例：查看端口是否可达(服务是否可达)</span></span><br><span class="line">[root@cPen_python .ssh]# yum install telnet -y</span><br><span class="line">[root@cPen_python .ssh]# telnet 192.168.0.31 2233</span><br><span class="line">Trying 192.168.0.31...</span><br><span class="line">Connected to 192.168.0.31.<span class="comment"># 注：服务可达</span></span><br><span class="line">Escape character is <span class="string">&#x27;^]&#x27;</span>.</span><br><span class="line">SSH-2.0-OpenSSH_8.0</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例4：提示主机不被信任 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：提示WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!</span></span><br><span class="line">将~/.ssh/known_hosts 删掉</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例5：永久修改主机名 hostnamectl set-hostname <span class="string">&quot;A&quot;</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#方法1</span></span><br><span class="line">[root@cPen_python .ssh]# hostnamectl set-hostname <span class="string">&quot;A&quot;</span></span><br><span class="line"><span class="comment">#注：其实是修改 /etc/hostname</span></span><br><span class="line">[root@A ~]# less /etc/hostname </span><br><span class="line"><span class="comment">#方法2</span></span><br><span class="line"><span class="comment">#或者直接修改 /etc/hostname</span></span><br><span class="line"><span class="comment">#临时修改主机名</span></span><br><span class="line">[root@B ~]# hostname <span class="built_in">cp</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例6：查看进程数 pstree -p</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：看程序树状结构 pstree -p</span></span><br><span class="line">[root@cPen_python .ssh]# pstree -p |grep sshd</span><br><span class="line">           |-sshd(1065)-+-sshd(3782)---bash(3784)</span><br><span class="line">           |            |-sshd(3980)---bash(3982)-+-grep(4318)</span><br><span class="line">           |            |-sshd(4059)---bash(4061)</span><br><span class="line">           |            `-sshd(4288)---bash(4290)</span><br><span class="line"><span class="comment">#注：前面是父程序，后面是父程序创造出来的子程序，子程序分配新的bash环境，bash环境在操作命令grep</span></span><br><span class="line"><span class="comment">#注：父进程创造出子进程，子进程有创造出一个子进程，子进程创造出一个新的bash环境</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#注：连接到B机器后bash环境多了一个ssh子进程去处理B机器</span></span><br><span class="line">[root@a ~]# ssh B</span><br><span class="line">Last login: Mon Nov 23 15:52:16 2020 from 192.168.0.32</span><br><span class="line">[root@a .ssh]# pstree -p |grep sshd</span><br><span class="line">           |-sshd(1065)-+-sshd(3782)---bash(3784)</span><br><span class="line">           |            |-sshd(3980)---bash(3982)-+-grep(4325)</span><br><span class="line">           |            |-sshd(4059)---bash(4061)---ssh(4323)</span><br><span class="line">           |            `-sshd(4288)---bash(4290)</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例7：修改客户端配置 ~/.ssh/config</span><br><span class="line"><span class="comment">#配置文件：~/.ssh/config</span></span><br><span class="line"><span class="comment">#工作中使用跳板机代理登录 (客户端的配置，方便开发配置)</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：假设现在有A、B、C三台机器，B是跳板机，假设A C不通，A通B，B通C，B通D，B通E…………</span></span><br><span class="line"><span class="comment">#注：B机器当做跳板机，A是自己的本地机，A机器做代理，B机器自动做转发</span></span><br><span class="line"><span class="comment">#注：在本地机A机器中操作</span></span><br><span class="line">[root@a ~]# vim ~/.ssh/config </span><br><span class="line"><span class="comment">###############################################</span></span><br><span class="line">ForwardAgent <span class="built_in">yes</span></span><br><span class="line">StrictHostKeyChecking no</span><br><span class="line">ServerAliveInterval 60</span><br><span class="line">IdentityFile ~/.ssh/id_rsa</span><br><span class="line"><span class="comment">###############################################</span></span><br><span class="line">Host B</span><br><span class="line">    HostName 192.168.0.31</span><br><span class="line">    User    sanchuang</span><br><span class="line">    Port    2233</span><br><span class="line"></span><br><span class="line">Host 192.168.0.54</span><br><span class="line">    User  sanchuang</span><br><span class="line">    Port 2233</span><br><span class="line">    ProxyCommand  ssh 192.168.0.31 -W %h:%p -l sanchuang -p 2233</span><br><span class="line"><span class="comment">#注：ProxyCommand表示 A通过跳板机(192.168.0.31)B登录到</span></span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------------------</span></span><br><span class="line">Host */ftp*/10.* 以10网段开头的ip地址 ssh 10.0.0.1 跳到这个配置执行</span><br><span class="line">    User    sanchuang</span><br><span class="line">    Port    2233</span><br><span class="line">    ProxyCommand  ssh B nc %h %p -w 10 2&gt;/dev/null</span><br><span class="line"><span class="comment">#注：上课时冲突 前面写Host *与ssh B冲突</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例8：远程执行命令 ssh B</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#不登录B机器，执行B机器上的命令 (一般用于脚本)</span></span><br><span class="line">[root@a ~]# ssh B ifconfig<span class="comment"># 注：登录到B执行 ifconfig命令</span></span><br><span class="line">[root@a ~]# ssh B ip a<span class="comment"># 注：登录到B执行 查看ip地址 命令 ；命令的返回是B机器给的</span></span><br><span class="line">[root@a ~]# ssh B <span class="string">&quot;/usr/sbin/ip a&quot;</span><span class="comment"># 注：脚本里建议使用命令的绝对路径</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例9：远程传输 scp (前提ssh可以连接)</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：传输文件</span></span><br><span class="line">[root@a ~]# <span class="built_in">touch</span> ahost</span><br><span class="line">[root@a ~]# scp ahost B:/tmp<span class="comment"># 注：将A机器 当前路径ahost文件cp到B机器下的/tmp路径下</span></span><br><span class="line">ahost                                                                                                     100%    0     0.0KB/s   00:00  </span><br><span class="line">[root@a ~]# scp B:/tmp/bhost ./<span class="comment"># 注：将B机器 /tmp/bhost文件cp到当前路径</span></span><br><span class="line">bhost                                                                                                     100%    0     0.0KB/s   00:00  </span><br><span class="line">[root@a ~]# scp B:tmp/testhost ./<span class="comment"># 注：将B机器 家目录下 tmp/testhost文件cp到当前路径</span></span><br><span class="line"><span class="comment">#注：传输目录 </span></span><br><span class="line">[root@a ~]# scp -r adir B:<span class="comment"># 注：将A机器当前路径下 adir文件夹 cp到B机器家目录下</span></span><br><span class="line">[root@a ~]# scp -r adir B:bdir<span class="comment"># 注：复制文件夹并改名</span></span><br><span class="line">[root@a ~]# scp -r adir B:bdir/<span class="comment"># 注：和上面的没有区别</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例10：sftp传输文件 (前提ssh可以连接)</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：ftp文件传输</span></span><br><span class="line"><span class="comment">#注：sftp 传输文件 本地和异地传输文件</span></span><br><span class="line"><span class="comment">#注：格式 sftp 用户名@主机名</span></span><br><span class="line">[sanchuang@a ~]$ sftp B</span><br><span class="line">Connected to B.</span><br><span class="line">sftp&gt; <span class="built_in">ls</span><span class="comment"># 注：显示远程目录列表</span></span><br><span class="line">2q        aa        adir      bb        bdir      testdir   testdir2  testhost  </span><br><span class="line">sftp&gt; get bdir</span><br><span class="line">Fetching /home/sanchuang/bdir/ to bdir</span><br><span class="line">Cannot download non-regular file: /home/sanchuang/bdir/</span><br><span class="line">sftp&gt; mget bdir</span><br><span class="line">Fetching /home/sanchuang/bdir/ to bdir</span><br><span class="line">Cannot download non-regular file: /home/sanchuang/bdir/</span><br><span class="line">sftp&gt; get 2q<span class="comment"># 注：get 远程路径下载文件</span></span><br><span class="line">Fetching /home/sanchuang/2q to 2q</span><br><span class="line">/home/sanchuang/2q                                                                                       100%  226   107.5KB/s   00:00    </span><br><span class="line">sftp&gt; <span class="built_in">exit</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例11：pssh pscp命令 (前提ssh可以连接)</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#批量处理</span></span><br><span class="line">pssh</span><br><span class="line">  -h  指定主机文件列表，内容格式”[user@]host[:Port]”</span><br><span class="line">  -i  指定每个服务器的处理信息</span><br><span class="line">[root@a ~]# yum install pssh -y<span class="comment"># 注：没有的话需要安装epel源</span></span><br><span class="line">[root@a ~]# <span class="built_in">cat</span> ip.txt </span><br><span class="line">192.168.0.31:2233</span><br><span class="line">192.168.0.54:22</span><br><span class="line">[root@a ~]# pssh -h ip.txt -i <span class="string">&quot;/usr/sbin/ip a&quot;</span></span><br><span class="line">[1] 17:18:13 [FAILURE] 192.168.0.54:22 Exited with error code 255、</span><br><span class="line">Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).</span><br><span class="line">……<span class="comment"># 注：需要保证ssh能不能过去</span></span><br><span class="line">[2] 17:18:13 [SUCCESS] 192.168.0.31:2233<span class="comment"># 注：返回SUCCESS表示执行成功</span></span><br><span class="line">……</span><br><span class="line">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000</span><br><span class="line">……</span><br><span class="line">2: ens33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen </span><br><span class="line">……</span><br><span class="line"><span class="comment">#-------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">#ip.txt里面可以这样写</span></span><br><span class="line">[root@a ~]# vim ip.txt </span><br><span class="line">sanchuang@192.168.0.31:2233</span><br><span class="line">sanchuang@192.168.0.54:2233</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例12：pscp.pssh 批量传输文件 (前提ssh可以连接)</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@a ~]# pscp.pssh -h ip.txt pscptest /tmp</span><br><span class="line"><span class="comment"># 注：把当前目录下的pscptest文件传送到目标主机的/tmp目录下</span></span><br><span class="line">[root@a ~]# vim ip.txt </span><br><span class="line">sanchuang@192.168.0.31:2233</span><br><span class="line">sanchuang@192.168.0.54:2233</span><br><span class="line">[root@a ~]# pscp.pssh -h ip.txt pscptest /tmp</span><br><span class="line">[1] 17:41:31 [FAILURE] sanchuang@192.168.0.54:2233 Exited with error code 1</span><br><span class="line">[2] 17:41:31 [SUCCESS] sanchuang@192.168.0.31:2233</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例13：fping 批量ping(前提ssh可以连接)</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：批量ping 使用fping命令</span></span><br><span class="line">[root@a ~]# yum install fping -y</span><br><span class="line">[root@a ~]# fping -g 192.168.0.1/24<span class="comment"># 注：-g 根据网段去ping</span></span><br><span class="line">192.168.0.1 is alive</span><br><span class="line">……</span><br><span class="line">192.168.0.254 is unreachable</span><br><span class="line">[root@a ~]# fping -f ip.txt <span class="comment"># 注：-f根据文件指定ip去ping</span></span><br><span class="line">192.168.0.31 is alive</span><br><span class="line">192.168.0.54 is alive</span><br><span class="line">[root@a ~]# vim ip.txt </span><br><span class="line">192.168.0.31</span><br><span class="line">192.168.0.54</span><br></pre></td></tr></table></figure><hr><h2 id="三-ssh服务补充">三. ssh服务补充<a class="header-anchor" href="#三-ssh服务补充"></a></h2><h3 id="3-1-ssh">3.1 ssh<a class="header-anchor" href="#3-1-ssh"></a></h3><blockquote><p>ssh --&gt; secure shell</p><p>作用：远程登录和操作远程的服务器 --&gt; 信息加密 --&gt; 非常安全的远程登录协议</p><p>#注：远程登录远程操控 省成本</p><p>ssh协议 属于<strong>应用层</strong>的协议</p><p>Linux：openssh --&gt; centos7/8自带</p><p>Windows没有ssh协议</p></blockquote><h3 id="3-2-命令">3.2 命令<a class="header-anchor" href="#3-2-命令"></a></h3><blockquote><p>命令：</p><p>​ssh</p><p>​scp# 注：远程copy</p><p>​sftp</p><p>​ssh-keygen</p><p>​ssh-copy-id</p></blockquote><h3 id="3-3-登录方式">3.3 登录方式<a class="header-anchor" href="#3-3-登录方式"></a></h3><blockquote><p>登录方式：</p><p>​Xshell# 注：不开源</p><p>​putty # 注：开源</p><p>​secureCRT# 注：开源</p><ol><li class="lvl-3"><p>用户名和密码</p></li></ol><p>​/etc/passwd# 注：放用户名</p><p>​/etc/shadow# 注：放密码</p><ol start="2"><li class="lvl-3"><p>密钥</p></li></ol><p>​公钥和私钥</p><p>​public key --&gt; 公开# 注：给别人</p><p>​private key # 注：自己所有</p></blockquote><h3 id="3-4-安全加固措施">3.4 安全加固措施<a class="header-anchor" href="#3-4-安全加固措施"></a></h3><blockquote><p>安全加固措施：</p><ol><li class="lvl-3"><p>修改端口号  22</p><p>​nmap # 注：端口扫描</p><p>​nc   # 注：端口扫描</p><ol start="2"><li class="lvl-6"><p>禁用root</p><p>su# 注：su 切换到root</p></li></ol></li><li class="lvl-3"><p>密码复杂性</p></li><li class="lvl-3"><p>启用密钥    # 注：禁止密码认证</p></li><li class="lvl-3"><p>打补丁 或者 安装最新版本的ssh软件</p></li><li class="lvl-3"><p>iptables防火墙</p></li></ol><p>#注：免密通道（密钥登录）</p></blockquote><h3 id="3-5-免密通道">3.5 免密通道<a class="header-anchor" href="#3-5-免密通道"></a></h3><blockquote><p>免密通道：</p><p>​单向信任# 注：把密钥给其他主机</p><p>​双向信任# 注：双方互给公钥</p><p>#注：一般用root用户，为了安全起见用普通用户</p></blockquote><h3 id="3-6-ansible">3.6 ansible<a class="header-anchor" href="#3-6-ansible"></a></h3><blockquote><p>ansible：自动化运维的工具：批量管理和操作</p><p>#注：ansible批量管理 批量部署的软件；底层用的ssh协议，推荐建立免密通道</p><p>#注：ansible软件 用Python写的</p></blockquote><h3 id="3-7-日志文件：-var-log-secure">3.7 日志文件：/var/log/secure<a class="header-anchor" href="#3-7-日志文件：-var-log-secure"></a></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></pre></td><td class="code"><pre><span class="line">日志文件：/var/log/secure</span><br><span class="line">[root@cPen_centos8 ssh]# vim /etc/ssh/sshd_config </span><br><span class="line"><span class="comment"># Logging</span></span><br><span class="line"><span class="comment">#SyslogFacility AUTH</span></span><br><span class="line">SyslogFacility AUTHPRIV<span class="comment"># 注：日志类型 认证类型 AUTHPRIV 设置</span></span><br><span class="line"><span class="comment">#LogLevel INFO</span></span><br><span class="line"></span><br><span class="line">日志文件：</span><br><span class="line">/var/log/secure</span><br><span class="line">[sanchuang@cPen_centos8 ~]$ ps aux|grep rsyslog<span class="comment"># 注：外包日志的进程</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></pre></td><td class="code"><pre><span class="line">ssh将自己的日志功能外包给rsyslog服务去帮它记录日志</span><br><span class="line"></span><br><span class="line">[sanchuang@cPen_centos8 ~]$ vim /etc/rsyslog.conf </span><br><span class="line"><span class="comment"># The authpriv file has restricted access.</span></span><br><span class="line">authpriv.*                                              /var/log/secure</span><br></pre></td></tr></table></figure><h3 id="3-8-ssh服务登录不了，如何排除？">3.8 ssh服务登录不了，如何排除？<a class="header-anchor" href="#3-8-ssh服务登录不了，如何排除？"></a></h3><blockquote><p>ssh服务登录不了，如何排除？</p><ol><li class="lvl-3"><p>检测网络是否通畅</p><p>ping</p></li><li class="lvl-3"><p>检测ssh服务是否启动，检查端口，selinux</p></li><li class="lvl-3"><p>ssh的配置：是否禁用root，是否禁用密码认证</p></li><li class="lvl-3"><p>检查防火墙iptables</p><p>​        service firewalled stop</p></li><li class="lvl-3"><p>黑白名单        # 注：centos6、7里面用，8里面没有</p></li></ol></blockquote><h3 id="3-9-ssh免密通道">3.9 ssh免密通道<a class="header-anchor" href="#3-9-ssh免密通道"></a></h3><blockquote><p>ssh免密通道</p><ol><li class="lvl-3"><p>生成密钥对</p><p>​ssh-keygen</p><p>​ssh-keygen -t ecdsa</p></li><li class="lvl-3"><p>上传公钥</p><p>​    ssh-copy-id -i id_ecdsa.pub <a href="mailto:root@192.168.0.35">root@192.168.0.35</a></p><p>​    ssh-copy-id -p 2299 -i id_ecdsa.pub <a href="mailto:root@192.168.0.35">root@192.168.0.35</a></p></li><li class="lvl-3"><p>远程连接</p><p>​    ssh -p ‘2299’ ‘root@192.168.0.39’</p></li></ol></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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">免密通道的建立步骤：</span><br><span class="line">[root@localhost .ssh]# ssh-keygen -t ecdsa</span><br><span class="line">[root@localhost .ssh]# ssh-copy-id -p 2299 -i id_ecdsa.pub root@192.168.0.39</span><br><span class="line">[root@localhost .ssh]# ssh -p <span class="string">&#x27;2299&#x27;</span> <span class="string">&#x27;root@192.168.0.39&#x27;</span></span><br><span class="line"></span><br><span class="line">known_hosts：存放我们曾经ssh连接过的机器的公钥</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><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">scp就是在2台机器之间底层使用ssh协议来拷贝文件或者文件夹</span><br><span class="line">[root@cPen_centos8 ssh]# ssh root@192.168.0.24<span class="comment"># 注：远程登录</span></span><br><span class="line">[root@cPen_centos8 ssh]# ssh root@192.168.0.24 <span class="built_in">df</span> -Th<span class="comment"># 注：远程执行命令</span></span><br><span class="line">[root@cPen_python ssh]# scp echo.sh root@192.168.0.35:/root<span class="comment"># 注：传文件  （源文件 远程）</span></span><br><span class="line">[root@cPen_python ssh]# scp -r /boot root@192.168.0.35:/root<span class="comment"># 注：传文件夹</span></span><br><span class="line">[root@cPen_python ssh]# scp -r root@192.168.0.35:/etc/passwd<span class="comment"># 注：拿文件夹</span></span><br><span class="line">[root@cPen_python ssh]# ssh root@192.168.0.35 bash /root/echo.sh feng zhang wang</span><br><span class="line">scp就是在2台机器之间底层使用ssh协议来拷贝文件或者文件夹</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_centos8 ssh]# getenforce <span class="comment"># 注：查看selinux</span></span><br><span class="line">Disabled</span><br><span class="line">[root@cPen_centos8 ssh]# setenforce 0<span class="comment"># 注：临时关闭selinux</span></span><br><span class="line">setenforce: SELinux is disabled</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[sanchuang@cPen_centos8 ~]$ ifdown ens33</span><br><span class="line">[sanchuang@cPen_centos8 ~]$ ifup ens33</span><br><span class="line"><span class="comment">#注：禁用root用户登录后，本地可以用root用户登录</span></span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> SSH </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>20_Linux基础-ssh服务2</title>
      <link href="/posts/46092.html"/>
      <url>/posts/46092.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-公钥认证排错">一. 公钥认证排错<a class="header-anchor" href="#一-公钥认证排错"></a></h2><p>1、确保公钥正确</p><p>2、确保~/.ssh/authorized_keys文件权限为600</p><p>3、确保家目录以及.ssh目录权限为755以下权限，即属组和其他人没有7的权限</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">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_web .ssh]# ssh -vvv wy@192.168.0.30<span class="comment"># 注：看ssh登录时的详细信息</span></span><br><span class="line"><span class="comment">#注：B机器下操作</span></span><br><span class="line">[wy@cPen_web .ssh]$ vim authorized_keys<span class="comment"># 注：把A机器的公钥粘过去</span></span><br><span class="line">[wy@cPen_web .ssh]$ <span class="built_in">chmod</span> 600 authorized_keys </span><br><span class="line">[wy@cPen_web home]$ <span class="built_in">chmod</span> 755 wy<span class="comment"># 注：公钥认证家目录其他人权限不能太高</span></span><br><span class="line">[wy@cPen_web ~]$ <span class="built_in">chmod</span> 755 .ssh<span class="comment"># 注：给.ssh也是755 权限</span></span><br></pre></td></tr></table></figure><hr><h2 id="二-登录方式">二. 登录方式<a class="header-anchor" href="#二-登录方式"></a></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><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">[root@cPen_web .ssh]# ssh wy@192.168.0.30</span><br><span class="line">[root@cPen_web .ssh]# ssh 192.168.0.30 -l wy</span><br><span class="line">[root@cPen_web .ssh]# ssh 192.168.0.30 -l wy -p 22<span class="comment"># 注：指定用户，指定端口（默认22号端口）</span></span><br><span class="line">[root@cPen_web .ssh]# ssh -vvv 192.168.0.30 wy<span class="comment"># 注：查看登录过程的详细信息</span></span><br><span class="line">…………</span><br><span class="line">debug1: Trying private key: /root/.ssh/id_dsa</span><br><span class="line">debug3: no such identity: /root/.ssh/id_dsa: No such file or directory</span><br><span class="line">debug1: Trying private key: /root/.ssh/id_ecdsa</span><br><span class="line">debug3: no such identity: /root/.ssh/id_ecdsa: No such file or directory</span><br><span class="line">debug1: Trying private key: /root/.ssh/id_ed25519</span><br><span class="line">debug3: no such identity: /root/.ssh/id_ed25519: No such file or directory</span><br><span class="line">debug1: Trying private key: /root/.ssh/id_xmss</span><br><span class="line">debug3: no such identity: /root/.ssh/id_xmss: No such file or directory</span><br><span class="line">…………</span><br><span class="line"><span class="comment">#注：默认会去寻找~/.ssh/id_rsa，然后再找id_dsa等等...</span></span><br><span class="line"><span class="comment">#注：rsa  dsa  ecdsa  加密算法</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：不接任何用户名，会以A机器上的当前用户去登录B机器上的同名用户（不管B机器有没有这个用户）(没有就登录失败)</span></span><br><span class="line">[sanchuang@cPen_web ~]$ ssh 192.168.0.30</span><br><span class="line">Are you sure you want to <span class="built_in">continue</span> connecting (<span class="built_in">yes</span>/no/[fingerprint])? <span class="built_in">yes</span></span><br><span class="line">sanchuang@192.168.0.30<span class="string">&#x27;s password: </span></span><br><span class="line"><span class="string">[sanchuang@cPen_web ~]$ </span></span><br><span class="line"><span class="string">----------------------------------</span></span><br><span class="line"><span class="string">#注：登录时默认会去寻找家目录下的~/.ssh/id_rsa去进行认证，所有尽量不要在生成key的时候将它的默认路径更改</span></span><br></pre></td></tr></table></figure><hr><h2 id="三-登录验证原理-密码登录">三. 登录验证原理 - 密码登录<a class="header-anchor" href="#三-登录验证原理-密码登录"></a></h2><p><strong>1、密码登录</strong></p><p>​client向server发送登陆请求，server将自己的公钥发送给client<br>​client使用这个公钥，将密码进行加密，发送给server<br>​server用私钥解密登陆密码，验证合法性<br>​server返回验证结果给client</p><p>这个流程有一个问题，怎么保证收到的公钥就是目标server的公钥？（中间人攻击）<br>如果一个攻击者中途拦截了client的登录请求，发送自己的公钥给client，client端就会用攻击者的公钥进行数据加密，攻击者接收到信息后，用自己的私钥就可以解密了，这就窃取了client的登陆信息了</p><p>为了解决这个问题，client端第一次登录的时候，会进行一个公钥确认</p><p>确认server服务端的这个host主机摘要，确认成功之后就会将server端的pubkey保存在~/know_hosts里面<br>以后每次连接都会验证这个know_hosts里的key和收到的pubkey是否一致</p><p>server主机的pubkey保存在/etc/ssh/目录下，默认使用ssh_host_ecdsa_key.pub</p><p><strong>#注：SSH基于公钥加密的技术</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241152622.png" alt=""></p><p>#注：第一步A机器向B机器发送登录请求（还没有道输入密码的阶段）</p><p>#注：B机器接收到A机器的请求之后，把B机器的公钥发送给A机器</p><p>#注：A机器拿到公钥之后，用公钥对密码进行加密（密码是密文，不能让别人知道）</p><p>#注：A机器把加好密的这一串密文发给B</p><p>#注： B机器收到来此A机器的机密之后的密码，用私钥解密，得到passwd，再与/etc/shadow密码进行比较验证是否通过</p><p>#注：B机器向A机器返回登陆结果（成功或者失败）</p><p><strong>#注：密码登录涉及公钥加密，ssh整个都设计公钥加密（无论是密码登录或公钥登录）</strong></p><p>#注：没有保证第3方人攻击</p><p>#注：公钥加密私钥解密、私钥加密公钥解密（为了区分后面+.pub）</p><p>#注：成对存在成对加解密</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><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">#注：第一次登录机器时，一般会要输入yes（是否信任B主机），然后把key放到know_hosts里面</span></span><br><span class="line">A机器下</span><br><span class="line">[root@cPen_web .ssh]# ssh 192.168.0.30 -l wy -p 22</span><br><span class="line">………………</span><br><span class="line">Are you sure you want to <span class="built_in">continue</span> connecting (<span class="built_in">yes</span>/no/[fingerprint])? <span class="built_in">yes</span></span><br><span class="line">………………</span><br><span class="line">[root@cPen_web .ssh]# <span class="built_in">cat</span> known_hosts </span><br><span class="line">192.168.0.30 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBO+Xv/RYitaOHx0iyAbcOXLIPZEn75xh94pJ2L+MWOV/V3YRezYCgHJSwAJm5N9ceqtYCKoXUL3cCJeuGiiDH0A=</span><br><span class="line">B机器下</span><br><span class="line">[root@cPen_web .ssh]# <span class="built_in">cd</span> /etc/ssh<span class="comment"># 注：ssh服务的配置文件</span></span><br><span class="line">[root@cPen_web ssh]# <span class="built_in">ls</span></span><br><span class="line">moduli      sshd_config         ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub</span><br><span class="line">ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key</span><br><span class="line">[root@cPen_web ssh]# <span class="built_in">cat</span> ssh_host_ecdsa_key.pub <span class="comment"># 注：默认使用ssh_host_ecdsa_key.pub</span></span><br><span class="line">ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBO+Xv/RYitaOHx0iyAbcOXLIPZEn75xh94pJ2L+MWOV/V3YRezYCgHJSwAJm5N9ceqtYCKoXUL3cCJeuGiiDH0A= </span><br><span class="line"><span class="comment">#注：A机器保存的key就是B机器/etc/ssh/ssh_host_ecdsa_key.pub下面的</span></span><br><span class="line"><span class="comment">#注：A机器生成的公钥就是B机器/etc/ssh/ssh_host_ecdsa_key.pub下面的</span></span><br></pre></td></tr></table></figure><p>第一次登录 输入yes的原因：信任它<br>-#注：为了增加安全性，第一次连接B主机的时候，都会进行一个主机确认（yes）<br>-#注：输入yes表示，是可信任主机，那就是将主机的pubkey保存在~/.ssh/known_hosts里面，以后每次连接都会验证接收的key是否和know_hosts里一直，不一致，会登录异常</p><p>.--------------------------------------------------------------------------------------------------------------------------</p><p>-#注：A机器向B机器发送请求登录<br>-#注：B机器向A机器返回公钥<br>-#注：如果A机器向B机器发送请求的时候，被C给拦截了<br>-#注：C就伪造一下，把它的公钥发送给A<br>-#注：A把密文用C的公钥加密发送给B，c就可以拿自己的密钥解密信息，不安全<br>-#注：只能自己确认（人为确认）接收的公钥是否是B机器的，输入yes，know_hosts就是自己信任的主机，把B主机的公钥保存到know_hosts里面<br>-#注：后续都会拿know_hosts里面 这个公钥和B发送的公钥进行比较（密钥不一致时会提示 登录失败不受信任）</p><p>-#注：这个key是属于主机的key，验证这台主机的<br>-#注：公钥登录的key属于用户的，是验证用户的key</p><hr><h2 id="四-登录验证原理-公钥认证登录">四. 登录验证原理 - 公钥认证登录<a class="header-anchor" href="#四-登录验证原理-公钥认证登录"></a></h2><p>2、公钥认证登陆</p><p>​client端生成公钥对，将公钥追加在server端的~/.ssh/authorized_keys（1行1个公钥）<br>​发送登录请求，server收到请求之后，生成随机字符串发送给client<br>​client用自己的私钥对字符串进行加密，发送给server<br>​server收到加密字符串之后用公钥解密，比较解密出的字符串和之前生成的字符串是否一致<br>​返回结果给client</p><p>-#注：公私钥对是成对存在的，一个用于加密，一个用于解密，具体哪个为私钥，哪个为公钥就看使用者自己管理</p><p>注意：非对称加密计数<br><strong>使用公钥进行加密，私钥解密，基本用于数据加密</strong><br><strong>使用私钥加密公钥解密，用于认证</strong>（对数据加密性没有要求，拿到就拿到）</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241157484.png" alt=""></p><p>-#注：第一步在A机器上生成公钥对<br>-#注：B主机将A主机的公钥写入B主机用户的~/.ssh/authorized_keys里面<br>-#注：A主机向B机器发送登录请求<br>-#注：B机器收到请求之后，会生成一个随机字符串。把这个随机字符串发送给A机器<br>-#注：A机器收到随机字符串后，用私钥加密<br>-#注：A机器将加密之后的字符串发送给B机器<br>-#注：B机器拿到A机器的加密字符串之后，用公钥解密，再比较解密之后的字符串和生成的字符串是否一致。<br>-#注：B机器再返回结果</p><p>-#注：ABC3台机器，A上面的公钥在BC上都有，C也能公钥解密，得到字符串（对数据加密性没有要求，拿到就拿到）</p></blockquote><hr><h2 id="五-总结">五. 总结<a class="header-anchor" href="#五-总结"></a></h2><h3 id="5-1-SSH服务介绍">5.1 SSH服务介绍<a class="header-anchor" href="#5-1-SSH服务介绍"></a></h3><p><strong>远程Shell应用程序</strong></p><ul class="lvl-0"><li class="lvl-2"><p>允许用户在远程机器上执行任意命令</p></li><li class="lvl-2"><p>让标准输出在本地</p></li><li class="lvl-2"><p>早期明文远程协议：telnet</p></li></ul><p><strong>SSH（Secure Shell，安全的外壳）</strong></p><ul class="lvl-0"><li class="lvl-2"><p>为客户机提供安全的Shell环境，用于远程管理</p></li><li class="lvl-2"><p>默认端口：TCP <code>22</code></p></li></ul><p><strong>SSH基于公钥加密（非对称加密）技术</strong></p><ul class="lvl-0"><li class="lvl-2"><p>数据加密传输</p></li><li class="lvl-2"><p>客户端和服务器的身份验证</p></li></ul><h3 id="5-2-公钥加密体系">5.2 公钥加密体系<a class="header-anchor" href="#5-2-公钥加密体系"></a></h3><p>**公钥（Public Key）和私钥（Private Key）  **</p><ul class="lvl-0"><li class="lvl-2"><p>公钥和私钥是成对生成的，这两个密钥互不相同，两个密钥可以互相加密和解密</p></li><li class="lvl-2"><p>不能根据一个密钥而推算出另外一个密钥</p></li><li class="lvl-2"><p>公钥对外公开，私钥只有私钥的持有人才知道</p></li><li class="lvl-2"><p>私钥应该由密钥的持有人妥善保管</p></li></ul><p><strong>根据实现的功能不同，可以分为数据加密和数字签名</strong></p><hr><h2 id="六-数据加密">六. 数据加密<a class="header-anchor" href="#六-数据加密"></a></h2><p>**发送方使用接收方的公钥加密数据 **<br><strong>接收方使用自己的私钥解密数据</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241324278.png" alt=""></p></blockquote><p><strong>数据加密能保证所发送数据的机密性</strong></p><p>.--------------------------------------------------------------------------------------------------------------------------</p><blockquote><p>-#注：数据加密 主要是为了保障 接收方的数据安全性</p><p>-#注：把A机器的公钥发送给B机器<br>-#注：B用A机器的公钥对传输内容进行加密，然后把信息发送给A机器<br>-#注：将加密内容发送给A机器，此时只有A机器有权限获取里面的内容</p><p>-#注：数据加密 主要是为了保障 接收方的数据安全性<br>-#注：不能保障收到的数据一定是B机器发过来的</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241325586.png" alt="image-20220824132542539" style="zoom:80%;" /></blockquote><hr><h2 id="七-数字签名">七. 数字签名<a class="header-anchor" href="#七-数字签名"></a></h2><p><strong>发送方</strong></p><ul class="lvl-0"><li class="lvl-2"><p>对原始数据执行HASH算法得到摘要值</p></li><li class="lvl-2"><p>发送方用自己私钥加密摘要值</p></li><li class="lvl-2"><p>将加密的摘要值与原始数据发送给接收方</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241327579.png" alt=""></p></blockquote><p><strong>数字签名保证数据完整性、身份验证和不可否认</strong></p><p>.--------------------------------------------------------------------------------------------------------------------------</p><blockquote><p>-#数据签名<br>-#注：如何保障收到的数据一定是B机器发过来的<br>-#注：（A机器上要有B机器的公钥，B机器也要有A机器的公钥）<br>-#注：A机器公钥给B机器<br>-#注：B机器公钥给A机器<br>-#注：B机器向A机器发送数据：B机器先用自己的私钥对摘要信息（hash，一般是data的hash散列值 做信息的摘要信息，验证信息-完整值）进行加密生成签名。B机器再用A机器的公钥对信息内容和签名进行加密，发送给A机器<br>-#注：A机器收到B机器的密文数据后，用自己的私钥进行解密。得到解密后的明文后，用B机器的公钥来解密B机器生成的签名</p><p>-#注：数据签名 验证发送方的数据安全（验证发送方是不是我想要的发送方）</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241328958.png" alt="image-20220824132809916" style="zoom:80%;" /></blockquote><hr><h2 id="八-SSH身份验证过程">八. SSH身份验证过程<a class="header-anchor" href="#八-SSH身份验证过程"></a></h2><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241330947.png" alt=""></p></blockquote><hr><h2 id="九-电子邮件数字签名过程">九. 电子邮件数字签名过程<a class="header-anchor" href="#九-电子邮件数字签名过程"></a></h2><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241331576.png" alt=""></p></blockquote><hr><h2 id="十-OpenSSH">十. OpenSSH<a class="header-anchor" href="#十-OpenSSH"></a></h2><p><strong>OpenSSH</strong></p><ul class="lvl-0"><li class="lvl-2"><p>官方站点：<a href="http://www.openssh.com">http://www.openssh.com</a></p></li><li class="lvl-2"><p>主要软件包：openssh-server、openssh-clients</p></li><li class="lvl-2"><p>服务名：<code>sshd</code></p></li><li class="lvl-2"><p>服务端主程序：<strong>/usr/sbin/sshd</strong>  # 注：都是可执行的脚本</p></li><li class="lvl-2"><p>客户端主程序：<strong>/usr/bin/ssh</strong>  # 注：都是可执行的脚本</p></li><li class="lvl-2"><p>服务端配置文件：/etc/ssh/<code>sshd_config</code></p></li><li class="lvl-2"><p>客户端配置文件：/etc/ssh/<code>ssh_config</code></p></li></ul><p>-#注：xshell就是模拟ssh的客户端<br>-#注：linux yum下下来的包基本都是rpm包</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><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line">示例1：查看命令属于哪个包下载的</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">ssh是通过openssh下载的</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">which</span> ssh</span><br><span class="line">/usr/bin/ssh</span><br><span class="line">[root@cPen_web ~]# rpm -qf /usr/bin/ssh</span><br><span class="line">openssh-clients-8.0p1-4.el8_1.x86_64</span><br><span class="line">[root@cPen_web ~]# yum list |grep openssh</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例2：启动sshd服务的实际上是执行行的服务启动脚本文件 /usr/sbin/sshd（真正执行服务的脚本）</span><br><span class="line">[root@cPen_web ~]# rpm -qf /usr/sbin/sshd</span><br><span class="line">openssh-server-8.0p1-4.el8_1.x86_64</span><br><span class="line">[root@cPen_web ~]# service sshd restart<span class="comment"># 注：service 守护进程 帮它去管理服务</span></span><br><span class="line">Redirecting to /bin/systemctl restart sshd.service</span><br><span class="line">[root@cPen_web ~]# </span><br><span class="line"><span class="comment">#注：守护进程可以帮助管理，想关闭或打开。自己管理的话，很难，要手动的kill 或者 先kill再起来</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例3：直接执行脚本/usr/sbin/sshd 启动服务</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#如果服务起来，会有22号端口属于listen监听状态</span></span><br><span class="line">[root@cPen_web ~]# service sshd stop</span><br><span class="line">[root@cPen_web ~]# lsof -i:22</span><br><span class="line">COMMAND  PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">sshd    1709      root    5u  IPv4  37939      0t0  TCP cPen_web:ssh-&gt;192.168.0.42:54537 (ESTABLISHED)</span><br><span class="line">sshd    2185      root    5u  IPv4  50589      0t0  TCP cPen_web:ssh-&gt;192.168.0.42:57389 (ESTABLISHED)</span><br><span class="line">[root@cPen_web ~]# /usr/sbin/sshd</span><br><span class="line">[root@cPen_web ~]# lsof -i:22</span><br><span class="line">COMMAND  PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">sshd    1709      root    5u  IPv4  37939      0t0  TCP cPen_web:ssh-&gt;192.168.0.42:54537 (ESTABLISHED)</span><br><span class="line">sshd    2185      root    5u  IPv4  50589      0t0  TCP cPen_web:ssh-&gt;192.168.0.42:57389 (ESTABLISHED)</span><br><span class="line">sshd    2282      root    4u  IPv4  52306      0t0  TCP *:ssh (LISTEN)<span class="comment"># 注：处于监听状态</span></span><br><span class="line">sshd    2282      root    6u  IPv6  52308      0t0  TCP *:ssh (LISTEN)</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例4：直接启动vsftpd服务端</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：vsftpd是服务端，ftp是客户端</span></span><br><span class="line">[root@cPen_web ~]# vsftpd<span class="comment"># 注：启动vsftpd服务端（可以直接启动）</span></span><br><span class="line"><span class="comment">#注：查看服务是否起来（4种）</span></span><br><span class="line">[root@cPen_web ~]# pidof vsftpd</span><br><span class="line">2297</span><br><span class="line">[root@cPen_web ~]# ps -ef |grep vsftpd</span><br><span class="line">root        2297       1  0 14:50 ?        00:00:00 vsftpd</span><br><span class="line">root        2300    2186  0 14:51 pts/1    00:00:00 grep --color=auto vsftpd</span><br><span class="line">[root@cPen_web ~]# netstat -auplt |grep vsftpd</span><br><span class="line">tcp6       0      0 [::]:ftp                [::]:*                  LISTEN      2297/vsftpd         </span><br><span class="line">[root@cPen_web ~]# lsof -i:21</span><br><span class="line">COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">vsftpd  2297 root    3u  IPv6  52524      0t0  TCP *:ftp (LISTEN)</span><br></pre></td></tr></table></figure><hr><h2 id="十一-SSH服务端配置文件">十一. SSH服务端配置文件<a class="header-anchor" href="#十一-SSH服务端配置文件"></a></h2><p><strong>/etc/ssh/sshd_config</strong></p><ul class="lvl-0"><li class="lvl-2"><p>重启sshd服务生效</p></li></ul><p>修改了配置文件端口号，启动不起来，原因是selinux是enforcing状态需要修改</p><p>.--------------------------------------------------------------------------------------------------------------------------</p><p>-#注：一般配置文件都是以#开头的注释行<br>-#注：只有root用户有权限修改它</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br></pre></td><td class="code"><pre><span class="line">示例1：过滤出有效行</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_web ~]# grep -v -E <span class="string">&quot;^#|^$&quot;</span> /etc/ssh/sshd_config <span class="comment"># 注：-E支持扩展正则 ； -v不显示</span></span><br><span class="line">HostKey /etc/ssh/ssh_host_rsa_key</span><br><span class="line">HostKey /etc/ssh/ssh_host_ecdsa_key</span><br><span class="line">HostKey /etc/ssh/ssh_host_ed25519_key</span><br><span class="line">……………………</span><br><span class="line">Subsystemsftp/usr/libexec/openssh/sftp-server</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例2：vim /etc/ssh/sshd_config</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_web ~]# vim /etc/ssh/sshd_config </span><br><span class="line"><span class="comment">#Port 22# 注：默认端口号</span></span><br><span class="line"><span class="comment">#AddressFamily any# 注：ip地址 （ipv4\ipv6） any 任何</span></span><br><span class="line"><span class="comment">#ListenAddress 0.0.0.0# 注：本机上面的所有ip地址</span></span><br><span class="line"><span class="comment">#ListenAddress ::# 注：ipv6</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例3：ipv6地址</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">IPv6的地址长度为128位，是IPv4地址长度的4倍。于是IPv4点分十进制格式不再适用，采用十六进制表示。</span><br><span class="line"><span class="comment">#注：以: 冒号分隔</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例4：网络连接失败 排错</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">1、ping通 确保网络是联通的</span><br><span class="line">2、确保服务是起来的</span><br><span class="line">[C:\~]$ telnet 192.168.0.29 2233</span><br><span class="line">1端口没起，2防火墙</span><br><span class="line">[C:\~]$ telnet 192.168.0.29</span><br><span class="line">Connecting to 192.168.0.29:23...</span><br><span class="line">Connecting to 192.168.0.29:2233...</span><br><span class="line">Connection established.</span><br><span class="line">To escape to <span class="built_in">local</span> shell, press <span class="string">&#x27;Ctrl+Alt+]&#x27;</span>.</span><br><span class="line">SSH-2.0-OpenSSH_8.0</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例5：配置文件常用配置详解</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_web ~]# vim /etc/ssh/sshd_config </span><br><span class="line"><span class="comment">#Port 22</span></span><br><span class="line">Port 2233<span class="comment"># 注：修改默认监听端口（默认22端口）</span></span><br><span class="line"><span class="comment">#AddressFamily any</span></span><br><span class="line">ListenAddress 192.168.0.29<span class="comment"># 注：设置本机监听ip地址，默认为0.0.0.0（表示在本机任意ip地址上监听）</span></span><br><span class="line">PermitRootLogin no<span class="comment"># 注：禁止root用户登录（no 不予许root用户登录，默认为yes）</span></span><br><span class="line"><span class="comment">#PubkeyAuthentication yes# 注：是否开启公钥认证（默认开启）</span></span><br><span class="line">AuthorizedKeysFile      .ssh/authorized_keys<span class="comment"># 注：配置公钥认证的文件（这个文件可以改 没必要）</span></span><br><span class="line"><span class="comment"># 注：前面的家目录没有写</span></span><br><span class="line">PasswordAuthentication no<span class="comment"># 注：是否开启密码认证，默认为yes</span></span><br><span class="line"><span class="comment"># WARNING: &#x27;UsePAM no&#x27; is not supported in Red Hat Enterprise Linux and may cause several</span></span><br><span class="line">UsePAM <span class="built_in">yes</span><span class="comment"># 注：使用pam认证（一般为yes不用改它）(pam帮我们进行认证，而不是ssh)</span></span><br><span class="line"><span class="comment">#UseDNS yes# 注：是否将客户端主机名解析成ip，可以将其设置为no</span></span><br><span class="line"><span class="comment"># 注：此过程不顺利的话，会非常的慢，会影响登录认证的速度，可以将其设置为no</span></span><br><span class="line"><span class="comment">#注：一般来说不会开启密码认证</span></span><br><span class="line"><span class="comment">#注：一般来说一个机器不允许root用户登录，一般来说给用户加sudo权限，用超级用户登录</span></span><br><span class="line"><span class="comment">#注：pam是linux下面的pam模块，认证模块。我们登陆进来后，pam帮我们做的密码/密码认证，身份认证状态检验</span></span><br><span class="line"><span class="comment">#注：pam认证模块 --&gt; 配置路径 /etc/pam.d/这个目录下面存放的是每个需要认证的服务的配置，文件名就是服务名</span></span><br><span class="line"><span class="comment">#注：DNS --&gt; 域名解析服务。网络中使用ip地址通信。域名最终都要解析成ip的</span></span><br><span class="line"><span class="comment">#注：DNS域名解析服务。主机名也可以使用DNS解析 (比如cPen_centos8)</span></span><br><span class="line"><span class="comment">#注：如果在DNS范畴之内，可以通过主机名来访问这台主机，或者通过ip地址来访问</span></span><br><span class="line">-----------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_centos8 ~]# visudo</span><br><span class="line">sanchuang   ALL=(ALL)   NOPASSWD:ALL</span><br><span class="line">[root@cPen_python ~]# service sshd restart<span class="comment"># 注：重启服务后22号端口已有的连接还在</span></span><br><span class="line">-------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：主机B登录</span></span><br><span class="line">[root@cPen_web ~]# ssh 192.168.0.29 -p 2233<span class="comment"># 注：指定端口2233</span></span><br><span class="line"><span class="comment">#注：已经连接了的端口，即使改了端口，也不会有影响（只要不关闭窗口）</span></span><br><span class="line"><span class="comment">#注：修改配置文件只是在磁盘上进行修改，对于正在运行的程序，需要把配置加载到磁盘上（重启、reload、kill -1）</span></span><br><span class="line"><span class="comment">#注：修改完配置文件后，root用户 和 密码登录 登录不上去了（禁止使用密码登录）</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：修改配置文件并重启服务时 PermitRootLogin no</span></span><br><span class="line"><span class="comment">#注：B机器root用户登录不上了</span></span><br><span class="line">[root@cPen_web ~]# ssh 192.168.0.29 -p 2233</span><br><span class="line">Permission denied (publickey,gssapi-keyex,gssapi-with-mic).</span><br><span class="line">===============================================================================</span><br><span class="line">PasswordAuthentication no<span class="comment"># 注：是否开启密码密码认证，默认为yes</span></span><br><span class="line"></span><br><span class="line">示例6：物理机上 公钥登录（sanchuang用户登录）</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：ssh生成公钥：（xshell菜单栏）工具 --&gt; 新建用户密钥生成向导 --&gt; 下一步（一直） --&gt; 保存公钥pub key:id_rsa_2048.pub</span></span><br><span class="line"><span class="comment">#注：把pub key复制到sanchuang用户下面去</span></span><br><span class="line">[sanchuang@cPen_web .ssh]$ vim authorized_keys</span><br><span class="line">………………</span><br><span class="line">[sanchuang@cPen_web .ssh]$ <span class="built_in">chmod</span> 600 authorized_keys </span><br><span class="line">[sanchuang@cPen_web .ssh]$ <span class="built_in">chmod</span> 755 /home/sanchuang</span><br><span class="line"><span class="comment">#注：物理机（xshell）生产一对密钥对，放在虚拟机上</span></span><br><span class="line"><span class="comment">#注：物理机上生成的key，在物理机上登，对物理机进行验证</span></span><br><span class="line"><span class="comment">#注：属性 --&gt; 用户身份验证 --&gt; 方法：Public Key ; 用户名：sanchuang ； 用户密钥：id_rsa_2048（刚才生成的密钥）</span></span><br><span class="line"><span class="comment">#注：这个key是物理机上的key，key粘到哪个用户下，就以哪个用户登录。在物理机上生成密钥对，要登你的虚拟机，使用xshell生成和管理密钥对，需要登录虚拟机的sanchuang用户，把物理机的pub key赋给sanchuang用户家目录下~/.ssh/authorized_keys，使用物理机去登。在物理机上生成的key，在物理机上登，sanchuang保存的是物理机的key，只能对物理机进行验证</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：连接不成功的话，设置selinux 关掉（setenforce 0）。修改端口需要添加selinux的规则，一般来说不会去添加它的规则，而是把它关掉</span></span><br><span class="line"><span class="comment">#注：连不上的话，把iptables也关掉（iptables -F）</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例7：ssh命令登陆</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">ssh命令登陆</span><br><span class="line">-l指定登陆的用户名</span><br><span class="line">-p指定server的端口</span><br><span class="line">-i指定私钥文件，默认会在~/.ssh/去找私钥</span><br><span class="line">-o接特定设置选项</span><br><span class="line"><span class="comment">#无序输入yes，自动保存hostkey</span></span><br><span class="line">ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223</span><br><span class="line"><span class="comment">#注：脚本里这样写 无序输入yes</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例8：修改完成之后重新加载配置的方法（sshd_config）</span><br><span class="line"><span class="comment">#注：ssh起来后(默认会读磁盘里ssh配置文件)放到内存去运行</span></span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：修改完成之后重新加载配置的方法（sshd_config）</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">kill</span> -1 2282</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">kill</span> -HUP 2282</span><br><span class="line">[root@cPen_web ~]# service sshd restart<span class="comment"># 注：重新启动服务</span></span><br><span class="line">[root@cPen_web ~]# service sshd reload<span class="comment"># 注：重新加载配置</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例9：man 5 查看配置文件帮助文档</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">man 1普通的命令</span><br><span class="line">man 5查看配置文件的帮助文档</span><br><span class="line">[root@cPen_web .ssh]# man 5 /etc/ssh/sshd_config <span class="comment"># 注：man 5 查看配置文件帮助文档</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例10：UsePAM <span class="built_in">yes</span></span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">UsePAM <span class="built_in">yes</span><span class="comment"># 注：使用pam认证（一般为yes不用改它）</span></span><br><span class="line"><span class="comment">#注：pam是linux下面的pam模块，认证模块。我们登陆进来后，pam帮我们做的密码/密码认证，身份认证状态检验</span></span><br><span class="line">模块文件：/etc/pam.d/ <span class="comment"># 注：存放路径；用于认证的模块，linux可插入认证模块</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_python ~]# <span class="built_in">cd</span> /etc/pam.d/<span class="comment"># 注：里面是pam的配置</span></span><br><span class="line">[root@cPen_python pam.d]# <span class="built_in">ls</span><span class="comment"># 注：里面全是认证的模块；每一个服务一个文件</span></span><br><span class="line">chfn         fingerprint-auth     passwd            postlogin     runuser-l          smtp.postfix  sudo-i          systemd-user</span><br><span class="line">chsh         fingerprint-auth-ac  password-auth     postlogin-ac  smartcard-auth     sshd          su-l            vlock</span><br><span class="line">config-util  login                password-auth-ac  remote        smartcard-auth-ac  su            system-auth     vmtoolsd</span><br><span class="line">crond        other                polkit-1          runuser       smtp               <span class="built_in">sudo</span>          system-auth-ac  vsftpd</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例11：hostname -f 查看主机名全称</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_centos8 pam.d]# hostname -f</span><br><span class="line">cPen_centos8</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例12：解析出百度的ip</span><br><span class="line">--------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@cPen_centos8 pam.d]# host www.baidu.com</span><br><span class="line">[root@cPen_centos8 pam.d]# ping www.baidu.com</span><br></pre></td></tr></table></figure><hr><h2 id="十二-练习">十二. 练习<a class="header-anchor" href="#十二-练习"></a></h2><p><strong>修改端口为2233</strong><br><strong>禁止root用户登录</strong><br><strong>禁止密码登录</strong><br><strong>创建管理员用户sanchuang,给sanchuang所有sudo权限</strong><br><strong>在Windows机器上生成密钥对，后续A,B两台虚拟机器都使用公钥认证进行登陆</strong><br><strong>*注意关闭防火墙和selinx</strong><br>iptables -F<br>getenforce 0 --&gt; 或者修改配置文件 /etc/selinux/config   --disabled，永久修改需要重启机器</p><p>.--------------------------------------------------------------------------------------------------------------------------</p><p>-#注：<strong>不是错误，使用service sshd restart命令实际上是执行/bin/systemctl restart sshd.service命令</strong></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">[root@cPen_python ~]# service sshd restart</span><br><span class="line">Redirecting to /bin/systemctl restart sshd.service<span class="comment"># 注：使用这个命令去执行</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：练习 具体操作如上</span></span><br></pre></td></tr></table></figure><hr><h2 id="十三-ssh-agent管理密钥">十三. ssh-agent管理密钥<a class="header-anchor" href="#十三-ssh-agent管理密钥"></a></h2><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241344042.png" alt=""></p><p>ssh-agent管理密钥  一个代理程序，帮助我们管理私钥<br>配置: xshell–&gt; 主机属性–》ssh --》勾选 使用xagent进行身份验证 ;勾选 使用代理转发</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">[sanchuang@mysql-binary .ssh]$ ssh-add id_rsa<span class="comment"># 注：添加主机密钥给agent管理</span></span><br><span class="line"><span class="comment">#注：把虚拟机上面的key也交给给ssh-agent去管理</span></span><br><span class="line"></span><br><span class="line">[sanchuang@mysql-binary .ssh]$ ssh-add -l<span class="comment"># 注：查看agent管理了哪些密钥</span></span><br><span class="line">2048 SHA256:eJz1xcOJnntAP/R0w1if7oEaukIbiwh0vmtp9Q605ls  (RSA)</span><br></pre></td></tr></table></figure><p>.--------------------------------------------------------------------------------------------------------------------------</p><p>-#注：ssh-agent的概念：帮你管理密钥的，默认情况下ssh-agent开在物理机上的。ssh-agent就是一个中间商，保存管理密钥的。在xshell里面开启了ssh-agent之后，从A机器登录到B机器，它会先取看一下A机器root家目录下面有没有公私钥，没有的话 会从ssh-agent里面捞取它的公私钥<br>-#注：B机器没有A机器的公钥，它会去找ssh-agent里面管理的那个公钥对（中间商），<code>最后认证是拿物理机的key去做认证的</code>，因为物理机里面跑了1个ssh-agent，管理了物理机的pubkey，物理机的pubkey可以登录A又可以登录B，满足的条件是物理机能够登录到B<br>-#注：再来一台主机C，想要从A调到C，先决条件是C要有物理机的pubkey，C对物理机授了权，然后物理机的key又由ssh-agent去管理，就可以从A主机跳到C主机。（家目录下面没有私钥生成，就去找ssh-agent管理的密钥对，只要C有物理机的公钥，就都可以登录了）</p><p>-#注：这个服务是xshell的，只能通过xshell里面才能进行这一系列操作（xshell管理ssh-agent）</p><p>.--------------------------------------------------------------------------------------------------------------------------</p><blockquote><p>-#注：（xshell菜单栏）文件 --&gt; 打开（下拉） --&gt; 属性（右键） --&gt; SSH --&gt; 允许Xagent进行身份验证（勾上）；允许代理转发（勾上）</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241347670.png" alt=""></p><p>-#注：在B机器上勾上（现在要在A机器上登录B机器）</p></blockquote><p>.--------------------------------------------------------------------------------------------------------------------------</p><p>#注：物理机上面有2个虚拟机 A、B，物理机使用xshell去连接A和B。刚在在A、B上都创建了sanchuang用户，并且把物理机的pub key都给了A、B两台机器的sanchuang用户。现在，在A机器上想要连接B机器的sanchuang用户，应该怎么做？B机器上没有A机器的key</p><p>#注：答：把A的key给B（在A机器上生成自己的key，这样的话太麻烦了）</p><p>#注：用户加的是哪一台的pubkey，就是允许哪一台的主机登录，加的authorized_keys是为哪一台机器授权</p><p>#注：A、B机器2台主机之间进行通讯的话，有1个本地的概念，它会在本地用户的家目录下面去找key；物理机没有这个概念，因为它是通过xshell(ssh的客户端，图形界面的ssh命令)去连接的，它通过xshell去管理它的key</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">示例：A机器上登录到B机器</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：前提确保 Windows可以免密码登录到A、B机器</span></span><br><span class="line">[sanchuang@cPen_python ~]$ ssh 10.122.148.108 -p 2233</span><br><span class="line">Last login: Sun Nov 15 19:59:00 2020 from 10.122.38.250</span><br><span class="line">[sanchuang@cPen_centos8 ~]$ </span><br></pre></td></tr></table></figure><hr><h2 id="十四-其他总结">十四. 其他总结<a class="header-anchor" href="#十四-其他总结"></a></h2><h3 id="14-1-SSH服务端配置文件">14.1 SSH服务端配置文件<a class="header-anchor" href="#14-1-SSH服务端配置文件"></a></h3><p><strong>SSH登录使用的用户名</strong></p><ul class="lvl-0"><li class="lvl-2"><p>服务器中的本地系统用户的帐号名</p></li></ul><p><strong>SSH登录的用户验证方式</strong></p><ul class="lvl-0"><li class="lvl-2"><p>密码验证：使用服务器中系统帐号对应的密码</p></li><li class="lvl-2"><p>密钥对验证：使用客户机中生成的公钥、私钥</p></li></ul><p><strong>SSH客户端文件通常无需修改</strong></p><h3 id="14-2-SSH客户端">14.2 SSH客户端<a class="header-anchor" href="#14-2-SSH客户端"></a></h3><p><strong>使用ssh命令远程登录</strong></p><ul class="lvl-0"><li class="lvl-2"><p>方式1： ssh 用户名<code>@</code>服务器地址</p></li><li class="lvl-2"><p>方式2： ssh <code>-l</code> 用户名 服务器地址</p></li><li class="lvl-2"><p>方式3： ssh服务器地址</p></li></ul><p><strong>客户机使用第一次连接服务器时</strong><br>[root@localhost ~]# <code>ssh root@10.10.10.1</code></p><h3 id="14-3-known-hosts文件">14.3 known_hosts文件<a class="header-anchor" href="#14-3-known-hosts文件"></a></h3><p><strong>客户机使用ssh第一次连接服务器时</strong></p><ul class="lvl-0"><li class="lvl-2"><p>将服务器上sshd守护进程的公钥复制到本地</p></li><li class="lvl-2"><p>存放到本地~/.ssh/known_hosts文件中</p></li><li class="lvl-2"><p>每行存放一台服务器的公钥</p></li><li class="lvl-2"><p><code>用来验证服务器的身份</code></p></li></ul><p><strong>公钥验证服务器的具体细节</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241352942.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241352022.png" alt=""></p></blockquote><h3 id="14-4-密钥方式">14.4 密钥方式<a class="header-anchor" href="#14-4-密钥方式"></a></h3><p><strong>SSH的公钥认证流程</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241353236.png" alt=""></p></blockquote><p><strong>公钥验证客户端的具体细节</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241353669.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241354706.png" alt=""></p></blockquote><p><strong>SSH公钥认证的基本实现步骤</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>1、在客户机创建密钥对</strong></p><ul class="lvl-2"><li class="lvl-4"><code>ssh-keygen -t rsa</code>指定rsa算法</li><li class="lvl-4">设置保护私钥文件的密码</li><li class="lvl-4">在<code>~/.ssh</code>下生成两个文件</li><li class="lvl-4"><code>id_rsa</code>是用户的私钥</li><li class="lvl-4"><code>id_rsa.pub</code>是用户的公钥</li></ul></li><li class="lvl-2"><p><strong>2、将公钥文件上传至服务器</strong></p><ul class="lvl-2"><li class="lvl-4"><p>上传到服务器~/.ssh/authorized_keys文件</p></li><li class="lvl-4"><p>文件中每行保存一个用户的公钥</p></li><li class="lvl-4"><p><code>scp ~/.ssh/id_rsa.pub</code></p><p><code>root@10.10.10.1:~/.ssh/authorized_keys</code></p></li></ul></li></ul><h3 id="14-5-SSH客户端">14.5 SSH客户端<a class="header-anchor" href="#14-5-SSH客户端"></a></h3><p><strong>使用scp命令远程复制文件/目录</strong></p><ul class="lvl-0"><li class="lvl-2"><p>方式1： scp 用户名@服务器地址:源文件 目标路径</p></li><li class="lvl-2"><p>方式2： scp 本地文件 用户名@服务器地址:目标路径</p></li><li class="lvl-2"><p>若复制的是目录，则需添加“-r”选项</p></li></ul><p><strong>使用sftp命令从服务器下载文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：sftp 用户名@服务器地址</p></li></ul><h3 id="14-6-通过SSH运行服务器中的窗口程序">14.6 通过SSH运行服务器中的窗口程序<a class="header-anchor" href="#14-6-通过SSH运行服务器中的窗口程序"></a></h3><p><strong>运行服务器中的图形程序是SSH的重要应用</strong></p><ul class="lvl-0"><li class="lvl-2"><p>ssh命令需要在图形界面虚拟终端下运行</p></li><li class="lvl-2"><p>命令格式：<code>ssh -X username@sshserver</code></p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241358685.png" alt=""></p></blockquote><p>xlock是运行在SSH服务器中，而显示在SSH客户机中的窗口程序</p><h3 id="14-7-SSH客户端应用">14.7 SSH客户端应用<a class="header-anchor" href="#14-7-SSH客户端应用"></a></h3><p><strong>使用图形客户端软件 SecureCRT</strong></p><ul class="lvl-0"><li class="lvl-2"><p>主要用途：基于SSH协议远程登录以便管理服务器</p></li><li class="lvl-2"><p>下载地址：<a href="http://www.vandyke.com/">http://www.vandyke.com/</a></p></li></ul><p><strong>使用图形客户端软件 WinSCP</strong></p><ul class="lvl-0"><li class="lvl-2"><p>主要用途：基于sftp、scp或ftp的方式下载/上传数据</p></li><li class="lvl-2"><p>下载地址：<a href="http://winscp.net/">http://winscp.net/</a></p></li></ul><h3 id="14-8-SSH访问控制">14.8 SSH访问控制<a class="header-anchor" href="#14-8-SSH访问控制"></a></h3><p>**SSH使用TCP Wrappers实现访问控制 **</p><p><strong>主要配置文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>/etc/hosts.allow</p></li><li class="lvl-2"><p>/etc/hosts.deny</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208241400235.png" alt=""></p></blockquote><p><strong>TCP Wrappers可以控制哪些服务</strong></p><ul class="lvl-0"><li class="lvl-2"><p>受super daemon（xinetd）管理的服务</p></li><li class="lvl-2"><p>支持libwrap.so模块的服务</p></li></ul><p><strong>TCP Wrappers的访问控制原则</strong></p><ul class="lvl-0"><li class="lvl-2"><p>首先检查 hosts.allow 文件，若找到相匹配的策略，则允许访问</p></li><li class="lvl-2"><p>否则继续检查 hosts.deny 文件，若找到相匹配的策略，则拒绝访问</p></li><li class="lvl-2"><p>如果两个文件中都没有相匹配的策略，则允许访问</p></li></ul><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> SSH </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>19_Linux基础-ssh服务1</title>
      <link href="/posts/33033.html"/>
      <url>/posts/33033.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-练习">一. 练习<a class="header-anchor" href="#一-练习"></a></h2><p>1、编写脚本，实现批量新增用户，用户名以user开头，具体新增用户数量随用户输入，并且为每个用户设置随机密码（密码长度为12位随机字符组成），记录创建的用户与密码，保存到/tmp/user文件中。</p><p>2、如何实现两个字符串的拼接，两个整数求和，以及5除以3，保留2位小数</p><p>3、如何计算本机有多少个用户以及多少个普通用户？</p><p>4、如何去除字符串中所有空格？</p><p>5、备份/var/log/nginx/access.log日志，每五分钟备份一次,并且以2020-11-15_10_05-access.log.tar.gz方式命名。将日志文件备份文件放到/nginx/目录下。</p><p>6、查找/etc/目录下10天以内3天以前修改过的文件，并将这些文件记录到/tmp/etc_log文件中</p><h3 id="1-1-编写脚本，实现批量新增用户，用户名以user开头，具体新增用户数量随用户输入，并且为每个用户设置随机密码（密码长度为12位随机字符组成），记录创建的用户与密码，保存到-tmp-user文件中">1.1 编写脚本，实现批量新增用户，用户名以user开头，具体新增用户数量随用户输入，并且为每个用户设置随机密码（密码长度为12位随机字符组成），记录创建的用户与密码，保存到/tmp/user文件中<a class="header-anchor" href="#1-1-编写脚本，实现批量新增用户，用户名以user开头，具体新增用户数量随用户输入，并且为每个用户设置随机密码（密码长度为12位随机字符组成），记录创建的用户与密码，保存到-tmp-user文件中"></a></h3><p><strong>题目1：编写脚本，实现批量新增用户，用户名以user开头，具体新增用户数量随用户输入，并且为每个用户设置随机密码（密码长度为12位随机字符组成），记录创建的用户与密码，保存到/tmp/user文件中。</strong></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></pre></td><td class="code"><pre><span class="line">示例1</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入你要添加的用户个数：&quot;</span> num1</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">seq</span> <span class="variable">$num1</span>`    <span class="comment"># 注：循环多少次</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">        <span class="built_in">id</span> user<span class="variable">$i</span> &amp;&gt;/dev/null</span><br><span class="line">        a=`<span class="built_in">echo</span> $?`     <span class="comment"># 注：上条命令返回值 0 成功 非0 失败</span></span><br><span class="line">        str1=`<span class="built_in">date</span> +%s+%N | <span class="built_in">md5sum</span>|<span class="built_in">head</span> -c 4`     <span class="comment"># 注：%s时间戳</span></span><br><span class="line">        <span class="keyword">if</span> [ <span class="variable">$a</span> -eq 0 ] ;<span class="keyword">then</span></span><br><span class="line">                <span class="built_in">echo</span> <span class="string">&quot;该用户已存在，不进行新建操作&quot;</span></span><br><span class="line">                <span class="built_in">break</span></span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">                useradd user$str1<span class="variable">$i</span>  &amp;&gt;/dev/null</span><br><span class="line">                b=`<span class="built_in">echo</span> $?`</span><br><span class="line">                <span class="keyword">if</span> [ <span class="variable">$b</span> -eq 0 ];<span class="keyword">then</span></span><br><span class="line">                        <span class="built_in">echo</span> <span class="string">&quot;创建成功&quot;</span></span><br><span class="line">                        passwd1=`mkpasswd -l 12`  <span class="comment"># 注：mkpasswd 生成随机12位密码串</span></span><br><span class="line">                        <span class="built_in">echo</span> <span class="variable">$passwd1</span> |passwd user$str1<span class="variable">$i</span> --stdin  &amp;&gt;/dev/null  <span class="comment"># 注：--stdin 密码从标准输入里面来</span></span><br><span class="line">                        <span class="built_in">echo</span> <span class="string">&quot;user$str1<span class="variable">$i</span>:<span class="variable">$passwd1</span>&quot;</span> &gt;&gt;/tmp/user</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                        <span class="built_in">echo</span> <span class="string">&quot;创建失败&quot;</span></span><br><span class="line">                <span class="keyword">fi</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@cPen_web lianxi]# <span class="built_in">date</span> +%s+%N<span class="comment"># 注：引用纳秒的概念，防止用户名 重复</span></span><br><span class="line">1605251515+012657467</span><br><span class="line">[root@cPen_web lianxi]# man <span class="built_in">date</span></span><br><span class="line">       %%     a literal %</span><br><span class="line">       %a     locale<span class="string">&#x27;s abbreviated weekday name (e.g., Sun)# 注：Sun</span></span><br><span class="line"><span class="string">       %A     locale&#x27;</span>s full weekday name (e.g., Sunday)<span class="comment"># 注：Sunday</span></span><br><span class="line">       %s     seconds since 1970-01-01 00:00:00 UTC<span class="comment"># 注：时间戳 从1970年1月1号到现在的秒数</span></span><br><span class="line">       %N     nanoseconds (000000000..999999999)<span class="comment"># 注：纳秒  1纳秒=十亿分之一秒</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">date</span> +%s+N | <span class="built_in">md5sum</span>|<span class="built_in">head</span> -c 4</span><br><span class="line">2b13[root@cPen_web ~]# </span><br><span class="line"></span><br><span class="line">示例2</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;输入新增用户数:&quot;</span> num</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">seq</span> <span class="variable">$num</span>`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    useradd user<span class="variable">$i</span> &amp;&gt;/dev/null</span><br><span class="line">    passwd=`mkpasswd -l 12`</span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$passwd</span> |passwd user<span class="variable">$i</span> --stdin &amp;&gt;/dev/null</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;用户名:user<span class="variable">$i</span>&quot;</span> <span class="string">&quot;密码:<span class="variable">$passwd</span>&quot;</span> &amp;&gt;&gt;/tmp/user</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><h3 id="1-2-如何实现两个字符串的拼接，两个整数求和，以及5除以3，保留2位小数">1.2 如何实现两个字符串的拼接，两个整数求和，以及5除以3，保留2位小数<a class="header-anchor" href="#1-2-如何实现两个字符串的拼接，两个整数求和，以及5除以3，保留2位小数"></a></h3><p><strong>题目2：如何实现两个字符串的拼接，两个整数求和，以及5除以3，保留2位小数</strong></p><p>数值运算：<a href="https://blog.csdn.net/weixin_34408624/article/details/92598137">https://blog.csdn.net/weixin_34408624/article/details/92598137</a><br>#注：挨在一起写实现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><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><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@cPen_web ~]# a=abc</span><br><span class="line">[root@cPen_web ~]# b=def</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> $a<span class="variable">$b</span><span class="comment"># 注：字符串拼接</span></span><br><span class="line">abcdef</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> abc<span class="variable">$a</span></span><br><span class="line">abcabc</span><br><span class="line">[root@cPen_web ~]# a=3</span><br><span class="line">[root@cPen_web ~]# b=4</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> $((<span class="variable">$a</span>+<span class="variable">$b</span>))</span><br><span class="line">7</span><br><span class="line"><span class="comment">#注：1个括号默认是字符串拼接  不会进行数值运算</span></span><br><span class="line">[root@cPen_web ~]# a=123<span class="comment"># 注：默认都是str类型</span></span><br><span class="line">[root@cPen_web ~]# a=<span class="string">&quot;123&quot;</span></span><br><span class="line">[root@cPen_web ~]# a=<span class="string">&#x27;123&#x27;</span></span><br><span class="line">------------------------------------------------------------</span><br><span class="line">[root@cPen_web ~]# a=123</span><br><span class="line">[root@cPen_web ~]# b=4</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> $(( <span class="variable">$a</span> &gt; <span class="variable">$b</span> ))</span><br><span class="line">1<span class="comment"># 注：正确返回1</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> $(( <span class="variable">$a</span> &lt; <span class="variable">$b</span> ))</span><br><span class="line">0<span class="comment"># 注：错误返回0</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">expr</span> <span class="variable">$a</span> + <span class="variable">$b</span><span class="comment"># 注：expr命令 进行数值运算</span></span><br><span class="line">127</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> $(( <span class="variable">$a</span> + <span class="variable">$b</span> ))<span class="comment"># 注：2个圆括号实现整数运算</span></span><br><span class="line">127</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> $[ <span class="variable">$a</span> + <span class="variable">$b</span> ]<span class="comment"># 注：中括号实现整数运算</span></span><br><span class="line">127</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">let</span> c=<span class="variable">$a</span>+<span class="variable">$b</span><span class="comment"># 注：let 也可以实现整数运算</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> <span class="variable">$c</span><span class="comment"># 注：let只能复制 不能直接赋值</span></span><br><span class="line">127</span><br><span class="line"><span class="comment">#注：整数运算：4种方法</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">expr</span> <span class="variable">$a</span> + <span class="variable">$b</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> $(( <span class="variable">$a</span> + <span class="variable">$b</span> ))</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> $[ <span class="variable">$a</span> + <span class="variable">$b</span> ]</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">let</span> c=<span class="variable">$a</span>+<span class="variable">$b</span><span class="comment"># 注：let只能复制 不能直接赋值</span></span><br><span class="line">数值运算：https://blog.csdn.net/weixin_34408624/article/details/92598137</span><br><span class="line">------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：小数运算</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;scale=3;5/3&quot;</span>|bc<span class="comment"># 注：3表示保留3位小数  5/3</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">echo</span> <span class="string">&quot;scale=3;5/3&quot;</span>|bc<span class="comment"># 注：确保主机上装了bc</span></span><br><span class="line">1.666</span><br><span class="line">[root@cPen_web lianxi]# <span class="built_in">echo</span> $((<span class="number">5</span>/<span class="number">3</span>))</span><br><span class="line">1</span><br><span class="line">[root@cPen_web lianxi]# <span class="built_in">echo</span> |awk <span class="string">&#x27;&#123;printf 5/3&#125;&#x27;</span><span class="comment"># 注：awk默认保留5位小数</span></span><br><span class="line">1.66667[root@cPen_web lianxi]# </span><br><span class="line">[root@cPen_web lianxi]# <span class="built_in">echo</span> |awk <span class="string">&#x27;&#123;printf &quot;%.2f&quot;,5/3&#125;&#x27;</span><span class="comment"># 注：保留2位小数</span></span><br><span class="line">1.67[root@cPen_web lianxi]# </span><br><span class="line">数值运算：https://blog.csdn.net/weixin_34408624/article/details/92598137</span><br></pre></td></tr></table></figure><h3 id="1-3-如何计算本机有多少个用户以及多少个普通用户？">1.3 如何计算本机有多少个用户以及多少个普通用户？<a class="header-anchor" href="#1-3-如何计算本机有多少个用户以及多少个普通用户？"></a></h3><p><strong>题目3：如何计算本机有多少个用户以及多少个普通用户？</strong></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">示例</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line"><span class="comment">#3、如何计算本机有多少个用户以及多少个普通用户？</span></span><br><span class="line"><span class="built_in">wc</span> -l /etc/passwd<span class="comment"># 注：本机有多少用户</span></span><br><span class="line">awk -F<span class="string">&quot;:&quot;</span> <span class="string">&#x27;$3&gt;=1000&#123;print $1&#125;&#x27;</span> /etc/passwd |<span class="built_in">wc</span> -l<span class="comment"># 注：本机有多少普通用户</span></span><br><span class="line"><span class="comment">#注：普通用户uid&gt;1000</span></span><br></pre></td></tr></table></figure><h3 id="1-4-如何去除字符串中所有空格？">1.4 如何去除字符串中所有空格？<a class="header-anchor" href="#1-4-如何去除字符串中所有空格？"></a></h3><p><strong>题目4：如何去除字符串中所有空格？</strong></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><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">str=<span class="string">&quot;s t r i n g&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$str</span> |<span class="built_in">tr</span> -d <span class="string">&quot; &quot;</span><span class="comment"># 注：-d删除指定字符</span></span><br></pre></td></tr></table></figure><h3 id="1-5-备份-var-log-nginx-access-log日志，每五分钟备份一次-并且以2020-11-15-10-05-access-log-tar-gz方式命名。将日志文件备份文件放到-nginx-目录下">1.5 备份/var/log/nginx/access.log日志，每五分钟备份一次,并且以2020-11-15_10_05-access.log.tar.gz方式命名。将日志文件备份文件放到/nginx/目录下<a class="header-anchor" href="#1-5-备份-var-log-nginx-access-log日志，每五分钟备份一次-并且以2020-11-15-10-05-access-log-tar-gz方式命名。将日志文件备份文件放到-nginx-目录下"></a></h3><p><strong>题目5：备份/var/log/nginx/access.log日志，每五分钟备份一次,并且以2020-11-15_10_05-access.log.tar.gz方式命名。将日志文件备份文件放到/nginx/目录下。</strong></p><p>#注：确保crontab打开</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><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@cPen_web ~]# crontab -e<span class="comment"># 注：计划任务里命令最好写绝对路径</span></span><br><span class="line">*/5 * * * * tar czf /nginx/$(<span class="built_in">date</span> +%Y-%m-%d_%H_%M-access.log.tar.gz) /var/log/nginx/access.log </span><br></pre></td></tr></table></figure><h3 id="1-6-查找-etc-目录下10天以内3天以前修改过的文件，并将这些文件记录到-tmp-etc-log文件中">1.6 查找/etc/目录下10天以内3天以前修改过的文件，并将这些文件记录到/tmp/etc_log文件中<a class="header-anchor" href="#1-6-查找-etc-目录下10天以内3天以前修改过的文件，并将这些文件记录到-tmp-etc-log文件中"></a></h3><p><strong>题目6：查找/etc/目录下10天以内3天以前修改过的文件，并将这些文件记录到/tmp/etc_log文件中</strong></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">示例</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@cPen_web ~]# find /etc -<span class="built_in">type</span> f -mtime -10 -mtime +3 <span class="comment"># 注：注意 是查找的文件</span></span><br><span class="line">/etc/dnf/modules.d/python27.module</span><br><span class="line">/etc/selinux/config</span><br><span class="line">/etc/vsftpd/vsftpd.conf</span><br><span class="line">/etc/dconf/db/site</span><br><span class="line">/etc/dconf/db/local</span><br><span class="line">/etc/dconf/db/distro</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">stat</span> /etc/selinux/config <span class="comment"># 注：stat看文件的原信息</span></span><br><span class="line">………………</span><br><span class="line">最近访问：2020-11-13 10:14:37.388001468 +0800</span><br><span class="line">最近更改：2020-11-05 15:12:05.484883965 +0800</span><br><span class="line">最近改动：2020-11-05 15:12:05.485883965 +0800</span><br><span class="line">[root@cPen_web lianxi]# find /etc -<span class="built_in">type</span> f -mtime -10 -mtime +3 &amp;&gt;/tmp/etc_log </span><br></pre></td></tr></table></figure><hr><h2 id="二-练习">二. 练习<a class="header-anchor" href="#二-练习"></a></h2><p><strong>请用shell写出一个简单的猜拳游戏，枚举值（0石头、1剪刀、2布），有两位选手分别是rob1、rob2，他们的出拳方式由系统自动枚举，并连续猜十盘，最后给出十盘的结果</strong></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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br></pre></td><td class="code"><pre><span class="line">示例1：判定各种情况 <span class="keyword">if</span>语句</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;猜拳游戏开始啦！！！&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;今天我们的两位对手是rob1和rob2&quot;</span></span><br><span class="line">pingju=0</span><br><span class="line">rob1_win=0</span><br><span class="line">rob2_win=0</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">seq</span> 10`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">        a=`<span class="built_in">echo</span> $[RANDOM%3]`</span><br><span class="line">        b=`<span class="built_in">echo</span> $[RANDOM%3]`</span><br><span class="line">        <span class="keyword">case</span> <span class="variable">$a</span> <span class="keyword">in</span></span><br><span class="line">        0)</span><br><span class="line">                c=bor1出的是石头</span><br><span class="line">                ;;</span><br><span class="line">        1)</span><br><span class="line">                c=bor1出的是剪刀</span><br><span class="line">                ;;</span><br><span class="line">        2)</span><br><span class="line">                c=bor1出的是布</span><br><span class="line">                ;;</span><br><span class="line">        <span class="keyword">esac</span></span><br><span class="line">        <span class="keyword">case</span> <span class="variable">$b</span> <span class="keyword">in</span></span><br><span class="line">        0)</span><br><span class="line">                d=bor2出的是石头</span><br><span class="line">                ;;</span><br><span class="line">        1)</span><br><span class="line">                d=bor2出的是剪刀</span><br><span class="line">                ;;</span><br><span class="line">        2)</span><br><span class="line">                d=bor2出的是布</span><br><span class="line">                ;;</span><br><span class="line">        <span class="keyword">esac</span></span><br><span class="line">        <span class="keyword">if</span> ((<span class="variable">$a</span>==<span class="variable">$b</span>));<span class="keyword">then</span></span><br><span class="line">                <span class="built_in">echo</span> -e <span class="string">&quot;<span class="variable">$c</span>\n<span class="variable">$d</span> \n他们战平了&quot;</span></span><br><span class="line">                pingju=$[<span class="variable">$pingju</span>+1]</span><br><span class="line">                <span class="built_in">continue</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">        <span class="keyword">if</span> [[ <span class="variable">$a</span> -eq 1 || <span class="variable">$b</span> -eq 1 ]];<span class="keyword">then</span>      <span class="comment"># 注：如果1方出布</span></span><br><span class="line">                <span class="keyword">if</span> [[ <span class="variable">$a</span> -eq 0 || <span class="variable">$b</span> -eq 0 ]];<span class="keyword">then</span> <span class="comment"># 注：如果1方出拳头</span></span><br><span class="line">                                <span class="keyword">if</span>  ((<span class="variable">$a</span>&gt;<span class="variable">$b</span>));<span class="keyword">then</span></span><br><span class="line">                                        <span class="built_in">echo</span> -e <span class="string">&quot;<span class="variable">$c</span>\n<span class="variable">$d</span>,rob2获胜&quot;</span></span><br><span class="line">                                        rob2_win=$[<span class="variable">$rob2_win</span>+1]</span><br><span class="line">                                        <span class="built_in">continue</span></span><br><span class="line">                                <span class="keyword">else</span></span><br><span class="line">                                        <span class="built_in">echo</span> -e <span class="string">&quot;<span class="variable">$c</span>\n<span class="variable">$d</span>,rob1获胜&quot;</span></span><br><span class="line">                                        rob1_win=$[<span class="variable">$rob1_win</span>+1]</span><br><span class="line">                                        <span class="built_in">continue</span></span><br><span class="line">                                <span class="keyword">fi</span></span><br><span class="line">                <span class="keyword">fi</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">        <span class="keyword">if</span> ((<span class="variable">$a</span>&gt;<span class="variable">$b</span>));<span class="keyword">then</span></span><br><span class="line">                <span class="built_in">echo</span> -e <span class="string">&quot;<span class="variable">$c</span>\n<span class="variable">$d</span>,rob1获胜&quot;</span></span><br><span class="line">                rob1_win=$[<span class="variable">$rob1_win</span>+1]</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">                <span class="built_in">echo</span> -e <span class="string">&quot;<span class="variable">$c</span>\n<span class="variable">$d</span>,rob2获胜&quot;</span></span><br><span class="line">                rob2_win=$[<span class="variable">$rob2_win</span>+1]</span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;rob1获胜次数<span class="variable">$rob1_win</span>,rob2获胜次数<span class="variable">$rob2_win</span>,平局次数<span class="variable">$pingju</span></span></span><br><span class="line"><span class="string">============================================================================================</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">示例2：使用减法</span></span><br><span class="line"><span class="string">#注：if语句的使用</span></span><br><span class="line"><span class="string">---------------------------------------------------------------------</span></span><br><span class="line"><span class="string">for i in `seq 10`</span></span><br><span class="line"><span class="string">do</span></span><br><span class="line"><span class="string">        rob1=<span class="subst">$(($RANDOM%3)</span>)</span></span><br><span class="line"><span class="string">        echo rob1=<span class="variable">$rob1</span></span></span><br><span class="line"><span class="string">        rob2=<span class="subst">$(($RANDOM%3)</span>)</span></span><br><span class="line"><span class="string">        echo rob2=<span class="variable">$rob2</span></span></span><br><span class="line"><span class="string">        if [ <span class="variable">$rob1</span> -eq <span class="variable">$rob2</span> ]</span></span><br><span class="line"><span class="string">        then</span></span><br><span class="line"><span class="string">                echo &quot;</span>平局<span class="string">&quot;</span></span><br><span class="line"><span class="string">        elif [ <span class="subst">$(($rob1-$rob2)</span>) -eq -1 ] || [ <span class="subst">$(($rob1-$rob2)</span>) -eq 2 ]  # 注：rob1赢的情况</span></span><br><span class="line"><span class="string">        then</span></span><br><span class="line"><span class="string">                echo &quot;</span>rob1 win<span class="string">&quot;</span></span><br><span class="line"><span class="string">        else</span></span><br><span class="line"><span class="string">                echo &quot;</span>rob2 win<span class="string">&quot;</span></span><br><span class="line"><span class="string">        fi</span></span><br><span class="line"><span class="string">done</span></span><br><span class="line"><span class="string">============================================================================================</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">示例3</span></span><br><span class="line"><span class="string">---------------------------------------------------------------------</span></span><br><span class="line"><span class="string">r1_win=0</span></span><br><span class="line"><span class="string">r2_win=0</span></span><br><span class="line"><span class="string">equal=0</span></span><br><span class="line"><span class="string">for i in `seq 10`</span></span><br><span class="line"><span class="string">do</span></span><br><span class="line"><span class="string">    echo -ne &quot;</span>第<span class="variable">$i</span>盘\t<span class="string">&quot;</span></span><br><span class="line"><span class="string">    rob1_res=<span class="subst">$(($RANDOM%3)</span>)</span></span><br><span class="line"><span class="string">    rob2_res=<span class="subst">$(($RANDOM%3)</span>)</span></span><br><span class="line"><span class="string">    if [[ <span class="subst">$(($rob1_res - $rob2_res)</span>) = -1 ]]; then echo -ne &quot;</span>rob1胜\t<span class="string">&quot; &amp;&amp;r1_win=<span class="subst">$(($r1_win + 1)</span>); fi</span></span><br><span class="line"><span class="string">    if [[ <span class="subst">$(($rob1_res - $rob2_res)</span>) =  2 ]]; then echo -ne &quot;</span>rob1胜\t<span class="string">&quot; &amp;&amp;r1_win=<span class="subst">$(($r1_win + 1)</span>); fi</span></span><br><span class="line"><span class="string">    if [[ <span class="subst">$(($rob2_res - $rob1_res)</span>) = -1 ]]; then echo -ne &quot;</span>rob2胜\t<span class="string">&quot; &amp;&amp;r2_win=<span class="subst">$(($r2_win + 1)</span>); fi</span></span><br><span class="line"><span class="string">    if [[ <span class="subst">$(($rob2_res - $rob1_res)</span>) =  2 ]]; then echo -ne &quot;</span>rob2胜\t<span class="string">&quot; &amp;&amp;r2_win=<span class="subst">$(($r2_win + 1)</span>); fi</span></span><br><span class="line"><span class="string">    if [[ <span class="subst">$(($rob1_res - $rob2_res)</span>) =  0 ]]; then echo -ne &quot;</span>平局\t<span class="string">&quot; &amp;&amp; equal=<span class="subst">$(($equal + 1)</span>); fi</span></span><br><span class="line"><span class="string">    [[ <span class="variable">$rob1_res</span> = 0 ]] &amp;&amp; echo -ne &quot;</span>rob1:石头\t<span class="string">&quot;</span></span><br><span class="line"><span class="string">    [[ <span class="variable">$rob1_res</span> = 1 ]] &amp;&amp; echo -ne &quot;</span>rob1:剪刀\t<span class="string">&quot;</span></span><br><span class="line"><span class="string">    [[ <span class="variable">$rob1_res</span> = 2 ]] &amp;&amp; echo -ne &quot;</span>rob1:布\t\t<span class="string">&quot;</span></span><br><span class="line"><span class="string">    [[ <span class="variable">$rob2_res</span> = 0 ]] &amp;&amp; echo  &quot;</span>rob2:石头<span class="string">&quot;</span></span><br><span class="line"><span class="string">    [[ <span class="variable">$rob2_res</span> = 1 ]] &amp;&amp; echo  &quot;</span>rob2:剪刀<span class="string">&quot;</span></span><br><span class="line"><span class="string">    [[ <span class="variable">$rob2_res</span> = 2 ]] &amp;&amp; echo  &quot;</span>rob2:布<span class="string">&quot;</span></span><br><span class="line"><span class="string">done</span></span><br><span class="line"><span class="string">echo &quot;</span>rob1胜场:<span class="variable">$r1_win</span><span class="string">&quot;</span></span><br><span class="line"><span class="string">echo &quot;</span>rob2胜场:<span class="variable">$r2_win</span><span class="string">&quot;</span></span><br><span class="line"><span class="string">echo &quot;</span>平局场数:<span class="variable">$equal</span><span class="string">&quot;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">示例4：生成1个随机数 3以内 不包括3</span></span><br><span class="line"><span class="string">---------------------------------------------------------------------</span></span><br><span class="line"><span class="string">#注：生成1个随机数 3以内 不包括3</span></span><br><span class="line"><span class="string">[root@cPen_web lianxi]# echo $[RANDOM%3]</span></span><br><span class="line"><span class="string">2</span></span><br><span class="line"><span class="string">[root@cPen_web lianxi]# echo $[RANDOM%3]</span></span><br><span class="line"><span class="string">1</span></span><br><span class="line"><span class="string">[root@cPen_web lianxi]# echo $[RANDOM%3]</span></span><br><span class="line"><span class="string">0</span></span><br></pre></td></tr></table></figure><hr><p><strong>SSH服务</strong></p><h2 id="三-SSH服务介绍">三. SSH服务介绍<a class="header-anchor" href="#三-SSH服务介绍"></a></h2><p><strong>远程Shell应用程序</strong></p><ul class="lvl-0"><li class="lvl-2"><p>允许用户在远程机器上执行任意命令</p></li><li class="lvl-2"><p>让标准输出在本地</p></li><li class="lvl-2"><p>早期明文远程协议：telnet</p></li></ul><p><strong>SSH（Secure Shell，安全的外壳）</strong></p><ul class="lvl-0"><li class="lvl-2"><p>为客户机提供安全的Shell环境，用于远程管理</p></li><li class="lvl-2"><p>默认端口：TCP <code>22</code></p></li></ul><p><strong>SSH基于公钥加密（非对称加密）技术</strong></p><ul class="lvl-0"><li class="lvl-2"><p>数据加密传输</p></li><li class="lvl-2"><p>客户端和服务器的身份验证</p></li></ul><p>#注：23号端口是明文的，已经淘汰了</p><p>.--------------------------------------------------------------------------------------------------------------</p><p><strong>ssh是什么？</strong></p><p>​ssh --&gt; secure shell</p><p>​remote login program – 远程登陆模式</p><p>​对数据进行加密传输的服务，主要用在远程登陆</p><p>#注：把数据放到加密好了的壳里面，是安全的协议</p><p>.--------------------------------------------------------------------------------------------------------------</p><p>ssh协议是应用层协议，根据ssh协议实现的服务叫ssh服务</p><p>ssh服务主要在HP-UX,LINUX,AIX,UNIX系统上都有（类UNIX系统上），Windows上没有</p><p>#注：ftp协议也是应用层的协议，根据协议实现的服务叫ftp服务</p><p>.--------------------------------------------------------------------------------------------------------------</p><p><strong>ssh常见的2种登陆方式：</strong></p><p>1、密码登陆</p><p>2、密钥登陆（免密码登录）# 注：不需要密码</p><p>#注：想要登录到那台主机，1、需要知道那台主机ip，2、允许登录，3、网络跟它联通，可以访问到那台主机上</p><p>#注：ssh服务默认端口 22号端口  可以去更改</p><p>.--------------------------------------------------------------------------------------------------------------</p><p>#注：<code>/etc/services</code> <strong>可以查看常用服务的默认端口号</strong></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">[root@cPen_web lianxi]# less /etc/services </span><br><span class="line">ssh             22/tcp                          <span class="comment"># The Secure Shell (SSH) Protocol</span></span><br><span class="line">ssh             22/udp                          <span class="comment"># The Secure Shell (SSH) Protocol</span></span><br><span class="line"><span class="comment">#注：一般来说ssh都是使用tcp去传输的</span></span><br></pre></td></tr></table></figure><p>.--------------------------------------------------------------------------------------------------------------</p><p>#注：因为它所有的数据都是进行加密的，所以说它是安全的shell</p><p>#注：2台主机之间进行数据交互 都会牵扯到 <strong>数据包的传输</strong></p><p>#注：对别的服务发起一个请求，其实就是相当于发送了1个包给它，这里包里面带有请求</p><p>#注：普通情况下不给它加密的话，信息是明文的，是不安全的；ssh服务<strong>对数据进行加密</strong>，只有a主机和b主机知道解密的方式，其他人不知道</p><p>#注：安装好系统后（最小安装），一般来说自带ssh服务，一般来说启动系统它会自动起来</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><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></pre></td><td class="code"><pre><span class="line">示例：查看ssh服务是否启动</span><br><span class="line">---------------------------------------------------------------------------------</span><br><span class="line">1、查看进程</span><br><span class="line">[root@cPen_web lianxi]# ps ef |grep ssh<span class="comment"># 注：进程名叫sshd</span></span><br><span class="line">2、pidof sshd<span class="comment"># 注：判定某个服务是否存在pid</span></span><br><span class="line">[root@cPen_web lianxi]# pidof sshd<span class="comment"># 注：服务起来的话必定会有1个pid</span></span><br><span class="line">2545 2543 2542 2538 2537 2536 909</span><br><span class="line"><span class="comment">#服务起来后必定会有1个pid</span></span><br><span class="line">3、查看网络连接监听状态 netstat</span><br><span class="line"><span class="comment">#注：yum install net-tools</span></span><br><span class="line">[root@cPen_web lianxi]# netstat -atpl |grep ssh<span class="comment"># 注：a 所有 ;t tcp ;p 端口</span></span><br><span class="line">[root@cPen_web lianxi]# netstat -atpln |grep ssh</span><br><span class="line">tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      909/sshd            </span><br><span class="line"><span class="comment">#注：listen状态 在监听中，表示别人可以里来连接我了</span></span><br><span class="line">tcp        0      0 192.168.0.21:22         192.168.0.42:58697      ESTABLISHED 2536/sshd: root [<span class="built_in">pr</span> </span><br><span class="line"><span class="comment">#注：ESTABLISHED表示已经建立连接了，可以进行数据交换了；</span></span><br><span class="line">tcp        0     36 192.168.0.21:22         192.168.0.42:58698      ESTABLISHED 2537/sshd: root [<span class="built_in">pr</span> </span><br><span class="line">tcp6       0      0 :::22                   :::*                    LISTEN      909/sshd       </span><br><span class="line"></span><br><span class="line"><span class="comment">#注：0.0.0.0:22表示在本机所有ip上监听22端口（别人可以通过所有的ip来访问）。如果把它监听到192.168.0.135/24上，那别人只能通过135这个地址来访问我</span></span><br><span class="line"><span class="comment">#注：listen状态 在监听中；表示服务起来了 在监听状态，表示别人可以来连接我了</span></span><br><span class="line"><span class="comment">#注：establish表示有1个客户端连接我了（已经建立连接的状态）</span></span><br><span class="line"><span class="comment">#注：0.0.0.0:*表示允许任意ip，任意端口客户端来连接（*代表任意端口客户端）</span></span><br><span class="line"><span class="comment">#注：0.0.0.0:22第1种表示本机上所有的ip（本机上的）</span></span><br><span class="line"><span class="comment">#注：0.0.0.0:* 表示允许任意ip，任意端口客户端来连接（外部客户端的任意端口）（*代表任意端口客户端）</span></span><br><span class="line">------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：本地回环地址代表本地，测试网卡是否ok 127.0.0.1/8 本地回环地址</span></span><br><span class="line"><span class="comment">#注：网卡实际地址192.168.0.21/24</span></span><br><span class="line"><span class="comment">#注：别人不可以通过127.0.0.1来访问，因为127.0.0.1代表本地，每一台机器都有一个127.0.0.1本地回环地址，别人通过127.0.0.1来访问，仅仅只是访问的自己</span></span><br><span class="line"></span><br><span class="line">4、lsof -i:22<span class="comment">#注：查看有没有listen状态的监听 ； establish表示连接建立了</span></span><br><span class="line"><span class="comment">#注：知道端口后可以查看端口</span></span><br><span class="line"><span class="comment">#注：lsof --&gt;list open file 列出打开的文件（全称）</span></span><br><span class="line">[root@cPen_web ~]# lsof -i:22</span><br><span class="line">COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">sshd     908 root    4u  IPv4  27707      0t0  TCP *:ssh (LISTEN)<span class="comment"># 注：listen 监听状态</span></span><br><span class="line">sshd     908 root    6u  IPv6  27721      0t0  TCP *:ssh (LISTEN)<span class="comment"># 注：ESTABLISHED 建立连接</span></span><br><span class="line">sshd    1419 root    5u  IPv4  29943      0t0  TCP cPen_web:ssh-&gt;10.112.68.22:49959 (ESTABLISHED)</span><br><span class="line">sshd    1421 root    5u  IPv4  29943      0t0  TCP cPen_web:ssh-&gt;10.112.68.22:49959 (ESTABLISHED)</span><br><span class="line">============================================================================================</span><br><span class="line">示例：增加ip地址</span><br><span class="line">[root@cPen_web lianxi]# ip a add 192.168.0.144/24 dev ens33<span class="comment"># 注：增加ip地址</span></span><br><span class="line">[root@cPen_web lianxi]# ip add<span class="comment"># 注：最好跟它同网段</span></span><br><span class="line">    inet 127.0.0.1/8 scope host lo<span class="comment"># 注：dev ens3 设备 ens33</span></span><br><span class="line">    inet 192.168.0.21/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33</span><br><span class="line">    inet 192.168.0.144/24 scope global secondary ens33</span><br><span class="line">============================================================================================</span><br><span class="line">示例：查看命令属于哪个包</span><br><span class="line">[root@cPen_web lianxi]# <span class="built_in">which</span> netstat<span class="comment"># 注：找到命令的绝对路径</span></span><br><span class="line">/usr/bin/netstat</span><br><span class="line">[root@cPen_web lianxi]# rpm -qf /usr/bin/netstat<span class="comment"># 注：查看这个绝对路径执行文件属于哪个包</span></span><br><span class="line">net-tools-2.0-0.51.20160912git.el8.x86_64</span><br></pre></td></tr></table></figure><hr><h2 id="四-密钥登陆">四. 密钥登陆<a class="header-anchor" href="#四-密钥登陆"></a></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><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">[root@cPen_web ~]# ssh-keygen<span class="comment"># 注：创建密钥对</span></span><br><span class="line">Generating public/private rsa key pair.<span class="comment"># 注：rsa算法生成公钥和私钥的钥匙对（钥匙有2把不是同一把）</span></span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/root/.ssh/id_rsa): </span><br><span class="line">Enter passphrase (empty <span class="keyword">for</span> no passphrase): </span><br><span class="line">Enter same passphrase again: </span><br><span class="line">Your identification has been saved <span class="keyword">in</span> /root/.ssh/id_rsa.</span><br><span class="line">Your public key has been saved <span class="keyword">in</span> /root/.ssh/id_rsa.pub.</span><br><span class="line">The key fingerprint is:</span><br><span class="line">SHA256:JZh0IhlTUDkIvuXuv7Iw7zYsoucwfLjpPWrHYN7P63g root@cPen_web</span><br><span class="line">The key<span class="string">&#x27;s randomart image is:</span></span><br><span class="line"><span class="string">+---[RSA 2048]----+</span></span><br><span class="line"><span class="string">|  ..=B=..        |</span></span><br><span class="line"><span class="string">| .  o+o=         |</span></span><br><span class="line"><span class="string">|  . . o.. .      |</span></span><br><span class="line"><span class="string">|   +     o       |</span></span><br><span class="line"><span class="string">|  . .   S        |</span></span><br><span class="line"><span class="string">|.o..             |</span></span><br><span class="line"><span class="string">|=o*o.            |</span></span><br><span class="line"><span class="string">|.=BXBE           |</span></span><br><span class="line"><span class="string">|=O+*XX+.         |</span></span><br><span class="line"><span class="string">+----[SHA256]-----+</span></span><br><span class="line"><span class="string">[root@cPen_web ~]# </span></span><br></pre></td></tr></table></figure><p><strong>加密</strong></p><ol><li class="lvl-3"><p><strong>对称加密</strong></p><p>​加解密的钥匙都是同一把</p><p>​怎么样安全的保存这个密码，这个密钥在需要加密的机器之间都是共享的</p><p>​很难保证这个密钥不被泄漏</p></li><li class="lvl-3"><p><strong>非对称加密</strong>                                                                          # 注：加密和解密的钥匙不一样</p><p>​    生成一对公私钥，私钥自己保管，公钥可以给其他人</p><p>​    公私钥对是成对存在的，一个用于加密，一个用于解密。具体哪个为私钥，哪个为公钥就看使用者自己管理。</p></li></ol><p>注意：</p><p>​使用公钥进行加密，私钥解密，基本用于数据加密</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><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></pre></td><td class="code"><pre><span class="line">[root@cPen_web ~]# ssh-keygen<span class="comment"># 注：创建密钥对</span></span><br><span class="line">Generating public/private rsa key pair.<span class="comment"># 注：rsa算法生成公钥和私钥的钥匙对（钥匙有2把不是同一把）</span></span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/root/.ssh/id_rsa):  <span class="comment"># 注：存放公私钥的路径，root用户的</span></span><br><span class="line">Enter passphrase (empty <span class="keyword">for</span> no passphrase): <span class="comment"># 注：设置密钥密码# 注：非全局</span></span><br><span class="line">Enter same passphrase again: </span><br><span class="line">Your identification has been saved <span class="keyword">in</span> /root/.ssh/id_rsa.</span><br><span class="line">Your public key has been saved <span class="keyword">in</span> /root/.ssh/id_rsa.pub.</span><br><span class="line">The key fingerprint is:</span><br><span class="line">SHA256:JZh0IhlTUDkIvuXuv7Iw7zYsoucwfLjpPWrHYN7P63g root@cPen_web<span class="comment"># 注：算法hash算法</span></span><br><span class="line">The key<span class="string">&#x27;s randomart image is:# 注：信息摘要 用的 SHA256 hash算法</span></span><br><span class="line"><span class="string">+---[RSA 2048]----+</span></span><br><span class="line"><span class="string">|  ..=B=..        |</span></span><br><span class="line"><span class="string">| .  o+o=         |</span></span><br><span class="line"><span class="string">|  . . o.. .      |</span></span><br><span class="line"><span class="string">|   +     o       |</span></span><br><span class="line"><span class="string">|  . .   S        |</span></span><br><span class="line"><span class="string">|.o..             |</span></span><br><span class="line"><span class="string">|=o*o.            |</span></span><br><span class="line"><span class="string">|.=BXBE           |</span></span><br><span class="line"><span class="string">|=O+*XX+.         |</span></span><br><span class="line"><span class="string">+----[SHA256]-----+</span></span><br><span class="line"><span class="string">[root@cPen_web ~]# </span></span><br><span class="line"><span class="string">#注：hash算法  任意长度的输入，映射成固定长度的输出</span></span><br><span class="line"><span class="string">--------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="string">#注：加密分为2种方式：1、对称加密；2、非对称加密</span></span><br><span class="line"><span class="string">#注：对称加密 a机器给b机器传输东西，a机器知道1串密码叫做aa，b机器也知道这个密码叫做aa；a机器对date用aa加密，b机器用aa解密。2个加密解密都用同一个密钥（加密的钥匙A和B都知道）。形式的条件是a和b都知道密钥是什么，且都一样</span></span><br><span class="line"><span class="string">#注：问题 不能保证密钥不被被人知道</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">#注：非对称加密  a机器和b机器进行数据加密传输（进行通讯）。a机器在本地生成1个public和private的钥匙对，a机器生成公钥和私钥都放在a机器上，发送数据时，a机器先把公钥给b（也可以把公钥给c,公钥可以给任何人），但是私钥只有自己a机器才知道。b机器用a机器给的公钥加密，a机器收到后用私钥解密</span></span><br><span class="line"><span class="string">唯一能够解密的钥匙 私钥 只有机器a才有，只有机器a才能解密</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">#注：对于数据信息加密而言，用公钥加密，用私钥解密，只有机器a才能解密</span></span><br><span class="line"><span class="string">#注：非对称加密  用于数据加密时，用公钥加密，私钥解密</span></span><br></pre></td></tr></table></figure><hr><h2 id="五-ssh配置">五. ssh配置<a class="header-anchor" href="#五-ssh配置"></a></h2><p><strong>ssh配置</strong></p><p>目录：<strong>/etc/ssh</strong><strong># 注：这下面放的都是ssh的配置文件</strong></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></pre></td><td class="code"><pre><span class="line">[root@cPen_web ~]# <span class="built_in">cd</span> /etc/ssh/  </span><br><span class="line">[root@cPen_web ssh]# <span class="built_in">ls</span></span><br><span class="line">moduli      sshd_config         ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub</span><br><span class="line">ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key</span><br><span class="line"><span class="comment">#注：sshd_config 客户端的配置文件</span></span><br><span class="line"><span class="comment">#注：ssh_config  服务的配置文件</span></span><br><span class="line"><span class="comment">#注：ssh_host_ecdsa_key  ssh_host_ecdsa_key.pub  一对公私钥</span></span><br><span class="line"><span class="comment">#注：ssh_host_ecdsa_key.pub 公钥  ssh_host_ecdsa_key私钥</span></span><br><span class="line"><span class="comment">#注：ssh服务起来的时候，它会自动创建1对公私钥</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">示例：创建的公私钥默认放在/root/.ssh/目录下</span><br><span class="line">[root@cPen_web ~]# <span class="built_in">cd</span> .ssh</span><br><span class="line">[root@cPen_web .ssh]# <span class="built_in">ls</span></span><br><span class="line">id_rsa  id_rsa.pub  known_hosts</span><br><span class="line"><span class="comment">#注：id_rsa私钥</span></span><br><span class="line"><span class="comment">#注：id_rsa.pub公钥</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-实现公钥认证-免密码登录">六. 实现公钥认证(免密码登录)<a class="header-anchor" href="#六-实现公钥认证-免密码登录"></a></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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#注：a机器下(生成公钥后)</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">cd</span> .ssh</span><br><span class="line">[root@cPen_web .ssh]# <span class="built_in">ls</span></span><br><span class="line">id_rsa  id_rsa.pub  known_hosts</span><br><span class="line">[root@cPen_web .ssh]# <span class="built_in">cat</span> id_rsa.pub </span><br><span class="line">ssh-rsa</span><br><span class="line">AAAAB3NhQX......jXDv87iERv/z9XepKCeYqCfF2Dvv0n/g+IeFmzhW0iOppExskimMPGGWcN+7rXWlwaLNTiknmSTl+mFvZV8uIY5DnQXv root@cPen_web</span><br><span class="line"><span class="comment">#注：b机器下</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">mkdir</span> .ssh<span class="comment"># 注：没有的话 创建 .ssh文件夹</span></span><br><span class="line">[root@cPen_web ~]# <span class="built_in">cd</span> .ssh/</span><br><span class="line">[root@cPen_web .ssh]# <span class="built_in">ls</span></span><br><span class="line">known_hosts</span><br><span class="line">[root@cPen_web .ssh]# vim authorized_keys<span class="comment"># 注：创建文件authorized_keys</span></span><br><span class="line">ssh-rsa<span class="comment"># 注：把a机器的公钥粘过去</span></span><br><span class="line">AAAAB3NhQX......jXDv87iERv/z9XepKCeYqCfF2Dvv0n/g+IeFmzhW0iOppExskimMPGGWcN+7rXWlwaLNTiknmSTl+mFvZV8uIY5DnQXv root@cPen_web</span><br><span class="line">[root@cPen_web .ssh]# <span class="built_in">chmod</span> 600 authorized_keys </span><br><span class="line"><span class="comment">#注：给它的权限为600，不要让其他人或者其他组有任何权限</span></span><br><span class="line"><span class="comment">#注：a机器下</span></span><br><span class="line">[root@cPen_web .ssh]# ssh root@10.122.148.108<span class="comment"># 注：使用客户端 以root用户登录</span></span><br><span class="line">………………………</span><br><span class="line">Are you sure you want to <span class="built_in">continue</span> connecting (<span class="built_in">yes</span>/no)? <span class="built_in">yes</span></span><br><span class="line">………………………</span><br><span class="line">[root@cPen_web ~]# <span class="comment"># 注：不需要输入密码，就是免密码登录成功</span></span><br></pre></td></tr></table></figure><p>实现公钥认证,免密码登录</p><p>A --&gt; BA机器要登录到B机器上</p><p>1、在A机器上生成公钥对（如果有公钥对，则不需要重新生成），默认会放在当前用户家目录下的.ssh/文件下</p><p>生成一个id_rsa（私钥），id_rsa.pub（公钥）</p><p>#注：如果有了，就不需要重新生成公钥对了，因为会覆盖。默认路径不要改它，改它的意义不大，因为默认在默认路径查找</p><p>[root@cPen_web ~]# ssh-keygen# 注：生成，中间一直敲回车，选择默认</p><p>2、在B机器上目标用户的家目录下面~/.ssh/authorized_keys文件里将A机器的公钥复制粘贴过来，</p><p>没有此文件就创建，并且确保这个文件的权限设为600</p><p>3、查看公钥认证是否成功</p><p>​在A机器上执行  ssh root@B机器的ip</p><p>​不需要输入密码就可以登录到B机器，则表示免密码登录成功</p><p>​公钥放在B机器的哪个用户下面，就通过哪个用户登录</p><p>​以哪个用户登录，需要看公钥放到B机器的哪个用户下</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">[root@cPen_web ~]# useradd wy</span><br><span class="line">[root@cPen_web ~]# su - wy<span class="comment"># 注：su切换不会经过ssh服务</span></span><br><span class="line">[wy@cPen_web ~]$ </span><br><span class="line"></span><br><span class="line"><span class="comment">#注：su切换用户，是不会经过ssh</span></span><br><span class="line"><span class="comment">#注：ssh是远程登录</span></span><br><span class="line">su 和 su -su切换不会切换bash环境（还是原用户的bash环境）</span><br><span class="line"> su - 去切换 会切换到wy的bash环境</span><br></pre></td></tr></table></figure><p><strong>公钥认证排错</strong></p><ol><li class="lvl-3"><p>确保公钥正确</p></li><li class="lvl-3"><p>确保~/.ssh/authorized_keys文件权限为600</p></li><li class="lvl-3"><p>确保家目录以及.ssh目录权限为755以下权限，即属组和其他人没有7的权限</p></li></ol><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> SSH </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>18_Linux基础-用户权限3</title>
      <link href="/posts/57976.html"/>
      <url>/posts/57976.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-回顾：-根目录下的-etc-一般放配置文件">一. 回顾：/根目录下的 /etc 一般放配置文件<a class="header-anchor" href="#一-回顾：-根目录下的-etc-一般放配置文件"></a></h2><p>/根目录下的 /etc 一般放配置文件</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><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><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# useradd sanle10</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">id</span> sanle10</span><br><span class="line">uid=2224(sanle10) gid=2224(sanle10) 组=2224(sanle10)</span><br><span class="line">[root@sanchuang-linux ~]# less /etc/group</span><br><span class="line">[root@sanchuang-linux ~]# useradd sanle11 -g sanchuang05 -G sanchuang06<span class="comment"># 指定基本组、附属组</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">id</span> sanle11</span><br><span class="line">uid=2225(sanle11) gid=1043(sanchuang05) 组=1043(sanchuang05),1044(sanchuang06)</span><br><span class="line">[root@sanchuang-linux ~]# less /etc/passwd<span class="comment"># 注：存放用户信息</span></span><br><span class="line">hello:x:1007:1007::/home/hello:/bin/bash</span><br><span class="line"><span class="comment"># 注：字段2仅仅只是密码占位符，真正的密码放在/etc/shadow</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -al /etc/passwd</span><br><span class="line">-rw-r--r-- 1 root root 4539 11月 12 09:50 /etc/passwd<span class="comment"># 注：任何人都可以访问/etc/passwd</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -al /etc/shadow</span><br><span class="line">---------- 1 root root 4588 11月 12 09:50 /etc/shadow<span class="comment"># 注：权限都为0</span></span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]# useradd sanle13 -c <span class="string">&quot;create sanle13&quot;</span><span class="comment"># 注：指定用户描述信息</span></span><br><span class="line">[root@sanchuang-linux ~]# less /etc/passwd</span><br><span class="line">sanle13:x:2227:2227:create sanle13:/home/sanle13:/bin/bash <span class="comment"># 注：字段5用户描述信息</span></span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">ls</span> -ld /lianxi<span class="comment"># 注：查看/lianxi 目录属于哪个用户哪个组</span></span><br><span class="line">drwxr-xr-x. 9 root root 4096 11月  9 09:47 /lianxi</span><br><span class="line"></span><br><span class="line"><span class="comment"># 普通用户默认只能在自己的家目录下 或 /tmp目录下创建</span></span><br><span class="line"></span><br><span class="line">对个人环境信息做设置</span><br><span class="line">~/.bash_profile</span><br><span class="line">~/.bashrc</span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">id</span> sanle11</span><br><span class="line">uid=2225(sanle11) gid=1043(sanchuang05) 组=1043(sanchuang05),1044(sanchuang06)<span class="comment"># 注：基本组sanchuang05</span></span><br><span class="line">[root@sanchuang-linux tmp]# su - sanle11</span><br><span class="line">[sanle11@sanchuang-linux ~]$ <span class="built_in">touch</span> cc</span><br><span class="line">[sanle11@sanchuang-linux ~]$ <span class="built_in">ls</span> -al</span><br><span class="line">总用量 16</span><br><span class="line">……………………</span><br><span class="line">-rw-r--r--   1 sanle11 sanchuang05    0 11月 12 10:21 cc<span class="comment"># 注：有效组sanchuang05</span></span><br><span class="line"><span class="comment"># 注：有效组默认是用户基本组</span></span><br><span class="line">[sanle11@sanchuang-linux ~]$ newgrp sanchuang06 <span class="comment"># 注：修改有效组；临时修改</span></span><br><span class="line">[sanle11@sanchuang-linux ~]$ <span class="built_in">touch</span> <span class="built_in">dd</span></span><br><span class="line">[sanle11@sanchuang-linux ~]$ <span class="built_in">ls</span> -al</span><br><span class="line">……………………</span><br><span class="line">-rw-r--r--   1 sanle11 sanchuang06    0 11月 12 10:23 <span class="built_in">dd</span><span class="comment"># 注：有效组sanchuang06</span></span><br></pre></td></tr></table></figure><hr><h2 id="二-练习">二. 练习<a class="header-anchor" href="#二-练习"></a></h2><h3 id="2-1">2.1<a class="header-anchor" href="#2-1"></a></h3><p><strong>题目1</strong></p><p>创建三个用户sx1,sx2,sx3，这三个用户的附属组都是sanle组，创建名为/home/sanle的目录，在该目录中，三个用户可以合作&gt;处理文件。要求恰当修改该目录的权限，以便只允许用户和组能在这个目录中访问、删除、创建文件，其他用户没有任何权限，&gt;三个用户新建的文件只能自己有权限删除，彼此无法删除，而且新建的文件应该被自动分配到sanle的组所有权。</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">示例</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line"><span class="comment">#创建三个用户sx1,sx2,sx3，这三个用户的附属组都是sanle组，创建名为/home/sanle的目录，在该目录中，三个用户可以合作&gt;处理文件。要求恰当修改该目录的权限，以便只允许用户和组能在这个目录中访问、删除、创建文件，其他用户没有任何权限，&gt;三个用户新建的文件只能自己有权限删除，彼此无法删除，而且新建的文件应该被自动分配到sanle的组所有权。</span></span><br><span class="line">useradd -G sanle sx1</span><br><span class="line">useradd -G sanle sx2</span><br><span class="line">useradd -G sanle sx3</span><br><span class="line"><span class="built_in">mkdir</span> /home/sanle</span><br><span class="line">newgrp sanle</span><br><span class="line"><span class="built_in">mkdir</span> /home/sanle</span><br><span class="line"><span class="built_in">chmod</span> 1770 /home/sanle -R</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;newgrp sanle&quot;</span> &gt;&gt; ~/.bashrc</span><br></pre></td></tr></table></figure><h3 id="2-2">2.2<a class="header-anchor" href="#2-2"></a></h3><p><strong>题目2</strong> <strong>脚本</strong></p><p>---------------------------------------------------------------------<br>1、创建用户<br>2、删除指定用户<br>3、修改指定用户（用户id，用户属组，用户家目录）<br>4、删除指定用户</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br></pre></td><td class="code"><pre><span class="line">示例1</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="function"><span class="title">menu</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;1、创建用户&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;2、删除指定用户&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;3、修改指定用户（用户id，用户属组，用户家目录）&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;4、删除指定用户&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">add</span></span>()&#123;</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入用户名:&quot;</span> username  <span class="comment"># 注：接收从键盘的输入</span></span><br><span class="line">    useradd <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;创建成功&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;创建失败&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">del</span></span>()&#123;</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入用户名:&quot;</span> username</span><br><span class="line">    userdel -r <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;删除成功&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;用户不存在&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">modify</span></span>()&#123;</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入用户名:&quot;</span> username</span><br><span class="line">    <span class="built_in">id</span> <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line">    <span class="keyword">if</span> [[ $? = 0 ]]</span><br><span class="line">    <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">read</span> -p <span class="string">&quot;输入uid:&quot;</span> uid<span class="comment"># 注：可以再加3个case 更精细</span></span><br><span class="line">        <span class="built_in">read</span> -p <span class="string">&quot;输入gid:&quot;</span> gid</span><br><span class="line">        <span class="built_in">read</span> -p <span class="string">&quot;输入家目录:&quot;</span> home</span><br><span class="line">        usermod -u <span class="variable">$uid</span> -g <span class="variable">$gid</span> -d <span class="variable">$home</span> <span class="variable">$username</span> 2&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;修改成功&quot;</span> || <span class="string">&quot;修改失败&quot;</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;用户不存在&quot;</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> :</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    menu</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;请输入1-4：&quot;</span> option</span><br><span class="line">    <span class="keyword">case</span> <span class="variable">$option</span> <span class="keyword">in</span></span><br><span class="line">    1)</span><br><span class="line">        add</span><br><span class="line">        ;;</span><br><span class="line">    2)</span><br><span class="line">        del</span><br><span class="line">        ;;</span><br><span class="line">    3)</span><br><span class="line">        modify</span><br><span class="line">        ;;</span><br><span class="line">    4)</span><br><span class="line">        del</span><br><span class="line">        ;;</span><br><span class="line">    *)</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;输入不合法&quot;</span></span><br><span class="line">    <span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line">示例2：一次性添加多个变量</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">mod</span></span>()&#123;</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入(用户id，用户属组，用户家目录):&quot;</span> userid usergroup userhome username</span><br><span class="line">       usermod -u <span class="variable">$userid</span> -g <span class="variable">$usergroup</span> -d <span class="variable">$userhome</span> <span class="variable">$username</span> &amp;&gt; /dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;修改成功&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;修改失败&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">示例3：精密选择（推荐）</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">menu</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;1、创建用户&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;2、删除指定用户&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;3、修改指定用户（用户id，用户属组，用户家目录）&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="title">menu2</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;1、修改用户id&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;2、修改用户属组&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;3、修改用户家目录&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="title">add</span></span>()&#123;</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入用户名:&quot;</span> username</span><br><span class="line">    <span class="built_in">id</span> <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp;<span class="built_in">echo</span> <span class="string">&quot;用户已存在&quot;</span> || useradd <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;创建成功&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;创建失败&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">del</span></span>()&#123;</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入用户名:&quot;</span> username</span><br><span class="line">    <span class="built_in">id</span> <span class="variable">$username</span> &amp;&gt;/dev/null || <span class="built_in">echo</span> <span class="string">&quot;用户不存在&quot;</span> &amp;&amp; userdel -r <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;删除成功&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;删除失败&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">modify</span></span>()&#123;</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入用户名:&quot;</span> username</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">id</span> <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line">    <span class="keyword">then</span></span><br><span class="line">menu2</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入:&quot;</span> choice2</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$choice2</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入uid:&quot;</span> uid</span><br><span class="line">    usermod -u <span class="variable">$uid</span> <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;修改成功&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;修改失败&quot;</span></span><br><span class="line">;;</span><br><span class="line">2)</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入gid:&quot;</span> gid</span><br><span class="line">    usermod -g <span class="variable">$gid</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;修改成功&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;修改失败&quot;</span></span><br><span class="line">;;</span><br><span class="line">3)</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;输入家目录:&quot;</span> home</span><br><span class="line">    usermod -d <span class="variable">$home</span> <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;修改成功&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;修改失败&quot;</span></span><br><span class="line">;;</span><br><span class="line">*)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;输入不合法&quot;</span></span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;用户不存在&quot;</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="literal">true</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    menu</span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;请输入(按q退出)：&quot;</span> choice</span><br><span class="line">    <span class="keyword">case</span> <span class="variable">$choice</span> <span class="keyword">in</span></span><br><span class="line">    1)</span><br><span class="line">        add</span><br><span class="line">        ;;</span><br><span class="line">    2)</span><br><span class="line">        del</span><br><span class="line">        ;;</span><br><span class="line">    3)</span><br><span class="line">        modify</span><br><span class="line">        ;;</span><br><span class="line">    q)</span><br><span class="line"><span class="built_in">break</span></span><br><span class="line">;;</span><br><span class="line">    *)</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;输入不合法&quot;</span></span><br><span class="line">    <span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><hr><h2 id="三-ACL的使用">三. ACL的使用<a class="header-anchor" href="#三-ACL的使用"></a></h2><p><strong>ACL(Access Control List)</strong># 注：<strong>访问控制列表（允许哪些人可以/不可以访问）</strong></p><ul class="lvl-0"><li class="lvl-2"><p>一个文件/目录的访问控制列表，可以针对任意指定的 用户/组使用权限字符分配rwx权限</p></li></ul><p><strong>设置ACL：setfacl指令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式： <code>setfacl 选项 规则 文件</code></p></li></ul><p><strong>常用选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>-m</code>：新增或修改ACL中的规则</p></li><li class="lvl-2"><p><code>-b</code>： 删除所有ACL规则</p></li><li class="lvl-2"><p>-x： 删除指定的ACL规则</p></li></ul><p><strong>查看ACL：getfacl指令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>getfacl  文件</code></p></li></ul><p><strong>设置ACL：setfacl指令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式： <code>setfacl 选项 规则 文件</code></p></li></ul><p><strong>常用规则</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>类型</code>:<code>特定的用户或组</code>:<code>权限</code></p></li><li class="lvl-2"><p><code>user:(uid/name):(perms)</code>     指定某位使用者的权限</p></li><li class="lvl-2"><p><code>group:(gid/name):(perms)</code>  指定某一群组的权限</p></li><li class="lvl-2"><p><code>other::(perms)</code>            指定其它使用者的权限</p></li><li class="lvl-2"><p><code>mask::(perms)</code>            设定有效的最大权限</p></li></ul><p><strong>注意</strong></p><ul class="lvl-0"><li class="lvl-2"><p>user、group、other、mask简写为：u , g , o , m</p></li><li class="lvl-2"><p>perms使用rwx</p></li></ul><p>#注：acl访问控制列表，工作中和云计算都比较常见</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><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></pre></td><td class="code"><pre><span class="line">示例1：查看文件acl</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：对权限精准把控</span></span><br><span class="line">[root@localhost ~]# getfacl win-utf-2.txt <span class="comment"># 注：查看文件acl规则</span></span><br><span class="line"><span class="comment"># file: win-utf-2.txt# 注：get file acl</span></span><br><span class="line"><span class="comment"># owner: root# 注：初始的规则</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rw-</span><br><span class="line">group::r--</span><br><span class="line">other::r--</span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -la win-utf-2.txt </span><br><span class="line">-rw-r--r--. 1 root root 0 10月 27 11:42 win-utf-2.txt</span><br><span class="line">[root@localhost ~]# </span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例2：对sanchuang用户有读写执行权限</span><br><span class="line"><span class="comment">#注：针对特殊用户</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# setfacl -m u:sanchuang:rwx win-utf-2.txt <span class="comment"># 注：对sanchuang用户有rwx权限</span></span><br><span class="line">[root@localhost ~]# getfacl win-utf-2.txt <span class="comment"># 注：u也可以写成 user  一般简写</span></span><br><span class="line"><span class="comment"># file: win-utf-2.txt# 注：注意普通用户对/root目录没有操作权限</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rw-</span><br><span class="line">user:sanchuang:rwx<span class="comment"># 注：对sanchuang用户有rwx权限</span></span><br><span class="line">group::r--</span><br><span class="line">mask::rwx</span><br><span class="line">other::r--</span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -la win-utf-2.txt <span class="comment"># 注：权限多了个+</span></span><br><span class="line">-rw-rwxr--+ 1 root root 0 10月 27 11:42 win-utf-2.txt</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例3：对组有读写执行的权利</span><br><span class="line"><span class="comment">#注：针对特定组</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# setfacl -m g:sanchuang5:rw win-utf-2.txt </span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -la win-utf-2.txt <span class="comment"># 注：set file acl</span></span><br><span class="line">-rw-rwxr--+ 1 root root 0 10月 27 11:42 win-utf-2.txt</span><br><span class="line">[root@localhost ~]# getfacl win-utf-2.txt </span><br><span class="line"><span class="comment"># file: win-utf-2.txt</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rw-</span><br><span class="line">user:sanchuang:rwx</span><br><span class="line">group::r--</span><br><span class="line">group:sanchuang5:rw-<span class="comment"># 注：对组有读写执行的权利</span></span><br><span class="line">mask::rwx</span><br><span class="line">other::r--</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例4：设置有效的最大权限</span><br><span class="line"><span class="comment">#注：针对mask设置有效权限</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：设定有效的最大权限为r</span></span><br><span class="line"><span class="comment">#注：设置的权限在mask之下（天花板）</span></span><br><span class="line">[root@localhost ~]# setfacl -m m::r win-utf-2.txt<span class="comment"># 注：设置有效的最大权限</span></span><br><span class="line">[root@localhost ~]# getfacl win-utf-2.txt </span><br><span class="line"><span class="comment"># file: win-utf-2.txt</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rw-</span><br><span class="line">user:sanchuang:rwx<span class="comment">#effective:r--# 注：即使sanchuang的权限是rw，但是有效最大权限是r</span></span><br><span class="line">group::r--</span><br><span class="line">group:sanchuang5:rw-<span class="comment">#effective:r--</span></span><br><span class="line">mask::r--</span><br><span class="line">other::r--</span><br><span class="line"><span class="comment">#注：指明了有效最大权限后；用户sanchuang即使有读写的权限，用户sanchuang5最大权限仅仅指为读</span></span><br><span class="line"><span class="comment">#注：即使设置了用户sanchuang rw权限，但是mask设置为r，也只有r的权限</span></span><br></pre></td></tr></table></figure><hr><h2 id="四-ACL类型">四. ACL类型<a class="header-anchor" href="#四-ACL类型"></a></h2><p><strong>ACL类型</strong></p><ul class="lvl-0"><li class="lvl-2"><p>存取型ACL(Access ACL)：文件或目录</p></li><li class="lvl-2"><p><code>预设型ACL(Default ACL)：只能对目录</code></p></li></ul><p><strong>预设型ACL(Default ACL)</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>setfacl –m default</code>:类型:特定的用户或组:权限<br><code>setfacl –m d</code>:类型:特定的用户或组:权限</p></li><li class="lvl-2"><p>设置了预设型ACL的目录，<strong>其下的所有文件或者子目录就都具有了主目录的ACL权限，并且子目录也同样有预设的ACl权限</strong></p></li></ul><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></pre></td><td class="code"><pre><span class="line">示例 设置预设ACL</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">mkdir</span> cc_test</span><br><span class="line">[root@sanchuang-linux lianxi]# getfacl cc_test/</span><br><span class="line"><span class="comment"># file: cc_test/</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rwx</span><br><span class="line">group::r-x</span><br><span class="line">other::r-x</span><br><span class="line">[root@sanchuang-linux lianxi]# setfacl -m d:u:sanle10:rw cc_test/ <span class="comment"># 注：对文件进行预设型acl设置</span></span><br><span class="line">[root@sanchuang-linux lianxi]# getfacl cc_test/</span><br><span class="line"><span class="comment"># file: cc_test/</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rwx</span><br><span class="line">group::r-x</span><br><span class="line">other::r-x</span><br><span class="line">default:user::rwx<span class="comment"># 注：新增的参数</span></span><br><span class="line">default:user:sanle10:rw-</span><br><span class="line">default:group::r-x</span><br><span class="line">default:mask::rwx</span><br><span class="line">default:other::r-x</span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">cd</span> cc_test/</span><br><span class="line">[root@sanchuang-linux cc_test]# <span class="built_in">touch</span> aa<span class="comment"># 注：新建的文件会继承预设的acl设置</span></span><br><span class="line">[root@sanchuang-linux cc_test]# getfacl aa</span><br><span class="line"><span class="comment"># file: aa</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rw-</span><br><span class="line">user:sanle10:rw-<span class="comment"># 注：新建的文件会继承预设的acl设置</span></span><br><span class="line">group::r-x<span class="comment">#effective:r--</span></span><br><span class="line">mask::rw-</span><br><span class="line">other::r--</span><br><span class="line"><span class="comment">#注：预设之前已经创建的文件 不会继承预设的acl设置</span></span><br></pre></td></tr></table></figure><hr><h2 id="五-练习">五. 练习<a class="header-anchor" href="#五-练习"></a></h2><p>1、新建三个组 shuiguo,  mifeng,  shaokao</p><p>2、新建3个用户，pingguo属于shuiguo组，jingshi属于mifen组，yueyang属于shaokao组</p><p>3、在根目录下新建目录food，将/etc/passwd文件复制到food目录下</p><p>4、设置权限，passwd文件能被shuiguo组读写，jingshi这个用户读写执行，yueyang这个用户不能进行任何操作</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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#1</span></span><br><span class="line">[root@sanchuang-linux lianxi]# groupadd shuiguo</span><br><span class="line">[root@sanchuang-linux lianxi]# groupadd mifen</span><br><span class="line">[root@sanchuang-linux lianxi]# groupadd shaokao</span><br><span class="line"><span class="comment">#2</span></span><br><span class="line">[root@sanchuang-linux lianxi]# useradd -g shuiguo pingguo</span><br><span class="line">[root@sanchuang-linux lianxi]# useradd -g mifen jingshi</span><br><span class="line">[root@sanchuang-linux lianxi]# useradd -g shaokao yueyang</span><br><span class="line"><span class="comment">#3</span></span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">mkdir</span> /food</span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">cp</span> /etc/passwd /food</span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">cd</span> /food</span><br><span class="line"><span class="comment">#4</span></span><br><span class="line">[root@sanchuang-linux food]# setfacl -m g:shuiguo:rw passwd </span><br><span class="line">[root@sanchuang-linux food]# setfacl -m u:jingshi:rwx passwd </span><br><span class="line">[root@sanchuang-linux food]# setfacl -m u:yueyang:--- passwd<span class="comment"># 注：没有任何权限</span></span><br><span class="line">[root@sanchuang-linux food]# getfacl passwd </span><br><span class="line"><span class="comment"># file: passwd</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rw-</span><br><span class="line">user:jingshi:rwx</span><br><span class="line">user:yueyang:---</span><br><span class="line">group::r--</span><br><span class="line">group:shuiguo:rw-</span><br><span class="line">mask::rwx</span><br><span class="line">other::r--</span><br></pre></td></tr></table></figure><hr><h2 id="六-权限的继承和拒绝">六. 权限的继承和拒绝<a class="header-anchor" href="#六-权限的继承和拒绝"></a></h2><p>一个用户属于某个组会继承这个组的权限。</p><p>​1.主要组<br>​2.次要组</p><p>用户的主要组（有效组）属于某个组，会继承这个组的权限，如果是附属组属于某个组，也会继承。</p><ul class="lvl-0"><li class="lvl-2"><p>newgrp</p></li></ul><p>拒绝权限高于一切 —》针对用户</p><p>一个组允许，一个组拒绝 —》允许</p><hr><h2 id="七-sudo授权">七. sudo授权<a class="header-anchor" href="#七-sudo授权"></a></h2><p><strong>sudo授权</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>Linux里root用户权限最大</strong></p></li></ul><p>​关机、重启系统、配置IP地址、格式化磁盘、mount等</p><ul class="lvl-0"><li class="lvl-2"><p><strong>普通用户权限非常小</strong></p></li><li class="lvl-2"><p><strong>如何让普通用户也具有一定的权限？</strong></p></li></ul><p>​给root用户分忧</p><ul class="lvl-0"><li class="lvl-2"><p><strong>如果能授权，那么是授权给用户还是组？</strong></p></li></ul><p>#注：sudo授权给部分普通用户使用root用户的权限<br>#注：<strong>sudo --&gt; 授权给普通用户取执行命令的</strong><br>#注：sudo配置文件 /etc/sudoers<br><code>#注：有一个日志文件会记录下被授权者执行的所有命令/var/log/secure</code></p><p>#注：<strong>第一个ALL表示允许任何终端、机器访问sudo，一般就表示本机</strong><br>#注：<strong>第二个ALL表示sudo命令可以允许以任何用户身份去执行</strong><br>#注：<strong>第三个ALL表示可以执行任何命令</strong></p><p><strong>授权日志：有一个日志文件会记录下被授权者执行的所有命令/var/log/secure</strong><br><strong>查看日志，知道授权命令的执行情况</strong><br>[root@cali ~]# tailf /var/log/secure</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br></pre></td><td class="code"><pre><span class="line">示例1：生成随机密码</span><br><span class="line"><span class="comment">#注：生成随机密码的工具mkpasswd</span></span><br><span class="line">https://www.cnblogs.com/shijunxian/archive/2020/05/26/12961543.html</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux food]# yum install expect -y</span><br><span class="line">[root@sanchuang-linux bin]# mkpasswd -l 15 -d 3 -c 4 -C 4 -s 2</span><br><span class="line">wjp4[HC]hx6mSO6</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例2：<span class="built_in">sudo</span>配置文件 /etc/sudoers</span><br><span class="line"><span class="comment">#注：授权给某些用户执行某些命令</span></span><br><span class="line"><span class="comment">#注：编辑/etc/sudoers授权并验证</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux bin]# less /etc/sudoers</span><br><span class="line">………………</span><br><span class="line"><span class="comment">## Syntax:</span></span><br><span class="line"><span class="comment">##</span></span><br><span class="line"><span class="comment">##      user    MACHINE=COMMANDS………………</span></span><br><span class="line"><span class="comment">## Allow root to run any commands anywhere </span></span><br><span class="line">root    ALL=(ALL)       ALL<span class="comment"># 注：ALL表示当前这个机器</span></span><br><span class="line"><span class="comment">#注：1、允许root用户执行这条命令 ； 2、ALL表示当前这个主机，(ALL)表示允许用户以哪个用户的权限设置 ； 3、ALL表示所有命令（在这个机器上面可以有任何用户的命令）</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：第一个ALL表示允许任何终端、机器访问sudo，一般就表示本机</span></span><br><span class="line"><span class="comment">#注：第二个ALL表示sudo命令可以允许以任何用户身份去执行</span></span><br><span class="line"><span class="comment">#注：第三个ALL表示可以执行任何命令</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例3：编辑配置文件/etc/sudoers 给用户颁布权限</span><br><span class="line"><span class="comment">#注：编辑配置文件 可以使用vim  也可以使用visudo  使用visudo不需要接文件名</span></span><br><span class="line"><span class="comment">#注：推荐使用visodu去编辑/etc/sudoers，它会检测语法；vim去编辑不会检测</span></span><br><span class="line"><span class="comment">#注：对于用户sanle有本地host所有权限</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux bin]# visudo<span class="comment"># 注：使用visudo不需要接文件名</span></span><br><span class="line"><span class="comment">## Allow root to run any commands anywhere</span></span><br><span class="line">root    ALL=(ALL)       ALL</span><br><span class="line">sanle   ALL=(ALL)       ALL</span><br><span class="line"><span class="comment">#注：表示sanle用户，可以在这台主机上执行任何用户的任何命令，但是使用sudo执行时需要输入sanle用户的密码</span></span><br><span class="line"><span class="comment">#注：不设置NOPASSWD  第1次输入密码后  密码有时效性</span></span><br><span class="line">[root@sanchuang-linux bin]# su - sanle<span class="comment"># 注：切换到sanle用户</span></span><br><span class="line">[sanle@sanchuang-linux ~]$ <span class="built_in">sudo</span> passwd wy<span class="comment"># 注：前面+sudo  能进行任何操作</span></span><br><span class="line">我们信任您已经从系统管理员那里了解了日常注意事项。</span><br><span class="line">总结起来无外乎这三点：</span><br><span class="line">    <span class="comment">#1) 尊重别人的隐私。</span></span><br><span class="line">    <span class="comment">#2) 输入前要先考虑(后果和风险)。</span></span><br><span class="line">    <span class="comment">#3) 权力越大，责任越大。</span></span><br><span class="line">[<span class="built_in">sudo</span>] sanle 的密码：<span class="comment"># 注：需要输入sanle用户 密码</span></span><br><span class="line">[root@sanchuang-linux bin]# visudo </span><br><span class="line"><span class="comment">## Allow root to run any commands anywhere</span></span><br><span class="line">root    ALL=(ALL)       ALL</span><br><span class="line">sanle   ALL=(ALL)       NOPASSWD:ALL</span><br><span class="line"><span class="comment">#注：表示sanle用户，可以在这台主机上执行任何用户的任何命令，无需输入sanle的密码</span></span><br><span class="line">[sanle@sanchuang-linux ~]$ <span class="built_in">sudo</span> passwd wy</span><br><span class="line">更改用户 wy 的密码 。</span><br><span class="line">新的 密码：<span class="comment"># 注：不需要验证原密码</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例4：给用户/组颁布权限</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux bin]# visudo </span><br><span class="line"><span class="comment">## Allow root to run any commands anywhere</span></span><br><span class="line">root    ALL=(ALL)       ALL</span><br><span class="line">sanle   ALL=(ALL)       NOPASSWD:ALL</span><br><span class="line"><span class="comment">#注：表示sanle用户，可以在这台主机上执行任何用户的任何命令，无需输入sanle的密码</span></span><br><span class="line">%sanchuang5 ALL=(ALL)   NOPASSWD:ALL</span><br><span class="line"><span class="comment">#注：表示sanchuang5这个组的用户，在这台主机上可以执行任何用户的任何命令，无需输入密码</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：对于sanchuang5这个组赋予以任何用户执行任何权限</span></span><br><span class="line"><span class="comment">#注：组里的所有成员也会拥有这个权限</span></span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例5 对于指定的命令去授权</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[sanle@sanchuang-linux ~]$ <span class="built_in">which</span> <span class="built_in">chown</span></span><br><span class="line">/usr/bin/chown</span><br><span class="line">[sanle@sanchuang-linux ~]$ <span class="built_in">which</span> passwd</span><br><span class="line">/usr/bin/passwd</span><br><span class="line">[root@sanchuang-linux cc_test]# visudo</span><br><span class="line">root    ALL=(ALL)       ALL</span><br><span class="line">sanle   ALL=(ALL)       NOPASSWD:ALL</span><br><span class="line">%sanchuang5 ALL=(ALL)   NOPASSWD:ALL</span><br><span class="line">wy      ALL=(ALL)       /usr/bin/chown,/usr/bin/passwd<span class="comment"># 注：接命令的绝对路径</span></span><br><span class="line"><span class="comment">#注：表示wy用户在这台主机上，拥有chown,passwd命令执行授权，命令路径写命令的绝对路径</span></span><br><span class="line">[wy@sanchuang-linux ~]$ <span class="built_in">sudo</span> <span class="built_in">chmod</span> 777 aa</span><br><span class="line">我们信任您已经从系统管理员那里了解了日常注意事项。</span><br><span class="line">总结起来无外乎这三点：</span><br><span class="line">    <span class="comment">#1) 尊重别人的隐私。</span></span><br><span class="line">    <span class="comment">#2) 输入前要先考虑(后果和风险)。</span></span><br><span class="line">    <span class="comment">#3) 权力越大，责任越大。</span></span><br><span class="line">[<span class="built_in">sudo</span>] wy 的密码： <span class="comment"># 注：验证密码后可以修改</span></span><br><span class="line">[wy@sanchuang-linux ~]$ <span class="built_in">sudo</span> passwd wy2</span><br><span class="line">更改用户 wy2 的密码 。</span><br><span class="line">新的 密码：</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例6：授权日志 /var/log/目录下  secure文件</span><br><span class="line"><span class="comment">#注：有一个日志文件会记录下被授权者执行的所有命令/var/log/secure</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux cc_test]# <span class="built_in">cd</span> /var/log/</span><br><span class="line">[root@sanchuang-linux <span class="built_in">log</span>]# less secure</span><br><span class="line">uid=0 <span class="built_in">tty</span>=/dev/pts/2 ruser=wy rhost=  user=wy</span><br><span class="line">Nov 12 16:43:26 sanchuang-linux <span class="built_in">sudo</span>[2424]: pam_unix(<span class="built_in">sudo</span>:auth): conversation failed</span><br><span class="line">Nov 12 16:43:26 sanchuang-linux <span class="built_in">sudo</span>[2424]: pam_unix(<span class="built_in">sudo</span>:auth): auth could not identify password <span class="keyword">for</span> [wy]</span><br><span class="line">Nov 12 16:43:26 sanchuang-linux <span class="built_in">sudo</span>[2424]: wy : <span class="built_in">command</span> not allowed ; TTY=pts/2 ; PWD=/home/wy ; USER=root</span><br><span class="line"> ; COMMAND=/bin/chmod 777 aa</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例7</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">ls</span> -ld /bin/passwd</span><br><span class="line">-rwsr-xr-x. 1 root root 33600 4月   7 2020 /bin/passwd</span><br><span class="line"><span class="comment">#注：s位  普通用户有设置密码的权限，但是没有为他人设置密码的权限，且密码需要满足密码复杂度</span></span><br></pre></td></tr></table></figure><hr><h2 id="八-练习">八. 练习<a class="header-anchor" href="#八-练习"></a></h2><p>yum install net-tools -y<br>授予bailongma用户：useradd、userdel、passwd<br>授予baigujing用户：ip、ping、ifconfig、route<br>授权yutujing用户：poweroff、reboot</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><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">示例1</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[wy@sanchuang-linux ~]$ <span class="built_in">which</span> useradd<span class="comment"># 注：查找命令的绝对路径</span></span><br><span class="line">/usr/sbin/useradd</span><br><span class="line">………………………………</span><br><span class="line">[wy@sanchuang-linux ~]# visudo</span><br><span class="line">root    ALL=(ALL)       ALL</span><br><span class="line">bailongma ALL=(ALL)     /usr/sbin/useradd,/usr/sbin/userdel,/usr/bin/passwd</span><br><span class="line">baigujing ALL=(ALL)     /usr/sbin/ip,/usr/bin/ping,/usr/sbin/ifconfig,/usr/sbin/route</span><br><span class="line">yutujing  ALL=(ALL)     /usr/sbin/poweroff,/usr/sbin/reboot</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例2：(ALL) 可以不写</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[wy@sanchuang-linux ~]# visudo</span><br><span class="line">root    ALL=(ALL)       ALL</span><br><span class="line">bailongma ALL=/usr/sbin/useradd,/usr/sbin/userdel,/usr/bin/passwd<span class="comment"># 注：(ALL) 可以不写</span></span><br><span class="line">baigujing ALL=/usr/sbin/ip,/usr/bin/ping,/usr/sbin/ifconfig,/usr/sbin/route</span><br><span class="line">yutujing  ALL=/usr/sbin/poweroff,/usr/sbin/reboot</span><br><span class="line">===============================================================================</span><br><span class="line"></span><br><span class="line">示例3：定义别名</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[wy@sanchuang-linux ~]# visudo</span><br><span class="line"><span class="comment">#定义命令别名</span></span><br><span class="line">Cmnd_Alias  NETWORK = /usr/sbin/ip,/usr/bin/ping,/usr/sbin/ifconfig,/usr/sbin/route</span><br><span class="line">Cmnd_Alias  SHUT = /usr/sbin/poweroff,/usr/sbin/reboot</span><br><span class="line">Cmnd_Alias  USER = /usr/sbin/useradd,/usr/sbin/userdel,/usr/bin/passwd</span><br><span class="line"></span><br><span class="line">bailongma ALL=USER,NETWORK</span><br><span class="line">baigujing ALL=NETWORK</span><br><span class="line">yutujing  ALL=SHUT</span><br><span class="line">------------------------------------------------------------------------</span><br><span class="line">[baigujing@sanchuang-linux ~]$ <span class="built_in">sudo</span> ip a add 192.168.0.144/24 dev ens33  <span class="comment">#注：为网卡增加ip地址</span></span><br><span class="line">[<span class="built_in">sudo</span>] baigujing 的密码：<span class="comment"># 注：ip命令权限的使用</span></span><br><span class="line">[baigujing@sanchuang-linux ~]$ ip add</span><br><span class="line">………………</span><br><span class="line">    inet 192.168.0.26/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33</span><br><span class="line">    inet 192.168.0.144/24 scope global secondary ens33</span><br><span class="line">………………</span><br><span class="line">------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：为网卡增加ip地址（1个网卡可以有多个ip地址）</span></span><br><span class="line">[wy@sanchuang-linux ~]$ ip a add 192.168.0.144/24 dev ens33</span><br></pre></td></tr></table></figure><hr><h2 id="九-SELinux介绍">九. SELinux介绍<a class="header-anchor" href="#九-SELinux介绍"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>**SELinux是什么？有什么用？ **</p></li><li class="lvl-2"><p><strong>如何查看SELinux是否开启？</strong></p></li></ul><p>​getenforce</p><ul class="lvl-0"><li class="lvl-2"><p><strong>如何关闭和开启SELinux？</strong></p></li></ul><p>​临时<br>​setenforce<br>​永久<br>​修改配置文件<br>​vim /etc/selinux/config<br>​vim /etc/sysconfig/selinux<br>​重新启动系统</p><ul class="lvl-0"><li class="lvl-2"><p><strong>SELinux在企业里使用多吗？</strong></p></li></ul><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></pre></td><td class="code"><pre><span class="line">SELinux是什么？</span><br><span class="line">·SELinux是一个linux系统里的一个安全方面的子系统，用来提升linux的整体的安全级别。是一种访问控制体系，进程只能访问那些在他的任务中所需要文件。（控制进程可以访问哪些允许访问的资源）</span><br><span class="line"></span><br><span class="line">·操作系统有两类访问控制：自主访问控制（DAC）和强制访问控制（MAC）。</span><br><span class="line"></span><br><span class="line">·标准Linux安全是一种DAC，SELinux为Linux增加了一个灵活的和可配置的的MAC。</span><br><span class="line"></span><br><span class="line">·DAC(Discretionary Access Control）自主访问控制</span><br><span class="line"></span><br><span class="line">·工作原理：</span><br><span class="line"></span><br><span class="line">·MAC(Mandatory Access Control）―――强制访问控制 ---》selinux</span><br><span class="line"></span><br><span class="line">·工作原理：</span><br><span class="line"></span><br><span class="line">·哪些进程能访问哪些类型的文件，都有安全策略</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><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><br><span class="line"><span class="comment">#注：这是链接文件/etc/sysconfig/selinux -&gt; /etc/selinux/config</span></span><br><span class="line">[root@cali <span class="built_in">log</span>]# vim /etc/sysconfig/selinux</span><br><span class="line">SELINUX=disabled</span><br><span class="line"></span><br><span class="line">临时配置</span><br><span class="line">临时配置，重新启动系统会失效</span><br><span class="line">0--》Permissive 宽容模式</span><br><span class="line">1--》Enforcing  强制执行模式 </span><br><span class="line">[root@cali selinux]# setenforce 0  </span><br><span class="line">[root@cali selinux]# getenforce  </span><br><span class="line">Permissive</span><br><span class="line">[root@cali selinux]#</span><br><span class="line">[root@cali selinux]# setenforce 1  </span><br><span class="line">[root@cali selinux]# getenforce  </span><br><span class="line">Enforcing</span><br><span class="line">[root@cali selinux]#</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><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">·进程控制 ：控制哪些进程能访问哪些文件，因为它对进程和文件进行了分类，制定了策略，策略里规定了哪些类型的进程能操作哪些类型的文件。</span><br><span class="line"></span><br><span class="line">·服务异常不能访问--》通过网络不能访问</span><br><span class="line">·1.考虑iptables防火墙是否开启 </span><br><span class="line">·2.考虑selinux安全机制是否开启</span><br><span class="line"></span><br><span class="line">·iptables 是外层的安全策略防火墙</span><br><span class="line">·selinux是linux内部的安全策略机制防火墙</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><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">博客链接：https://blog.csdn.net/yanjun821126/article/details/80828908</span><br><span class="line"></span><br><span class="line">SELinux</span><br><span class="line">是内核集成的一个安全相关的子系统，可以让系统更加的安全</span><br><span class="line">内核版本2.6以上支持</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：查看内核版本 uname -r</span></span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">uname</span> -r</span><br><span class="line">4.18.0-193.el8.x86_64</span><br><span class="line"></span><br><span class="line">安全增强型 Linux（Security-Enhanced Linux）简称 SELinux，它是一个 Linux 内核模块，也是 Linux 的一个安全子系统。</span><br><span class="line"></span><br><span class="line">SELinux 的作用</span><br><span class="line">SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源（最小权限原则）。</span><br><span class="line"></span><br><span class="line">DAC:</span><br><span class="line">在没有使用 SELinux 的操作系统中，决定一个资源是否能被访问的因素是：某个资源是否拥有对应用户的权限（读、写、执行）</span><br><span class="line">这种权限管理机制的主体是用户，也称为自主访问控制（DAC）</span><br><span class="line"></span><br><span class="line">MAC:</span><br><span class="line">在使用了 SELinux 的操作系统中，决定一个资源是否能被访问的因素除了上述因素之外，还需要判断每一类进程是否拥有对某一类资源的访问权限。</span><br><span class="line">这种权限管理机制的主体是进程，也称为强制访问控制（MAC）</span><br><span class="line"></span><br><span class="line">默认情况下SElinux属于关闭状态（<span class="built_in">disable</span>）服务访问不了基本是设置了SElinux</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><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">示例：临时修改</span><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">#注：0  --》Permissive 宽容模式</span></span><br><span class="line"><span class="comment">#注：1  --》Enforcing  强制执行模式</span></span><br><span class="line">[root@sanchuang-linux ~]# getenforce <span class="comment"># 注：获取当前selinux的模式</span></span><br><span class="line">Disabled</span><br><span class="line">[root@sanchuang-linux ~]# setenforce 0<span class="comment"># 注：0宽容模式临时生效</span></span><br><span class="line">setenforce: SELinux is disabled</span><br><span class="line">[root@sanchuang-linux ~]# setenforce 1<span class="comment"># 注：1强制模式（一定要遵循SELinux规则）</span></span><br><span class="line">setenforce: SELinux is disabled</span><br><span class="line"><span class="comment">#注：0|1  Permissive|Enforcing  宽容模式|强制执行模式</span></span><br><span class="line"></span><br><span class="line">============================================================================================</span><br><span class="line">示例：永久生效 修改配置文件</span><br><span class="line"><span class="comment">#注：配置文件：/etc/selinux/config</span></span><br><span class="line">[root@sanchuang-linux ~]# vim /etc/selinux/config</span><br><span class="line"><span class="comment">#     enforcing - SELinux security policy is enforced.</span></span><br><span class="line"><span class="comment">#     permissive - SELinux prints warnings instead of enforcing.</span></span><br><span class="line"><span class="comment">#     disabled - No SELinux policy is loaded.</span></span><br><span class="line">SELINUX=disabled<span class="comment"># 注：指定工作模式</span></span><br><span class="line"><span class="comment">#注：修改之后生效，需要重启电脑</span></span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> 权限 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>17_Linux基础-用户权限2</title>
      <link href="/posts/14777.html"/>
      <url>/posts/14777.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-练习：批量创建n个用户">一. 练习：批量创建n个用户<a class="header-anchor" href="#一-练习：批量创建n个用户"></a></h2><p>批量创建n个用户</p><p>用户名以sanchuang开头,sanchuang</p><p>指定家目录/lianxi/user</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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# <span class="built_in">seq</span> -w 10<span class="comment"># 注：-w 同等长度输出</span></span><br><span class="line">01</span><br><span class="line">02</span><br><span class="line">………………</span><br><span class="line">09</span><br><span class="line">10</span><br><span class="line">[root@sanchuang-linux ~]# vim create_user2.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line">num=<span class="variable">$1</span>          <span class="comment"># 注：$1外面 接收参数，改名字 见名知义</span></span><br><span class="line">[ -d /lianxi/user ] || <span class="built_in">mkdir</span> /lianxi/user      <span class="comment"># 注：-d判断目录是否存在，-f判断普通文件是否存在</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">seq</span> -w <span class="variable">$num</span>`   <span class="comment"># 注：mkdir /lianxi/user 就可以了，不要加上用户名目录</span></span><br><span class="line"><span class="keyword">do</span><span class="comment"># 注：判断是否存在，如果前面为真不做任何事情，如果为假就执行mkdir…</span></span><br><span class="line">    useradd -d /lianxi/user/sanchuang<span class="variable">$i</span> sanchuang<span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@sanchuang-linux ~]# bash create_user2.sh 12</span><br><span class="line">useradd：用户“sanchuang01”已存在</span><br><span class="line">useradd：用户“sanchuang02”已存在</span><br><span class="line">………………</span><br><span class="line">useradd：用户“sanchuang10”已存在</span><br><span class="line">useradd：用户“sanchuang12”已存在</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /lianxi/user</span><br><span class="line">[root@sanchuang-linux user]# <span class="built_in">ls</span></span><br><span class="line">sanchuang01  …………  sanchuang10  sanchuang12</span><br><span class="line">[root@sanchuang-linux user]# <span class="built_in">cd</span></span><br><span class="line">[root@sanchuang-linux ~]# bash create_user2.sh 20</span><br><span class="line">useradd：用户“sanchuang01”已存在</span><br><span class="line">useradd：用户“sanchuang02”已存在</span><br><span class="line">………………</span><br><span class="line">useradd：用户“sanchuang12”已存在</span><br><span class="line">useradd：用户“sanchuang13”已存在</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /lianxi/user</span><br><span class="line">[root@sanchuang-linux user]# <span class="built_in">ls</span></span><br><span class="line">sanchuang01  …………  sanchuang18  sanchuang20</span><br></pre></td></tr></table></figure><hr><h2 id="二-一般情况下普通用户只能在家目录下或者-tmp目录下创建文件或者文件夹">二. 一般情况下普通用户只能在家目录下或者/tmp目录下创建文件或者文件夹<a class="header-anchor" href="#二-一般情况下普通用户只能在家目录下或者-tmp目录下创建文件或者文件夹"></a></h2><p><strong>一般情况下普通用户只能在家目录下或者/tmp目录下创建文件或者文件夹</strong></p><p>#注：/tmp目录是一个临时目录，一般存放临时性的东西</p><p>#注：（如：程序运行中需要记录的一些东西，程序结束后把/tmp目录下的东西删掉）</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">[root@sanchuang-linux ~]# su - sanchuang</span><br><span class="line">上一次登录：五 11月  6 17:09:41 CST 2020pts/2 上</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld /</span><br><span class="line">dr-xr-xr-x. 38 root root 4096 11月  5 15:12 /</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld /etc</span><br><span class="line">drwxr-xr-x. 90 root root 8192 11月  7 15:00 /etc</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld ./<span class="comment"># 注：家目录下 创建文件或者文件夹</span></span><br><span class="line">drwxrwxrwx. 4 sanchuang sanchuang 122 11月  6 17:10 ./</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld /tmp<span class="comment"># 注：/tmp目录下 创建文件或者文件夹</span></span><br><span class="line">drwxrwxrwt. 12 root root 264 11月  7 10:36 /tmp</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：chmod  自己是属主的时候，才可以修改权限</span></span><br></pre></td></tr></table></figure><hr><h2 id="三-chmod">三. chmod<a class="header-anchor" href="#三-chmod"></a></h2><p><strong>chmod使用，必须是文件的属主，才能改动文件的读写执行权限（root除外）</strong></p><p>#注：chmod使用 用户必须是文件的属主才能修改（即使是文件属组里的成员也没有权限去修改文件）</p><p>#注：root用户除外</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">示例：su切换用户时 加- 不加- 区别</span><br><span class="line">[root@sanchuang-linux chenpeng]# su - sanchuang11<span class="comment"># 注：加 - 会自动切换到到家目录下</span></span><br><span class="line">上一次登录：六 11月  7 15:10:51 CST 2020pts/0 上</span><br><span class="line">[sanchuang11@sanchuang-linux ~]$ <span class="built_in">exit</span></span><br><span class="line">注销</span><br><span class="line">[root@sanchuang-linux chenpeng]# su sanchuang11<span class="comment"># 注：不加 - 会在当前目录下</span></span><br><span class="line">[sanchuang11@sanchuang-linux chenpeng]$ </span><br></pre></td></tr></table></figure><hr><h2 id="四-设置文件-目录的归属">四. 设置文件/目录的归属<a class="header-anchor" href="#四-设置文件-目录的归属"></a></h2><p><strong>设置文件/目录的归属</strong></p><h3 id="4-1-chown命令">4.1 chown命令<a class="header-anchor" href="#4-1-chown命令"></a></h3><p><strong>chown命令</strong>      # 注：用来改变文件的属主和属组</p><ul class="lvl-0"><li class="lvl-2"><p>必须是<strong>root</strong># 注：chown 只能root去更改</p></li><li class="lvl-2"><p>用户和组必须存在</p></li><li class="lvl-2"><p>格式：<code>chown  属主  文件</code><br><code>chown :属组  文件 </code><br><code>chown  属主:属组 文件</code></p></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><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="built_in">chown</span> 修改文件的属主和属组</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">ls</span> -al sanchuang_log <span class="comment"># 注：属主 sanchuang ; 属组 sanchuang</span></span><br><span class="line">-rw-rw-r-- 1 sanchuang sanchuang 673 11月  7 15:19 sanchuang_log</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">chown</span> sanchuang10 sanchuang_log <span class="comment"># 注：修改属主 sanchuang10</span></span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">ls</span> -al sanchuang_log </span><br><span class="line">-rw-rw-r-- 1 sanchuang10 sanchuang 673 11月  7 15:19 sanchuang_log</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">chown</span> :sanchuang9 sanchuang_log <span class="comment"># 注：修改属组 sanchuang9</span></span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">ls</span> -al sanchuang_log </span><br><span class="line">-rw-rw-r-- 1 sanchuang10 sanchuang9 673 11月  7 15:19 sanchuang_log</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">chown</span> sanchuang2:sanchuang sanchuang_log <span class="comment"># 注：即改属主又改属组</span></span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">ls</span> -al sanchuang_log </span><br><span class="line">-rw-rw-r-- 1 sanchuang2 sanchuang 673 11月  7 15:19 sanchuang_log</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">[root@sanchuang-linux tmp]# <span class="built_in">chown</span> xixi:haha sanchuang_log <span class="comment"># 注：修改 字符串会检查</span></span><br><span class="line"><span class="built_in">chown</span>: 无效的用户: “xixi:haha”</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">chown</span> 6666:6666 sanchuang_log <span class="comment"># 注：数字没有限制</span></span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">ls</span> -al sanchuang_log </span><br><span class="line">-rw-rw-r-- 1 6666 6666 673 11月  7 15:19 sanchuang_log</span><br></pre></td></tr></table></figure><h3 id="4-2-chgrp命令">4.2 chgrp命令<a class="header-anchor" href="#4-2-chgrp命令"></a></h3><p><strong>chgrp命令</strong><strong># 注：修改属组（不常用）</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>chgrp  属组  文件</code></p></li><li class="lvl-2"><p>必须是root或者是文件的所有者</p></li><li class="lvl-2"><p>必须是新组的成员</p></li></ul><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>-R</code>：递归修改指定目录下所有文件、子目录的归属</p></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></pre></td><td class="code"><pre><span class="line">示例：<span class="built_in">chgrp</span>命令 修改属组</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">chgrp</span> sanchuang5 sanchuang_log <span class="comment"># 注:只修改属组</span></span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">ls</span> -al sanchuang_log </span><br><span class="line">-rw-rw-r-- 1 6666 sanchuang5 673 11月  7 15:19 sanchuang_log</span><br></pre></td></tr></table></figure><h3 id="4-3-可以执行的用户">4.3 可以执行的用户<a class="header-anchor" href="#4-3-可以执行的用户"></a></h3><p><strong>可以执行的用户</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208170358168.png" alt=""></p></blockquote><p>操作   可以执行的用户</p><p>chmod  root和文件所有者</p><p>chgrp    root和文件所有者（必须是组成员）</p><p>chown   只有root</p><p>#注：chgrp修改属组  文件所有者 必须是想要<strong>修改的组</strong>里的<strong>组成员</strong></p><hr><h2 id="五-默认权限">五. 默认权限<a class="header-anchor" href="#五-默认权限"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>在内核级别，文件的初始权限666</p></li><li class="lvl-2"><p>在内核级别，文件夹的初始权限777</p></li><li class="lvl-2"><p>用umask命令控制默认权限，临时有效</p></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></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# <span class="built_in">umask</span>  0022</span><br><span class="line">[root@localhost ~]# <span class="built_in">umask</span> -S  u=rwx,g=rx,o=rx  </span><br><span class="line">[root@localhost ~]# <span class="built_in">umask</span> 077  </span><br><span class="line">[root@localhost ~]# <span class="built_in">umask</span>  0077</span><br><span class="line">不推荐修改系统默认<span class="built_in">umask</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 注：umask规定默认创建文件或者文件夹的权限有多大</span></span><br><span class="line">============================================================================================</span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld <span class="built_in">dd</span> <span class="comment"># 注：新建的文件dd</span></span><br><span class="line">-rw-rw-r-- 1 sanchuang9 sanchuang9 0 11月  7 15:48 <span class="built_in">dd</span><span class="comment"># 注：权限644</span></span><br><span class="line">============================================================================================</span><br></pre></td></tr></table></figure><h3 id="5-1-etc-profile下面有umask的设置">5.1 /etc/profile下面有umask的设置<a class="header-anchor" href="#5-1-etc-profile下面有umask的设置"></a></h3><p><strong>/etc/profile下面有<code>umask</code>的设置</strong></p><p><strong>系统环境设置 /etc/profile</strong># 注：<strong>/etc/profile下面有umask的设置</strong></p><p>#注：判断uid是否大于199，并且当前用户的 用户名和组名 相等的时候 umask 是 002</p><p>#注：用户名和组名不一样时 umask 是022</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line">[sanchuang9@sanchuang-linux ~]$ less /etc/profile<span class="comment"># 注：/etc/profile下面有umask的设置</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$UID</span> -gt 199 ] &amp;&amp; [ <span class="string">&quot;`/usr/bin/id -gn`&quot;</span> = <span class="string">&quot;`/usr/bin/id -un`&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">umask</span> 002<span class="comment"># 注：如果uid大于199 执行 id -gn 命令  group_name  ;id -un user_name</span></span><br><span class="line"><span class="keyword">else</span><span class="comment"># 注：判定uid是否大于199，并且group_name=user_name</span></span><br><span class="line">    <span class="built_in">umask</span> 022<span class="comment"># 注：用户名和组名一样时 umask 是002 ； 用户名和组名不一样时 是 002</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：新建文件的权限是666-umask，新建目录的权限是777-umask</span></span><br><span class="line"><span class="comment">#注：使用umask设置文件的权限，因为每次登陆shell都会加载系统的环境，会运行/etc/profile，所以会设置它的umask</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：id -gn 获取当前用户组名</span></span><br><span class="line"><span class="comment">#注：id -un 获取当前用户名</span></span><br><span class="line"><span class="comment">#uid大于199，并且当前用户的group_name和user_name名字相同的时候 umask是002</span></span><br><span class="line"><span class="comment">#剩下的时候 umask是022</span></span><br><span class="line"></span><br><span class="line">·在内核级别，文件的初始权限666  </span><br><span class="line">·在内核级别，文件夹的初始权限777</span><br><span class="line">·用<span class="built_in">umask</span>命令控制默认权限，临时有效</span><br><span class="line"></span><br><span class="line"><span class="built_in">umask</span>为002 则表示新建文件的默认权限为664，新建文件的文件夹权限为775</span><br><span class="line"><span class="built_in">umask</span>为022 则表示新建文件的默认权限为644，新建文件的文件夹权限为755</span><br><span class="line"></span><br><span class="line"><span class="comment"># 注：666 - umask</span></span><br><span class="line"> 777 - <span class="built_in">umask</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例：<span class="built_in">id</span> -gn 获取当前用户组名; <span class="built_in">id</span> -un 获取当前用户名</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux tmp]# /usr/bin/id -gn</span><br><span class="line">root</span><br><span class="line">[root@sanchuang-linux tmp]# /usr/bin/id -un</span><br><span class="line">root</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">id</span> -gn<span class="comment"># 注：当前所在用户组名</span></span><br><span class="line">root</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">id</span> -un<span class="comment"># 注：当前所在用户名</span></span><br><span class="line">root</span><br><span class="line">============================================================================================</span><br><span class="line">示例：判断2个字符串是否相等 可以用1个等号</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux tmp]# [ <span class="string">&quot;a&quot;</span> = <span class="string">&quot;b&quot;</span> ] || <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span><span class="comment"># 注：判断字符串相同 可以用一个等于号</span></span><br><span class="line">ok<span class="comment"># 注：条件为假 输出ok</span></span><br><span class="line">[root@sanchuang-linux tmp]# [ <span class="string">&quot;a&quot;</span> = <span class="string">&quot;b&quot;</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span><span class="comment"># 注：条件为真 输出ok</span></span><br><span class="line">[root@sanchuang-linux tmp]# [ <span class="string">&quot;a&quot;</span> = <span class="string">&quot;a&quot;</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span></span><br><span class="line">ok</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux tmp]# su - sanchuang<span class="comment"># 注：用户名和组名一样时</span></span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">umask</span> </span><br><span class="line">0002<span class="comment"># 注：用户名和组名一样时 umask 是002</span></span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">id</span> -gn<span class="comment"># 注：第一位0是粘滞位  002是umask</span></span><br><span class="line">sanchuang</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">id</span> -un</span><br><span class="line">sanchuang</span><br><span class="line"></span><br><span class="line">[root@localhost ~]# su - b1<span class="comment"># 注：用户名 和 组名不一样时</span></span><br><span class="line">[b1@localhost ~]$ <span class="built_in">id</span></span><br><span class="line">uid=1204(b1) gid=1001(cali) 组=1001(cali),200(tech)</span><br><span class="line">[b1@localhost ~]$ <span class="built_in">id</span> -un</span><br><span class="line">b1</span><br><span class="line">[b1@localhost ~]$ <span class="built_in">id</span> -gn</span><br><span class="line">cali</span><br><span class="line">[b1@localhost ~]$ <span class="built_in">umask</span> <span class="comment"># 注：用户名和组名不一样时 umask是022</span></span><br><span class="line">0022</span><br><span class="line">[b1@localhost ~]$ <span class="built_in">touch</span> gg</span><br><span class="line">[b1@localhost ~]$ <span class="built_in">ls</span> -ld gg<span class="comment"># 注：新建文件的权限是644权限</span></span><br><span class="line">-rw-r--r--. 1 b1 cali 0 11月  8 16:27 gg</span><br><span class="line">[b1@localhost ~]$ <span class="built_in">umask</span> 422<span class="comment"># 注：临时设置umask为422（临时修改）</span></span><br><span class="line">[b1@localhost ~]$ <span class="built_in">mkdir</span> <span class="built_in">test</span><span class="comment"># 注：新建文件夹的权限是 355（777-umask）</span></span><br><span class="line">[b1@localhost ~]$ <span class="built_in">ls</span> -ld <span class="built_in">test</span>/</span><br><span class="line">d-wxr-xr-x. 2 b1 cali 6 11月  8 16:49 <span class="built_in">test</span>/<span class="comment"># 注：目录权限355 写执行 读执行 读执行</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例：临时设置<span class="built_in">umask</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">umask</span> 422<span class="comment"># 注：临时更改umask</span></span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">touch</span> hh</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">ls</span> -ld hh</span><br><span class="line">--w-r--r-- 1 root root 0 11月  7 16:02 hh   <span class="comment"># 注：文件 权限是244 写读读</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例：<span class="built_in">umask</span> -S 查看文件目前默认权限是多少</span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">umask</span> -S<span class="comment"># 注：查看文件目前默认权限是多少</span></span><br><span class="line">u=rwx,g=rwx,o=rx</span><br><span class="line">============================================================================================</span><br><span class="line">示例：想要修改某个用户的<span class="built_in">umask</span>，永久修改</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：在家目录下的.bashrc下添加umask设置永久修改</span></span><br><span class="line"><span class="comment">#注：/etc/profile,/etc/bashrc系统配置 基本上不要更改（不要想着改全局配置）</span></span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ vim /home/sanchuang9/.bashrc</span><br><span class="line"><span class="built_in">umask</span>=002</span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">exit</span></span><br><span class="line">注销</span><br><span class="line">[root@sanchuang-linux tmp]# su - sanchuang9</span><br><span class="line">上一次登录：六 11月  7 16:07:40 CST 2020pts/0 上</span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">umask</span><span class="comment"># 注：umask变成002了</span></span><br><span class="line">0002</span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ bash<span class="comment"># 注：执行到新bash里面去 umask也是002</span></span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">umask</span></span><br><span class="line">0002</span><br></pre></td></tr></table></figure><hr><h2 id="六-练习">六. 练习<a class="header-anchor" href="#六-练习"></a></h2><h3 id="6-1-新建文件夹-pem，复制-etc-hosts文件到pem目录下">6.1 新建文件夹/pem，复制/etc/hosts文件到pem目录下<a class="header-anchor" href="#6-1-新建文件夹-pem，复制-etc-hosts文件到pem目录下"></a></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></pre></td><td class="code"><pre><span class="line">1、新建文件夹/pem，复制/etc/hosts文件到pem目录下</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">mkdir</span> /pem</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">cp</span> /etc/hosts /pem</span><br></pre></td></tr></table></figure><h3 id="6-2-修改hosts文件的权限为，属主有读写执行，组有读写执行，其他人没有任何权限">6.2 修改hosts文件的权限为，属主有读写执行，组有读写执行，其他人没有任何权限<a class="header-anchor" href="#6-2-修改hosts文件的权限为，属主有读写执行，组有读写执行，其他人没有任何权限"></a></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">2、修改hosts文件的权限为，属主有读写执行，组有读写执行，其他人没有任何权限</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">chmod</span> 750 /pem/hosts </span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">ls</span> -al /pem/hosts </span><br><span class="line">-rwxr-x--- 1 root root 158 11月  7 16:20 /pem/hosts</span><br></pre></td></tr></table></figure><h3 id="6-3-新建-pem2目录，修改权限为任何人都有读写执行的权限">6.3 新建/pem2目录，修改权限为任何人都有读写执行的权限<a class="header-anchor" href="#6-3-新建-pem2目录，修改权限为任何人都有读写执行的权限"></a></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">3、新建/pem2目录，修改权限为任何人都有读写执行的权限</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">mkdir</span> /pem2</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">chmod</span> 777 /pem2</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">chmod</span> 777 /pem2 -R<span class="comment"># 注：连带下面所有的子文件</span></span><br></pre></td></tr></table></figure><h3 id="6-4-修改-pem2目录权限为属主有读写执行的权限，其他任何人都没有权限">6.4 修改/pem2目录权限为属主有读写执行的权限，其他任何人都没有权限<a class="header-anchor" href="#6-4-修改-pem2目录权限为属主有读写执行的权限，其他任何人都没有权限"></a></h3><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">4、修改/pem2目录权限为属主有读写执行的权限，其他任何人都没有权限</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">chmod</span> 700 /pem2 </span><br></pre></td></tr></table></figure><h3 id="6-5-修改-pem2任何人都没有任何权限">6.5 修改/pem2任何人都没有任何权限<a class="header-anchor" href="#6-5-修改-pem2任何人都没有任何权限"></a></h3><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">5、修改/pem2任何人都没有任何权限</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">chmod</span> 000 /pem2 </span><br></pre></td></tr></table></figure><h3 id="6-6-复制-etc-passwd和-etc-shadow文件到-pem目录下，查看复制之后的权限是否一致，如何保持权限一致">6.6 复制/etc/passwd和/etc/shadow文件到/pem目录下，查看复制之后的权限是否一致，如何保持权限一致<a class="header-anchor" href="#6-6-复制-etc-passwd和-etc-shadow文件到-pem目录下，查看复制之后的权限是否一致，如何保持权限一致"></a></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></pre></td><td class="code"><pre><span class="line">6、复制/etc/passwd和/etc/shadow文件到/pem目录下，查看复制之后的权限是否一致，如何保持权限一致</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">cp</span> /etc/&#123;passwd,shadow&#125; /pem</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">ls</span> -al /pem</span><br><span class="line">--w-r--r--   1 root root 3964 11月  7 16:23 passwd</span><br><span class="line">----------   1 root root 4201 11月  7 16:23 shadow</span><br></pre></td></tr></table></figure><h3 id="6-7-cp-a-保留文件的属性（包括权限、时间、用户、组）">6.7 cp -a 保留文件的属性（包括权限、时间、用户、组）<a class="header-anchor" href="#6-7-cp-a-保留文件的属性（包括权限、时间、用户、组）"></a></h3><p><strong><code>cp -a</code> 保留文件的属性（包括权限、时间、用户、组）</strong></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">[root@sanchuang-linux pem]# <span class="built_in">cp</span> /home/sanchuang9/.viminfo /tmp/viminfo<span class="comment"># 注：cp过来 属主、属组发生改变</span></span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">ls</span> -al /tmp/viminfo </span><br><span class="line">--w------- 1 root root 1622 11月  7 16:30 /tmp/viminfo</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">ls</span> -al /tmp/viminfo <span class="comment"># 注：cp-a选项 属主、属组、权限、创建时间都没变</span></span><br><span class="line">-rw------- 1 sanchuang9 sanchuang9 1622 11月  7 16:11 /tmp/viminfo</span><br></pre></td></tr></table></figure><hr><h2 id="七-文件或目录的隐藏属性">七. 文件或目录的隐藏属性<a class="header-anchor" href="#七-文件或目录的隐藏属性"></a></h2><p><strong>chattr命令：设置文件的隐藏属性</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>chattr  [+-=] [ai] 文件或目录</code># 注：+、-、= 分别表示 增加、去除、设置参数</p></li></ul><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>-R</code>：递归修改</p></li><li class="lvl-2"><p><code>-a</code>：可以增加文件内容，但不能修改和删除</p></li><li class="lvl-2"><p><code>-i</code>：锁定保护文件</p></li></ul><p><strong>lsattr命令：查看文件的隐藏属性</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：lsattr [Rda] 文件或目录</p></li></ul><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>-R</code>：递归修改</p></li><li class="lvl-2"><p><code>-d</code>：查看目录</p></li></ul><p>#注：<strong>普通用户设置不了文件的隐藏属性；root用户才能设置</strong></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></pre></td><td class="code"><pre><span class="line">示例1：chattr +i hosts 锁定保护文件</span><br><span class="line"><span class="comment"># 注：root用户也不能去修改它</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：不能更改文件（不能删 不能加 不能移动）</span></span><br><span class="line">[root@sanchuang-linux pem]# chattr +i hosts<span class="comment"># 注：设置锁定保护文件；将它不能更改</span></span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">mv</span> hosts&#123;,.bak&#125;<span class="comment"># 注：不能移动（即使是root用户）</span></span><br><span class="line"><span class="built_in">mv</span>: 无法将<span class="string">&#x27;hosts&#x27;</span> 移动至<span class="string">&#x27;hosts.bak&#x27;</span>: 不允许的操作</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">ls</span> -al hosts <span class="comment"># 注：ls -al命令 无法查看隐藏属性</span></span><br><span class="line">-rwxr-x--- 1 root root 158 11月  7 16:20 hosts</span><br><span class="line">[root@sanchuang-linux pem]# lsattr hosts<span class="comment"># 注：lsattr 才能 查看文件隐藏属性 i</span></span><br><span class="line">----i--------------- hosts<span class="comment"># 注：多了1个i属性</span></span><br><span class="line">[root@sanchuang-linux pem]# chattr -i hosts<span class="comment"># 注：去除属性 去除锁定</span></span><br><span class="line">[root@sanchuang-linux pem]# lsattr hosts</span><br><span class="line">-------------------- hosts<span class="comment"># 注：i隐藏属性没了</span></span><br><span class="line"><span class="comment">#注：不能删，加，移动（root用户也不能）</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例2：chattr +a hosts 可以增加文件内容，但不能修改和删除</span><br><span class="line"><span class="comment"># 注：可以使用重定向去增加文件内容，但不能去修改和删除</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux pem]# chattr +a hosts<span class="comment"># 注：可以增加文件内容，但是无法修改和删除</span></span><br><span class="line">[root@sanchuang-linux pem]# lsattr hosts</span><br><span class="line">-----a-------------- hosts<span class="comment"># 注：多了a属性</span></span><br><span class="line">[root@sanchuang-linux pem]# vim hosts <span class="comment"># 注：不可以修改</span></span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">echo</span> <span class="string">&quot;aaaa&quot;</span> &gt;&gt; hosts <span class="comment"># 注：可以追加</span></span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">cat</span> hosts </span><br><span class="line">127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4</span><br><span class="line">aaaa</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">rm</span> -rf hosts <span class="comment"># 注：不可以删除</span></span><br><span class="line"><span class="built_in">rm</span>: 无法删除<span class="string">&#x27;hosts&#x27;</span>: 不允许的操作</span><br><span class="line"><span class="comment">#注：不能修改，只能追加，不能删除</span></span><br><span class="line"><span class="comment">#注：有时候无论什么情况都不想让它更改 +a属性</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例3：chattr +i /etc/passwd</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux pem]# chattr +i /etc/passwd<span class="comment"># 注：设置以后就创建不了用户</span></span><br><span class="line">[root@sanchuang-linux pem]# lsattr /etc/passwd<span class="comment"># 注：查看隐藏属性</span></span><br><span class="line">----i--------------- /etc/passwd<span class="comment"># 注：隐藏属性i</span></span><br><span class="line">[root@sanchuang-linux pem]# useradd sanchuang21<span class="comment"># 注：无论什么用户，设置了隐藏属性，基本没戏了</span></span><br><span class="line">useradd：无法打开 /etc/passwd</span><br><span class="line">[root@sanchuang-linux pem]# chattr -i /etc/passwd<span class="comment"># 注：解锁</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例4：普通用户设置不了文件的隐藏属性</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# su - sanchuang</span><br><span class="line">[sanchuang@localhost ~]$ <span class="built_in">touch</span> aa</span><br><span class="line">[sanchuang@localhost ~]$ chattr +i aa<span class="comment"># 注：普通用户设置不了文件的隐藏属性</span></span><br><span class="line">chattr: 不允许的操作 <span class="keyword">while</span> setting flags on aa</span><br></pre></td></tr></table></figure><hr><h2 id="八-文件的正常权限">八. 文件的正常权限<a class="header-anchor" href="#八-文件的正常权限"></a></h2><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208170416487.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment">#注：正常文件的权限是读写执行</span></span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">ls</span> -ld /tmp</span><br><span class="line">drwxrwxrwt. 12 root root 4096 11月  7 16:30 /tmp<span class="comment"># 注：t 文件的特殊权限</span></span><br></pre></td></tr></table></figure><hr><h2 id="九-文件的特别权限">九. 文件的特别权限<a class="header-anchor" href="#九-文件的特别权限"></a></h2><p>#注：<strong>set位权限设置</strong></p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208170417672.png" alt=""></p></blockquote><p><strong>SET位权限</strong></p><p><strong>主要用途：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>为<strong>可执行</strong>（有 x 权限的）文件设置，权限字符为“s”# 注：<strong>以前的x位变成s位</strong></p></li><li class="lvl-2"><p>其他用户执行该文件时，将拥有属主或属组用户的权限</p></li></ul><p><strong>SET位权限类型</strong>：</p><ul class="lvl-0"><li class="lvl-2"><p>SUID：表示对属主用户增加SET位权限</p></li><li class="lvl-2"><p>SGID：表示对属组内的用户增加SET位权限</p></li></ul><p># 注：用在可执行文件<br># 注：suid  sgid  对应文件而言</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></pre></td><td class="code"><pre><span class="line">示例：/bin/passwd</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# <span class="built_in">which</span> passwd</span><br><span class="line">/bin/passwd</span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -ld /bin/passwd </span><br><span class="line">-rwsr-xr-x. 1 root root 27856 4月   1 2020 /bin/passwd</span><br><span class="line"><span class="comment">#注：普通用户以root用户的身份，间接更新了shadow文件中自己的密码</span></span><br><span class="line">[root@localhost ~]# su - sanchuang</span><br><span class="line">[sanchuang@localhost ~]$ passwd sanchuang<span class="comment"># 注：不能更改密码  其他权限没到位</span></span><br><span class="line">passwd：只有根用户才能指定用户名。</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：s位 这个权限基本不会颁布，必须在有可执行文件下才能生效</span></span><br><span class="line"><span class="comment">#注：这个权限设置 所有人全部给，不能精确到某个用户</span></span><br><span class="line"></span><br><span class="line">示例：SET位权限设置</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux pem]# <span class="built_in">ls</span> -ld /pem</span><br><span class="line">d-wxr-xr-x 2 root root 47 11月  7 16:42 /pem<span class="comment"># 注：只有root用户有写的权限</span></span><br><span class="line"><span class="comment">#注：让/pem有普通用户创建、写入的权限？</span></span><br><span class="line">1.设置/pem的权限为777</span><br><span class="line">2.设置<span class="built_in">mkdir</span> SUID的权限</span><br><span class="line">[root@sanchuang-linux sbin]# <span class="built_in">which</span> <span class="built_in">mkdir</span></span><br><span class="line">/usr/bin/mkdir</span><br><span class="line">[root@sanchuang-linux sbin]# <span class="built_in">ls</span> -ld /usr/bin/mkdir </span><br><span class="line">-rwxr-xr-x. 1 root root 195192 4月  10 2020 /usr/bin/mkdir<span class="comment"># 注：没有设置s属性</span></span><br><span class="line">[root@sanchuang-linux sbin]# <span class="built_in">chmod</span> u+s /bin/mkdir <span class="comment"># 注：让普通用户执行mkdir时以root（属主）权限去运行</span></span><br><span class="line">[root@sanchuang-linux sbin]# <span class="built_in">ls</span> -ld /usr/bin/mkdir <span class="comment"># 注：变成s位了</span></span><br><span class="line">-rwsr-xr-x. 1 root root 195192 4月  10 2020 /usr/bin/mkdir</span><br><span class="line">[root@sanchuang-linux sbin]# su - sanchuang9</span><br><span class="line">上一次登录：六 11月  7 16:09:48 CST 2020pts/0 上</span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">cd</span> /pem</span><br><span class="line">[sanchuang9@sanchuang-linux pem]$ <span class="built_in">ls</span></span><br><span class="line">hosts  passwd  shadow</span><br><span class="line">[sanchuang9@sanchuang-linux pem]$ <span class="built_in">mkdir</span> aa <span class="comment"># 注：普通用户有写的权限了</span></span><br><span class="line">[sanchuang9@sanchuang-linux pem]$ <span class="built_in">ls</span> -ld /pem</span><br><span class="line">d-wxr-xr-x 3 root root 57 11月  7 16:59 /pem</span><br><span class="line">[sanchuang9@sanchuang-linux pem]$ <span class="built_in">touch</span> <span class="built_in">dd</span><span class="comment"># 注：touch没有这个权限</span></span><br><span class="line"><span class="built_in">touch</span>: 无法创建 <span class="string">&#x27;dd&#x27;</span>: 权限不够</span><br><span class="line">[sanchuang9@sanchuang-linux pem]$ <span class="built_in">exit</span></span><br><span class="line">注销</span><br><span class="line">[root@sanchuang-linux sbin]# <span class="built_in">chmod</span> u-s /bin/mkdir</span><br><span class="line">[root@sanchuang-linux sbin]# <span class="built_in">ls</span> -ld /bin/mkdir </span><br><span class="line">-rwxr-xr-x. 1 root root 195192 4月  10 2020 /bin/mkdir</span><br><span class="line"><span class="comment"># 注：s位基本不会给</span></span><br><span class="line"><span class="comment"># 注：s位不要轻易的颁布它，会对用户进行影响</span></span><br></pre></td></tr></table></figure><hr><h2 id="十-粘滞位权限（Sticky）">十. 粘滞位权限（Sticky）<a class="header-anchor" href="#十-粘滞位权限（Sticky）"></a></h2><p><strong>粘滞位权限（Sticky）</strong></p><p><strong>主要用途：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>为公共目录（例如，权限为777的）设置，权限字符为“<code>t</code>”# 注：<strong>t 粘滞位标记字符</strong></p></li><li class="lvl-2"><p>用户不能删除该目录中其他用户的文件</p></li></ul><p># 注：一般作用于文件夹<br># 注：粘滞位对于文件夹而言</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">示例1</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux sbin]# <span class="built_in">ls</span> -ld /tmp</span><br><span class="line">drwxrwxrwt. 12 root root 4096 11月  7 16:30 /tmp<span class="comment"># 注：/tmp目录 任何用户 都有读写执行权限</span></span><br><span class="line"><span class="comment">#注：因为粘滞位权限，用户在/tmp目录下只能创建自己的，删除自己的</span></span><br><span class="line"><span class="comment">#注：一般作用于文件夹</span></span><br><span class="line"><span class="comment">#注：sanchuang10用户不能删除sanchuang用户创建的文件</span></span><br><span class="line">==============================================================================================================</span><br><span class="line">示例2：<span class="built_in">chmod</span> 777 /pem 普通用户可以操作/pem这一层目录下的文件或者文件夹及子文件</span><br><span class="line"><span class="comment"># 注：777权限，不同用户可以相互删除文件</span></span><br><span class="line"><span class="comment"># 注：设置粘滞位后，只能删除自己创建的文件</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">chmod</span> 777 /pem<span class="comment"># 注：把/pem文件夹权限改为777</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /pem<span class="comment"># 注：所有用户都有对/pem读写执行的权限 包括创建、删除</span></span><br><span class="line">drwxrwxrwx 3 root root 74 11月  7 17:10 /pem</span><br><span class="line">[root@sanchuang-linux ~]# su - sanchuang9<span class="comment"># 注：普通用户有创建的权限</span></span><br><span class="line">上一次登录：六 11月  7 17:07:17 CST 2020pts/2 上</span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">touch</span> /pem/sanchuang9<span class="comment"># 注：普通用户有创建的权限</span></span><br><span class="line">[root@sanchuang-linux ~]# su - sanchuang</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">rm</span> -rf /pem/sanchuang9<span class="comment"># 注：普通用户有删除的权限</span></span><br><span class="line"><span class="comment">#注：用户可以删除其他用户创建的文件</span></span><br><span class="line">==============================================================================================================</span><br><span class="line">示例3：粘滞位 t</span><br><span class="line"><span class="comment"># 注：设置粘滞位后，只能删除自己创建的文件</span></span><br><span class="line">[sanchuang9@sanchuang-linux tmp]$ <span class="built_in">ls</span> -ld /tmp</span><br><span class="line">drwxrwxrwt. 13 root root 4096 11月  7 17:07 /tmp<span class="comment"># 注：/tmp目录设置了1个粘滞位</span></span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">touch</span> /tmp/sanchuang9</span><br><span class="line">[sanchuang9@sanchuang-linux ~]$ <span class="built_in">exit</span></span><br><span class="line">[root@sanchuang-linux ~]# su - sanchuang</span><br><span class="line">上一次登录：日 11月  8 19:05:55 CST 2020pts/3 上</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">rm</span> -rf /tmp/sanchuang9<span class="comment"># 注：因为设置了1个粘滞位</span></span><br><span class="line"><span class="built_in">rm</span>: 无法删除<span class="string">&#x27;/tmp/sanchuang9&#x27;</span>: 不允许的操作<span class="comment"># 注：用户只能在/tmp目录下创建 删除自己的</span></span><br><span class="line"><span class="comment">#注：粘滞位的作用</span></span><br><span class="line"><span class="comment">#注：·为公共目录（例如，权限为777的）设置，权限字符为“t”</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><hr><h2 id="十一-设置SET位、粘滞位权限">十一. 设置SET位、粘滞位权限<a class="header-anchor" href="#十一-设置SET位、粘滞位权限"></a></h2><p><strong>设置SET位、粘滞位权限</strong></p><p><strong>使用权限字符</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>chmod  ug±s  可执行文件...</code># 注：设置set位</p></li><li class="lvl-2"><p><code>chmod  o±t   目录名...</code>     # 注：设置粘滞位</p></li></ul><p><strong>使用权限数字</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>chmod  mnnn   可执行文件...</code></p></li><li class="lvl-2"><p><strong>m为4时，对应SUID，2对应SGID，1对应粘滞位，可叠加</strong># 注：m为4 为2 set位</p></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><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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /tmp</span><br><span class="line">drwxrwxrwt. 13 root root 4096 11月  7 17:07 /tmp<span class="comment"># 注：/tmp目录设置了粘滞位，权限为1777</span></span><br><span class="line"><span class="comment">#注：/tmp目录设置了粘滞位，第1位是1</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例：设置粘滞位</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">chmod</span> 1777 /pem</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /pem</span><br><span class="line">drwxrwxrwt 3 root root 74 11月  7 17:10 /pem<span class="comment"># 注：粘滞位 t 之前 x 的位置</span></span><br><span class="line"><span class="comment">#注：普通情况下不需要使用粘滞位、set位的时候，用3个数字就可以了</span></span><br><span class="line">-----------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /bin/mkdir </span><br><span class="line">-rwxr-xr-x. 1 root root 195192 4月  10 2020 /bin/mkdir</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">chmod</span> 4755 /bin/mkdir<span class="comment"># 注：设置为SET位SUID权限</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /bin/mkdir </span><br><span class="line">-rwsr-xr-x. 1 root root 195192 4月  10 2020 /bin/mkdir</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">chmod</span> 755 /bin/mkdir<span class="comment"># 注：改回来</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /bin/mkdir </span><br><span class="line">-rwxr-xr-x. 1 root root 195192 4月  10 2020 /bin/mkdir</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> 权限 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>16_Linux基础-文件&amp;目录权限及归属</title>
      <link href="/posts/5637.html"/>
      <url>/posts/5637.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-文件-目录的权限">一. 文件/目录的权限<a class="header-anchor" href="#一-文件-目录的权限"></a></h2><p><strong>文件/目录的权限</strong></p><p><strong>访问权限</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>可读(read)</code>：允许查看文件内容、显示目录列表r</p></li><li class="lvl-2"><p><code>可写(write)</code>：允许修改文件内容，允许在目录中新建、移动、删除文件或子目录w</p></li><li class="lvl-2"><p><code>可执行(execute)</code>：允许运行程序、切换目录x</p></li></ul><p><strong>归属（所有权）</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>文件拥有者(owner)</code>：拥有该文件或目录的<strong>用户帐号</strong># 注：<strong>属主</strong></p></li><li class="lvl-2"><p><code>属组(group)</code>：拥有该文件或目录的<strong>组帐号</strong>        # 注：<strong>属组</strong></p></li><li class="lvl-2"><p><code>其它人(others)</code>：除了属主和属组的<strong>其他人</strong>       # 注：<strong>其他</strong></p></li></ul><p>#注：区分是对于文件而言还是对于目录而言</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">ls</span> -al 查看当前目录下面文件或者文件夹的详细信息，包括文件的权限</span><br><span class="line"><span class="built_in">ls</span> -ld 查看当前目录</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><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">示例1：查看文件权限 <span class="built_in">ls</span> -al</span><br><span class="line"><span class="comment"># 注：第三列属主 第四列属组</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -al<span class="comment">#注：查看文件权限</span></span><br><span class="line">总用量 668</span><br><span class="line">-rw-r--r--.  1 root root    211 9月  18 10:31 <span class="string">&#x27;!&#x27;</span></span><br><span class="line">dr-xr-x---. 21 root root  12288 11月  6 15:16  .</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -al zuoye.sh <span class="comment"># 注：查看单个文件权限</span></span><br><span class="line">-rw-r--r--. 1 root root 1212 10月 29 20:20 zuoye.sh</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -al /home<span class="comment"># 注：查看/home目录下所有文件的权限</span></span><br><span class="line">总用量 18348</span><br><span class="line">drwxr-xr-x. 43 root         root            4096 11月  6 15:36 .</span><br><span class="line">dr-xr-xr-x. 38 root         root            4096 11月  5 15:12 ..</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -al *.sh<span class="comment"># 注：查看文件权限</span></span><br><span class="line">-rw-r--r--. 1 root root    0 9月  25 09:35 backup_log.sh</span><br><span class="line">-rw-r--r--. 1 root root   41 10月 28 20:27 file_test.sh</span><br><span class="line"></span><br><span class="line">示例2：查看目录权限 <span class="built_in">ls</span> -ld /home</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /home<span class="comment"># 注：查看/home 目录的权限</span></span><br><span class="line">drwxr-xr-x. 43 root root 4096 11月  6 15:36 /home</span><br></pre></td></tr></table></figure><hr><h2 id="二-文件-目录的权限">二. 文件/目录的权限<a class="header-anchor" href="#二-文件-目录的权限"></a></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></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -ld first.py </span><br><span class="line">-rw-r--r--. 1 root root 1097 10月 13 10:20 first.py</span><br><span class="line">文件类型 访问权限  所有者  属组</span><br></pre></td></tr></table></figure><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208162047554.png" alt=""></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><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></pre></td><td class="code"><pre><span class="line">示例：drwxr-xr-x</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">第一列：表示文件类型与权限</span><br><span class="line">第一个字符</span><br><span class="line">        -普通文件 file</span><br><span class="line">        d表示目录</span><br><span class="line">        s表示socket文件<span class="comment"># 注：socket（套接字） 进程之间通信的一种方式。</span></span><br><span class="line">        p管道文件 pipe</span><br><span class="line">        c字符设备文件<span class="built_in">tty</span></span><br><span class="line">        b块设备文件 磁盘（disk）<span class="comment"># 注：跟硬件相关的块设备文件一般放在 /dev下面</span></span><br><span class="line">        l链接文件<span class="comment"># 注：/usr/bin/目录下 有大量 链接文件</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">#权限 r 可读  w 可写  x 可执行</span></span><br><span class="line">  ·第2-第4个字符</span><br><span class="line">    表示属主的权限</span><br><span class="line">  ·第5-第7个字符</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">敲的所有命令都是在PATH环境变量路径下查找</span><br><span class="line"></span><br><span class="line">创建链接文件</span><br><span class="line"><span class="comment"># 注：ln -s 源文件 目标文件symbolic adj. 象征的；符号的；使用符号的</span></span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">ln</span> -s python3.6 python<span class="comment"># 注：-s创建软链接</span></span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">ln</span> -s python3.6 /root/python<span class="comment"># 注：可以在绝对路径下创建链接文件</span></span><br><span class="line"><span class="comment">#注：链接文件/root/python 放在了/root目录下</span></span><br><span class="line"><span class="built_in">which</span>查看命令的绝对路径</span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">which</span> <span class="built_in">mkdir</span></span><br><span class="line">/usr/bin/mkdir</span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">mv</span> /usr/bin/mkdir /usr/bin/mkdirbak<span class="comment"># 注：修改名字后 命令找不到了</span></span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">mkdir</span></span><br><span class="line">-bash: <span class="built_in">mkdir</span>: 未找到命令</span><br><span class="line">[root@sanchuang-linux bin]# mkdirbak /tmp/mkdir</span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">mv</span> /usr/bin/mkdirbak /usr/bin/mkdir<span class="comment"># 注：改回来</span></span><br><span class="line"></span><br><span class="line">/usr/bin/下有大量链接文件</span><br><span class="line">[root@sanchuang-linux tmp]# <span class="built_in">cd</span> /usr/bin/<span class="comment"># 注：/usr/bin/下有大量链接文件</span></span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">ls</span> -al python2<span class="comment"># 注：链接文件</span></span><br><span class="line">lrwxrwxrwx. 1 root root 9 6月   5 11:38 python2 -&gt; python2.7</span><br><span class="line">[root@sanchuang-linux bin]# <span class="built_in">ls</span> -al python3<span class="comment"># 注：链接文件</span></span><br><span class="line">lrwxrwxrwx. 1 root root 25 9月  18 15:47 python3 -&gt; /etc/alternatives/python3</span><br></pre></td></tr></table></figure><hr><h2 id="三-socket（套接字）">三. socket（套接字）<a class="header-anchor" href="#三-socket（套接字）"></a></h2><blockquote><p>#注：socket（套接字） 进程之间通信的一种方式，通常用于不同主机不同进程之间的通信方式（网络编程）</p><p>ftp有vsftpd的服务，vsftpd服务端服务起来了开启21号端口。ftp客户端要想连接这个服务，ftp客户端需要开启一个随机端口去连接21号端口，进行网络传输。通过网络指定某种特定协议，进行网络连接。</p><p>开启一个vsftpd，会产生一个socket文件</p><p>开放了端口基本上都会有一个socket文件</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></pre></td><td class="code"><pre><span class="line">[root@localhost mail]# <span class="built_in">cd</span> /data/mysql</span><br><span class="line">[root@localhost mysql]# <span class="built_in">ls</span> -al</span><br><span class="line">srwxrwxrwx  1 mysql mysql        0 10月  7 12:04 mysql.sock<span class="comment"># 注：s socket文件 （粉色）</span></span><br></pre></td></tr></table></figure><hr><h2 id="四-Linux内核五大子系统">四. Linux内核五大子系统<a class="header-anchor" href="#四-Linux内核五大子系统"></a></h2><p><strong>Linux内核五大子系统：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>1、文件系统</p></li><li class="lvl-2"><p>2、内存管理</p></li><li class="lvl-2"><p>3、进程通信</p></li><li class="lvl-2"><p>4、进程调度</p></li><li class="lvl-2"><p>5、网络接口</p></li></ul><hr><h2 id="五-进程">五. 进程<a class="header-anchor" href="#五-进程"></a></h2><p><strong>进程是系统进行资源分配的基本单位，不同进程之间资源是互相隔离的</strong></p><p><strong>进程之间通信（常见的5种）：</strong></p><ol><li class="lvl-3"><p>管道</p></li><li class="lvl-3"><p>信号（kill -9）</p></li><li class="lvl-3"><p>共享内存</p></li><li class="lvl-3"><p>socket套接字</p></li><li class="lvl-3"><p>消息队列</p></li></ol><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></pre></td><td class="code"><pre><span class="line">示例1：管道<span class="comment">#注：管道是进程之间通信的一种方式</span></span><br><span class="line">示例</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> /etc/passwd |grep sanchuang<span class="comment"># 注：通过管道把前进程的输出赋给后进程的输入</span></span><br><span class="line">sanchuang:x:1005:1005::/home/sanchuang:/bin/bash</span><br><span class="line"><span class="comment">#注：适用于相同主机不同进程</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">示例2：信号</span><br><span class="line">示例：<span class="built_in">kill</span> -9 pid</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">kill</span> -l</span><br><span class="line"> 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP</span><br><span class="line"> 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL10) SIGUSR1………………</span><br><span class="line">[root@sanchuang-linux ~]# ps -ef |grep nginx</span><br><span class="line">root        5868    5691  0 16:29 pts/0    00:00:00 grep --color=auto nginx</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">kill</span> -9 2868<span class="comment"># 注：发送9这个信号给1209进程</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">示例3：共享内存</span><br><span class="line"><span class="comment">#注：A、B之间创建了一片新的内存空间，可以一起去拿</span></span><br><span class="line"><span class="comment">#注：适用于相同主机不同进程</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">示例4：socket套接字</span><br><span class="line"><span class="comment">#注：用于不同主机之间不同进程  网络通信</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">示例5：消息队列</span><br><span class="line"><span class="comment">#注：相当于排队的 1,2,3,4,5,6</span></span><br><span class="line"><span class="comment">#注：AB共享的内存空间里，A产生的B去获取。A产生1，B取出来，1从A里出去</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-根目录下">六. /根目录下<a class="header-anchor" href="#六-根目录下"></a></h2><p><strong>/etc存放配置文件</strong><br><strong>/dev存放设备文件</strong># 注：<strong>硬件相关的  磁盘、网卡、socket</strong><br>/root  # 注：root用户家目录<br>/home   # 注：存放普通用户的家目录文件</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">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /dev</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">ls</span> -al</span><br><span class="line">crw-rw-rw-   1 root <span class="built_in">tty</span>       5,   0 11月  6 11:32 <span class="built_in">tty</span><span class="comment"># 注：字符设备文件tty</span></span><br><span class="line">crw--w----   1 root <span class="built_in">tty</span>       4,   0 11月  5 15:12 tty0</span><br><span class="line">crw--w----   1 root <span class="built_in">tty</span>       4,   1 11月  6 14:28 tty1</span><br><span class="line">brw-rw----   1 root disk      8,   0 11月  5 15:12 sda<span class="comment"># 注：块设备文件磁盘</span></span><br></pre></td></tr></table></figure><h2 id="七-可执行权限">七. 可执行权限<a class="header-anchor" href="#七-可执行权限"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">第一列第二到第十个字符</span><br><span class="line">  #权限 r 可取  w 可写  x 可执行</span><br><span class="line">  第2-第4个字符</span><br><span class="line">    表示属主的权限</span><br><span class="line">  第5-第7个字符</span><br><span class="line">    表示属组的权限</span><br><span class="line">  后三个</span><br><span class="line">  表示其他人的权限</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><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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -al men_test.sh </span><br><span class="line">-rw-r--r--. 1 root root 0 10月 30 16:26 men_test.sh</span><br><span class="line">[root@sanchuang-linux ~]# bash men_test.sh <span class="comment"># 注：使用bash解释器去执行（生成一个新的bash）</span></span><br><span class="line">[root@sanchuang-linux ~]# sh men_test.sh <span class="comment"># 注：使用sh解释器去执行（生成一个新的sh）</span></span><br><span class="line">[root@sanchuang-linux ~]# . men_test.sh<span class="comment"># 注：使用当前bash去执行，会继承当前环境变量</span></span><br><span class="line"><span class="comment">#注：相当于当前bash，当前环境</span></span><br><span class="line">[root@sanchuang-linux ~]# ./men_test.sh <span class="comment"># 注：权限不够，本身没有可执行权限</span></span><br><span class="line">-bash: ./men_test.sh: 权限不够 <span class="comment"># 注：有可执行权限的文件 可以直接./men_test.sh执行</span></span><br></pre></td></tr></table></figure><hr><h2 id="八-Shell文件执行方式">八. Shell文件执行方式<a class="header-anchor" href="#八-Shell文件执行方式"></a></h2><blockquote><p><strong>Shell文件执行方式（3种）</strong><br>#注：<strong>shell里面可执行文件后缀没有要求 不一定非要.sh结尾</strong></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><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">[root@sanchuang-linux ~]# vim test_aa.sh</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;testaa...&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$b</span></span><br><span class="line">[root@sanchuang-linux ~]# a=1</span><br><span class="line">[root@sanchuang-linux ~]# b=2</span><br><span class="line">[root@sanchuang-linux ~]# . test_aa.sh <span class="comment"># 注：使用当前bash去执行test_aa.sh，会继承当前 shell 的 环境变量</span></span><br><span class="line">testaa...<span class="comment"># 注：用.会继承当前bash里的一切变量</span></span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">[root@sanchuang-linux ~]# bash test_aa.sh <span class="comment"># 注：创建一个新的bash环境去执行命令</span></span><br><span class="line">testaa...<span class="comment"># 注：新bash环境中没有定义a、b变量</span></span><br><span class="line"><span class="comment"># 注：没有输出父bash的a、b</span></span><br><span class="line"><span class="comment"># 注：没有获取到a、b</span></span><br><span class="line">[root@sanchuang-linux ~]# sh test_aa.sh <span class="comment"># 注：创建一个新的sh环境去执行命令</span></span><br><span class="line">testaa...</span><br><span class="line"><span class="comment"># 注：没有输出</span></span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]# ./test_aa.sh <span class="comment"># 注：执行文件本身，看文件本身有没有执行权限</span></span><br><span class="line">-bash: ./test_aa.sh: 权限不够 <span class="comment"># 注：直接执行当前目录下的这个文件 需要可执行权限</span></span><br><span class="line"><span class="comment"># 注：其他的方式不一定需要可执行权限</span></span><br><span class="line"></span><br><span class="line">总结</span><br><span class="line">. test_aa.sh不需要可执行权限当前bash进程执行</span><br><span class="line">bash test_aa.sh不需要可执行权限新的bash进程运行</span><br><span class="line">sh test_aa.sh不需要可执行权限新的bash进程运行</span><br><span class="line">./test_aa.sh需要可执行权限新的bash进程运行</span><br></pre></td></tr></table></figure><hr><h2 id="九-chmod命令">九. chmod命令<a class="header-anchor" href="#九-chmod命令"></a></h2><p><strong>chmod命令</strong># 注：<strong>修改文件的访问权限</strong></p><p><strong>格式1</strong>：<code>chmod [ugoa] [+-=] [rwx] 文件或目录...</code></p><ul class="lvl-0"><li class="lvl-2"><p><strong>u、g、o、a 分别表示</strong><br>u属主、g属组、o其他用户、a所有用户</p></li><li class="lvl-2"><p><strong>+、-、= 分别表示</strong><br>+增加、-去除、=设置权限</p></li><li class="lvl-2"><p><strong>rwx</strong><br>对应的权限字符</p></li></ul><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>-R</code>：递归修改指定目录下所有文件、子目录的权限</p></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><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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">chmod</span> u+x men_test.sh <span class="comment"># 注：对属主+可执行权限</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -al men_test.sh </span><br><span class="line">-rwxr--r--. 1 root root 0 10月 30 16:26 men_test.sh<span class="comment"># 注：可执行文件 都是绿的</span></span><br><span class="line"><span class="comment">#注：可执行文件都是绿的</span></span><br><span class="line"><span class="comment">#注：socket文件都是粉的</span></span><br><span class="line">[root@sanchuang-linux ~]# ./men_test.sh <span class="comment"># 注：可以直接执行了</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">chmod</span> a-x sc -R<span class="comment"># 注：-R递归，把该目录和该目录下的所有子文件都去除可执行权限</span></span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">chmod</span> a+x sc -R<span class="comment"># 注：所有用户增加可执行权限</span></span><br><span class="line">============================================================================================</span><br><span class="line"><span class="comment">#注：根目录只有root用户能用</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /</span><br><span class="line">dr-xr-xr-x. 38 root root 4096 11月  5 15:12 /</span><br><span class="line">============================================================================================</span><br><span class="line">[root@mysql-binary ~]# <span class="built_in">chmod</span> u+x group_member.sh </span><br><span class="line">[root@mysql-binary ~]# ./group_member.sh sanchuang5<span class="comment"># 注：添加了可执行权限后可以 ./运行</span></span><br><span class="line">sanchuang5,sanchuang11,sanchuang13,sanchuang10,sanchuang12</span><br></pre></td></tr></table></figure><hr><h2 id="十-chmod命令">十. chmod命令<a class="header-anchor" href="#十-chmod命令"></a></h2><p><strong>chmod命令</strong># 注：<strong>修改文件的访问权限</strong></p><p><strong>格式2</strong>：<code>chmod nnn 文件或目录...</code>          # 注：nnn表示3位八进制数</p><p>权限项      读写执行读写执行读写执行</p><p>字符表示  rwx          rwx        rwx</p><p>数字表示  421          421        421</p><p>权限分配  文件所有者     文件所属组   其他用户</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208162102394.png" alt=""></p></blockquote><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>-R</code>：递归修改指定目录下所有文件、子目录的权限</p></li></ul><p>#注：root用户基本上无论有没有权限，它都可以使用</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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">chmod</span> 777 sc <span class="comment"># 注：都有读写执行的权限</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">chmod</span> 700 sc <span class="comment"># 注：属主有读写执行的权限</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux home]# <span class="built_in">ls</span> -ld sanchuang<span class="comment"># 注：查看目录权限 ls -ld</span></span><br><span class="line">drwx------. 4 sanchuang sanchuang 122 11月  6 17:10 sanchuang</span><br><span class="line">[root@sanchuang-linux home]# <span class="built_in">chmod</span> 777 /home/sanchuang<span class="comment"># 注：都有读写执行的权限</span></span><br><span class="line">[root@sanchuang-linux home]# <span class="built_in">ls</span> -ld sanchuang</span><br><span class="line">drwxrwxrwx. 4 sanchuang sanchuang 122 11月  6 17:10 sanchuang</span><br><span class="line">[root@sanchuang-linux home]# <span class="built_in">chmod</span> 777 /home/sanchuang -R<span class="comment"># 注：-R：递归修改指定目录下所有文件、子目录的权限</span></span><br><span class="line">[root@sanchuang-linux home]# <span class="built_in">ls</span> -ld sanchuang</span><br><span class="line">drwxrwxrwx. 4 sanchuang sanchuang 122 11月  6 17:10 sanchuang</span><br><span class="line"><span class="comment">#注：用户的家目录下（如/home/sanchuang）授予所有对象读写执行权限，会造成普通用户sanchuang无法进行远程登录</span></span><br><span class="line"></span><br><span class="line">示例：root用户基本上无论有没有权限，它都可以使用</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">ls</span> -ld /etc/shadow</span><br><span class="line">---------- 1 root root 4201 11月  7 12:04 /etc/shadow</span><br><span class="line">[root@sanchuang-linux ~]# vim /etc/shadow</span><br></pre></td></tr></table></figure><hr><h2 id="十一-一般情况下普通用户只能在家目录下或者-tmp目录下创建文件或者文件夹">十一. 一般情况下普通用户只能在家目录下或者/tmp目录下创建文件或者文件夹<a class="header-anchor" href="#十一-一般情况下普通用户只能在家目录下或者-tmp目录下创建文件或者文件夹"></a></h2><p><strong>一般情况下普通用户只能在家目录下或者/tmp目录下创建文件或者文件夹</strong></p><p>#注：/tmp目录是一个临时目录，一般存放临时性的东西（如：程序运行中需要记录的一些东西，程序结束后把/tmp目录下的东西删掉）</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">[root@sanchuang-linux ~]# su - sanchuang</span><br><span class="line">上一次登录：五 11月  6 17:09:41 CST 2020pts/2 上</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld /</span><br><span class="line">dr-xr-xr-x. 38 root root 4096 11月  5 15:12 /</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld /etc</span><br><span class="line">drwxr-xr-x. 90 root root 8192 11月  7 15:00 /etc</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld ./<span class="comment"># 注：家目录下 创建文件或者文件夹</span></span><br><span class="line">drwxrwxrwx. 4 sanchuang sanchuang 122 11月  6 17:10 ./</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">ls</span> -ld /tmp<span class="comment"># 注：/tmp目录下 创建文件或者文件夹</span></span><br><span class="line">drwxrwxrwt. 12 root root 264 11月  7 10:36 /tmp</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：chmod  自己是属主的时候，才可以修改权限</span></span><br></pre></td></tr></table></figure><hr><h2 id="十二-chmod">十二. chmod<a class="header-anchor" href="#十二-chmod"></a></h2><p><strong>chmod</strong># 注：<strong>修改文件的归属权限</strong></p><p><strong>chmod使用，必须是文件的属主，才能改动文件的读写执行权限（root除外）</strong></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">[root@sanchuang-linux chenpeng]# su - sanchuang11<span class="comment"># 注：加 - 会自动到家目录下</span></span><br><span class="line">上一次登录：六 11月  7 15:10:51 CST 2020pts/0 上</span><br><span class="line">[sanchuang11@sanchuang-linux ~]$ <span class="built_in">exit</span></span><br><span class="line">注销</span><br><span class="line">[root@sanchuang-linux chenpeng]# su sanchuang11<span class="comment"># 注：不加 - 会在当前路径下</span></span><br><span class="line">[sanchuang11@sanchuang-linux chenpeng]$ </span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> 权限 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>15_Linux基础-用户与组2</title>
      <link href="/posts/43746.html"/>
      <url>/posts/43746.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-练习">一. 练习<a class="header-anchor" href="#一-练习"></a></h2><h3 id="1-1-如何知道一个用户是否在linux系统里存在？">1.1 如何知道一个用户是否在linux系统里存在？<a class="header-anchor" href="#1-1-如何知道一个用户是否在linux系统里存在？"></a></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></pre></td><td class="code"><pre><span class="line">1、如何知道一个用户是否在linux系统里存在？</span><br><span class="line"><span class="built_in">cat</span> /etc/passwd</span><br><span class="line">或者 <span class="built_in">id</span>命令</span><br></pre></td></tr></table></figure><h3 id="1-2-如何禁用一个用户登陆linux系统">1.2 如何禁用一个用户登陆linux系统<a class="header-anchor" href="#1-2-如何禁用一个用户登陆linux系统"></a></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></pre></td><td class="code"><pre><span class="line">2、如何禁用一个用户登陆linux系统</span><br><span class="line">使用usermod -L 锁定用户</span><br><span class="line">usermod -s /sbin/nologin root</span><br></pre></td></tr></table></figure><h3 id="1-3-如何知道一个用户属于哪些组">1.3 如何知道一个用户属于哪些组<a class="header-anchor" href="#1-3-如何知道一个用户属于哪些组"></a></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">3、如何知道一个用户属于哪些组</span><br><span class="line">使用<span class="built_in">id</span>命令查看</span><br><span class="line">使用<span class="built_in">groups</span>命令查看</span><br><span class="line">查看/etc/group里用户所属的组</span><br></pre></td></tr></table></figure><h3 id="1-4-如何知道哪些用户现在已经登录在linux里？-哪些用户曾经登陆过linux系统？">1.4 如何知道哪些用户现在已经登录在linux里？ 哪些用户曾经登陆过linux系统？<a class="header-anchor" href="#1-4-如何知道哪些用户现在已经登录在linux里？-哪些用户曾经登陆过linux系统？"></a></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><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">4、如何知道哪些用户现在已经登录在linux里？ 哪些用户曾经登陆过linux系统？</span><br><span class="line">使用w命令查看用户登录情况</span><br><span class="line">使用last命令查看曾经登录过的用户</span><br><span class="line">示例：w  <span class="built_in">who</span>  看当前登录的用户</span><br><span class="line"><span class="comment">#注：w看的更详细些</span></span><br><span class="line">[root@localhost ~]# w</span><br><span class="line"> 09:37:40 up  8:32,  5 <span class="built_in">users</span>,  load average: 0.00, 0.01, 0.05</span><br><span class="line">USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT</span><br><span class="line">root     tty1                      四09    6:28   0.09s  0.09s -bash</span><br><span class="line">root     pts/3    192.168.136.1    09:29    4.00s  0.05s  0.03s w</span><br><span class="line">[root@localhost ~]# <span class="built_in">who</span></span><br><span class="line">root     tty1         2020-11-05 09:31</span><br><span class="line">root     pts/3        2020-11-06 09:29 (192.168.136.1)</span><br></pre></td></tr></table></figure><h3 id="1-5-如何给用户重新设置密码">1.5 如何给用户重新设置密码<a class="header-anchor" href="#1-5-如何给用户重新设置密码"></a></h3><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">5、如何给用户重新设置密码</span><br><span class="line">passwd</span><br></pre></td></tr></table></figure><h3 id="1-6-linux的root密码忘记了怎么办">1.6 linux的root密码忘记了怎么办<a class="header-anchor" href="#1-6-linux的root密码忘记了怎么办"></a></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">6、linux的root密码忘记了怎么办</span><br><span class="line">  进入单用户模式</span><br><span class="line">      1、开机，按任意键停住启动界面，然后选择对应的内核，按 e 进行编辑</span><br><span class="line">      2、找到linux16这一行，在最后输入 rd.break</span><br><span class="line">      3、按 Ctrl-x 启动，然后按照以下操作破解 root 密码</span><br><span class="line">示例：忘记root用户密码怎么办？</span><br><span class="line">答：进入单用户模式</span><br></pre></td></tr></table></figure><p>​<a href="https://blog.csdn.net/qq_37960324/article/details/84589565">https://blog.csdn.net/qq_37960324/article/details/84589565</a><br>​<a href="https://www.cnblogs.com/jsjrj01/p/10301603.htm">https://www.cnblogs.com/jsjrj01/p/10301603.htm</a></p><h3 id="1-7-如何将已经登录在系统里的用户踢出去？并且防止它再次登陆？">1.7 如何将已经登录在系统里的用户踢出去？并且防止它再次登陆？<a class="header-anchor" href="#1-7-如何将已经登录在系统里的用户踢出去？并且防止它再次登陆？"></a></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">7、如何将已经登录在系统里的用户踢出去？并且防止它再次登陆？</span><br><span class="line">1.踢出可疑的root登录用户，马上修改密码 </span><br><span class="line">2.sshd---》/etc/hosts.deny hosts.allow --&gt;ip </span><br><span class="line">3./etc/ssh/sshd_config --&gt;DenyUsers --&gt;用户</span><br></pre></td></tr></table></figure><h3 id="1-8-怎么把普通用户变成root用户">1.8 怎么把普通用户变成root用户<a class="header-anchor" href="#1-8-怎么把普通用户变成root用户"></a></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></pre></td><td class="code"><pre><span class="line">8、怎么把普通用户变成root用户</span><br><span class="line">1.（不推荐）修改 /etc/passwd 文件，找到要修改的普通用户，把用户ID修改为 0</span><br><span class="line">2.<span class="built_in">sudo</span> 权限</span><br></pre></td></tr></table></figure><h3 id="1-9">1.9<a class="header-anchor" href="#1-9"></a></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><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">·  创建目录/tech/cali和/tech/sanle，分别用于保存个项目组中用户帐号的宿主目录；</span><br><span class="line">·  为两个项目组添加组帐号cali、sanle，GID号分别为1001、1002；为技术部添加组帐号tech，GID号为200；</span><br><span class="line">·  添加2个用户，分别为b1、b2，要求他们的基本组是cali，附加组是tech，宿主目录均使用/tech/cali目录中与帐号同名的文件夹（例如b1用户的宿主目录/tech/cali/b1）；其中b2用户帐号设置2012-12-31日后失效；</span><br><span class="line">·  添加2个用户，分别为a1、a2，要求他们的基本组是sanle，附加组是tech；宿主目录均使用/tech/sanle目录中与帐号同名的文件夹（例如a1用户的宿主目录/tech/cali/a1） ；其中a2用户帐号登录的shell为/bin/ksh</span><br><span class="line">所有新建用户密码都是123456；</span><br><span class="line"></span><br><span class="line">1、<span class="built_in">mkdir</span> -p  /tech/cali /tech/sanle</span><br><span class="line">2、groupadd -g 1001 cali  </span><br><span class="line">     groupadd -g 1002 sanle</span><br><span class="line">     groupadd -g 200 tech</span><br><span class="line">3、useradd -g cali -G tech -d /tech/cali/b1 b1</span><br><span class="line">     useradd -g cali -G tech -d /tech/cali/b2 -e 2020-11-6 b2</span><br><span class="line">4、useradd -g sanle -G tech -d /tech/sanle/a100 a1</span><br><span class="line">     useradd -g sable -G tech -d /tech/sanle/a200 -s /bin/ksh a2</span><br><span class="line">5、<span class="built_in">echo</span> 123456|passwd a1 --stdin</span><br><span class="line">     <span class="built_in">echo</span> 123456|passwd a2 --stdin</span><br><span class="line">----------------------------------------------------------------</span><br><span class="line">示例：过期账户不能登录</span><br><span class="line">-----------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# useradd -e <span class="string">&quot;2012-11-22&quot;</span> sanle3<span class="comment"># 注：过期账户不能登录</span></span><br><span class="line">[root@sanchuang-linux ~]# su - sanle3<span class="comment"># 注：可以切换，不能登录</span></span><br><span class="line">[sanle3@sanchuang-linux ~]$ </span><br></pre></td></tr></table></figure><hr><h2 id="二-etc-group文件">二. /etc/group文件<a class="header-anchor" href="#二-etc-group文件"></a></h2><p><strong>/etc/group文件</strong></p><p>#注：/etc 存放配置文件的地方</p><p><strong>/etc/group文件</strong># 注：可以查看<strong>哪些账户的次要组是</strong></p><p>组帐号：</p><ul class="lvl-0"><li class="lvl-2"><p>主要组(私有组)</p></li><li class="lvl-2"><p>次要组(附属组)</p></li></ul><p>GID：（Group Identify，组标识号）</p><p><strong>Linux组帐号</strong></p><ul class="lvl-0"><li class="lvl-2"><p>主要组(私有组)</p></li></ul><p>与用户相关的默认组，在/etc/passwd文件的第四个字段定义</p><ul class="lvl-0"><li class="lvl-2"><p>次要组(附属组)</p></li></ul><p>用户可以同时属于其他的组，在/etc/group文件的第四个字段定义</p><p><code>用户的主要组的名称和GID相关</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# useradd -g sanchuang4 -G sanchuang5 sanchuang10</span><br><span class="line">[root@sanchuang-linux ~]# useradd -g sanchuang4 -G sanchuang5 sanchuang12</span><br><span class="line">[root@sanchuang-linux ~]# useradd -g sanchuang5 -G sanchuang4 sanchuang13</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> /etc/group</span><br><span class="line">sanchuang4:x:1100:sanchuang13<span class="comment"># 注：只显示次要组的组成员列表</span></span><br><span class="line">sanchuang5:x:1200:sanchuang10,sanchuang12<span class="comment"># 注：只显示次要组的组成员列表</span></span><br><span class="line"><span class="comment">#注：组账号名：sanchuang5；GID：1200；组成员列表sanchuang10,sanchuang12</span></span><br><span class="line"><span class="comment">#注：只显示次要组的组成员列表</span></span><br><span class="line">===========================================================================================================</span><br><span class="line">示例：怎样查看一个组里有哪些用户</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：联系2个文件 /etc/passwd /etc/group</span></span><br><span class="line">[root@sanchuang-linux ~]# awk -F: <span class="string">&#x27;/sanchuang5/&#123;print $3,$4&#125;&#x27;</span> /etc/group</span><br><span class="line">1200 sanchuang10,sanchuang12<span class="comment"># 注：模糊匹配，匹配包含sanchuang5的行</span></span><br><span class="line">[root@sanchuang-linux ~]# awk -F: <span class="string">&#x27;$1==&quot;sanchuang5&quot;&#123;print $3,$4&#125;&#x27;</span> /etc/group<span class="comment"># 注：加引号</span></span><br><span class="line">1200 sanchuang10,sanchuang12<span class="comment"># 注：精确匹配</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# vim group_member.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line">group_name=<span class="variable">$1</span>           <span class="comment">#注：组名作为参数</span></span><br><span class="line"><span class="comment">#/etc/group获取它的GID和成员列表</span></span><br><span class="line">group_msg=`awk -F: -v group_awk=<span class="variable">$group_name</span> <span class="string">&#x27;$1==group_awk&#123;print $3,$4&#125;&#x27;</span> /etc/group`</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$group_msg</span> <span class="comment">#注：-v选项 向awk传递shell变量 指定外部$group_name赋给awk内部变量 运行的时候用自定义的变量</span></span><br><span class="line">[root@sanchuang-linux ~]# sh group_member.sh sanchuang5</span><br><span class="line">1200 sanchuang10,sanchuang12</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=<span class="string">&#x27;1200 sanchuang10,sanchuang12&#x27;</span></span><br><span class="line">[root@sanchuang-linux ~]# s1=(a b c d e)</span><br><span class="line">[root@sanchuang-linux ~]# s2=(<span class="variable">$a</span>)<span class="comment"># 注：转化为数组</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$s2</span></span><br><span class="line">1200</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$s2</span>[@]</span><br><span class="line">1200[@]</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;s2[@]&#125;</span><span class="comment"># 注：获取数组里全部元素</span></span><br><span class="line">1200 sanchuang10,sanchuang12</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;#s2[@]&#125;</span><span class="comment"># 注：获取数组长度</span></span><br><span class="line">2</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;#s2&#125;</span><span class="comment"># 注：获取第一个元素 字符的长度</span></span><br><span class="line">4</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;s2[0]&#125;</span><span class="comment"># 注：获取数组里第一个元素</span></span><br><span class="line">1200</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;s2[1]&#125;</span><span class="comment"># 注：获取数组里第二个元素</span></span><br><span class="line">sanchuang10,sanchuang12</span><br><span class="line">-----------------------------------------</span><br><span class="line">group_name=<span class="variable">$1</span>           <span class="comment">#注：组名作为参数</span></span><br><span class="line"><span class="comment">#/etc/group获取它的GID和成员列表</span></span><br><span class="line">group_msg=`awk -F: -v group_awk=<span class="variable">$group_name</span> <span class="string">&#x27;$1==group_awk&#123;print $3,$4&#125;&#x27;</span> /etc/group`</span><br><span class="line"><span class="comment">#注：-v选项 向awk传递shell变量 指定外部$group_name赋给awk内部变量 运行的时候用自定义的变量</span></span><br><span class="line"><span class="comment">#注：获取数组里第一个元素</span></span><br><span class="line">group_lst=(<span class="variable">$group_msg</span>)  <span class="comment">#注：转变成数组</span></span><br><span class="line">group_id=<span class="variable">$&#123;group_lst[0]&#125;</span><span class="comment"># 注：gid</span></span><br><span class="line">group_user_1=<span class="variable">$&#123;group_lst[1]&#125;</span><span class="comment"># 注：该组（次要组）成员</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# vim group_member.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line">  </span><br><span class="line">group_name=<span class="variable">$1</span>           <span class="comment">#注：组名作为参数</span></span><br><span class="line"><span class="comment">#/etc/group获取它的GID和成员列表</span></span><br><span class="line">group_msg=`awk -F: -v group_awk=<span class="variable">$group_name</span> <span class="string">&#x27;$1==group_awk&#123;print $3,$4&#125;&#x27;</span> /etc/group`</span><br><span class="line"><span class="comment">#注：-v选项 向awk传递shell变量 指定外部$group_name赋给awk内部变量 运行的时候用自定义的变量</span></span><br><span class="line"><span class="comment">#注：获取数组里第一个元素</span></span><br><span class="line">group_lst=(<span class="variable">$group_msg</span>)  <span class="comment">#注：转变成数组</span></span><br><span class="line">group_id=<span class="variable">$&#123;group_lst[0]&#125;</span></span><br><span class="line">group_user_1=<span class="variable">$&#123;group_lst[1]&#125;</span></span><br><span class="line"><span class="comment">#注：获取/etc/passwd 主要组 成员；tr &quot;\n&quot; &quot;,&quot; 指定分隔符为,；过滤出 $4==group_id 的行</span></span><br><span class="line">group_user_2=`awk -F: -v group_id=<span class="variable">$group_id</span> <span class="string">&#x27;$4==group_id&#123;print $1&#125;&#x27;</span> /etc/passwd|<span class="built_in">tr</span> <span class="string">&quot;\n&quot;</span> <span class="string">&quot;,&quot;</span>`</span><br><span class="line"><span class="built_in">echo</span> $group_user_2<span class="variable">$group_user_1</span><span class="comment"># 注：直接拼接 不需要加“+”号</span></span><br><span class="line">[root@sanchuang-linux ~]# sh group_member.sh sanchuang5</span><br><span class="line">sanchuang13,sanchuang10,sanchuang12</span><br><span class="line">--------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> /etc/passwd</span><br><span class="line">sanchuang13:x:1034:1200::/home/sanchuang13:/bin/bash<span class="comment"># 注：gid 位置 $4</span></span><br><span class="line">===========================================================================================================</span><br><span class="line">总结：查看组中有哪些成员</span><br><span class="line"><span class="comment">#shell与awk参数传递：</span></span><br><span class="line">https://blog.csdn.net/imzoer/article/details/8738581</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> group_member2.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">group_name=<span class="variable">$1</span></span><br><span class="line">group_msg=`awk -F: -v group_awk=<span class="variable">$group_name</span> <span class="string">&#x27;$1==group_awk&#123;print $3,$4&#125;&#x27;</span> /etc/group`</span><br><span class="line">group_lst=(<span class="variable">$group_msg</span>)<span class="comment"># 注：awk -v 选项  定义参数，把变量传递给awk</span></span><br><span class="line">group_id=<span class="variable">$&#123;group_lst[0]&#125;</span><span class="comment"># 注：()括起来 把字符变成一个数组，默认以空格分割，获取1,2元素</span></span><br><span class="line">group_user_1=<span class="variable">$&#123;group_lst[1]&#125;</span></span><br><span class="line">group_user_2=`awk -F: -v group_id=<span class="variable">$group_id</span> <span class="string">&#x27;$4==group_id&#123;print $1&#125;&#x27;</span> /etc/passwd| <span class="built_in">tr</span> <span class="string">&quot;\n&quot;</span> <span class="string">&quot;,&quot;</span>`</span><br><span class="line"><span class="built_in">echo</span> $group_user_2<span class="variable">$group_user_1</span><span class="comment"># 注：把换行符换成逗号</span></span><br><span class="line">[root@sanchuang-linux ~]# sh group_member2.sh sanchuang5</span><br><span class="line">sanchuang13,sanchuang10,sanchuang12</span><br><span class="line"></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">命令行</span><br><span class="line">[root@sanchuang-linux ~]# less /etc/group</span><br><span class="line">sanchuang5:x:1200:sanchuang10,sanchuang12</span><br><span class="line">[root@sanchuang-linux ~]# awk -F: <span class="string">&#x27;$1==&quot;sanchuang5&quot;&#123;print $3&#125;&#x27;</span> /etc/group</span><br><span class="line">1200<span class="comment"># 注：加引号，表示一个字符串</span></span><br><span class="line">[root@sanchuang-linux ~]# awk -F: <span class="string">&#x27;$1==&quot;sanchuang5&quot;&#123;print $3,$4&#125;&#x27;</span> /etc/group</span><br><span class="line">1200 sanchuang10,sanchuang12<span class="comment"># 注：组id附属组的成员</span></span><br><span class="line">[root@sanchuang-linux ~]# awk -F: <span class="string">&#x27;$4==1200&#123;print $1&#125;&#x27;</span> /etc/passwd</span><br><span class="line">sanchuang13<span class="comment"># 注：获取的是  为主要组时 成员的用户名（默认换行分割）</span></span><br><span class="line">group_user_2=`awk -F: -v group_id=<span class="variable">$group_id</span> <span class="string">&#x27;$4==group_id&#123;print $1&#125;&#x27;</span> /etc/passwd| <span class="built_in">tr</span> <span class="string">&quot;\n&quot;</span> <span class="string">&quot;,&quot;</span>`</span><br><span class="line"><span class="comment">#注：把换行符换成逗号</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">字符串截取<span class="comment"># 注：不准确，gid可能5位</span></span><br><span class="line">[root@sanchuang-linux ~]# result=`awk -F: <span class="string">&#x27;$1==&quot;sanchuang5&quot;&#123;print $3,$4&#125;&#x27;</span> /etc/group`</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;result:0:4&#125;</span></span><br><span class="line">1200</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;result#* &#125;</span></span><br><span class="line">sanchuang10,sanchuang12</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;result:5&#125;</span></span><br><span class="line">sanchuang10,sanchuang12</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;result%% *&#125;</span></span><br><span class="line">1200</span><br><span class="line">---------------------------</span><br><span class="line">字符串截取：</span><br><span class="line"><span class="comment">#字符串操作</span></span><br><span class="line">line=`<span class="built_in">head</span> -n1 /etc/passwd`</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;字符串为：<span class="variable">$line</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;字符串为：$line&#x27;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;截取前4个字符:&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line:0:4&#125;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;截取后9个字符:&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line:0-9&#125;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从倒数第九个字符开始截取4个字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line:0-9:4&#125;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从左向右截取最后一个:后的字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line##*:&#125;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从左向右截取第一个:后的字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line#*:&#125;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从右向左截取最后一个:后的字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line%%:*&#125;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从右向左截取第一个:后的字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line%:*&#125;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;字符串长度&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;#line&#125;</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="keyword">for</span>循环获取</span><br><span class="line">[root@sanchuang-linux lianxi]# vim user.sh</span><br><span class="line">result=`awk -F: <span class="string">&#x27;$1==&quot;sanchuang5&quot;&#123;print $3,$4&#125;&#x27;</span> /etc/group`</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="variable">$result</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@sanchuang-linux lianxi]# bash user.sh </span><br><span class="line">1200</span><br><span class="line">sanchuang10,sanchuang12</span><br><span class="line">[root@sanchuang-linux ~]# result=`awk -F: <span class="string">&#x27;$1==&quot;sanchuang5&quot;&#123;print $3,$4&#125;&#x27;</span> /etc/group`</span><br><span class="line">------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="keyword">for</span> i <span class="keyword">in</span> <span class="variable">$result</span>; <span class="keyword">do</span> <span class="built_in">echo</span> <span class="variable">$i</span>; <span class="keyword">done</span></span><br><span class="line">1200</span><br><span class="line">sanchuang10,sanchuang12</span><br></pre></td></tr></table></figure><hr><h2 id="三-group操作">三. group操作<a class="header-anchor" href="#三-group操作"></a></h2><h3 id="3-1-groupadd-groupdel">3.1 groupadd  groupdel<a class="header-anchor" href="#3-1-groupadd-groupdel"></a></h3><p><strong>groupadd命令</strong></p><p>格式：<code>groupadd [-g GID]组帐号名</code></p><p><strong>groupdel命令</strong></p><p>格式：<code>groupdel 组帐号名</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></pre></td><td class="code"><pre><span class="line">示例：groupadd  groupdel</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# groupadd -g 5000 sanle<span class="comment"># 注：创建gid为5000的sanle组</span></span><br><span class="line">[root@sanchuang-linux ~]# less /etc/group<span class="comment">#↑注：添加组账号sanle</span></span><br><span class="line">sanle:x:5000:</span><br><span class="line">[root@sanchuang-linux ~]# groupdel sanle<span class="comment"># 注：删除组账号sanle</span></span><br><span class="line">[root@sanchuang-linux ~]# less /etc/group<span class="comment"># 注：没有了</span></span><br></pre></td></tr></table></figure><h3 id="3-2-groupmod-newgrp">3.2 groupmod  newgrp<a class="header-anchor" href="#3-2-groupmod-newgrp"></a></h3><p><strong>groupmod命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>用途：设置组名和组id</p></li><li class="lvl-2"><p>格式：<code>groupmod [选项]...组帐号名</code></p></li></ul><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p>-n：修改组名</p></li><li class="lvl-2"><p>-g：修改组id</p></li></ul><p><strong>newgrp改变有效组</strong></p><ul class="lvl-0"><li class="lvl-2"><p>用户必须是要改变组的成员</p></li></ul><p><strong>有效组：（用的很少）</strong><br>新建文件或者文件夹的时候，使用的gid<br>gid使用哪个组，哪个就是有效组</p><p>当前用户新建文件或者文件夹的时候，默认使用的gid对应的组 就是有效组</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></pre></td><td class="code"><pre><span class="line">示例：newgrp改变有效组</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux lianxi]# ll<span class="comment"># 注：ll查看目录详细信息</span></span><br><span class="line">-rw-r--r--. 1 root root      86 9月  25 14:23 abcd.txt</span><br><span class="line">-rw-r--r--. 1 root root     158 9月  25 09:47 backup_log.sh</span><br><span class="line"><span class="comment">#注：第一个root是文件的 属主</span></span><br><span class="line"><span class="comment">#注：第二个root是文件的 属组</span></span><br><span class="line">---------------------------------------------------</span><br><span class="line">[root@sanchuang-linux lianxi]# newgrp sanchuang4</span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">touch</span> aa</span><br><span class="line">[root@sanchuang-linux lianxi]# ll</span><br><span class="line">-rw-r--r--  1 root sanchuang4       0 11月  6 11:25 bb<span class="comment"># 注：属组发生改变</span></span><br><span class="line">---------------------------------------------------</span><br><span class="line">[root@sanchuang-linux lianxi]# su - sanchuang10</span><br><span class="line">[root@sanchuang-linux lianxi]# <span class="built_in">touch</span> cc</span><br><span class="line">[sanchuang10@sanchuang-linux ~]$ ll</span><br><span class="line">总用量 0</span><br><span class="line">-rw-r--r-- 1 sanchuang10 sanchuang4 0 11月  6 11:27 cc</span><br><span class="line">[sanchuang10@sanchuang-linux ~]$ newgrp sanchuang<span class="comment"># 注：普通用户想切换有效组，有效组里面必须有这个普通用户</span></span><br><span class="line">密码：</span><br><span class="line">newgrp: failed to crypt password with previous salt: 无效的参数</span><br><span class="line"><span class="comment">#注：普通用户想切换有效组，有效组里面必须有这个普通用户</span></span><br></pre></td></tr></table></figure><h3 id="3-3-Linux组帐号">3.3 Linux组帐号<a class="header-anchor" href="#3-3-Linux组帐号"></a></h3><p><strong>Linux组帐号</strong></p><ul class="lvl-0"><li class="lvl-2"><p>主要组(私有组)</p></li></ul><p>与用户相关的默认组，在/etc/passwd文件的第四个字段定义</p><ul class="lvl-0"><li class="lvl-2"><p>次要组(附属组)</p></li></ul><p>用户可以同时属于其他的组，在/etc/group文件的第四个字段定义</p><p><code>用户的主要组的名称和GID相关</code></p><hr><h2 id="四-gpasswd命令">四. gpasswd命令<a class="header-anchor" href="#四-gpasswd命令"></a></h2><p><strong>gpasswd命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>用途：设置组帐号密码（极少用）、添加/删除组成员</p></li><li class="lvl-2"><p>格式：<code>gpasswd [选项]... 组帐号名</code></p></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">示例：删除组成员root</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# gpasswd -d root market</span><br><span class="line">正在将用户“root”从“market”组中删除</span><br><span class="line"></span><br><span class="line">示例：设置组账号密码</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# gpasswd sanchuang</span><br><span class="line">正在修改 sanchuang 组的密码</span><br><span class="line">新密码：</span><br><span class="line">请重新输入新密码：</span><br><span class="line">[root@sanchuang-linux ~]# </span><br></pre></td></tr></table></figure><hr><h2 id="五-linux加密">五. linux加密<a class="header-anchor" href="#五-linux加密"></a></h2><p>Linux加密</p><p>默认采用sha512算法</p><p>采用哈希算法–》散列值求取</p><p>​把任意长度的输入，映射成固定长度的输出，该输出就是散列值</p><p>​是一种单向加密技术</p><p>hash算法：md5  sha1  sha2  sha256  sha512</p><p><strong>如何判定密码正确？</strong></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><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></pre></td><td class="code"><pre><span class="line">示例：md5sum</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># echo &quot;123456&quot;|md5sum # 注：md5sum也是一种哈希算法</span></span><br><span class="line">f447b20a7fcbf53a5d5be013ea0b15af  -<span class="comment"># 注：无论给的是 都会返回特点长度的输出</span></span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># echo &quot;123456xyzzzzz&quot;|md5sum # 注：单向加密的算法</span></span><br><span class="line">bcdd6694d1ece311bd7bd668da54b9b9  -</span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># echo &quot;xxxxxxxxxxxxxxxxxxxxxxxx&quot;|md5sum</span></span><br><span class="line">7373d8394616d74ba2c42402266ae3aa  -</span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux tmp]<span class="comment"># md5sum douban# 注：对文件进行加密</span></span><br><span class="line">816ba8dd29e68f3450d8748096227d42  douban<span class="comment"># 注：对任意文件的输入，都会有对应长度的输出</span></span><br><span class="line">[root@sanchuang-linux tmp]<span class="comment"># md5sum sucai8</span></span><br><span class="line">9a44802fc09e1b84dc94740c40aa6450  sucai8</span><br><span class="line"></span><br><span class="line">示例：撞库 加盐</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：撞库</span></span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># echo &quot;123456&quot;|md5sum# 注：加密字符串相同，输出的散列值相同</span></span><br><span class="line">f447b20a7fcbf53a5d5be013ea0b15af  -</span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># echo &quot;123456&quot;|md5sum</span></span><br><span class="line">f447b20a7fcbf53a5d5be013ea0b15af  -</span><br><span class="line"><span class="comment">#注：加盐# 注：提高密码安全性</span></span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># echo &quot;123456xndfoaei242&quot;|md5sum# 注：xndfoaei242 盐值</span></span><br><span class="line">15465f7aa2929cca95ed7efb97ffeba0  -</span><br><span class="line"></span><br><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">root:$<span class="number">6</span>$i4J5vzOUIMpchLRj$nTCbYWgA5cpv34Set6R2ZmC1AYYHGHnQafNbA9fkFsTR0E9GG1BJP5o3OTMuC4kGUqsomCI/G8FdEVELI/aeq0::<span class="number">0</span>:<span class="number">99999</span>:<span class="number">7</span>:::</span><br><span class="line"></span><br><span class="line">密码字段：$加密算法<span class="built_in">id</span>$盐值$真正的密文</span><br><span class="line">加密底层使用内核的crypt函数实现</span><br><span class="line"></span><br><span class="line">python实现（sha512）</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">import</span> crypt</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>crypt.crypt(<span class="string">&#x27;123456&#x27;</span>,<span class="string">&#x27;$6$i4J5vzOUIMpchLRj&#x27;</span>)<span class="comment"># 注：$加密算法id$盐值，密文和上面相同</span></span><br><span class="line"><span class="string">&#x27;$6$i4J5vzOUIMpchLRj$nTCbYWgA5cpv34Set6R2ZmC1AYYHGHnQafNbA9fkFsTR0E9GG1BJP5o3OTMuC4kGUqsomCI/G8FdEVELI/aeq0&#x27;</span><span class="comment"># 注：与上面的密文一样</span></span><br><span class="line">-----------------------------------------</span><br><span class="line">$<span class="number">6</span> 代表sha512算法</span><br><span class="line">$i4J5vzOUIMpchLRj 盐值</span><br><span class="line">$nTCbYWgA5cpv……aeq0 真正的密文</span><br><span class="line"></span><br><span class="line">哈希算法用途：用来判定文件md5值是否改变</span><br></pre></td></tr></table></figure><hr><h2 id="六-etc-login-defs文件">六. /etc/login.defs文件<a class="header-anchor" href="#六-etc-login-defs文件"></a></h2><p><strong>/etc/login.defs文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>对账户初始的属性设置</p></li><li class="lvl-2"><p>设置普通用户的UID和GID范围等</p></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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">[root@sanchuang-linux ~]# vim /etc/login.defs </span><br><span class="line">MAIL_DIR        /var/spool/mail<span class="comment"># 注：设置默认地址</span></span><br><span class="line">PASS_MAX_DAYS   99999<span class="comment"># 注：密码的过期天数</span></span><br><span class="line">PASS_MIN_DAYS   0</span><br><span class="line">PASS_MIN_LEN    5</span><br><span class="line">PASS_WARN_AGE   7</span><br><span class="line">UID_MIN                  1000</span><br></pre></td></tr></table></figure><hr><h2 id="七-useradd命令在后台到底做了哪些工作">七. useradd命令在后台到底做了哪些工作?<a class="header-anchor" href="#七-useradd命令在后台到底做了哪些工作"></a></h2><blockquote><p><strong>useradd命令在后台到底做了哪些工作?</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208130132822.png" alt=""></p></blockquote><hr><h2 id="八-etc-skel-文件">八. /etc/skel/*文件<a class="header-anchor" href="#八-etc-skel-文件"></a></h2><p>*<em>/etc/skel/<em>文件</em></em></p><ul class="lvl-0"><li class="lvl-2"><p>新建用户帐号时，复制到用户宿主目录中</p></li></ul><p><strong>主要控制用户初始配置文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>bash_profile</code>：用户<strong>每次登录</strong>时执行</p></li><li class="lvl-2"><p><code>bashrc</code>：   每次进入<strong>新的Bash</strong>环境时执行</p></li><li class="lvl-2"><p><code>bash_logout</code>：用户每次<strong>退出登录</strong>时执行</p></li><li class="lvl-2"><p><code>bash_history</code> ：   记录存放<strong>上次注销前</strong>使用的历史命令</p></li></ul><p><em>登陆的时候：</em><br>.bash_profile<br>~/.bash_profile --&gt; ~/.bashrc --&gt; <strong>/etc/bashrc</strong></p><p><strong>进入新bash环境</strong>：<br>~/.bashrc --&gt; <strong>/etc/bashrc</strong></p><p>--------------------------------------------------------------------------------------------</p><p>#注：<strong>登录的时候都会执行 .bash_profile</strong></p><p>#注：登录的时候都会执行 .bashrc# 注：<strong>.bash_profile里面调用了.bashrc</strong></p><p>#注：登录的时候 <strong>先执行.bash_profile，.bash_profile里面调用了.bashrc</strong></p><p>#注：进入了一个<strong>新的bash环境，执行.bashrc</strong></p><p>#注：到<strong>新bash环境下，执行了.bashrc，不执行.bash_profile。登录时执行.bash_profile</strong></p><p><strong>用户环境设置</strong></p><p>#注：/etc/bashrc  系统用户的环境设置，别名设置，其他的函数</p><p>/etc/bashrc  相当于全局配置，此文件只能root用户修改# 注：/etc/bashrc 只有root用户才能修改</p><p>~/.bashrc    个人配置，个性化配置，自己家目录下有权限修改# 注：家目录下的.bashrc文件</p><p><strong>/etc/profile</strong>系统全局用户环境配置</p><p><strong>~/.bash_profile</strong>个人配置</p><p>原因：</p><p>全局配置，影响所有用户。</p><p>家目录下配置，影响当前用户。</p><p><strong>/etc/目录下的环境配置修改，属于全局配置，家目录下属于个人用户配置</strong></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></pre></td><td class="code"><pre><span class="line">示例：家目录下配置</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# less .bash_profile </span><br><span class="line"><span class="comment"># .bash_profile</span></span><br><span class="line"><span class="keyword">if</span> [ -f /etc/bashrc ]; <span class="keyword">then</span><span class="comment"># 注：判断有没有 /etc/bashrc，有就在当前执行/etc/bashrc</span></span><br><span class="line">        . /etc/bashrc<span class="comment"># 注：/etc/bashrc 执行初始化的用户环境设置</span></span><br><span class="line"><span class="keyword">fi</span><span class="comment"># 注：用. 去执行，. 代表当前bash</span></span><br><span class="line">PATH=<span class="variable">$PATH</span>:<span class="variable">$HOME</span>/bin</span><br><span class="line"></span><br><span class="line"><span class="built_in">export</span> PATH</span><br><span class="line"></span><br><span class="line">[root@localhost ~]# less .bashrc </span><br><span class="line"><span class="comment"># .bashrc</span></span><br><span class="line"><span class="built_in">alias</span> <span class="built_in">rm</span>=<span class="string">&#x27;rm -i&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> <span class="built_in">cp</span>=<span class="string">&#x27;cp -i&#x27;</span></span><br><span class="line"><span class="built_in">alias</span> <span class="built_in">mv</span>=<span class="string">&#x27;mv -i&#x27;</span></span><br><span class="line"><span class="keyword">if</span> [ -f /etc/bashrc ]; <span class="keyword">then</span></span><br><span class="line">        . /etc/bashrc<span class="comment"># 注：最终执行的是这个文件</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">which</span> <span class="built_in">ls</span><span class="comment"># 注：ls执行的是/usr/bin/ls，通过PATH环境变量从前往后找</span></span><br><span class="line"><span class="built_in">alias</span> <span class="built_in">ls</span>=<span class="string">&#x27;ls --color=auto&#x27;</span></span><br><span class="line">/usr/bin/ls</span><br><span class="line"></span><br><span class="line">============================================================================================</span><br><span class="line">示例：/etc/skel/*文件</span><br><span class="line"><span class="comment">#注：新建用户帐号时，复制到用户宿主目录中</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /etc/skel/</span><br><span class="line">[root@sanchuang-linux skel]# <span class="built_in">ls</span> -al</span><br><span class="line">总用量 24</span><br><span class="line">drwxr-xr-x.  2 root root   62 9月  16 13:23 .</span><br><span class="line">drwxr-xr-x. 90 root root 8192 11月  6 15:15 ..</span><br><span class="line">-rw-r--r--.  1 root root   18 11月  9 2019 .bash_logout</span><br><span class="line">-rw-r--r--.  1 root root  141 11月  9 2019 .bash_profile</span><br><span class="line">-rw-r--r--.  1 root root  312 11月  9 2019 .bashrc</span><br><span class="line"></span><br><span class="line">============================================================================================</span><br><span class="line">示例：.bash_history 记录存放上次注销前使用的历史命令</span><br><span class="line">.bash_history  存放当前用户的命令历史，第一次登录用户，操作命令的时候，不会生成此文件</span><br><span class="line">第一次登陆退出后会自动将内存里的历史记录写到.bash_history文件里</span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">history</span><span class="comment">#注：history只是查看当前用户的命令历史</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#注：用户退出时，命令历史才会写入.bash_history</span></span><br><span class="line"><span class="comment">#注：新建用户时，不会生成.bash_history文件，只有退出后 再次登录 才会生成.bash_history文件</span></span><br><span class="line"><span class="comment">#注：不是所有的命令都写入history，不是很准确</span></span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> .bash_history <span class="comment"># 注：在当前用户的家目录下查看.bash_history文件</span></span><br></pre></td></tr></table></figure><hr><h2 id="九-每次登录或退出sanchuang的时候，打印日志到-tmp-sanchuang-log">九. 每次登录或退出sanchuang的时候，打印日志到/tmp/sanchuang_log<a class="header-anchor" href="#九-每次登录或退出sanchuang的时候，打印日志到-tmp-sanchuang-log"></a></h2><p><strong>每次登录或退出sanchuang的时候，打印日志到/tmp/sanchuang_log</strong></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></pre></td><td class="code"><pre><span class="line">步骤</span><br><span class="line">1.在sanchuang用户下，修改.bash_profile文件，添加<span class="comment"># 注：因为每次登陆都会先执行这个文件</span></span><br><span class="line">now_date=`<span class="built_in">date</span>`</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$now_date</span><span class="string">&quot;login...&quot;</span> &gt;&gt; /tmp/sanchuang_log</span><br><span class="line">2.在sanchuang用户下，修改.bash_logout文件，添加<span class="comment"># 注：因为每次退出时都会执行这个文件</span></span><br><span class="line">now_date=`<span class="built_in">date</span>`</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$now_date</span><span class="string">&quot;logout...&quot;</span> &gt;&gt; /tmp/sanchuang_log</span><br><span class="line">3.监控文件变化，新增末尾行<span class="comment"># 注：经常用 tail -f 监控文件</span></span><br><span class="line">$ <span class="built_in">tail</span> -f /tmp/sanchuang_log<span class="comment"># 注：tail -f监控文件末尾的变化（新增的末尾行）</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><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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux <span class="built_in">log</span>]# su - sanchuang<span class="comment"># 注：普通用户  在自己的家目录下操作</span></span><br><span class="line">上一次登录：五 11月  6 14:59:23 CST 2020pts/1 上</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ vim ~/.bash_profile <span class="comment"># 注：家目录下的.bash_profile操作</span></span><br><span class="line">now_date=`<span class="built_in">date</span>`</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$now_date</span><span class="string">&quot;login...&quot;</span> &gt;&gt; /tmp/sanchuang_log</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">tail</span> -f /tmp/sanchuang_log<span class="comment"># 注：tail -f监控文件末尾的变化</span></span><br><span class="line">2020年 11月 06日 星期五 15:05:26 CSTlogin...</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ vim ~/.bash_logout </span><br><span class="line">now_date=`<span class="built_in">date</span>`</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$now_date</span><span class="string">&quot;logout...&quot;</span> &gt;&gt; /tmp/sanchuang_log</span><br><span class="line">[sanchuang@sanchuang-linux ~]$ <span class="built_in">tail</span> -f /tmp/sanchuang_log<span class="comment"># 注：tail -f监控文件末尾的变化</span></span><br><span class="line">2020年 11月 06日 星期五 15:05:26 CSTlogin...</span><br><span class="line">2020年 11月 06日 星期五 15:07:33 CSTlogout...</span><br></pre></td></tr></table></figure><hr><h2 id="十-Shell启动配置文件的区别">十. Shell启动配置文件的区别<a class="header-anchor" href="#十-Shell启动配置文件的区别"></a></h2><p><strong>Shell启动配置文件的区别</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>/etc/profile</strong>：     配置全局环境变量，影响所有用户</p></li><li class="lvl-3"><p><strong>~/.bash_profile</strong> ： 配置个人环境，影响一个用户</p></li><li class="lvl-2"><p><strong>/etc/bashrc</strong> ：        配置全局的别名或者shell选项，影响所有用户</p></li><li class="lvl-2"><p>**~/.bashrc **：        配置个人别名或者shell选项，影响一个用户</p></li></ul><hr><h2 id="十一-bash-history">十一. .bash_history<a class="header-anchor" href="#十一-bash-history"></a></h2><p><strong>.bash_history</strong></p><p>存放当前用户的命令历史，第一次登录用户，操作命令的时候，不会生成此文件</p><p>第一次登陆退出后会自动将内存里的历史记录写到.bash_history文件里</p><hr><h2 id="十二-bash的启动脚本初始化">十二. bash的启动脚本初始化<a class="header-anchor" href="#十二-bash的启动脚本初始化"></a></h2><blockquote><p><strong>bash的启动脚本初始化</strong></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208130144863.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202208130144897.png" alt=""></p></blockquote><hr><h2 id="十三-用户和组账户查询">十三. 用户和组账户查询<a class="header-anchor" href="#十三-用户和组账户查询"></a></h2><p><strong>用户和组账户查询</strong></p><p><strong>id命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>用途：查询用户身份标识</p></li><li class="lvl-2"><p>格式：id [用户名]</p></li></ul><p><strong>who、w、users命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>用途：查询已登录到主机的用户信息</p></li></ul><p><strong>groups命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>用途:查询用户所属的组# 注：返回用户所属的 基本组和附加组</p></li></ul><p><strong>last、lastlog命令使用</strong></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></pre></td><td class="code"><pre><span class="line">示例：w  <span class="built_in">who</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# w<span class="comment"># 注：看的是你以哪个用户登录进来，而不是当前你切换到的用户</span></span><br><span class="line"> 15:26:24 up  6:11,  6 <span class="built_in">users</span>,  load average: 0.00, 0.01, 0.05</span><br><span class="line">USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT</span><br><span class="line">root     tty1     -                四15   58:07   0.07s  0.07s -bash<span class="comment"># 注：tty真实终端</span></span><br><span class="line">root     pts/0    192.168.0.42     14:28    0.00s  0.18s  0.01s w <span class="comment"># 注：远程登录pts虚拟终端</span></span><br><span class="line">root     pts/1    192.168.0.42     14:28   12:24   0.07s  0.01s -bash</span><br><span class="line"><span class="comment">#注：真实终端FORM为空</span></span><br><span class="line"><span class="comment">#注：虚拟终端显示的是物理机的ip地址</span></span><br><span class="line"><span class="comment">#注：WHAT当前环境做的事情</span></span><br><span class="line"><span class="comment">#注：15:26:24 当前时间</span></span><br><span class="line"><span class="comment">#注：6:11开机总时间</span></span><br><span class="line"><span class="comment">#注：6 users登录用户数量</span></span><br><span class="line"><span class="comment">#注：load average cpu平均负载，数值越大，机器越繁忙</span></span><br><span class="line">--------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">who</span><span class="comment"># 注：看的没有w详细</span></span><br><span class="line">root     tty1         2020-11-05 15:13</span><br><span class="line">root     pts/0        2020-11-06 14:28 (192.168.0.42)</span><br><span class="line">root     pts/1        2020-11-06 14:28 (192.168.0.42)</span><br><span class="line">------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">users</span><span class="comment"># 注：查看当前有哪些用户登录</span></span><br><span class="line">root root root root root root</span><br><span class="line">---------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">groups</span> sanchuang10<span class="comment"># 注：显示用户所属的基本组和附加组</span></span><br><span class="line">sanchuang10 : sanchuang4 sanchuang5</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">id</span> sanchuang10</span><br><span class="line">uid=1032(sanchuang10) gid=1100(sanchuang4) 组=1100(sanchuang4),1200(sanchuang5)</span><br><span class="line">--------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# last<span class="comment"># 注：查看之前有哪些用户登录过</span></span><br><span class="line">root     tty1                          Wed Sep 16 13:41 - 13:41  (00:00)</span><br><span class="line">root     pts/0        192.168.136.1    Wed Sep 16 13:29 - 13:40  (00:11)</span><br><span class="line">reboot   system boot  4.18.0-193.el8.x Wed Sep 16 13:26 - 13:42  (00:15)</span><br><span class="line">[root@sanchuang-linux ~]# lastlog <span class="comment"># 注：查看每一个用户的最近登录状态</span></span><br><span class="line">用户名           端口     来自             最后登陆时间</span><br><span class="line">root             pts/0                     五 11月  6 15:18:46 +0800 2020</span><br><span class="line">bin                                        **从未登录过**</span><br><span class="line">shutdown                                   **从未登录过**</span><br></pre></td></tr></table></figure><hr><h2 id="十四-终端设备名称">十四. 终端设备名称<a class="header-anchor" href="#十四-终端设备名称"></a></h2><p><strong>终端设备名称</strong></p><p>​名称  设备</p><p>​<strong>ttyn 虚拟控制台</strong></p><p>​<strong>pts/n   伪终端</strong></p><p>​<strong>:0      X服务器</strong></p><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> 用户与组 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>14_Linux基础-用户与组1</title>
      <link href="/posts/10588.html"/>
      <url>/posts/10588.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-练习">一. 练习<a class="header-anchor" href="#一-练习"></a></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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br></pre></td><td class="code"><pre><span class="line">示例1</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">menu</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;1、监控内存使用情况,如果内存使用率大于百分之80，给予提醒&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;2、扫描局域网ip,检查哪些ip地址正在使用&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;3、监控文件/etc/passwd是否被修改，每隔5分钟监控一次&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;4、监控nginx进程是否存在，不存在就给予相应提醒&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">option_1</span></span>()&#123;</span><br><span class="line">    total=`free -m|grep -i mem|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f2`</span><br><span class="line">    <span class="comment">#free=`free -m|grep -i mem|tr -s &quot; &quot;|cut -d &quot; &quot; -f4`</span></span><br><span class="line">    used=`free -m|grep -i mem|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f3`</span><br><span class="line">    used_rate=`<span class="built_in">echo</span> <span class="string">&quot;scale=4;<span class="variable">$used</span>/<span class="variable">$total</span>&quot;</span> |bc`</span><br><span class="line">    <span class="comment">#used_1=`echo &quot;$total*0.8&quot;|bc `</span></span><br><span class="line">    result=` <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$used_rate</span>&gt;0.8&quot;</span>|bc `</span><br><span class="line">    <span class="comment">#echo $result</span></span><br><span class="line">    <span class="keyword">if</span> (( <span class="variable">$result</span>  == <span class="number">1</span> ))</span><br><span class="line">    <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">echo</span> -e <span class="string">&quot;\e[31m使用率超过80%，请及时对内存扩容，以免不必要的损失\e[0m&quot;</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="built_in">echo</span>  <span class="string">&quot; nothing to do&quot;</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">option_2</span></span>()&#123;</span><br><span class="line">        <span class="keyword">for</span> ip <span class="keyword">in</span> `<span class="built_in">seq</span> 255`</span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">        ( ip_full=192.168.0.<span class="variable">$ip</span></span><br><span class="line">        ping -c 1 <span class="variable">$ip_full</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="variable">$ip_full</span> &gt;&gt;up.txt || <span class="built_in">echo</span> <span class="variable">$ip_full</span> &gt;&gt;down.txt</span><br><span class="line">        ) &amp;     <span class="comment"># 注：放到后台子进程执行</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line"><span class="built_in">wait</span> <span class="comment"># 父进程等待子进程执行完成之后再退出</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">option_3</span></span>()&#123;</span><br><span class="line">    check_num=`diff /etc/passwd /lianxi/passwd |<span class="built_in">wc</span> -l`</span><br><span class="line">    [[ check_num -eq 0 ]] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;文件未被修改&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;文件已被修改&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">option_4</span></span>()&#123;</span><br><span class="line">    pidof nginx &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;nginx is running&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;nginx is down&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">menu</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入你的选择:&quot;</span> option</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$option</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line">    option_1</span><br><span class="line">    ;;</span><br><span class="line">2)</span><br><span class="line">    option_2</span><br><span class="line">    ;;</span><br><span class="line">3)</span><br><span class="line">    option_3</span><br><span class="line">    ;;</span><br><span class="line">4)</span><br><span class="line">    option_4</span><br><span class="line">    ;;</span><br><span class="line">*)</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;请输入1-4&quot;</span></span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line">示例2：重复选择</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">重复选择</span><br><span class="line"><span class="keyword">while</span> : </span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;#########################&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;1.查看内存使用率&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;2.扫描局域网ip&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;3.查看文件是否被修改&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;4.查看nginx进程&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;5.退出&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;#########################&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> : </span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入你的选择:&quot;</span> options</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$options</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line">/root/shell/mem.sh</span><br><span class="line">;;</span><br><span class="line">2)</span><br><span class="line">/root/shell/scan_ip.sh</span><br><span class="line">;;</span><br><span class="line">3)</span><br><span class="line">/root/shell/passwd_test.sh</span><br><span class="line">;;</span><br><span class="line">4)</span><br><span class="line">/root/shell/ngnix_test.sh</span><br><span class="line">;;</span><br><span class="line">5)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;退出&quot;</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line">;;</span><br><span class="line">*)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;1-4&quot;</span></span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">示例3：使用awk获取</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$options</span> <span class="keyword">in</span></span><br><span class="line"></span><br><span class="line">1)</span><br><span class="line"><span class="function"><span class="title">memory_monitor</span></span>()&#123;</span><br><span class="line">total=`free -m |grep Mem |awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span>`</span><br><span class="line">used=`free -m |grep Mem |awk <span class="string">&#x27;&#123;print $3&#125;&#x27;</span>`</span><br><span class="line">use_rate=`<span class="built_in">echo</span> <span class="string">&quot;scale=2;<span class="variable">$used</span>/<span class="variable">$total</span>&quot;</span> |bc`</span><br><span class="line">result=`<span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$use_rate</span>&gt;0.8&quot;</span> |bc`</span><br><span class="line"><span class="keyword">if</span>(( <span class="variable">$result</span> == <span class="number">1</span> ))</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;内存使用率大于80%！！！&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;内存使用状态良好！&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line">memory_monitor</span><br><span class="line">;;</span><br></pre></td></tr></table></figure><hr><h2 id="二-user-group-用户与组">二. user group 用户与组<a class="header-anchor" href="#二-user-group-用户与组"></a></h2><h3 id="2-1-常见命令">2.1 常见命令<a class="header-anchor" href="#2-1-常见命令"></a></h3><p>id 查看<br>useradd 创建<br>userdel 删除<br>passwd 创建用户密码<br>su 切换用户<br><strong>usermod 更改用户信息</strong></p><h3 id="2-2-为什么要引入这个用户和组？">2.2 为什么要引入这个用户和组？<a class="header-anchor" href="#2-2-为什么要引入这个用户和组？"></a></h3><blockquote><p>1、安全性</p><p>2、权限管理</p><p>3、资源管控</p><p>对文件的访问，读写可以管控</p><p>对进程的管理 --&gt; 谁可以管理</p></blockquote><h3 id="2-3-用户和组">2.3 用户和组<a class="header-anchor" href="#2-3-用户和组"></a></h3><blockquote><p>每个用户有一个唯一的UID<br>每个组也有一个唯一的GID</p><p>一个用户可以属于不同组<br>一个组可以有不同用户# 注：多对多的关系</p><p>用户和组 --&gt; 权限资源管控<br>用户加入组，就可以有这个组的权限<br>默认情况下，创建用户，会添加一个和用户同名的组</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><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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux ~]# <span class="built_in">id</span> chenpeng<span class="comment"># 注：id查看用户和组信息</span></span><br><span class="line">uid=1030(chenpeng) gid=1030(chenpeng) 组=1030(chenpeng)</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# useradd sanchuang</span><br><span class="line">[root@localhost ~]# <span class="built_in">id</span> sanchuang</span><br><span class="line">uid=1000(sanchuang) gid=1000(sanchuang) 组=1000(sanchuang)</span><br><span class="line">[root@localhost ~]# less /etc/passwd</span><br><span class="line">[root@localhost ~]# less /home/sanchuang/</span><br><span class="line">[root@localhost ~]# passwd sanchuang</span><br><span class="line">更改用户 sanchuang 的密码 。</span><br><span class="line">新的 密码：</span><br><span class="line">无效的密码： 密码少于 8 个字符</span><br><span class="line">重新输入新的 密码：</span><br><span class="line">passwd：所有的身份验证令牌已经成功更新。</span><br><span class="line">[sanchuang@localhost ~]$ <span class="comment"># 注：登录后默认位置为用户家目录（使用用户sanchuang登录）</span></span><br><span class="line">[root@localhost ~]# less /etc/shadow<span class="comment"># 注：shadow存放的是用户的密码信息</span></span><br><span class="line">[root@localhost ~]# less /etc/shadow</span><br><span class="line">shadow   shadow-  </span><br><span class="line">[root@localhost ~]# less /etc/passwd</span><br><span class="line">passwd   passwd-  </span><br><span class="line">[root@localhost ~]# diff /etc/passwd /etc/passwd-<span class="comment"># 注：passwd-备份文件，每次都会少一个最新的操作</span></span><br><span class="line">21d20<span class="comment"># 注：可以回滚上一个版本</span></span><br><span class="line">&lt; sanchuang:x:1000:1000::/home/sanchuang:/bin/bash</span><br><span class="line">[root@localhost ~]# diff /etc/shadow /etc/shadow-<span class="comment"># 注：shadowd-备份文件，每次都会少一个最新的操作</span></span><br><span class="line">21d20<span class="comment"># 注：可以回滚上一个版本</span></span><br><span class="line">&lt; sanchuang:$6<span class="variable">$dKQsah</span>/D<span class="variable">$6sm6owwvDEnVs8BclDWQZ7meYSaMf5Y7AofxzxwxO0PPrvzqHHVCer1G656iY2gE</span>.sUOarUl9beKi2usYdATQ1:18571:0:99999:7:::</span><br><span class="line">[root@localhost ~]# less /etc/group<span class="comment"># 注：存放组信息</span></span><br><span class="line">[root@localhost ~]# less /etc/gshadow<span class="comment"># 注：存放组密码信息</span></span><br><span class="line"></span><br><span class="line">[root@localhost ~]# <span class="built_in">cd</span> /home/sanchuang/<span class="comment"># 注：新建用户，有三个隐藏文件</span></span><br><span class="line">[root@localhost sanchuang]# <span class="built_in">ls</span></span><br><span class="line">[root@localhost sanchuang]# <span class="built_in">ls</span> -al<span class="comment"># 注：新建用户帐号时，从 /etc/skel 目录中复制而来</span></span><br><span class="line">总用量 12</span><br><span class="line">drwx------. 2 sanchuang sanchuang  62 11月  5 10:25 .</span><br><span class="line">drwxr-xr-x. 3 root      root       23 11月  5 10:25 ..</span><br><span class="line">-rw-r--r--. 1 sanchuang sanchuang  18 4月   1 2020 .bash_logout</span><br><span class="line">-rw-r--r--. 1 sanchuang sanchuang 193 4月   1 2020 .bash_profile</span><br><span class="line">-rw-r--r--. 1 sanchuang sanchuang 231 4月   1 2020 .bashrc</span><br><span class="line">[root@localhost sanchuang]# <span class="built_in">cd</span> /etc/skel/<span class="comment"># 注：模板，拷贝一份过去</span></span><br><span class="line">[root@localhost skel]# <span class="built_in">ls</span> -al</span><br><span class="line">总用量 24</span><br><span class="line">drwxr-xr-x.  2 root root   62 10月  6 16:33 .</span><br><span class="line">drwxr-xr-x. 77 root root 8192 11月  5 10:27 ..</span><br><span class="line">-rw-r--r--.  1 root root   18 4月   1 2020 .bash_logout</span><br><span class="line">-rw-r--r--.  1 root root  193 4月   1 2020 .bash_profile</span><br><span class="line">-rw-r--r--.  1 root root  231 4月   1 2020 .bashrc</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[root@localhost skel]# less /etc/login.defs<span class="comment"># 注：关于账户的设置信息</span></span><br><span class="line"><span class="comment"># Min/max values for automatic uid selection in useradd</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">UID_MIN                  1000<span class="comment"># 注：最多可以创建59000个用户</span></span><br><span class="line">UID_MAX                 60000</span><br><span class="line"><span class="comment"># System accounts</span></span><br><span class="line">SYS_UID_MIN               201</span><br><span class="line">SYS_UID_MAX               999</span><br><span class="line">CREATE_HOME     <span class="built_in">yes</span><span class="comment"># 注：创建家目录</span></span><br><span class="line">ENCRYPT_METHOD SHA512<span class="comment"># 注：指定用什么方式加密用户密码</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[root@localhost skel]# <span class="built_in">ls</span> /etc/group<span class="comment"># 注：组也有备份文件</span></span><br><span class="line">group   group-  </span><br><span class="line">[root@localhost skel]# <span class="built_in">ls</span> /etc/gshadow</span><br><span class="line">gshadow   gshadow-  </span><br><span class="line"></span><br><span class="line">[root@localhost spool]# <span class="built_in">cd</span> /var/spool/mail/<span class="comment"># 注：邮件目录</span></span><br><span class="line">[root@localhost mail]# <span class="built_in">ls</span><span class="comment"># 注：/var/spool/mail/ 下创建一个同名的文件</span></span><br><span class="line">sanchuang</span><br><span class="line"></span><br><span class="line">[sanchuang@localhost ~]$ less /etc/shadow<span class="comment"># 注：普通用户没有权限查看 /etc/shadow存放密码信息</span></span><br><span class="line">/etc/shadow: 权限不够 <span class="comment"># 注：只有root用户可读</span></span><br></pre></td></tr></table></figure><h3 id="2-4-用户创建牵扯到哪些文件">2.4 用户创建牵扯到哪些文件<a class="header-anchor" href="#2-4-用户创建牵扯到哪些文件"></a></h3><p><strong>账户信息相关文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>/etc/passwd  --&gt; 存放用户相关信息的</p></li><li class="lvl-2"><p>/etc/shadow  --&gt; 存放用户密码</p></li><li class="lvl-2"><p>/etc/passwd- 和 /etc/shadow- 这是/etc/passwd 和 /etc/shadow的备份文件，总是比原文件少一次操作</p></li></ul><p><strong>组相关文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>/etc/group   --&gt; 存放组信息的</p></li><li class="lvl-2"><p>/etc/gshadow  --&gt; 存放组密码的</p></li><li class="lvl-2"><p>/etc/group- 和 /etc/gshadow- 备份文件</p></li></ul><p><strong>用户环境默认设置</strong></p><ul class="lvl-0"><li class="lvl-2"><p>创建用户时，会拷贝/etc/skel/下的文件到用户的家目录</p></li></ul><p><strong>用户的家目录</strong></p><ul class="lvl-0"><li class="lvl-2"><p>默认情况下会在/home目录下创建一个同名文件夹</p></li></ul><p><strong>用户默认属性设置文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>/etc/login.defs</p></li></ul><p><strong>邮件目录</strong></p><ul class="lvl-0"><li class="lvl-2"><p>/var/spool/mail/ 下创建一个同名的文件</p></li></ul><h3 id="2-5-etc-passwd-文件详解">2.5 /etc/passwd 文件详解<a class="header-anchor" href="#2-5-etc-passwd-文件详解"></a></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">[root@localhost mail]# <span class="built_in">cat</span> /etc/passwd</span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">sanchuang:x:1000:1000::/home/sanchuang:/bin/bash</span><br><span class="line">·使用：分隔</span><br><span class="line">·字段1：用户名</span><br><span class="line">·字段2：密码占位符，通常为“x”或者“*”（因为这个文件谁都可读，所以真正的密码存放在/etc/shadow）</span><br><span class="line">·字段3：用户<span class="built_in">id</span><span class="comment"># 注：-u指定</span></span><br><span class="line">·字段4：用户所属基本组<span class="built_in">id</span> <span class="comment"># 注：-g指定基本组</span></span><br><span class="line">·字段5：用户描述信息  <span class="comment"># 注：新建用户没有 没有设置一般没有 （-c选项）</span></span><br><span class="line">·字段6：家目录<span class="comment"># 注：家目录的绝对路径（-d选项）</span></span><br><span class="line">·字段7：登录shell的信息</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><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -ld /etc/shadow</span><br><span class="line">----------. 1 root root 2330 11月  5 20:51 /etc/shadow<span class="comment"># 注：普通用户/组 无法读取执行</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -ld /etc/passwd</span><br><span class="line">-rw-r--r--. 1 root root 2006 11月  5 20:51 /etc/passwd</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：通过yum安装的  配置文件一般放在/etc 下</span></span><br></pre></td></tr></table></figure><h3 id="2-6-练习：找出系统中uid大于1000的用户，显示出它的名字，UID，家目录，shell">2.6 练习：找出系统中uid大于1000的用户，显示出它的名字，UID，家目录，shell<a class="header-anchor" href="#2-6-练习：找出系统中uid大于1000的用户，显示出它的名字，UID，家目录，shell"></a></h3><p><strong>找出系统中uid大于1000的用户，显示出它的名字，UID，家目录，shell</strong></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">[root@sanchuang-linux ~]# awk -F: <span class="string">&#x27;$3&gt;1000&#123;print $1,$3,$6,$7&#125;&#x27;</span> /etc/passwd</span><br><span class="line">chenpeng 1030 /home/chenpeng /bin/bash</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：使用cat和直接使用awk消耗内存差不多</span></span><br><span class="line"><span class="comment">#注：语法：awk 选项 ‘模式+动作’ 文件# 注：不接模式的话 全文截取</span></span><br></pre></td></tr></table></figure><h3 id="2-7-练习：找出-etc-passwd中有几种shell信息">2.7 练习：找出/etc/passwd中有几种shell信息<a class="header-anchor" href="#2-7-练习：找出-etc-passwd中有几种shell信息"></a></h3><p><strong>找出/etc/passwd中有几种shell信息</strong></p><h3 id="2-8-useradd详解">2.8 useradd详解<a class="header-anchor" href="#2-8-useradd详解"></a></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">Shell设置</span><br><span class="line">[root@sanchuang-linux ~]# awk -F: <span class="string">&#x27;&#123;print $7&#125;&#x27;</span> /etc/passwd |<span class="built_in">sort</span>|<span class="built_in">uniq</span><span class="comment"># 注：排序去重</span></span><br><span class="line">/bin/bash<span class="comment"># 注：系统默认用户的shell环境信息 --&gt; 正常使用的shell</span></span><br><span class="line">/bin/sync<span class="comment"># 注：将内存里的缓存刷新到磁盘 --&gt; 类似于Python中fp.flush()</span></span><br><span class="line">/sbin/halt<span class="comment"># 注：登陆就关机</span></span><br><span class="line">/sbin/nologin<span class="comment"># 注：用户不能登录（不允许登录）</span></span><br><span class="line">/sbin/shutdown<span class="comment"># 注：登陆就关机</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><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><br><span class="line"><span class="comment">#注：关机至强最会执行以下sync,将内存里的缓存刷新到磁盘</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">sync</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：使用which命令查看命令的绝对路径</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">which</span> <span class="built_in">sync</span></span><br><span class="line">/usr/bin/sync</span><br><span class="line">敲<span class="built_in">sync</span>会按照PATH变量的路径下向下找下去</span><br><span class="line">执行一个/bin/bash 就会到我们现在的终端环境了</span><br></pre></td></tr></table></figure><hr><h2 id="三-用户和组的关系">三. 用户和组的关系<a class="header-anchor" href="#三-用户和组的关系"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>每个账户有一个唯一的UID</p></li><li class="lvl-2"><p>每个组也有一个唯一的GID</p></li><li class="lvl-2"><p>多个账户可以属于同一个组</p></li></ul><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220812074315487.png" alt="image-20220812074315487" style="zoom:80%;" /><hr><h2 id="四-用户和组的相关文件">四. 用户和组的相关文件<a class="header-anchor" href="#四-用户和组的相关文件"></a></h2><p><strong>和账户相关文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>/etc/passwd、/etc/shadow</p></li></ul><p><strong>和组相关文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>/etc/group、/etc/gshadow</p></li></ul><p><strong>账户宿主目录中文件来源</strong></p><ul class="lvl-0"><li class="lvl-2"><p>新建用户帐号时，从 <code>/etc/skel</code> 目录中复制而来# 注：<strong>初始化用户家目录</strong></p></li></ul><p><strong>默认账户的属性文件</strong></p><ul class="lvl-0"><li class="lvl-2"><p>/etc/login.defs</p></li></ul><p><strong>用于保存用户的帐号基本信息</strong></p><ul class="lvl-0"><li class="lvl-2"><p>文件位置：<code>/etc/passwd</code></p></li><li class="lvl-2"><p>每一行对应一个用户的帐号记录</p></li><li class="lvl-2"><p>字段1：用户帐号的名称</p></li><li class="lvl-2"><p>字段2：用户密码字串或者密码占位符“<code>x</code>”</p></li><li class="lvl-2"><p>字段3：用户帐号的UID号</p></li><li class="lvl-2"><p>字段4：所属基本组帐号的GID号</p></li><li class="lvl-2"><p>字段5：用户描述信息</p></li><li class="lvl-2"><p>字段6：家目录</p></li><li class="lvl-2"><p>字段7：登录Shell信息</p></li></ul><hr><h2 id="五-用户和组的相关文件">五. 用户和组的相关文件<a class="header-anchor" href="#五-用户和组的相关文件"></a></h2><p><strong>用户账户：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>超级用户<code>root</code></p></li><li class="lvl-2"><p>程序用户</p></li><li class="lvl-2"><p>普通用户</p></li></ul><p><strong>UID （User Identity，用户标识号）</strong></p><ul class="lvl-0"><li class="lvl-2"><p>超级用户root的UID为<code>0</code></p></li><li class="lvl-2"><p>程序用户的UID<code>1-999</code></p></li><li class="lvl-2"><p>普通用户的UID大于等于<code>1000</code></p></li></ul><hr><h2 id="六-添加与删除用户">六. 添加与删除用户<a class="header-anchor" href="#六-添加与删除用户"></a></h2><p><strong>useradd命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>useradd[选项]...用户名</code></p></li></ul><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>-u：指定 UID 标记号</code></p></li><li class="lvl-2"><p><code>-d</code>：指定宿主目录，缺省为 <code>/home/用户名</code></p></li><li class="lvl-2"><p><code>-e</code>：指定帐号失效时间</p></li><li class="lvl-2"><p><code>-g</code>：指定用户的基本组名（或GID号）</p></li><li class="lvl-2"><p><code>-G</code>：指定用户的附加组名（或GID号）</p></li><li class="lvl-2"><p>-M：不为用户建立并初始化宿主目录</p></li><li class="lvl-2"><p><code>-s</code>：指定用户的登录Shell</p></li><li class="lvl-2"><p>-c：用户注释描述信息</p></li><li class="lvl-2"><p>-r:新建系统用户，不会有新建家目录</p></li></ul><p>#注：每次新建用户，uid都会在上一个用户uid基础上+1<br>#注：默认新建用户从1001开始</p><p><strong>Shell设置</strong></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">/bin/bash<span class="comment"># 注：系统默认用户的shell环境信息 --&gt; 正常使用的shell</span></span><br><span class="line">/bin/sync<span class="comment"># 注：将内存里的缓存刷新到磁盘 --&gt; 类似于Python中fp.flush()</span></span><br><span class="line">/sbin/halt<span class="comment"># 注：登陆就关机</span></span><br><span class="line">/sbin/nologin<span class="comment"># 注：用户不能登录，ssh和su都不能登陆</span></span><br><span class="line">/sbin/shutdown<span class="comment"># 注：登陆就关机</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><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">示例：-s /sbin/nologin</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：本机用来跑服务的，不能登录</span></span><br><span class="line">[root@localhost mail]# useradd -s /sbin/nologin sanchuang2</span><br><span class="line">[root@localhost mail]# <span class="built_in">echo</span> 123456|passwd sanchuang2 --stdin</span><br><span class="line">更改用户 sanchuang2 的密码 。</span><br><span class="line">passwd：所有的身份验证令牌已经成功更新。</span><br><span class="line">[root@localhost mail]# ssh sanchuang2@192.168.136.136<span class="comment">#注：ssh 登录本机sanchuang2</span></span><br><span class="line">……………………………………</span><br><span class="line">Are you sure you want to <span class="built_in">continue</span> connecting (<span class="built_in">yes</span>/no)? <span class="built_in">yes</span></span><br><span class="line">Warning: Permanently added <span class="string">&#x27;192.168.136.136&#x27;</span> (ECDSA) to the list of known hosts.</span><br><span class="line">sanchuang2@192.168.136.136<span class="string">&#x27;s password: </span></span><br><span class="line"><span class="string">This account is currently not available.# 注：提示用户不可达，因为sanchuang2的Shell是nologin，不能直接登录</span></span><br><span class="line"><span class="string">Connection to 192.168.136.136 closed.</span></span><br><span class="line"><span class="string">[root@localhost ~]# su - sanchuang2# 注：不能切换</span></span><br><span class="line"><span class="string">上一次登录：四 11月  5 11:49:14 CST 2020从 192.168.136.136pts/2 上</span></span><br><span class="line"><span class="string">This account is currently not available.</span></span><br><span class="line"><span class="string">--------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="string">[root@localhost ~]# usermod -s /bin/bash sanchuang2# 注：usermod -s 更改用户的shell信息</span></span><br><span class="line"><span class="string">[root@localhost ~]# cat /etc/passwd|grep sanchuang2</span></span><br><span class="line"><span class="string">sanchuang2:x:1001:1001::/home/sanchuang2:/bin/bash</span></span><br></pre></td></tr></table></figure><h3 id="练习：显示出系统中uid大于1000并且用户名包含sanchuang的用户信息（用户名，用户Id，用户家目录）">练习：显示出系统中uid大于1000并且用户名包含sanchuang的用户信息（用户名，用户Id，用户家目录）<a class="header-anchor" href="#练习：显示出系统中uid大于1000并且用户名包含sanchuang的用户信息（用户名，用户Id，用户家目录）"></a></h3><p><strong>显示出系统中uid大于1000并且用户名包含sanchuang的用户信息（用户名，用户Id，用户家目录）</strong></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">[root@localhost ~]# awk -F: <span class="string">&#x27;$3&gt;1000&#123;print $1,$3,$6&#125;&#x27;</span> /etc/passwd</span><br><span class="line">sanchuang2 1001 /home/sanchuang2</span><br><span class="line">方法1</span><br><span class="line">[root@localhost ~]# awk -F: <span class="string">&#x27;$3&gt;1000&#123;print $1,$3,$6&#125;&#x27;</span> /etc/passwd |grep sanchuang</span><br><span class="line">sanchuang2 1001 /home/sanchuang2</span><br><span class="line">方法2</span><br><span class="line">[root@localhost ~]# awk -F: <span class="string">&#x27;$3&gt;1000 &amp;&amp; $1 ~ /sanchuang/&#123;print $1,$3,$6&#125;&#x27;</span> /etc/passwd</span><br><span class="line">sanchuang2 1001 /home/sanchuang2<span class="comment"># 注：$1 ~ /sanchuang/ 匹配sanchuang</span></span><br></pre></td></tr></table></figure><hr><h2 id="七-进程">七. 进程<a class="header-anchor" href="#七-进程"></a></h2><blockquote><p>进程：正在运行中的程序</p><p>程序：代码集合，放在磁盘上的</p><p>进程是计算机进行资源分配的基本单位</p><p>进程的组成核心：进程控制块（PCB）</p><p>PCB一般包括</p><p>1、pid进程唯一标识符</p><p>2、有效用户信息  -euid,egid(通常情况下就是uid,gid)# 注：就是进程属于哪个用户</p><p>3、程序的状态</p><p>4、程序的优先级</p><p>5、程序的上下文</p></blockquote><hr><h2 id="八-Python中使用os模块查看当前进程的用户信息">八. Python中使用os模块查看当前进程的用户信息<a class="header-anchor" href="#八-Python中使用os模块查看当前进程的用户信息"></a></h2><p><strong>Python中使用os模块查看当前进程的用户信息</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><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="meta">&gt;&gt;&gt; </span><span class="keyword">import</span> os</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>os.geteuid()<span class="comment"># 注：获取当前进程用户的用户uid信息</span></span><br><span class="line"><span class="number">0</span><span class="comment"># 注：为0的都是root用户  root用户的uid</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>os.getuid()<span class="comment"># 注：通常情况下，uid和euid都是一样的</span></span><br><span class="line"><span class="number">0</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">普通用户导入 os模块</span><br><span class="line">[sanchuang2@localhost ~]$ python3</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">import</span> os</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>os.geteuid()</span><br><span class="line"><span class="number">1001</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>os.getuid()</span><br><span class="line"><span class="number">1001</span></span><br><span class="line">[sanchuang2@localhost ~]$ <span class="built_in">id</span> sanchuang2</span><br><span class="line">uid=<span class="number">1001</span>(sanchuang2) gid=<span class="number">1001</span>(sanchuang2) 组=<span class="number">1001</span>(sanchuang2)</span><br></pre></td></tr></table></figure><hr><h2 id="九-ftp协议（文件传输协议）">九. ftp协议（文件传输协议）<a class="header-anchor" href="#九-ftp协议（文件传输协议）"></a></h2><h3 id="9-1">9.1<a class="header-anchor" href="#9-1"></a></h3><blockquote><p>vsftpd服务与本地用户</p><p>ftp的服务 做文件传输的，上传或下载一个文件到指定的地方</p><p>ftp是一个文件传输服务，主要用于上传和下载文件，实现文件共享</p><p>匿名用户和本地用户都可以登录ftp服务，它们登录进去之后只能操作家目录下的文件或者文件夹</p><p>三种用户：</p><p>1、匿名用户</p><p>2、本地用户# 注：ftp传输可以使用linux本地用户；ssh登录也可以用本地用户</p><p>3、虚拟用户</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line">============================================================================================</span><br><span class="line">1、服务安装</span><br><span class="line">[root@sanchuang-linux ~]# yum install vsftpd</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">2、启动服务</span><br><span class="line">[root@sanchuang-linux ~]# service vsftpd restart</span><br><span class="line">Redirecting to /bin/systemctl restart vsftpd.service</span><br><span class="line">[root@sanchuang-linux ~]# ps -ef |grep vsftp<span class="comment"># 注：默认root用户启动</span></span><br><span class="line">root        3377       1  0 14:51 ?        00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf</span><br><span class="line">root        3379    3184  0 14:52 pts/1    00:00:00 grep --color=auto vsftp</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">3、安装客户端</span><br><span class="line"><span class="comment">#注：centos8里vsftpd服务默认不允许匿名用户登录</span></span><br><span class="line">使用匿名用户（ftp）登录的话，修改/etc/vsftpd/vsftpd.conf里的配置 anonymous_enable=YES</span><br><span class="line"><span class="comment">#注：修改完配置文件重启vsftpd服务</span></span><br><span class="line"></span><br><span class="line">登录上去之后，默认读取系统中ftp这个用户的家目录文件</span><br><span class="line">-----------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# yum install lftp -y<span class="comment"># 注：lftp是vsftpd的客户端</span></span><br><span class="line">[root@sanchuang-linux ~]# yum install ftp-y<span class="comment"># 注：ftp也是vsftpd的客户端</span></span><br><span class="line"><span class="comment">#注：这两个都是ftp的客户端</span></span><br><span class="line">============================================================================================</span><br><span class="line">[root@sanchuang-linux ~]# lftp ftp@192.168.0.27<span class="comment"># 注：以ftp用户去登录程序</span></span><br><span class="line">密码:    <span class="comment"># 注：ftp是默认用户</span></span><br><span class="line">[root@localhost ~]# ftp 192.168.136.136<span class="comment"># 注：登录ftp服务</span></span><br><span class="line">………………………………</span><br><span class="line">Name (192.168.136.136:root): ftp<span class="comment"># 注：匿名用户ftp登录</span></span><br><span class="line">331 Please specify the password.</span><br><span class="line">Password:<span class="comment"># 注：回车</span></span><br><span class="line">230 Login successful.</span><br><span class="line">………………………………</span><br><span class="line">ftp&gt; </span><br><span class="line">============================================================================================</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> /etc/passwd</span><br><span class="line">ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin<span class="comment"># 注：vsftpd的匿名用户，公共用户</span></span><br><span class="line"><span class="comment">#注：/var/ftp  ftp这个用户的家目录文件</span></span><br><span class="line">============================================================================================</span><br><span class="line">[root@sanchuang-linux ~]# vim /etc/vsftpd/vsftpd.conf <span class="comment"># 注：Centos8中开启匿名用户允许登录</span></span><br><span class="line">anonymous_enable=YES<span class="comment"># 注：centos7不用设置</span></span><br><span class="line"><span class="comment">#注：修改完配置文件重启vsftpd服务</span></span><br><span class="line">============================================================================================</span><br><span class="line">登录上去之后，默认读取系统中ftp这个用户的家目录文件</span><br><span class="line">/var/ftp</span><br><span class="line">-----------------------------------------------------</span><br><span class="line">[root@localhost ~]# <span class="built_in">cd</span> /var/ftp/</span><br><span class="line">[root@localhost ftp]# <span class="built_in">ls</span></span><br><span class="line">pub</span><br><span class="line">[root@localhost ftp]# <span class="built_in">cd</span> pub</span><br><span class="line">[root@localhost pub]# <span class="built_in">ls</span><span class="comment"># 注：/var/ftp/pub/下为空</span></span><br><span class="line">[root@localhost pub]# <span class="built_in">touch</span> aa bb<span class="comment"># 注：创建文件aa bb</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">ftp&gt; <span class="built_in">ls</span><span class="comment"># 注：当前路径 /var/ftp</span></span><br><span class="line">…………………………</span><br><span class="line">drwxr-xr-x    2 0        0              26 Nov 05 07:20 pub</span><br><span class="line">ftp&gt; <span class="built_in">cd</span> pub</span><br><span class="line">…………………………</span><br><span class="line">ftp&gt; <span class="built_in">ls</span><span class="comment"># 注：显示出文件aa bb</span></span><br><span class="line">…………………………</span><br><span class="line">-rw-r--r--    1 0        0               0 Nov 05 07:20 aa</span><br><span class="line">-rw-r--r--    1 0        0               0 Nov 05 07:20 bb</span><br><span class="line">226 Directory send OK.</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">ftp&gt; get aa<span class="comment"># 注：下载文件</span></span><br><span class="line"><span class="built_in">local</span>: aa remote: aa</span><br><span class="line">…………………………</span><br><span class="line">ftp&gt; !<span class="built_in">ls</span><span class="comment"># 注：查看当前所在系统命令有哪些文件</span></span><br><span class="line">aa addstr.py</span><br><span class="line">ftp&gt; !<span class="built_in">pwd</span><span class="comment"># 注：查看当前所在系统命令路径</span></span><br><span class="line">/root</span><br><span class="line"><span class="comment">#注：匿名用户不能上传</span></span><br><span class="line">============================================================================================</span><br><span class="line">[root@localhost ~]# ftp 192.168.136.136</span><br><span class="line">Name (192.168.136.136:root): sanchuang<span class="comment"># 注：本地用户sanchuang登录</span></span><br><span class="line">Password:</span><br><span class="line">230 Login successful.<span class="comment"># 注：230 代表登录成功</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">ftp&gt; put first.py <span class="comment"># 注：上传文件</span></span><br><span class="line"><span class="built_in">local</span>: first.py remote: first.py<span class="comment"># 注：匿名用户不能上传</span></span><br><span class="line">…………………………</span><br><span class="line">1097 bytes sent <span class="keyword">in</span> 0.0157 secs (69.83 Kbytes/sec)</span><br><span class="line">ftp&gt; <span class="built_in">ls</span></span><br><span class="line">…………………………</span><br><span class="line">-rw-r--r--    1 1000     1000         1097 Nov 05 07:34 first.py</span><br><span class="line">226 Directory send OK.</span><br><span class="line">============================================================================================</span><br><span class="line">[root@localhost pub]# less /etc/services <span class="comment"># 注：# less /etc/services 查看默认端口号</span></span><br><span class="line">ftp             21/tcp<span class="comment"># 注：ftp服务默认是21号端口</span></span><br><span class="line">ftp             21/udp          fsp fspd</span><br></pre></td></tr></table></figure><h3 id="9-2-匿名用户和本地用户都可以登录ftp服务，它们登录进去之后只能操作家目录下的文件或者文件夹">9.2 匿名用户和本地用户都可以登录ftp服务，它们登录进去之后只能操作家目录下的文件或者文件夹<a class="header-anchor" href="#9-2-匿名用户和本地用户都可以登录ftp服务，它们登录进去之后只能操作家目录下的文件或者文件夹"></a></h3><p><strong>匿名用户和本地用户都可以登录ftp服务，它们登录进去之后只能操作家目录下的文件或者文件夹</strong></p><p><strong>三种用户：</strong><br>1、<strong>匿名用户</strong># 注：匿名用户  ftp ; 无需密码 ; 家目录 /var/ftp ； ftp也是系统的本地用户，系统自动创建ftp用户，nologin，可以通过ftp登录<br>2、<strong>本地用户</strong># 注：就是linux系统上的用户 ; ftp登录之后在本地用户家目录下<br>3、<strong>虚拟用户</strong># 注：建立出一个虚拟的用户，映射到本地用户</p><p>#注：/etc/passwd  第6个字段 是用户的家目录<br>#注：看用户的家目录 看/etc/passwd文件</p><h3 id="9-3-ftp常用命令">9.3 ftp常用命令<a class="header-anchor" href="#9-3-ftp常用命令"></a></h3><p><strong>ftp常用命令</strong></p><blockquote><p>ftp常用命令：<br>上传文件：<strong>put</strong># 注：匿名用户不能上传<br>下载文件：<strong>get</strong><br>查看：<strong>ls</strong><br>切换路径：<strong>cd</strong></p></blockquote><h3 id="9-4-ftp的2种工作模式">9.4* ftp的2种工作模式<a class="header-anchor" href="#9-4-ftp的2种工作模式"></a></h3><p><strong>ftp的2种工作模式</strong>（面试）</p><p><strong>问的时候：总结（要提到端口号）</strong></p><p>主动模式和被动模式都会开启21号端口进行连接</p><p>区别是数据连接的方式</p><p>主动模式：服务器主动开启20号端口去和客户机主动建立数据连接，传输数据</p><p>被动模式：客户机拿到随机开放端口后向服务器进行一个数据传输，客户端向这个随机端口去建立连接，进行数据传输</p><blockquote><p><strong>一</strong>、<strong>主动模式</strong>（<strong>默认</strong>情况下是主动模式）</p><p>1、客户端登录时请求ftp服务器 命令连接端口（21号端口）</p><p>2、21号端口返回信息登录成功或者登录失败</p><p>3、登录成功后客户端请求传输数据（对21号端口发起一个请求），开启一个随机端口</p><p>4、服务器主动开启它的20号端口去把它的数据传递给客户端的随机端口</p><p>服务器主动开启20号端口，向客户机主动发送数据</p><p><strong>二</strong>、<strong>被动模式</strong></p><p>1、客户端登录时请求ftp服务器 开启 命令连接端口（21号端口）</p><p>#注：21号端口都是用来做命令连接的</p><p>2、21号端口返回信息登录成功或者登录失败</p><p>3、客户机请求数据传输（客户机向服务器请求数据传输时，向服务器发送一个pasv命令，告诉服务器端要以被动模式取接收命令。这时服务器端就开放一个端口，可以指定范围，返回给客户机，把这个端口号返回给客户端）</p><p>4、收到服务器开放端口号</p><p>5、开始连接服务器端口，进行数据传输（和5555号端口建立连接）</p><p>假设开放的是5555，服务器就会把5555端口起来，端口处于监听状态，别人就可以连接过来，就可以和这个主机建立连接，就可以通过5555号端口传递数据</p><p>#注：被动模式需要配置，默认主动模式</p><p>无论主动模式，还是被动模式，21号端口都必须起来</p><p>主动模式20号端口起来，被动模式20号端口不一定起来</p><p>#注：数据请求和命令请求不是同一个端口的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220812080812262.png" alt=""></p></blockquote><hr><h2 id="十-usermod-userdel">十. usermod userdel<a class="header-anchor" href="#十-usermod-userdel"></a></h2><h3 id="usermod">usermod<a class="header-anchor" href="#usermod"></a></h3><p><strong>usermod命令</strong></p><p>格式：<code>usermod[选项]...用户名</code></p><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p>-l：更改用户帐号的登录名称</p></li><li class="lvl-2"><p>-L：锁定用户账户</p></li><li class="lvl-2"><p>-U：解锁用户账户</p></li><li class="lvl-2"><p>以下选项与useradd命令中的含义相同</p></li></ul><p>​-u、-d、-e、-g、-G、-s</p><h3 id="userdel">userdel<a class="header-anchor" href="#userdel"></a></h3><p><strong>userdel命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>userdel [-r] 用户名 </code></p></li><li class="lvl-2"><p><strong>添加 -r 选项时，表示连用户的宿主目录一并删除</strong># 注：<strong>建议接上</strong></p></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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# useradd stu01  </span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -ld /home/stu01/</span><br><span class="line">drwx------ 2 stu01 stu01 4096 09-09 12:38 /home/stu01/  </span><br><span class="line">[root@localhost ~]# userdel -r stu01<span class="comment"># 注：删除用户帐号stu01</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -ld /home/stu01/  </span><br><span class="line"><span class="built_in">ls</span>: /home/stu01/: 没有那个文件或目录</span><br></pre></td></tr></table></figure><hr><h2 id="十一-useradd">十一. useradd<a class="header-anchor" href="#十一-useradd"></a></h2><p><strong>useradd命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>useradd[选项]...用户名</code></p></li></ul><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>-u：指定 UID 标记号</code></p></li><li class="lvl-2"><p><code>-d</code>：指定宿主目录，缺省为 <code>/home/用户名</code></p></li><li class="lvl-2"><p><code>-e</code>：指定帐号失效时间</p></li><li class="lvl-2"><p><code>-g</code>：指定用户的基本组名（或GID号）# 注：基本组只能有一个</p></li><li class="lvl-2"><p><code>-G</code>：指定用户的附加组名（或GID号）# 注：附加组可以用很多个 无论基本组/附加组 用户都可以获得所有权限</p></li><li class="lvl-2"><p>-M：不为用户建立并初始化宿主目录</p></li><li class="lvl-2"><p><code>-s</code>：指定用户的登录Shell</p></li><li class="lvl-2"><p>-c：用户注释描述信息</p></li><li class="lvl-2"><p>-r: 新建系统用户，不会有新建家目录</p></li></ul><hr><h2 id="十二-用户">十二. 用户<a class="header-anchor" href="#十二-用户"></a></h2><h3 id="12-1">12.1<a class="header-anchor" href="#12-1"></a></h3><p><strong>用户账户：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>超级用户<code>root</code># 注：拥有最高权限</p></li><li class="lvl-2"><p>程序用户    # 注：程序运行过程中需要使用的用户</p></li><li class="lvl-2"><p>普通用户    # 注：手动创建的用户</p></li></ul><p><strong>UID （User Identity，用户标识号）</strong></p><ul class="lvl-0"><li class="lvl-2"><p>超级用户root的UID为<code>0</code></p></li><li class="lvl-2"><p>程序用户的UID <code>1-999</code></p></li><li class="lvl-2"><p>普通用户的UID大于等于<code>1000</code></p></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><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">示例：mysql uid</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# <span class="built_in">id</span> mysql</span><br><span class="line">uid=1000(mysql) gid=1000(mysql) 组=1000(mysql)</span><br><span class="line">[root@localhost ~]# <span class="built_in">id</span> sanchuang2</span><br><span class="line">uid=1001(sanchuang2) gid=1001(sanchuang2) 组=1001(sanchuang2)</span><br><span class="line"></span><br><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：默认情况不指定uid 在上一个用户前+1</span></span><br><span class="line">[root@localhost ~]# useradd -u 1100 chenpeng1<span class="comment"># 注：指定用户id</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">id</span> chenpeng1</span><br><span class="line">uid=1100(chenpeng1) gid=1100(chenpeng1) 组=1100(chenpeng1)</span><br><span class="line">[root@localhost ~]# useradd -u 1101 -g 1100 chenpeng2<span class="comment"># 注：指定用户id、基本组</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">id</span> chenpeng2<span class="comment"># 注：在chenpeng1这个组里面</span></span><br><span class="line">uid=1101(chenpeng2) gid=1100(chenpeng1) 组=1100(chenpeng1)</span><br><span class="line"></span><br><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# usermod -u 1200 chenpeng2<span class="comment"># 注：修改用户id</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">id</span> chenpeng2</span><br><span class="line">uid=1200(chenpeng2) gid=1100(chenpeng1) 组=1100(chenpeng1)</span><br><span class="line"></span><br><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# useradd -d /var/log/sanchuang6 sanchuang6<span class="comment"># 注：指定用户家目录</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">cd</span> /var/log/sanchuang6/</span><br><span class="line">[root@localhost sanchuang6]# <span class="built_in">ls</span></span><br><span class="line">[root@localhost sanchuang6]# less /etc/passwd</span><br><span class="line">sanchuang6:x:1201:1201::/var/log/sanchuang6:/bin/bash<span class="comment"># 注：第6列 用户家目录</span></span><br><span class="line"></span><br><span class="line">示例：指定附加组</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost sanchuang6]# useradd -g chenpeng1 -G sanchuang,sanchuang2 sanchuang7</span><br><span class="line">[root@localhost sanchuang6]# <span class="built_in">id</span> sanchuang7</span><br><span class="line">uid=1202(sanchuang7) gid=1100(chenpeng1) 组=1100(chenpeng1),1000(sanchuang),1001(sanchuang2)</span><br><span class="line"><span class="comment">#注：基本组chenpeng1  附属组 sanchuang  sanchuang2</span></span><br><span class="line"><span class="comment">#注：-g指定基本组  -G指定附加组</span></span><br><span class="line">============================================================================================</span><br><span class="line">·-c：用户注释描述信息</span><br><span class="line">/etc/passwd  第5列可以查看描述信息</span><br></pre></td></tr></table></figure><h3 id="12-2-userdel-删除用户">12.2 userdel 删除用户<a class="header-anchor" href="#12-2-userdel-删除用户"></a></h3><p><strong>userdel命令</strong></p><p>格式：<code>userdel [-r] 用户名 </code></p><p>添加 -r 选项时，表示连用户的宿主目录一并删除</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></pre></td><td class="code"><pre><span class="line">示例1</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# useradd stu01  </span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -ld /home/stu01/</span><br><span class="line">drwx------ 2 stu01 stu01 4096 09-09 12:38 /home/stu01/  </span><br><span class="line">[root@localhost ~]# userdel -r stu01<span class="comment"># 注：删除用户帐号stu01</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">ls</span> -ld /home/stu01/  </span><br><span class="line"><span class="built_in">ls</span>: /home/stu01/: 没有那个文件或目录</span><br><span class="line"></span><br><span class="line">示例2</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost sanchuang6]# userdel sanchuang7</span><br><span class="line">[root@localhost sanchuang6]# less /etc/passwd<span class="comment"># 注：删除了</span></span><br><span class="line">[root@localhost sanchuang6]# <span class="built_in">cd</span> /home/sanchuang7<span class="comment"># 注：没删</span></span><br><span class="line">[root@localhost sanchuang7]# <span class="built_in">ls</span> /var/spool/mail/sanchuang7<span class="comment"># 注：没删</span></span><br><span class="line">/var/spool/mail/sanchuang7</span><br></pre></td></tr></table></figure><hr><h2 id="十三-usermod-用户修改">十三. usermod 用户修改<a class="header-anchor" href="#十三-usermod-用户修改"></a></h2><p>usermod命令</p><p>格式：<code>usermod[选项]...用户名</code></p><p>常用命令选项</p><ul class="lvl-0"><li class="lvl-2"><p>-l：更改用户帐号的登录名称</p></li><li class="lvl-2"><p>-L：锁定用户账户</p></li><li class="lvl-2"><p>-U：解锁用户账户</p></li><li class="lvl-2"><p>以下选项与useradd命令中的含义相同<br>-u、-d、-e、-g、-G、-s</p></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><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">示例：-L：锁定用户账户</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：锁上之后不能密码登录</span></span><br><span class="line"><span class="comment">#注：本质就是在shadow密码前面加一个！号，使得登录的时候密码验证失败</span></span><br><span class="line">[root@localhost sanchuang7]# <span class="built_in">id</span> sanchuang6</span><br><span class="line">uid=1201(sanchuang6) gid=1201(sanchuang6) 组=1201(sanchuang6)</span><br><span class="line">[root@localhost sanchuang7]# usermod -L sanchuang6<span class="comment"># 注：锁定用户账户</span></span><br><span class="line">[root@localhost sanchuang7]# less /etc/shadow<span class="comment"># 注：密码密文前面加了1个感叹号</span></span><br><span class="line">chenpeng2:!$6<span class="variable">$P3yFUy</span>.H<span class="variable">$UOfUIbl8V3h1ng4J</span>/OdVV1aWc3Cx3s5bldkysl33aDyrigsgK0VQ3nzrC4mojDNotpE9w61NbVQmZFqDDRfpl.:18571:0:99999:7:::</span><br><span class="line">[root@localhost sanchuang7]# diff /etc/shadow /etc/shadow-</span><br><span class="line">25c25</span><br><span class="line">&lt; chenpeng2:!$6<span class="variable">$P3yFUy</span>.H<span class="variable">$UOfUIbl8V3h1ng4J</span>/OdVV1aWc3Cx3s5bldkysl33aDyrigsgK0VQ3nzrC4mojDNotpE9w61NbVQmZFqDDRfpl.:18571:0:99999:7:::</span><br><span class="line">---</span><br><span class="line">&gt; chenpeng2:$6<span class="variable">$P3yFUy</span>.H<span class="variable">$UOfUIbl8V3h1ng4J</span>/OdVV1aWc3Cx3s5bldkysl33aDyrigsgK0VQ3nzrC4mojDNotpE9w61NbVQmZFqDDRfpl.:18571:0:99999:7:::</span><br><span class="line"><span class="comment">#注：sha512加密技术  密文 明文</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# ssh chenpeng2@192.168.0.188</span><br><span class="line">chenpeng2@192.168.0.188<span class="string">&#x27;s password: # 注：锁上之后不能密码登录</span></span><br><span class="line"><span class="string">Permission denied, please try again.</span></span><br><span class="line"><span class="string">…………………………</span></span><br><span class="line"><span class="string">Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).</span></span><br></pre></td></tr></table></figure><hr><h2 id="十四-etc-shadow">十四. /etc/shadow<a class="header-anchor" href="#十四-etc-shadow"></a></h2><p><strong>用于保存密码字串、密码有效期等信息</strong></p><ul class="lvl-0"><li class="lvl-2"><p>文件位置：<code>/etc/shadow</code>   # 注：存放用户密码的文件，只能root用户查看</p></li><li class="lvl-2"><p>每一行对应一个用户的密码记录</p></li><li class="lvl-2"><p>字段1：用户帐号的名称</p></li><li class="lvl-2"><p><code>字段2：加密的密码字串信息</code> # 注：字段2就是存放密码的字段存放的密码是加密的 密文，sha512算法加密</p></li><li class="lvl-2"><p>字段3：上次修改密码的时间</p></li><li class="lvl-2"><p>字段4：密码的最短有效天数，默认值为0</p></li><li class="lvl-2"><p>字段5：密码的最长有效天数，默认值为99999</p></li><li class="lvl-2"><p>字段6：提前多少天警告用户口令将过期，默认值为7</p></li><li class="lvl-2"><p>字段7：在密码过期之后多少天禁用此用户</p></li><li class="lvl-2"><p>字段8：帐号失效时间，默认值为空</p></li><li class="lvl-2"><p>字段9：保留字段（未使用）</p></li></ul><hr><h2 id="十五-passwd">十五. passwd<a class="header-anchor" href="#十五-passwd"></a></h2><p><strong>passwd命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>格式：<code>passwd [选项]... 用户名</code></p></li></ul><p><strong>常用命令选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p>-d：清空用户的密码，使之无需密码即可登录</p></li><li class="lvl-2"><p>-l：锁定用户帐号</p></li><li class="lvl-2"><p>-S：查看用户帐号的状态（是否被锁定）</p></li><li class="lvl-2"><p>-u：解锁用户帐号</p></li><li class="lvl-2"><p>–stdin：接收别的命令stdout做为stdin标准输入设置密码</p></li></ul><p><code>root用户可以修改所有用户密码，不要求复杂性</code></p><p><code>普通用户只能改自己的密码，要求复杂性</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><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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost sanchuang7]# passwd -d sanchuang6<span class="comment"># 注：清空用户密码</span></span><br><span class="line">清除用户的密码 sanchuang6。</span><br><span class="line">passwd: 操作成功</span><br><span class="line">[root@localhost sanchuang7]# useradd sanchuang5<span class="comment"># 注：注册 未给密码</span></span><br><span class="line">[root@localhost mail]# less /etc/shadow</span><br><span class="line">sanchuang6::18571:0:99999:7:::<span class="comment"># 注：清除用户密码，密码字段为空</span></span><br><span class="line">sanchuang5:!!:18571:0:99999:7:::<span class="comment"># 注：未给密码 密码字段默认2个感叹号</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#usermod和passwd锁定账户都是修改账户的shadow加密字段信息，使他们登录的时候密码匹配不上，达到一个锁定状态</span></span><br><span class="line"><span class="comment">#usermod -L   加一个!号# 注：锁定用户在shadow密码字段前加一个！号</span></span><br><span class="line"><span class="comment">#passwd -l 加两个!号# 注：锁定用户在shadow密码字段前加两个！号</span></span><br><span class="line"><span class="comment">#注：查看用户有没有设置密码  看/etc/shadow信息</span></span><br><span class="line"></span><br><span class="line">示例：usermod -L 和 passwd -l锁定用户</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost mail]# useradd chen001</span><br><span class="line">[root@localhost mail]# useradd chen002</span><br><span class="line">[root@localhost mail]# useradd chen003</span><br><span class="line">[root@localhost mail]# <span class="built_in">echo</span> 123456|passwd chen001 --stdin</span><br><span class="line">[root@localhost mail]# <span class="built_in">echo</span> 123456|passwd chen002 --stdin</span><br><span class="line">[root@localhost mail]# <span class="built_in">echo</span> 123456|passwd chen003 --stdin</span><br><span class="line">[root@localhost mail]# usermod -L chen002<span class="comment"># 注：chen002做 usermod -L 操作</span></span><br><span class="line">[root@localhost mail]# passwd -d chen003<span class="comment"># 注：chen003做 passwd -d  操作</span></span><br><span class="line">清除用户的密码 chen003。</span><br><span class="line">passwd: 操作成功</span><br><span class="line">[root@localhost mail]# less /etc/shadow</span><br><span class="line">chen001:$6<span class="variable">$y</span>……k1q.yk8U1gOGp/:18571:0:99999:7:::</span><br><span class="line">chen002:!$6<span class="variable">$u</span>……YF0.:18571:0:99999:7:::</span><br><span class="line">chen003::18571:0:99999:7:::</span><br><span class="line">-------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# ssh chen003@192.168.136.136<span class="comment"># 注：登录不上去</span></span><br><span class="line">chen003@192.168.136.136<span class="string">&#x27;s password: </span></span><br><span class="line"><span class="string">…………</span></span><br><span class="line"><span class="string">Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).</span></span><br><span class="line"><span class="string">[root@localhost ~]# ssh chen002@192.168.136.136# 注：登录不上去</span></span><br><span class="line"><span class="string">chen002@192.168.136.136&#x27;</span>s password: </span><br><span class="line">…………</span><br><span class="line">Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).</span><br><span class="line">[root@localhost ~]# ssh chen001@192.168.136.136<span class="comment"># 注：没做操作的 远程登录成功</span></span><br><span class="line">chen001@192.168.136.136<span class="string">&#x27;s password: </span></span><br><span class="line"><span class="string">[chen001@localhost ~]$ </span></span><br></pre></td></tr></table></figure><hr><h2 id="十六-etc-group">十六. /etc/group<a class="header-anchor" href="#十六-etc-group"></a></h2><p><strong>/etc/group</strong></p><p>​字段一：组名</p><p>​字段二：密码字段</p><p>​字段三：组id</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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# less /etc/group</span><br><span class="line">tech:x:200:b1,b2,a1,a2</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> 用户与组 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>13_Linux基础-SHELL命令-wc-diff-patch-bc-awk</title>
      <link href="/posts/9132.html"/>
      <url>/posts/9132.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-回顾">一. 回顾<a class="header-anchor" href="#一-回顾"></a></h2><h3 id="sort">sort<a class="header-anchor" href="#sort"></a></h3><p><strong>sort</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">格式：sort 选项 文件</span><br><span class="line">-n按数值进行排序</span><br><span class="line">-r降序排序</span><br><span class="line">-k指定排序的列</span><br><span class="line">-t指定分隔符</span><br><span class="line">-u去重</span><br></pre></td></tr></table></figure><h3 id="uniq">uniq<a class="header-anchor" href="#uniq"></a></h3><p><strong>uniq</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">格式：uniq 选项 文件</span><br><span class="line">-c统计每列在文本中出现的次数</span><br><span class="line">-u仅显示出现一次的行</span><br><span class="line">-d仅显示重复出现的行</span><br></pre></td></tr></table></figure><h3 id="cut">cut<a class="header-anchor" href="#cut"></a></h3><p><strong>cut</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">格式：cut 选项 提取范围 文件</span><br><span class="line">-d指定分隔符</span><br><span class="line">-f指定显示的特定字段</span><br><span class="line">-c指定特定字符</span><br></pre></td></tr></table></figure><h3 id="文本三剑客">文本三剑客<a class="header-anchor" href="#文本三剑客"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">grep 过滤 通用的正则表达式分析程序</span><br><span class="line">grep [选项]... 模式 目标文件</span><br><span class="line">-i不区分大小写</span><br><span class="line">-v反转查找，不显示包含指定字符的行</span><br><span class="line">-o显示匹配的内容，并且换行显示</span><br><span class="line">-n显示出过滤出来的行的行号</span><br><span class="line">-r递归查找指定目录下所有的文件（包括其子目录）</span><br><span class="line">-E支持更多的正则扩展表达式</span><br></pre></td></tr></table></figure><h3 id="正则表达式">正则表达式<a class="header-anchor" href="#正则表达式"></a></h3><figure class="highlight plaintext"><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">^aa以aa开头的行</span><br><span class="line">Aa$以aa结尾的行</span><br></pre></td></tr></table></figure><h3 id="通配符">通配符<a class="header-anchor" href="#通配符"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">*表示匹配前一项任意次</span><br><span class="line">?表示匹配前一次0次或1次</span><br><span class="line">+表示匹配前一项一次到多次</span><br><span class="line">.（占位符）表示除换行符之外的任意字符</span><br><span class="line">&#123;n,m&#125;匹配n到m次</span><br><span class="line">&#123;,n&#125;匹配0次到n次</span><br><span class="line">&#123;m,&#125;匹配m次以上</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[]集合表示</span><br><span class="line">[a-zA-Z]</span><br><span class="line">[0-9]</span><br><span class="line">[^a]表示不取a</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">示例</span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment"># grep -E &quot;a.*c&quot; grep_test.txt # 注：.* 匹配前一项 . 0次或任意次</span></span><br><span class="line"><span class="comment"># grep -E &quot;a*c&quot; abc.txt --color=auto# 注：*  匹配前一项 a 0次或任意次</span></span><br><span class="line"><span class="comment"># grep -E &quot;a+c&quot; abc.txt --color=auto# 注：+  匹配前一项 a 1次或多次</span></span><br></pre></td></tr></table></figure><hr><h2 id="二-wc">二. wc<a class="header-anchor" href="#二-wc"></a></h2><p>wc（字数统计）命令</p><p>格式：<code>wc[选项]...目标文件...</code></p><ul class="lvl-0"><li class="lvl-2"><p><strong>-l：统计行数</strong></p></li><li class="lvl-2"><p><strong>-w：统计字数 （前后都是空白的一组字符）</strong></p></li><li class="lvl-2"><p><strong>-c：统计字符数（可见和不可见的字符）</strong></p></li></ul><p>注：wc文本操作命令，可以直接接文本，不需要用cat</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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> wc_test.txt </span><br><span class="line">a b c</span><br><span class="line">aa bb cc</span><br><span class="line">xyz</span><br><span class="line">1234</span><br><span class="line">aa-bb</span><br><span class="line"></span><br><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">wc</span> -l wc_test.txt <span class="comment"># 注：统计行数</span></span><br><span class="line">5 wc_test.txt</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">wc</span> -w wc_test.txt <span class="comment"># 注：统计字数</span></span><br><span class="line">9 wc_test.txt</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">wc</span> -c wc_test.txt <span class="comment"># 注：统计字符数</span></span><br><span class="line">30 wc_test.txt</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> wc_test.txt|<span class="built_in">wc</span> -c<span class="comment"># 写法2：cat</span></span><br><span class="line">30</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">wc</span> -c &lt; wc_test.txt <span class="comment"># 写法3：重定向</span></span><br><span class="line">30</span><br></pre></td></tr></table></figure><hr><h2 id="三-diff">三. diff<a class="header-anchor" href="#三-diff"></a></h2><p>diff命令</p><ul class="lvl-0"><li class="lvl-2"><p>比较两个文件之间的差异</p></li><li class="lvl-2"><p>输出结果为两个文件的不同之处</p></li></ul><p>diff命令的输出格式</p><ul class="lvl-0"><li class="lvl-2"><p>标准diff</p></li><li class="lvl-2"><p><code>-u</code>：会将不同的地方放在一起，紧凑易读</p></li><li class="lvl-2"><p>-r： 递归比较目录下的所有文件</p></li></ul><p>利用diff命令生成补丁</p><ul class="lvl-0"><li class="lvl-2"><p><code>diff -u test1 test2 &gt; test.patch</code></p></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><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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> diff_1_test.txt</span><br><span class="line">aa</span><br><span class="line">bb</span><br><span class="line">cc</span><br><span class="line">xx</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> diff_2_test.txt</span><br><span class="line">aa</span><br><span class="line">bb</span><br><span class="line">xx</span><br><span class="line"></span><br><span class="line">示例1</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# diff diff_1_test.txt diff_2_test.txt </span><br><span class="line">3d2<span class="comment"># 注：3d2  文件1个第3行 需要删除 就会和 文件2相同</span></span><br><span class="line">&lt; cc<span class="comment"># 注：文件1 中的cc</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> diff_1_test.txt</span><br><span class="line">aa</span><br><span class="line">bb</span><br><span class="line">cc</span><br><span class="line">xx</span><br><span class="line">gg</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> diff_2_test.txt</span><br><span class="line">aa</span><br><span class="line">bb</span><br><span class="line"><span class="built_in">dd</span></span><br><span class="line">xx</span><br><span class="line">ee</span><br><span class="line"></span><br><span class="line">示例2</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# diff diff_1_test.txt diff_2_test.txt </span><br><span class="line">3c3<span class="comment"># 注：第3行</span></span><br><span class="line">&lt; cc<span class="comment"># 注：文件1 中的cc</span></span><br><span class="line">---</span><br><span class="line">&gt; <span class="built_in">dd</span><span class="comment"># 注：文件2 中的dd</span></span><br><span class="line">5c5<span class="comment"># 注：第5行</span></span><br><span class="line">&lt; gg<span class="comment"># 注：文件1 中的gg</span></span><br><span class="line">---</span><br><span class="line">&gt; ee<span class="comment"># 注：文件2 中的ee</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例3：-u：会将不同的地方放在一起，紧凑易读</span><br><span class="line">[root@sanchuang-linux ~]# diff -u diff_1_test.txt diff_2_test.txt </span><br><span class="line">--- diff_1_test.txt2020-10-30 11:50:45.784010843 +0800</span><br><span class="line">+++ diff_2_test.txt2020-10-30 11:51:11.475010836 +0800</span><br><span class="line">@@ -1,5 +1,5 @@</span><br><span class="line"> aa</span><br><span class="line"> bb</span><br><span class="line">-cc<span class="comment"># 注：理解为 左 - 右 +</span></span><br><span class="line">+<span class="built_in">dd</span><span class="comment"># 注：或者理解为 左边 -cc +dd 就和右边相同</span></span><br><span class="line"> xx</span><br><span class="line">-gg</span><br><span class="line">+ee</span><br></pre></td></tr></table></figure><hr><h2 id="四-patch">四. patch<a class="header-anchor" href="#四-patch"></a></h2><p>patch命令：</p><ul class="lvl-0"><li class="lvl-2"><p>用途：用来打补丁修补文件</p></li><li class="lvl-2"><p>格式：<code>patch[选项]原始文件 &lt; 补丁文件</code></p></li><li class="lvl-2"><p><code>-p</code>N： N表示忽略N层路径</p></li><li class="lvl-2"><p><code>-R</code>：  还原到老版本</p></li></ul><p>注意事项</p><ul class="lvl-0"><li class="lvl-2"><p>如果打多个补丁，注意先后顺序</p></li><li class="lvl-2"><p>打补丁前不要修改源文件</p></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><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# yum install patch</span><br><span class="line">[root@sanchuang-linux ~]# diff diff_1_test.txt diff_2_test.txt </span><br><span class="line">3c3<span class="comment"># 注：差异内容</span></span><br><span class="line">&lt; cc</span><br><span class="line">---</span><br><span class="line">&gt; <span class="built_in">dd</span></span><br><span class="line">5c5</span><br><span class="line">&lt; gg</span><br><span class="line">---</span><br><span class="line">&gt; ee</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：差异文件又叫补丁文件</span></span><br><span class="line"><span class="comment">#注：生成的是文件1的补丁文件</span></span><br><span class="line">[root@sanchuang-linux ~]# diff -u diff_1_test.txt diff_2_test.txt &gt; diff_test.patch <span class="comment"># 注：1的补丁</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> diff_test.patch <span class="comment">#注：补丁文件</span></span><br><span class="line">--- diff_1_test.txt2020-10-30 11:50:45.784010843 +0800</span><br><span class="line">+++ diff_2_test.txt2020-10-30 11:51:11.475010836 +0800</span><br><span class="line">@@ -1,5 +1,5 @@</span><br><span class="line"> aa</span><br><span class="line"> bb</span><br><span class="line">-cc</span><br><span class="line">+<span class="built_in">dd</span></span><br><span class="line"> xx</span><br><span class="line">-gg</span><br><span class="line">+ee</span><br><span class="line">[root@sanchuang-linux ~]# patch diff_1_test.txt &lt; diff_test.patch <span class="comment"># 注：打补丁</span></span><br><span class="line">patching file diff_1_test.txt</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> diff_1_test.txt <span class="comment"># 注：打补丁</span></span><br><span class="line">aa</span><br><span class="line">bb</span><br><span class="line"><span class="built_in">dd</span></span><br><span class="line">xx</span><br><span class="line">ee</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> diff_2_test.txt <span class="comment"># 注：文件1、2内容相同</span></span><br><span class="line">aa</span><br><span class="line">bb</span><br><span class="line"><span class="built_in">dd</span></span><br><span class="line">xx</span><br><span class="line">ee</span><br></pre></td></tr></table></figure><hr><h2 id="五-grep-A-B">五. grep -A\-B<a class="header-anchor" href="#五-grep-A-B"></a></h2><p>-A：找到匹配行以及后几行</p><p>-B：输出匹配行以及前几行</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">示例</span><br><span class="line">[root@localhost ~]# grep -A 3 quit /etc/passwd<span class="comment"># 注：找到匹配行以及后几行</span></span><br><span class="line">[root@localhost ~]# grep -B 3 quit /etc/passwd<span class="comment"># 注：输出匹配行以及前几行</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-free-g">六. free -g<a class="header-anchor" href="#六-free-g"></a></h2><p><strong>看内存使用率 free -g</strong></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">[root@sanchuang-linux ~]# free -g<span class="comment"># 注：看内存使用率 ，-g单位G ， -m单位M</span></span><br><span class="line">              total        used        free      shared  buff/cache   available</span><br><span class="line">Mem:              1           0           1           0           0           1</span><br><span class="line">Swap:             1           0           1</span><br><span class="line">[root@sanchuang-linux ~]# free -m</span><br><span class="line">              total        used        free      shared  buff/cache   available</span><br><span class="line">Mem:           1800         272        1101           8         426        1363</span><br><span class="line">Swap:          2047           0        2047</span><br></pre></td></tr></table></figure><hr><h2 id="七-编写脚本">七. 编写脚本<a class="header-anchor" href="#七-编写脚本"></a></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><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><br><span class="line">1、监控内存使用情况,如果内存使用率大于百分之80，给予提醒</span><br><span class="line">total free 使用率</span><br><span class="line">2、扫描局域网ip,检查哪些ip地址正在使用</span><br><span class="line">ping -c 1<span class="comment"># 注：发送1个包</span></span><br><span class="line">3、监控文件/etc/passwd是否被修改，每隔5分钟监控一次</span><br><span class="line">diff</span><br><span class="line"><span class="built_in">md5sum</span><span class="comment"># md5值，文件的唯一标识</span></span><br><span class="line">4、监控nginx进程是否存在，不存在就给予相应提醒</span><br><span class="line">pidof nginx</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><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">md5sum</span> abc.txt <span class="comment"># 注：md5值</span></span><br><span class="line">2416b02c3d9d753f48cf49dbb5f1de94  abc.txt</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# pidof nginx<span class="comment"># 注：显示指定程序的进程号</span></span><br><span class="line">12767 12766 12765</span><br></pre></td></tr></table></figure><h3 id="7-1-监控内存使用情况-如果内存使用率大于百分之80，给予提醒">7.1 监控内存使用情况,如果内存使用率大于百分之80，给予提醒<a class="header-anchor" href="#7-1-监控内存使用情况-如果内存使用率大于百分之80，给予提醒"></a></h3><p>​total free 使用率</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><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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">mem</span></span>()&#123;</span><br><span class="line">    total=`free -m|grep -i mem|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f2`</span><br><span class="line">    <span class="comment">#free=`free -m|grep -i mem|tr -s &quot; &quot;|cut -d &quot; &quot; -f4`</span></span><br><span class="line">    used=`free -m|grep -i mem|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f3`</span><br><span class="line">    used_rate=`<span class="built_in">echo</span> <span class="string">&quot;scale=4;<span class="variable">$used</span>/<span class="variable">$total</span>&quot;</span> |bc`</span><br><span class="line">    <span class="comment">#used_1=`echo &quot;$total*0.8&quot;|bc `</span></span><br><span class="line">    result=` <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$used_rate</span>&gt;0.8&quot;</span>|bc `</span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$result</span></span><br><span class="line">    <span class="keyword">if</span> (( <span class="variable">$result</span>  == <span class="number">1</span> ))</span><br><span class="line">    <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">echo</span> -e <span class="string">&quot;\e[31m使用率超过80%，请及时对内存扩容，以免不必要的损失\e[0m&quot;</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="built_in">echo</span>  <span class="string">&quot; nothing to do&quot;</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">&#125;</span><br><span class="line">mem</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# bash mem_test.sh</span><br><span class="line">0</span><br><span class="line"> nothing to <span class="keyword">do</span></span><br><span class="line">============================================================================================</span><br><span class="line">知识点7.1.1 bc 命令</span><br><span class="line">菜鸟教程：https://www.runoob.com/linux/linux-comm-bc.html</span><br><span class="line">bc 命令是任意精度计算器语言，通常在linux下当计算器用</span><br><span class="line">[root@localhost ~]# yum install bc -y</span><br><span class="line">[root@sanchuang-linux ~]# used=`free -m|grep -i mem|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f3`</span><br><span class="line">[root@sanchuang-linux ~]# total=`free -m|grep -i mem|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f2`</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;scale=2;<span class="variable">$used</span>/<span class="variable">$total</span>&quot;</span> |bc<span class="comment"># 注：保留2位小数</span></span><br><span class="line">.16</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;scale=3;<span class="variable">$used</span>/<span class="variable">$total</span>&quot;</span> |bc<span class="comment"># 注：保留3位小数</span></span><br><span class="line">.165</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# free -m|grep -i mem|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f2 <span class="comment"># 注：-i 不区分大小写</span></span><br><span class="line">1800</span><br><span class="line">[root@sanchuang-linux ~]# use_rate=`<span class="built_in">echo</span> <span class="string">&quot;scale=4;<span class="variable">$used</span>/<span class="variable">$total</span>&quot;</span> |bc`</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$use_rate</span>&gt;0.8&quot;</span>|bc<span class="comment"># 注：为假返回0</span></span><br><span class="line">0</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;0.7&gt;0.8&quot;</span>|bc<span class="comment"># 注：为假返回0</span></span><br><span class="line">0</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;0.9&gt;0.8&quot;</span>|bc<span class="comment"># 注：为真返回1</span></span><br><span class="line">1<span class="comment"># 注：这返回的应该是布尔值0假1真，而不是命令执行失败的值。$?都为0 ，命令执行成功</span></span><br><span class="line"><span class="comment">############################################################################################</span></span><br><span class="line">知识点7.1.2 小数的运算</span><br><span class="line">小数的运算：</span><br><span class="line">1、可以使用bc</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;scale=3;1/3&quot;</span>|bc<span class="comment"># 注：保留3位小数</span></span><br><span class="line">.333</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;0.7&gt;0.8&quot;</span>|bc<span class="comment"># 注：不成立返回0</span></span><br><span class="line">0</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;0.9&gt;0.8&quot;</span>|bc<span class="comment"># 注：成立返回1</span></span><br><span class="line">1</span><br><span class="line"></span><br><span class="line">2、awk 选项</span><br><span class="line">语法：awk 选项 ‘模式+动作’ 文件</span><br><span class="line">常用选项：</span><br><span class="line">-F指定分隔符</span><br><span class="line"></span><br><span class="line">内置变量</span><br><span class="line">NRawk里表示每一行的行号</span><br><span class="line">NFawk的列号</span><br><span class="line"></span><br><span class="line">模式</span><br><span class="line"></span><br><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# free -m</span><br><span class="line">              total        used        free      shared  buff/cache   available</span><br><span class="line">Mem:           3770         195        3274          11         300        3348</span><br><span class="line">Swap:          2047           0        2047</span><br><span class="line">[root@localhost ~]# free -m|awk <span class="string">&#x27;NR==2&#123;print $2&#125;&#x27;</span><span class="comment"># 注：打印第二行 第2个变量</span></span><br><span class="line">3770<span class="comment"># 注：NR 行号 ， $2 第2个变量</span></span><br><span class="line">[root@localhost ~]# free -m|awk <span class="string">&#x27;NR==2&#123;print $3&#125;&#x27;</span><span class="comment"># 注：打印第二行 第3个变量</span></span><br><span class="line">194</span><br><span class="line">============================================================================================</span><br><span class="line">[root@sanchuang-linux ~]# free -m|awk <span class="string">&#x27;/Mem/&#123;print $3/$2&#125;&#x27;</span><span class="comment"># 注：计算小数，过滤出Mem</span></span><br><span class="line">0.156111<span class="comment"># 注：过滤出Mem 这1行</span></span><br><span class="line">[root@sanchuang-linux ~]# free -m|awk <span class="string">&#x27;/Mem/&#123;printf &quot;%.2f\n&quot;, $3/$2&#125;&#x27;</span><span class="comment"># 注：保留2位的浮点数</span></span><br><span class="line">0.16<span class="comment"># 注：\n换行输出</span></span><br></pre></td></tr></table></figure><h3 id="7-2-扫描局域网ip-检查哪些ip地址正在使用">7.2 扫描局域网ip,检查哪些ip地址正在使用<a class="header-anchor" href="#7-2-扫描局域网ip-检查哪些ip地址正在使用"></a></h3><p>​ping -c 1# 注：发送1个包</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></pre></td><td class="code"><pre><span class="line">方法1</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">scan_ip</span></span>()&#123;</span><br><span class="line">    <span class="keyword">for</span> ip <span class="keyword">in</span> `<span class="built_in">seq</span> 255`</span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">        ( ip_full=192.168.0.<span class="variable">$ip</span></span><br><span class="line">        ping -c 1 <span class="variable">$ip_full</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="variable">$ip_full</span> &gt;&gt;up.txt || <span class="built_in">echo</span> <span class="variable">$ip_full</span> &gt;&gt;down.txt</span><br><span class="line">        ) &amp;<span class="comment"># 注：放到后台子进程执行</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line"><span class="built_in">wait</span> <span class="comment"># 父进程等待子进程执行完成之后再退出</span></span><br><span class="line">&#125;</span><br><span class="line">scan_ip</span><br><span class="line"></span><br><span class="line">方法2</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">scan_ip</span></span>()&#123;</span><br><span class="line">    <span class="keyword">for</span> ip <span class="keyword">in</span> 192.168.0.&#123;1..255&#125;<span class="comment"># 注：1-255可以这么写</span></span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">        ( </span><br><span class="line">        ping -c 1 <span class="variable">$ip</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="variable">$ip</span> &gt;&gt;up.txt || <span class="built_in">echo</span> <span class="variable">$ip</span> &gt;&gt;down.txt</span><br><span class="line">        ) &amp; </span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line"><span class="built_in">wait</span> <span class="comment">#注：作用：父进程等待子进程执行完成之后再退出</span></span><br><span class="line">&#125;</span><br><span class="line">scan_ip</span><br><span class="line">注：后台进程</span><br><span class="line">命令 &amp;   产生子bash进程去执行命令的任务</span><br><span class="line"><span class="built_in">wait</span>父进程等待子进程结束之后再退出</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]# ip=45</span><br><span class="line">[root@sanchuang-linux ~]# ip_full=192.168.0.<span class="variable">$ip</span><span class="comment"># 注：shell 字符串的拼接</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$ip_full</span> </span><br><span class="line">192.168.0.45</span><br><span class="line">[root@sanchuang-linux ~]# top<span class="comment"># 注：查看cpu</span></span><br></pre></td></tr></table></figure><h3 id="7-3-监控nginx进程是否存在，不存在就给予相应提醒">7.3 监控nginx进程是否存在，不存在就给予相应提醒<a class="header-anchor" href="#7-3-监控nginx进程是否存在，不存在就给予相应提醒"></a></h3><p>​pidof nginx</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">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">check_nginx</span></span>()&#123;</span><br><span class="line">    pidof nginx &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;nginx is running&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;nginx is down&quot;</span></span><br><span class="line">    <span class="comment">#if [[ $? -eq 0 ]]</span></span><br><span class="line">    <span class="comment">#then</span></span><br><span class="line">    <span class="comment">#    echo &quot;nginx is running&quot;</span></span><br><span class="line">    <span class="comment">#fi</span></span><br><span class="line">&#125;</span><br><span class="line">check_nginx</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# pidof nginx</span><br><span class="line">12767 12766 12765</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $?<span class="comment"># 注：返回值为0表示成功</span></span><br><span class="line">0</span><br></pre></td></tr></table></figure><h3 id="7-4-监控文件-etc-passwd是否被修改，每隔5分钟监控一次">7.4 监控文件/etc/passwd是否被修改，每隔5分钟监控一次<a class="header-anchor" href="#7-4-监控文件-etc-passwd是否被修改，每隔5分钟监控一次"></a></h3><p>​diff</p><p>​md5sum# md5值，文件的唯一标识</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">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">check_monitor</span></span>()&#123;</span><br><span class="line">    check_num=`differ /etc/passwd /lianxi/passwd |<span class="built_in">wc</span> -l`</span><br><span class="line">    [[ check_num -eq 0 ]] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;文件未被修改&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;文件已被修改&quot;</span></span><br><span class="line">&#125;</span><br><span class="line">check_monitor</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cp</span> /etc/passwd /lianxi/passwd</span><br><span class="line"><span class="built_in">cp</span>：是否覆盖<span class="string">&#x27;/lianxi/passwd&#x27;</span>？ y</span><br><span class="line">[root@sanchuang-linux ~]# diff /etc/passwd /lianxi/passwd</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $?<span class="comment"># 注：即使文件不被修改，返回也为0 （理解为命令执行成功）</span></span><br><span class="line">0<span class="comment"># 注：所以不能直接用类三元运算 去判断</span></span><br><span class="line">[root@sanchuang-linux ~]# diff /etc/passwd /lianxi/passwd</span><br><span class="line">[root@sanchuang-linux ~]# diff /etc/passwd /lianxi/passwd|<span class="built_in">wc</span></span><br><span class="line">      0       0       0</span><br><span class="line">[root@sanchuang-linux ~]# diff /etc/passwd /lianxi/passwd|<span class="built_in">wc</span> -l</span><br><span class="line">0</span><br><span class="line"><span class="comment">#注：判定依据 diff 是否输出内容</span></span><br><span class="line">没有输出内容，<span class="built_in">wc</span> -l 行数为0，说明文件未被修改</span><br><span class="line"><span class="comment">#注：文件是否被修改，想到diff命令</span></span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Shell </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>12_Linux基础-SHELL命令-sort-uniq-cut-grep-正则表达式-通配符</title>
      <link href="/posts/61496.html"/>
      <url>/posts/61496.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-回顾">一. 回顾<a class="header-anchor" href="#一-回顾"></a></h2><p><strong>回顾1 shell常用命令</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">获取命令的返回输出结果</span><br><span class="line">1.` `，反引号 line=`ls`</span><br><span class="line">2.$()line=$(ls)</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">seq 类似于python里的range</span><br><span class="line">主要生产一组有序数字序列</span><br><span class="line">-s 指定分隔符</span><br><span class="line">-w 指定同等宽度输出</span><br></pre></td></tr></table></figure><hr><h2 id="二-sort">二. sort<a class="header-anchor" href="#二-sort"></a></h2><p><strong>sort命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>默认按每行的第一个字符排序</p></li><li class="lvl-2"><p>-n：按<strong>整数</strong>进行排序–&gt;默认是<strong>升序</strong></p></li><li class="lvl-2"><p>-r：<strong>递减</strong>排序（注：降序）</p></li><li class="lvl-2"><p>-u：去重</p></li></ul><p><code>指定排序键</code></p><ul class="lvl-0"><li class="lvl-2"><p>指定按哪一列数据进行排序</p></li><li class="lvl-2"><p>-k：指定哪一列为排序键</p></li><li class="lvl-2"><p><code>cat tt | sort -n -k4</code></p></li></ul><p><code>指定字段分隔符</code></p><ul class="lvl-0"><li class="lvl-2"><p>-t：指定字段分割符（默认是空白）</p></li><li class="lvl-2"><p><code>sort -t: -n -k3 /etc/passwd</code># 注：指定分隔符为 :</p></li></ul><p><strong>sort是一个排序命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p><strong>默认按照每行第一个首字符进行排序</strong></p><ul class="lvl-2"><li class="lvl-4"><strong>英文根据a-z的顺序进行排序，如果第一个字母相同，就比较第二个字母，依次类推</strong></li><li class="lvl-4"><strong>中文根据首个字符的拼音的首字母进行排序</strong></li></ul></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><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></pre></td><td class="code"><pre><span class="line">示例1：<span class="built_in">cat</span> sort_test.txt |<span class="built_in">sort</span></span><br><span class="line">---------------------------------------------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> sort_test.txt <span class="comment"># 注：显示文本内容</span></span><br><span class="line">中文 456 1xx  123</span><br><span class="line">abc bcd  3yy <span class="built_in">dd</span></span><br><span class="line">Aac XYZ  2zz</span><br><span class="line">三创 xixi</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> sort_test.txt |<span class="built_in">sort</span><span class="comment"># 注：对整个文本进行排序</span></span><br><span class="line">三创 xixi</span><br><span class="line">中文 456 1xx  123</span><br><span class="line">Aac XYZ  2zz</span><br><span class="line">abc bcd  3yy <span class="built_in">dd</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">&gt;&gt;&gt; ord(<span class="string">&quot;三&quot;</span>)<span class="comment"># python中的ord()函数查看万国码编码</span></span><br><span class="line">19977<span class="comment"># 注：sort不是按编码排序</span></span><br><span class="line">&gt;&gt;&gt; ord(<span class="string">&quot;中&quot;</span>)</span><br><span class="line">20013</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# locale<span class="comment"># 注：查看编码格式</span></span><br><span class="line">LANG=zh_CN.UTF-8</span><br><span class="line">LC_CTYPE=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_NUMERIC=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_TIME=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_COLLATE=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_MONETARY=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_MESSAGES=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_PAPER=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_NAME=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_ADDRESS=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_TELEPHONE=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_MEASUREMENT=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_IDENTIFICATION=<span class="string">&quot;zh_CN.UTF-8&quot;</span></span><br><span class="line">LC_ALL=</span><br><span class="line">============================================================================================</span><br><span class="line">示例2：<span class="built_in">cat</span> sort_test.txt |<span class="built_in">sort</span> -k 2指定哪一列为排序键</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> sort_test.txt |<span class="built_in">sort</span> -k2<span class="comment"># 注：指定第二列进行排序</span></span><br><span class="line">中文 456 1xx  123</span><br><span class="line">abc bcd  3yy <span class="built_in">dd</span></span><br><span class="line">三创 xixi</span><br><span class="line">Aac XYZ  2zz</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> sort_test.txt |<span class="built_in">sort</span> -k 3  <span class="comment"># 注：指定第三列进行排序</span></span><br><span class="line">三创 xixi<span class="comment"># 注：空白在前面</span></span><br><span class="line">中文 456 1xx  123<span class="comment"># 注：1</span></span><br><span class="line">Aac XYZ  2zz <span class="comment"># 注：2</span></span><br><span class="line">abc bcd  3yy <span class="built_in">dd</span> <span class="comment"># 注：3</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例3：英文根据a-z的顺序进行排序，如果第一个字母相同，就比较第二个字母</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> sort_test.txt </span><br><span class="line">中文 456 1xx  123</span><br><span class="line">aac bcd  3yy <span class="built_in">dd</span></span><br><span class="line">Aac XYZ  2zz</span><br><span class="line">三创 xixi</span><br><span class="line">Xyz  cde</span><br><span class="line">Bbc  Abc</span><br><span class="line">bbc xxx</span><br><span class="line">ABC</span><br><span class="line">abc</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> sort_test.txt |<span class="built_in">sort</span><span class="comment"># 注：不是按照编码排序</span></span><br><span class="line">三创 xixi</span><br><span class="line">中文 456 1xx  123</span><br><span class="line">aac bcd  3yy <span class="built_in">dd</span></span><br><span class="line">Aac XYZ  2zz</span><br><span class="line">abc</span><br><span class="line">ABC</span><br><span class="line">Bbc  Abc</span><br><span class="line">bbc xxx</span><br><span class="line">Xyz  cde</span><br></pre></td></tr></table></figure><h3 id="sort-n">sort -n<a class="header-anchor" href="#sort-n"></a></h3><p><strong>sort -n 按数字进行排序</strong></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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux ~]# a=123<span class="comment"># 注：a表示的是字符</span></span><br><span class="line">[root@sanchuang-linux ~]# b=234</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$a</span>+<span class="variable">$b</span><span class="comment"># 注：字符串的拼接</span></span><br><span class="line">123+234</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $((<span class="variable">$a</span>+<span class="variable">$b</span>))<span class="comment"># 注：需要用2个括号进行数字的相加</span></span><br><span class="line">357</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> aa.txt </span><br><span class="line">123</span><br><span class="line">23</span><br><span class="line">4</span><br><span class="line">234</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> aa.txt |<span class="built_in">sort</span><span class="comment"># 注：默认情况按首个字母字符串进行排序</span></span><br><span class="line">123</span><br><span class="line">23</span><br><span class="line">234</span><br><span class="line">4</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> aa.txt |<span class="built_in">sort</span> -n<span class="comment"># 注：sort -n 按数值大小进行排序</span></span><br><span class="line">4<span class="comment"># 注：默认升序</span></span><br><span class="line">23<span class="comment"># 注：-n 数字排序比较</span></span><br><span class="line">123</span><br><span class="line">234</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> aa.txt |<span class="built_in">sort</span> -n -r<span class="comment"># 注：数字、倒序 排序，效果相同</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> aa.txt |<span class="built_in">sort</span> -nr<span class="comment"># 注：数字、倒序 排序，效果相同</span></span><br><span class="line">234</span><br><span class="line">123</span><br><span class="line">23</span><br><span class="line">4</span><br></pre></td></tr></table></figure><h3 id="t-指定列数的分隔符">-t 指定列数的分隔符<a class="header-anchor" href="#t-指定列数的分隔符"></a></h3><p><strong>指定列数的分隔符<code># head -n7 /etc/passwd |sort -k6 -t :</code></strong></p><p>​<strong>默认分隔符为空白字符</strong></p><p>​<strong>使用 -t 指定列数的分隔符</strong></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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux ~]# <span class="built_in">head</span> -n7 /etc/passwd |<span class="built_in">sort</span><span class="comment"># 注：取前7行 排序</span></span><br><span class="line">adm:x:3:4:adm:/var/adm:/sbin/nologin</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">daemon:x:2:2:daemon:/sbin:/sbin/nologin</span><br><span class="line">lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line"><span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">head</span> -n7 /etc/passwd |<span class="built_in">sort</span> -k2<span class="comment"># 注：sort -k2指定第2列为排序键</span></span><br><span class="line">adm:x:3:4:adm:/var/adm:/sbin/nologin</span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">daemon:x:2:2:daemon:/sbin:/sbin/nologin</span><br><span class="line">lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line"><span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">head</span> -n7 /etc/passwd |<span class="built_in">sort</span> -k6 -t :<span class="comment"># *注：-t : 指定分隔符为 :</span></span><br><span class="line">bin:x:1:1:bin:/bin:/sbin/nologin</span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line"><span class="built_in">sync</span>:x:5:0:<span class="built_in">sync</span>:/sbin:/bin/sync</span><br><span class="line">daemon:x:2:2:daemon:/sbin:/sbin/nologin</span><br><span class="line">shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown</span><br><span class="line">adm:x:3:4:adm:/var/adm:/sbin/nologin</span><br><span class="line">lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">head</span> -n7 /etc/passwd |<span class="built_in">sort</span> -k6 -t : -r<span class="comment"># 注：-r 倒序</span></span><br></pre></td></tr></table></figure><hr><h2 id="三-练习：找出内存使用率最高的5个进程">三. 练习：找出内存使用率最高的5个进程<a class="header-anchor" href="#三-练习：找出内存使用率最高的5个进程"></a></h2><p><strong>找出内存使用率最高的5个进程</strong></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">ps aux|<span class="built_in">sort</span> -n -k4 -r|<span class="built_in">head</span> -5注：推荐</span><br><span class="line">注：内存使用率 %MEM</span><br><span class="line">[root@sanchuang-linux ~]# ps aux|<span class="built_in">tail</span> -n +2|<span class="built_in">sort</span> -nr -k4 |<span class="built_in">head</span> -5</span><br><span class="line">root         960  0.0  2.0 221572 38096 ?        S    08:31   0:00 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files</span><br><span class="line">root         930  0.0  1.7 425416 31480 ?        Ssl  08:31   0:01 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P</span><br><span class="line">polkitd      890  0.0  1.2 1625936 23856 ?       Ssl  08:31   0:00 /usr/lib/polkit-1/polkitd --no-debug</span><br><span class="line">root         891  0.0  0.9 391216 18088 ?        Ssl  08:31   0:00 /usr/sbin/NetworkManager --no-daemon</span><br><span class="line">root         954  0.0  0.8 219700 15416 ?        S    08:31   0:00 /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#ps aux|tail -n +2|sort -nr -k4 |head -5</span></span><br><span class="line">注：<span class="built_in">tail</span> -n +2 显示从第2行到末尾（可加可不加）</span><br><span class="line">注：<span class="built_in">sort</span> -nr -k4   -n按数字排序，-r倒序，-k4指定第4列为排序键</span><br><span class="line">注：<span class="built_in">head</span> -5 取前5行</span><br></pre></td></tr></table></figure><hr><h2 id="四-uniq">四. uniq<a class="header-anchor" href="#四-uniq"></a></h2><p><strong>uniq命令的使用（去重）</strong></p><p>uniq --&gt; unique唯一的<br>去重相邻的行<br><strong>先排序，再去重</strong><br><strong>-c 统计重复出现的次数</strong><br><strong>-u 显示只出现1次的行</strong><br><strong>-d 显示重复出现的行</strong></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><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></pre></td><td class="code"><pre><span class="line">============================================================================================</span><br><span class="line">示例1：去重相邻的行</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> uniq_test.txt</span><br><span class="line">123 abc</span><br><span class="line">abc 123</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">45</span><br><span class="line">45</span><br><span class="line">47</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">47</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> uniq_test.txt |<span class="built_in">uniq</span><span class="comment"># 注：去重相邻的行</span></span><br><span class="line">123 abc</span><br><span class="line">abc 123</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">45</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">47</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> uniq_test.txt |<span class="built_in">sort</span> -n |<span class="built_in">uniq</span><span class="comment"># 注：先排序，再去重</span></span><br><span class="line">abc 123<span class="comment"># 注：一般来说，先排序，再去重</span></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">123 abc</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">示例1.1 <span class="comment"># cat uniq_test.txt |sort -nu</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> uniq_test.txt |<span class="built_in">sort</span> -n -u<span class="comment"># 注：sort -u 也可以去重</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> uniq_test.txt |<span class="built_in">sort</span> -nu<span class="comment"># 注：效果一样</span></span><br><span class="line">abc 123</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">123 abc</span><br><span class="line">============================================================================================</span><br><span class="line">示例2：-c 统计重复出现</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> uniq_test.txt |<span class="built_in">sort</span> -n |<span class="built_in">uniq</span> -c    <span class="comment"># 注： -c 统计重复出现的次数</span></span><br><span class="line">      1 abc 123</span><br><span class="line">      3 45</span><br><span class="line">      1 46</span><br><span class="line">      3 47</span><br><span class="line">      1 48</span><br><span class="line">      1 123 abc</span><br><span class="line">============================================================================================</span><br><span class="line">示例3：-u显示只出现1次的行</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> uniq_test.txt |<span class="built_in">sort</span> -n |<span class="built_in">uniq</span> -u<span class="comment"># 注：-u显示只出现1次的行</span></span><br><span class="line">abc 123</span><br><span class="line">46</span><br><span class="line">48</span><br><span class="line">123 abc</span><br><span class="line">============================================================================================</span><br><span class="line">示例4：-d 显示重复出现的行</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> uniq_test.txt |<span class="built_in">sort</span> -n |<span class="built_in">uniq</span> -d<span class="comment"># 注：-d 显示重复出现的行</span></span><br><span class="line">45</span><br><span class="line">47</span><br></pre></td></tr></table></figure><hr><h2 id="五-练习：统计120000行-频率前十的ip">五. 练习：统计120000行 频率前十的ip<a class="header-anchor" href="#五-练习：统计120000行-频率前十的ip"></a></h2><p><strong>统计120000行 频率前十的ip</strong></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">[root@sanchuang-linux ~]# <span class="built_in">cat</span> ips.txt |<span class="built_in">sort</span> |<span class="built_in">uniq</span> -c|<span class="built_in">sort</span> -nr |<span class="built_in">head</span></span><br><span class="line"><span class="comment">#注1：第一个sort 把相同的ip段放在一起</span></span><br><span class="line"><span class="comment">#注2：uniq -c统计次数</span></span><br><span class="line"><span class="comment">#注：第二个sort -nr 对前面的次数+ip 进行逆序</span></span><br><span class="line"><span class="comment">#注：head 默认取前十个</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><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="built_in">sort</span> -c 用于统计ip地址的访问</span><br><span class="line">[root@localhost ~]# yum install nginx</span><br><span class="line">[root@sanchuang-linux ~]# nginx</span><br><span class="line">[root@sanchuang-linux ~]# lsof -i:80<span class="comment"># 注：nginx起来了</span></span><br><span class="line">COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span><br><span class="line">nginx   12765  root    9u  IPv4  60060      0t0  TCP *:http (LISTEN)</span><br><span class="line">nginx   12765  root   10u  IPv6  60061      0t0  TCP *:http (LISTEN)</span><br><span class="line">nginx   12766 nginx    9u  IPv4  60060      0t0  TCP *:http (LISTEN)</span><br><span class="line">nginx   12766 nginx   10u  IPv6  60061      0t0  TCP *:http (LISTEN)</span><br><span class="line">nginx   12767 nginx    9u  IPv4  60060      0t0  TCP *:http (LISTEN)</span><br><span class="line">nginx   12767 nginx   10u  IPv6  60061      0t0  TCP *:http (LISTEN)</span><br><span class="line">[root@sanchuang-linux ~]# iptables -F<span class="comment"># 注：关闭防火墙</span></span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /var/log<span class="comment"># 注：/var/log放日志</span></span><br><span class="line">[root@sanchuang-linux <span class="built_in">log</span>]# <span class="built_in">cd</span> nginx</span><br><span class="line">[root@sanchuang-linux nginx]# <span class="built_in">pwd</span></span><br><span class="line">/var/log/nginx</span><br><span class="line">[root@sanchuang-linux nginx]# <span class="built_in">ls</span></span><br><span class="line">access.log  error.log<span class="comment"># 注：日志文件</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-练习：统计web服务器访问前十的用户">六. 练习：统计web服务器访问前十的用户<a class="header-anchor" href="#六-练习：统计web服务器访问前十的用户"></a></h2><p><strong>统计web服务器访问前十的用户（注：通过ip判断）</strong></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></pre></td><td class="code"><pre><span class="line"><span class="comment">#注：nginx查看访问次数最多的3个ip(笔试题常见)</span></span><br><span class="line"><span class="comment">#cat access.log |awk &#x27;&#123;print $1&#125;&#x27;|sort|uniq -c|sort -nr|head -3</span></span><br><span class="line">[root@sanchuang-linux nginx]# <span class="built_in">head</span> access.log </span><br><span class="line">192.168.0.42 - - [29/Oct/2020:12:01:01 +0800] <span class="string">&quot;GET / HTTP/1.1&quot;</span> 200 4057 <span class="string">&quot;-&quot;</span> <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400&quot;</span> <span class="string">&quot;-&quot;</span></span><br><span class="line">………………<span class="comment"># 注：awk命令 提取文本第一列数据 ip地址</span></span><br><span class="line">[root@sanchuang-linux nginx]# <span class="built_in">cat</span> access.log |awk <span class="string">&#x27;&#123;print $1&#125;&#x27;</span></span><br><span class="line">192.168.0.42<span class="comment"># 注：默认以空格为分隔符，打印第一列$1</span></span><br><span class="line">192.168.0.42</span><br><span class="line">192.168.0.42</span><br><span class="line">192.168.0.42</span><br><span class="line">192.168.0.42</span><br><span class="line">192.168.0.193</span><br><span class="line">192.168.0.193</span><br><span class="line">192.168.0.193</span><br><span class="line">192.168.0.193<span class="comment"># 注：awk命令 提取文本第一列数据 ip地址</span></span><br><span class="line">[root@sanchuang-linux nginx]# <span class="built_in">cat</span> access.log |awk <span class="string">&#x27;&#123;print $1&#125;&#x27;</span>|<span class="built_in">sort</span>|<span class="built_in">uniq</span> -c|<span class="built_in">sort</span> -nr|<span class="built_in">head</span> -3</span><br><span class="line">      5 192.168.0.42<span class="comment"># 注：统计前3的访问量</span></span><br><span class="line">      4 192.168.0.193</span><br></pre></td></tr></table></figure><hr><h2 id="七-cut">七. cut<a class="header-anchor" href="#七-cut"></a></h2><p><strong>cut命令</strong></p><ul class="lvl-0"><li class="lvl-2"><p>从文本文件或者文本流中提取文本列</p></li><li class="lvl-2"><p><code>cut -选项 提取范围 文本文件</code></p></li></ul><p>-----------------------------------</p><p><strong>常见选项</strong></p><ul class="lvl-0"><li class="lvl-2"><p>-c：从指定提取范围中提取字符</p></li><li class="lvl-2"><p>-f：从指定提取范围中提取字段</p></li><li class="lvl-2"><p>-d：指定分隔符，默认分隔符为tab键</p></li></ul><p>-----------------------------------</p><p><strong>提取范围</strong></p><p><code>n：第n项</code></p><p><code>n-：第n项到行尾</code></p><p><code>-m：行首到第m项 </code></p><p><code>n,m：第n项和第m项 </code></p><p><code>n-m：第n项到第m项</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><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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# w<span class="comment"># 注：w 当前用户登录情况</span></span><br><span class="line"> 14:45:33 up  4:12,  5 <span class="built_in">users</span>,  load average: 0.00, 0.00, 0.03</span><br><span class="line">USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT</span><br><span class="line">root     tty1     -                三22   15:49   0.08s  0.08s -bash</span><br><span class="line">root     pts/0    192.168.0.42     14:29    3.00s  0.02s  0.01s w</span><br><span class="line">root     pts/1    192.168.0.42     14:29   15:35   0.00s  0.00s -bash</span><br><span class="line">root     pts/3    192.168.0.42     09:48    4:56m  0.03s  0.03s -bash</span><br><span class="line">root     pts/4    192.168.0.42     09:50    2:37m  0.52s  0.52s -bash</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">who</span><span class="comment"># 注：w 看到更详细点</span></span><br><span class="line">root     tty1         2020-10-28 22:15</span><br><span class="line">root     pts/0        2020-10-29 14:29 (192.168.0.42)</span><br><span class="line">root     pts/1        2020-10-29 14:29 (192.168.0.42)</span><br><span class="line">root     pts/3        2020-10-29 09:48 (192.168.0.42)</span><br><span class="line">root     pts/4        2020-10-29 09:50 (192.168.0.42)</span><br><span class="line">方法1</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# w |<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d<span class="string">&quot; &quot;</span> -f 1,2,4</span><br><span class="line"> 14:50:31 4:17,<span class="comment"># 注：默认分隔符为tab键，所有要压缩 </span></span><br><span class="line">USER TTY LOGIN@<span class="comment"># 注：再指定分隔符为空格</span></span><br><span class="line">root tty1 三22   <span class="comment"># 注：加tr -s &quot; &quot;</span></span><br><span class="line">root pts/0 14:29</span><br><span class="line">root pts/1 14:29</span><br><span class="line">root pts/3 09:48</span><br><span class="line">root pts/4 09:50</span><br><span class="line">方法2</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# w |awk <span class="string">&#x27;&#123;print $1,$2,$4&#125;&#x27;</span><span class="comment"># 注：awk 默认分隔符是空白字符</span></span><br><span class="line">14:51:28 up 5    <span class="comment"># 注：打印第1、2、4列</span></span><br><span class="line">USER TTY LOGIN@</span><br><span class="line">root tty1 三22</span><br><span class="line">root pts/0 14:29</span><br><span class="line">root pts/1 14:29</span><br><span class="line">root pts/3 09:48</span><br><span class="line">root pts/4 09:50</span><br></pre></td></tr></table></figure><h3 id="以冒号作为分隔符-截取用户名、用户Id、用户属组">以冒号作为分隔符  截取用户名、用户Id、用户属组<a class="header-anchor" href="#以冒号作为分隔符-截取用户名、用户Id、用户属组"></a></h3><p><strong>以冒号作为分隔符  截取用户名、用户Id、用户属组</strong></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">写法1</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> /etc/passwd|<span class="built_in">cut</span> -d<span class="string">&quot;:&quot;</span> -f 1,3,5</span><br><span class="line">写法2（推荐）</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot;:&quot;</span> -f 1,3,5 /etc/passwd<span class="comment"># 注：截取1,3,5列</span></span><br><span class="line"><span class="comment">#注：文本操作命令，可以直接操作文本，不需要用到cat</span></span><br></pre></td></tr></table></figure><h3 id="取值范围">取值范围<a class="header-anchor" href="#取值范围"></a></h3><p><strong>取值范围</strong></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">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot;:&quot;</span> -f 1,3,5 /etc/passwd<span class="comment"># 注：截取1,3,5列</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot;:&quot;</span> -f 1-5 /etc/passwd<span class="comment"># 注：截取1-5列</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot;:&quot;</span> -f 3- /etc/passwd<span class="comment"># 注：截取第3列--列尾</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot;:&quot;</span> -f -3 /etc/passwd<span class="comment"># 注：截取前3列</span></span><br><span class="line">============================================================================================</span><br><span class="line">-c：从指定提取范围中提取字符</span><br><span class="line">示例</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> abcdefg |<span class="built_in">cut</span> -c 2<span class="comment"># 注：截取第2个字符</span></span><br><span class="line">b</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> abcdefg |<span class="built_in">cut</span> -c 2-5<span class="comment"># 注：截取2--5个字符</span></span><br><span class="line">bcde</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> abcdefg |<span class="built_in">cut</span> -c 5-<span class="comment"># 注：截取第5到末尾字符</span></span><br><span class="line">efg</span><br></pre></td></tr></table></figure><hr><h2 id="八-练习">八. 练习<a class="header-anchor" href="#八-练习"></a></h2><p><strong>练习</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">1统计access.log中排名前三的ip</span><br><span class="line">2显示/boot目录下面所有的文件大小(包括子目录中的文件)，并且由小到大排序</span><br><span class="line">3统计/etc/passwd中每种shell使用的次数（降序排序）</span><br><span class="line">4统计一下/etc/passwd中sbin这个单词出现了多少次</span><br><span class="line">5只显示ens33的ip地址</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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br></pre></td><td class="code"><pre><span class="line">============================================================================================</span><br><span class="line">示例1：1统计access.log中排名前三的ip</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot;-&quot;</span> -f 1 access.log |<span class="built_in">sort</span>|<span class="built_in">uniq</span> -c|<span class="built_in">sort</span> -nr|<span class="built_in">head</span> -n3</span><br><span class="line">      7 192.168.0.42 </span><br><span class="line">      6 192.168.0.193 </span><br><span class="line">      5 192.168.0.38 </span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f1 access.log |<span class="built_in">sort</span>|<span class="built_in">uniq</span> -c</span><br><span class="line">      6 192.168.0.193</span><br><span class="line">      5 192.168.0.21</span><br><span class="line">      5 192.168.0.32</span><br><span class="line">      5 192.168.0.37</span><br><span class="line">      5 192.168.0.38</span><br><span class="line">      7 192.168.0.42</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f1 access.log |<span class="built_in">sort</span>|<span class="built_in">uniq</span> -c|<span class="built_in">sort</span> -nr</span><br><span class="line">      7 192.168.0.42</span><br><span class="line">      6 192.168.0.193</span><br><span class="line">      5 192.168.0.38</span><br><span class="line">      5 192.168.0.37</span><br><span class="line">      5 192.168.0.32</span><br><span class="line">      5 192.168.0.21</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f1 access.log |<span class="built_in">sort</span>|<span class="built_in">uniq</span> -c|<span class="built_in">sort</span> -nr|<span class="built_in">head</span> -3</span><br><span class="line">      7 192.168.0.42</span><br><span class="line">      6 192.168.0.193</span><br><span class="line">      5 192.168.0.38</span><br><span class="line">============================================================================================</span><br><span class="line">示例2：2显示/boot目录下面所有的文件大小(包括子目录中的文件)，并且由小到大排序</span><br><span class="line">方法1</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">du</span> -ak /boot |<span class="built_in">sort</span> -n  <span class="comment"># 注：以k为字节</span></span><br><span class="line">4/boot/.bashrc</span><br><span class="line">4/boot/efi/EFI/centos</span><br><span class="line">4/boot/grub2/device.map</span><br><span class="line">4/boot/grub2/grubenv</span><br><span class="line">4/boot/grub2/i386-pc/adler32.mod</span><br><span class="line">4/boot/grub2/i386-pc/all_video.mod</span><br><span class="line">4/boot/grub2/i386-pc/aout.mod</span><br><span class="line"></span><br><span class="line">方法2</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# ll -R|grep root|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f 5,9|<span class="built_in">sort</span> -n</span><br><span class="line">0 1214.txt</span><br><span class="line">0 12244.txt</span><br><span class="line">0 1224.txt</span><br><span class="line">0 12456.txt</span><br><span class="line">0 20</span><br><span class="line">0 20</span><br><span class="line">0 2020-09-24-18_25_03.txt</span><br><span class="line"></span><br><span class="line">方法3</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# ll -R|grep root|awk <span class="string">&#x27;&#123;print $5,$9&#125;&#x27;</span>|<span class="built_in">sort</span> -n</span><br><span class="line">0 1214.txt</span><br><span class="line">0 12244.txt</span><br><span class="line">0 1224.txt</span><br><span class="line">0 12456.txt</span><br><span class="line">0 20</span><br><span class="line">0 20</span><br><span class="line">0 2020-09-24-18_25_03.txt</span><br><span class="line">0 abcd.txt</span><br><span class="line">============================================================================================</span><br><span class="line">示例3：3统计/etc/passwd中每种shell使用的次数（降序排序）</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cut</span> -d : -f7 /etc/passwd |<span class="built_in">sort</span>|<span class="built_in">uniq</span> -c|<span class="built_in">sort</span> -nr</span><br><span class="line">     31 /bin/bash</span><br><span class="line">     19 /sbin/nologin</span><br><span class="line">      1 /sbin/shutdown</span><br><span class="line">      1 /sbin/halt</span><br><span class="line">      1 /bin/sync</span><br><span class="line">============================================================================================</span><br><span class="line">示例4：4统计一下/etc/passwd中sbin这个单词出现了多少次</span><br><span class="line">方法1</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# grep -o sbin /etc/passwd</span><br><span class="line">sbin</span><br><span class="line">sbin</span><br><span class="line">………………</span><br><span class="line">sbin</span><br><span class="line">sbin</span><br><span class="line">[root@sanchuang-linux ~]# grep -o sbin /etc/passwd|<span class="built_in">wc</span> -l</span><br><span class="line">25</span><br><span class="line"></span><br><span class="line">方法2</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> /etc/passwd|<span class="built_in">tr</span> <span class="string">&quot;:&quot;</span> <span class="string">&quot;\n&quot;</span>|grep sbin|<span class="built_in">wc</span> -l</span><br><span class="line">25<span class="comment"># 注：将: 换成 换行符  同一行换到不同的行去</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例5：5只显示ens33的ip地址</span><br><span class="line"><span class="comment">#ip a |grep ens33|grep inet|tr -s &quot; &quot;|cut -d &quot; &quot; -f3|cut -d&quot;/&quot; -f1</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# ip a |grep ens33</span><br><span class="line">2: ens33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000</span><br><span class="line">    inet 192.168.0.34/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33</span><br><span class="line">[root@sanchuang-linux ~]# ip a |grep ens33|grep inet|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f3</span><br><span class="line">192.168.0.34/24</span><br><span class="line">[root@sanchuang-linux ~]# ip a |grep ens33|grep inet|<span class="built_in">tr</span> -s <span class="string">&quot; &quot;</span>|<span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f3|<span class="built_in">cut</span> -d<span class="string">&quot;/&quot;</span> -f1</span><br><span class="line">192.168.0.34</span><br></pre></td></tr></table></figure><hr><h2 id="九-awk指定分隔符-F">九. awk指定分隔符 -F<a class="header-anchor" href="#九-awk指定分隔符-F"></a></h2><p><strong>awk指定分隔符 -F</strong></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">[root@sanchuang-linux ~]# awk -F<span class="string">&quot;:&quot;</span> <span class="string">&#x27;&#123;print $1&#125;&#x27;</span> /etc/passwd</span><br><span class="line">root</span><br><span class="line">bin</span><br><span class="line">daemon</span><br><span class="line">adm</span><br><span class="line">lp</span><br><span class="line"><span class="built_in">sync</span></span><br><span class="line">…………………………</span><br></pre></td></tr></table></figure><hr><h2 id="十-grep">十. grep<a class="header-anchor" href="#十-grep"></a></h2><p><strong>grep命令</strong></p><p>文本三剑客  ==&gt;  awk  grep  sed<br><a href="https://www.cnblogs.com/end/archive/2012/02/21/2360965.html">https://www.cnblogs.com/end/archive/2012/02/21/2360965.html</a><br>grep 过滤  通用的正则表达式分析程序<br><strong>grep、egrep、fgrep</strong><br><strong>做匹配来过滤的</strong></p><p>用途：在文件中查找并显示包含指定字符串的行 格式：<code>grep  [选项]... 模式  目标文件</code></p><p>#注：<strong>模式pattern --》模板</strong></p><p>​   <strong>可以接受一个正则表达式</strong></p><p><code>-i</code>：查找时忽略大小写</p><p><code>-v</code>：反转查找，输出与模式不相符的行</p><p>-n：显示符合模式要求的行号</p><p>-r：递归搜索所有文件</p><p><code>-o</code>：只显示匹配的内容</p><p><code>-E</code>：支持更多的元字符（支持扩展正则）</p><p>-A：找到匹配行以及后几行</p><p>-B：输出匹配行以及前几行</p><p>模式</p><p><code>^….  ：以什么开头，整行以什么开头</code></p><p><code>…..$ ：以什么结尾，整行以什么结尾</code></p><p>注：grep 是文本操作命令，可以直接操作文本</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></pre></td><td class="code"><pre><span class="line">=====================================================================</span><br><span class="line">示例1：-v：反转查找，输出与模式不相符的行</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# grep -v “#” /etc/yum.repos.d/centos.repo   </span><br><span class="line"><span class="comment"># 注：不输出包含# 的行</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例2：-i 查找时忽略大小写</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /etc/ssh/</span><br><span class="line">[root@sanchuang-linux ssh]# <span class="built_in">pwd</span></span><br><span class="line">/etc/ssh</span><br><span class="line">[root@sanchuang-linux ssh]# grep -i <span class="string">&quot;port&quot;</span> /etc/ssh/sshd_config <span class="comment"># 注：查找时忽略大小写</span></span><br><span class="line"><span class="comment"># If you want to change the port on a SELinux system, you have to tell</span></span><br><span class="line"><span class="comment"># semanage port -a -t ssh_port_t -p tcp #PORTNUMBER</span></span><br><span class="line"><span class="comment">#Port 22</span></span><br><span class="line"><span class="comment"># WARNING: &#x27;UsePAM no&#x27; is not supported in Fedora and may cause several</span></span><br><span class="line"><span class="comment">#GatewayPorts no</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例3：忽略大小写，并显示查找到的行号</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ssh]# grep -i -n <span class="string">&quot;port&quot;</span> /etc/ssh/sshd_config <span class="comment"># 注：显示符合模式要求的行号</span></span><br><span class="line">13:# If you want to change the port on a SELinux system, you have to tell</span><br><span class="line">15:# semanage port -a -t ssh_port_t -p tcp <span class="comment">#PORTNUMBER</span></span><br><span class="line">17:#Port 22</span><br><span class="line">102:# WARNING: <span class="string">&#x27;UsePAM no&#x27;</span> is not supported <span class="keyword">in</span> Fedora and may cause several</span><br><span class="line">108:#GatewayPorts no</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例4：-r 递归搜索所有文件</span><br><span class="line">注：子目录以及子子目录下面查找</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ssh]# grep <span class="string">&quot;xxxxx&quot;</span> * -r  <span class="comment"># 注：当前目录所有目录及子目录文件下的 递归查找</span></span><br><span class="line">[root@sanchuang-linux ssh]# grep <span class="string">&quot;GET&quot;</span> /var/log/nginx -r  <span class="comment"># 注：nginx目录下面 递归查找</span></span><br><span class="line">/var/log/nginx/error.log:2020/10/29 12:01:02 [error] 12767#0: *2 open() <span class="string">&quot;/usr/share/nginx/html/favicon.ico&quot;</span> failed (2: No such file or directory), client: 192.168.0.42, server: _, request: <span class="string">&quot;GET /favicon.ico HTTP/1.1&quot;</span>, host: <span class="string">&quot;192.168.0.34&quot;</span>, referrer: <span class="string">&quot;http://192.168.0.34/&quot;</span></span><br><span class="line">/var/log/nginx/error.log:2020/10/29 12:01:58 [error] 12767#0: *2 open() <span class="string">&quot;/usr/share/nginx/html/favicon.ico&quot;</span> failed (2: No such file or directory), client: 192.168.0.42, server: _, request: <span class="string">&quot;GET /favicon.ico HTTP/1.1&quot;</span>, host: <span class="string">&quot;192.168.0.34&quot;</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#递归查找/var/log/nginx下的所有文件（包括其下面子目录里的文件）</span></span><br><span class="line">[root@mysql-binary nginx]# grep <span class="string">&quot;GET&quot;</span> /var/log/nginx -r</span><br></pre></td></tr></table></figure><hr><h2 id="十一-正则表达式">十一. 正则表达式<a class="header-anchor" href="#十一-正则表达式"></a></h2><p><strong>正则表达式</strong></p><p><code>^aa     表示以aa开头的行</code><br><code>aa$     表示以aa结尾的行</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[]      表示一个字符集</span><br><span class="line">[a-z]   从a - z 中取一个</span><br><span class="line">[^a-z]  不取a-z的字符</span><br><span class="line">grep ^[^a-zA-Z0-9_] grep_test.txt  显示不以字母、数字、下划线开头的行</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><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></pre></td><td class="code"><pre><span class="line">示例1：不输出以#开头的行</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux yum.repos.d]# grep -v ^# centos.repo</span><br><span class="line">[root@sanchuang-linux yum.repos.d]# grep -v ^# centos.repo|grep -v ^$   <span class="comment"># 注：不输出空白行</span></span><br><span class="line">注：不输出空白行       grep -v ^$</span><br><span class="line">   不输出以#开头的行  grep -v ^#</span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例2：过滤出grep_test.txt中，不以#号开头的行 和 非空白行</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">cat</span> grep_test.txt</span><br><span class="line"><span class="comment">#aaa</span></span><br><span class="line">aaa#bbb</span><br><span class="line"></span><br><span class="line">456</span><br><span class="line"><span class="comment">#</span></span><br><span class="line">789</span><br><span class="line">[root@sanchuang-linux chenpeng]# grep -v ^# grep_test.txt  <span class="comment"># 注：过滤出不以#号开头的行</span></span><br><span class="line">aaa#bbb</span><br><span class="line"></span><br><span class="line">456</span><br><span class="line">789</span><br><span class="line"></span><br><span class="line"><span class="comment">#方法1</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# grep -v ^# grep_test.txt |grep -v ^$<span class="comment"># 注：过滤出空白行</span></span><br><span class="line">aaa#bbb                                      <span class="comment"># 注：如果是空白字符  不会被过滤</span></span><br><span class="line">456</span><br><span class="line">789</span><br><span class="line"></span><br><span class="line"><span class="comment">#方法2</span></span><br><span class="line">过滤出grep_test.txt中 不以#开头的行和非空白行</span><br><span class="line">[root@sanchuang-linux chenpeng]# grep -v -E <span class="string">&quot;^#|^$&quot;</span> grep_test.txt </span><br><span class="line">aaa#bbb                         <span class="comment"># 注：-E 正则表达式 ，| 或者 ， -v 不显示</span></span><br><span class="line">456                             <span class="comment"># 注：-E：支持更多的元字符（支持扩展正则）</span></span><br><span class="line">789</span><br></pre></td></tr></table></figure><hr><h2 id="十二-表示一个字符集（正则表达式）">十二. [] 表示一个字符集（正则表达式）<a class="header-anchor" href="#十二-表示一个字符集（正则表达式）"></a></h2><p><strong>[] 表示一个字符集（正则表达式）</strong></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></pre></td><td class="code"><pre><span class="line">[root@localhost chenpeng]# <span class="built_in">cat</span> grep_test.txt </span><br><span class="line">abc</span><br><span class="line">adc</span><br><span class="line">Abdc</span><br><span class="line">ac</span><br><span class="line">a1c</span><br><span class="line">axy</span><br><span class="line">axc</span><br><span class="line">123</span><br><span class="line">777</span><br><span class="line">示例1：过滤出abc adc</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost chenpeng]# grep a[bd]c grep_test.txt        <span class="comment"># 注：取字符集[bd]里面的其中1个</span></span><br><span class="line">abc</span><br><span class="line">adc</span><br><span class="line">[root@sanchuang-linux chenpeng]# grep a[a-z]c grep_test.txt <span class="comment"># 注：取出a-z中的1个字符</span></span><br><span class="line">abc                                        <span class="comment"># 注：ac    没有被过滤，必须有1个字符放在这里</span></span><br><span class="line">adc                                        <span class="comment"># 注：[a-z] 表示 从a - z 中取一个</span></span><br><span class="line">axc</span><br><span class="line">[root@sanchuang-linux chenpeng]# grep a[0-9]c grep_test.txt     <span class="comment"># 注：取出0-9中的1歌字符</span></span><br><span class="line">a1c</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"></span><br><span class="line">示例2：[^a-z] 不取a-z的字符</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# grep a[^a-z]c grep_test.txt    <span class="comment"># 注：^取反，ac之间不取a-z的字符</span></span><br><span class="line">a1c</span><br><span class="line"></span><br><span class="line">示例3：取出不以字母开头的行</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# grep ^[^a-zA-Z] grep_test.txt  <span class="comment"># 注：不以a-zA-Z开头的行</span></span><br><span class="line">11c</span><br><span class="line">123                                   <span class="comment"># 注：中间接空格  表示 包括空格</span></span><br><span class="line">777</span><br><span class="line">注：grep ^[a-zA-Z] grep_test.txt  以字母开头的行</span><br><span class="line">============================================================================================</span><br><span class="line">示例4：显示不以字母、数字、下划线开头的行</span><br><span class="line">写法1</span><br><span class="line">[root@sanchuang-linux chenpeng]# grep ^[^a-zA-Z0-9_] grep_test.txt</span><br><span class="line">写法2</span><br><span class="line">[root@sanchuang-linux chenpeng]# grep -v ^[a-zA-Z0-9_] grep_test.txt</span><br><span class="line"><span class="comment">#注：显示不以字母、数字、下划线开头的行</span></span><br></pre></td></tr></table></figure><hr><h2 id="十三-通配符（正则表达式）">十三. 通配符（正则表达式）<a class="header-anchor" href="#十三-通配符（正则表达式）"></a></h2><p><strong>通配符（正则表达式）</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">*     代表匹配前一个项任意次</span><br><span class="line">？    代表匹配前一个项0次或者1次</span><br><span class="line">+     代表匹配前一个项一次到多次</span><br><span class="line">.     占位符 除\n之外的任意字符</span><br><span class="line">&#123;n,m&#125; 匹配前一项n到m次</span><br><span class="line">egrep 等同于 grep -E</span><br><span class="line">fgrep 不支持任何正则，普通文本过滤</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><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">示例1：* ? + .</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：匹配的都是前面这个字符</span></span><br><span class="line">[root@localhost ~]# <span class="built_in">cat</span> grep_test.txt </span><br><span class="line">alc</span><br><span class="line">axxc</span><br><span class="line">ac</span><br><span class="line">[root@localhost ~]# grep -E a.?c grep_test.txt    <span class="comment"># 注：-E 支持更多正则扩展</span></span><br><span class="line">alc                                               <span class="comment"># 注：.  占位符（注=一定要有1个字符）</span></span><br><span class="line">ac                                                <span class="comment"># 注：.? 表示a和c之间.可以出现0次到1次</span></span><br><span class="line">[root@localhost ~]# grep -E a.*c grep_test.txt    <span class="comment"># 注：.* 表示a和c之间可以有任意个.（任意个字符）</span></span><br><span class="line">alc               <span class="comment"># 注：egrep 等同于 grep -E</span></span><br><span class="line">axxc</span><br><span class="line">ac</span><br><span class="line">[root@localhost ~]# grep -E a.c grep_test.txt     <span class="comment"># 注：.  表示a和c之间只有1个字符</span></span><br><span class="line">alc</span><br><span class="line">[root@localhost ~]# grep -E a.+c grep_test.txt    <span class="comment"># 注：代表前一个字符.出现1个到多个</span></span><br><span class="line">alc</span><br><span class="line">axxc</span><br><span class="line"></span><br><span class="line">示例2：&#123; &#125;</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#注：匹配的都是前面这个字符</span></span><br><span class="line">[root@localhost ~]# egrep <span class="string">&quot;a.&#123;1&#125;c&quot;</span> grep_test.txt    <span class="comment"># 注：指定 . 出现1次</span></span><br><span class="line">alc</span><br><span class="line">[root@localhost ~]# egrep <span class="string">&quot;a.&#123;1,2&#125;c&quot;</span> grep_test.txt  <span class="comment"># 注：指定 . 出现1次到2次</span></span><br><span class="line">alc</span><br><span class="line">axxc</span><br><span class="line"></span><br><span class="line">示例3：&#123; &#125;</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@localhost ~]# <span class="built_in">cat</span> grep_test.txt </span><br><span class="line">alc</span><br><span class="line">axxc</span><br><span class="line">ac</span><br><span class="line">ayy1c</span><br><span class="line">addddddc</span><br><span class="line">[root@localhost ~]# egrep <span class="string">&quot;a.&#123;1,5&#125;c&quot;</span> grep_test.txt           <span class="comment"># 注：前1项 . 出现1次到5次</span></span><br><span class="line">alc</span><br><span class="line">axxc</span><br><span class="line">ayy1c</span><br><span class="line"></span><br><span class="line">egrep 等同于 grep -E</span><br><span class="line">fgrep  不支持正则，普通文本过滤</span><br></pre></td></tr></table></figure><hr><h2 id="十四-练习：grep-正则表达式">十四. 练习：grep 正则表达式<a class="header-anchor" href="#十四-练习：grep-正则表达式"></a></h2><p><strong>grep 正则表达式</strong></p><p>1、进入/lianxi目录，复制/etc/passwd到当前目录下，然后对passwd进行操作</p><p>2、查找出当前passwd文件中以ftp或者mail开头的行，输出到屏幕</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">grep -E <span class="string">&quot;^ftp|^mail&quot;</span> passwd</span><br><span class="line">egrep <span class="string">&quot;^ftp|^mail&quot;</span> passwd</span><br></pre></td></tr></table></figure><p>3、查找出当前passwd文件中不以r、m、f开头的行</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">grep -v -E <span class="string">&quot;^r|^m|^f&quot;</span> passwd</span><br><span class="line">grep ^[^rmp] passwd</span><br></pre></td></tr></table></figure><p>4、查找出当前passwd中以bash结尾的行</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">grep bash$ passwd</span><br></pre></td></tr></table></figure><p>5、查找出/etc/login.defs文件中的有效行（不显示空行和注释行，以#号开头的行）</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">grep -v -E <span class="string">&quot;^#|^$&quot;</span> /etc/login.defs</span><br></pre></td></tr></table></figure><p>6、查找出/var/log/messages 文档中有15个字母的单词</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">grep -E <span class="string">&quot;[^a-zA-Z][a-zA-Z&#123;15&#125;][^a-zA-Z]&quot;</span> /var/log/message  <span class="comment"># 注：左右不是单词，中间15个字母</span></span><br><span class="line">grep -E <span class="string">&quot;\b[a-zA-Z&#123;15&#125;]\b&quot;</span> /var/log/message                <span class="comment"># 注：\b自动匹配单词的边界</span></span><br></pre></td></tr></table></figure><p>7、查找出/etc/passwd文件里用户名包含liu同时使用bash的用户</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">grep liu /etc/passwd|grep bash$|<span class="built_in">cut</span> -d<span class="string">&quot;:&quot;</span> -f1</span><br></pre></td></tr></table></figure><p>8、查找出/etc/ssh/sshd_config里的有效行</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">grep -v -E <span class="string">&quot;^#|^$&quot;</span> /etc/ssh/sshd_config</span><br></pre></td></tr></table></figure><p>9、查找出/etc/ssh/sshd_config 文件里包含连续2个字符的行</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">grep -E <span class="string">&quot;(.)\1&quot;</span> /etc/ssh/sshd_config </span><br><span class="line">grep -E <span class="string">&quot;(.)\1&quot;</span>  <span class="comment"># 注：.除了换行的任意一个字符  \1前面这个组在\1这里又出现一次（一模一样）  </span></span><br></pre></td></tr></table></figure><p>10、查找出包含特殊字符的行</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">grep -E <span class="string">&quot;[^0-Z]&quot;</span> grep_test.txt</span><br></pre></td></tr></table></figure><p>11、查找出不包含数字的行</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">grep -v <span class="string">&quot;[0-9]&quot;</span> abc.txt</span><br></pre></td></tr></table></figure><p>12、查找出/var/log/secure里的ip地址</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"><span class="built_in">cut</span> -d <span class="string">&quot; &quot;</span> -f11 /var/log/secure|grep -E <span class="string">&quot;\..&quot;</span>|<span class="built_in">sort</span>|<span class="built_in">uniq</span>    注：\.转义  第二个. 表示任1字符</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><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><br><span class="line">grep -E <span class="string">&quot;((([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.)&#123;3&#125;(([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))&quot;</span> ip_test.txt</span><br><span class="line">============================================================================================</span><br><span class="line">ip地址匹配：</span><br><span class="line">   Ipv4  0-255  4个    192.168.1.0</span><br><span class="line">注：匹配ip地址</span><br><span class="line">[root@sanchuang-linux ~]# grep -E <span class="string">&quot;((([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.)&#123;3&#125;(([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))&quot;</span> ip_test.txt</span><br><span class="line">192.168.0.1</span><br><span class="line">192.168.1.255</span><br><span class="line">172.0.0.1</span><br><span class="line"></span><br><span class="line">((([<span class="number">0</span>-<span class="number">9</span>])|([<span class="number">1</span>-<span class="number">9</span>][<span class="number">0</span>-<span class="number">9</span>])|(<span class="number">1</span>[<span class="number">0</span>-<span class="number">9</span>][<span class="number">0</span>-<span class="number">9</span>])|(<span class="number">2</span>[<span class="number">0</span>-<span class="number">4</span>][<span class="number">0</span>-<span class="number">9</span>])|(<span class="number">25</span>[<span class="number">0</span>-<span class="number">5</span>]))\.)&#123;3&#125;(([<span class="number">0</span>-<span class="number">9</span>])|([<span class="number">1</span>-<span class="number">9</span>][<span class="number">0</span>-<span class="number">9</span>])|(<span class="number">1</span>[<span class="number">0</span>-<span class="number">9</span>][<span class="number">0</span>-<span class="number">9</span>])|(<span class="number">2</span>[<span class="number">0</span>-<span class="number">4</span>][<span class="number">0</span>-<span class="number">9</span>])|(<span class="number">25</span>[<span class="number">0</span>-<span class="number">5</span>]))</span><br><span class="line"><span class="comment">#括号括起来表示一个组</span></span><br><span class="line"></span><br><span class="line">分析</span><br><span class="line">0-255</span><br><span class="line">0-9                                     个位数</span><br><span class="line">[1-9][0-9]                              十位数</span><br><span class="line">(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])   百位数</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Shell </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>11_Linux基础-SHELL入门2</title>
      <link href="/posts/35184.html"/>
      <url>/posts/35184.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-练习：用户-增删改查">一. 练习：用户 增删改查<a class="header-anchor" href="#一-练习：用户-增删改查"></a></h2><p><strong>脚本 编写一个脚本，实现如下功能</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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><br><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">====================</span><br><span class="line">输入的指定不是1-4，给提示给予提醒，并且如果不输入退出的话，可以循环添加。</span><br><span class="line">按1  增加用户，并且设置密码 useradd  passwd</span><br><span class="line">按2  删除用户     userdel -r </span><br><span class="line">按3  查看用户    id </span><br><span class="line">按4  退出         exit</span><br><span class="line">=====================================================================</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><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></pre></td><td class="code"><pre><span class="line">示例1：</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">menu</span></span>()&#123;<span class="comment">#（注：函数）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;====================&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;1.增加用户并增加密码&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;2.删除用户&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;3.查看用户&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;4.退出&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;====================&quot;</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请选择您所需要的服务:&quot;</span> ser</span><br><span class="line">&#125;</span><br><span class="line">-------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">create_user</span></span>()&#123;<span class="comment">#（注：函数）</span></span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;创建用户名:&quot;</span> user1</span><br><span class="line">    <span class="built_in">id</span> <span class="variable">$user1</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;用户已存在！&quot;</span> &amp;&amp; <span class="built_in">return</span><span class="comment">#（注：退出函数，接return）</span></span><br><span class="line">    useradd <span class="variable">$user1</span> &amp;&gt;/dev/null<span class="comment">#（注：导入黑洞文件）</span></span><br><span class="line">    <span class="built_in">id</span> <span class="variable">$user1</span> &amp;&gt;/dev/null || <span class="built_in">return</span> <span class="comment">#(注：用户已存在 用Id 判断比较好。返回值非0可能是命令执行错误)</span></span><br><span class="line">    <span class="built_in">read</span> -s -p <span class="string">&quot;设置密码:&quot;</span> passwd1<span class="comment">#（注：-s密码隐藏）</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$passwd1</span>|passwd <span class="variable">$user1</span> --stdin &amp;&gt;/dev/null</span><br><span class="line">&#125;</span><br><span class="line">-----------------------------------------------------------</span><br><span class="line"><span class="keyword">while</span> :</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">menu<span class="comment">#（注：调用函数）</span></span><br><span class="line"><span class="keyword">case</span> <span class="variable">$ser</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line">    clear<span class="comment">#（注：清空屏幕）</span></span><br><span class="line">    create_user</span><br><span class="line">    ;;</span><br><span class="line">2)</span><br><span class="line"><span class="comment"># ……………………………………</span></span><br><span class="line">4)</span><br><span class="line">    <span class="built_in">echo</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">    <span class="built_in">echo</span> “请输入1-4！”</span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">-----------------------------------------------------------------------------------------------------------</span><br><span class="line">示例2：<span class="keyword">if</span> 语法</span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">    <span class="keyword">if</span> [<span class="string">&quot;<span class="variable">$options</span>&quot;</span>==1]||[<span class="string">&quot;<span class="variable">$options</span>&quot;</span>==2]||[<span class="string">&quot;<span class="variable">$options</span>&quot;</span>==3]||[<span class="string">&quot;<span class="variable">$options</span>&quot;</span>==4]</span><br><span class="line">    <span class="keyword">then</span></span><br><span class="line">        <span class="keyword">case</span> <span class="variable">$options</span> <span class="keyword">in</span></span><br><span class="line">        1)</span><br><span class="line">            <span class="built_in">read</span> -p <span class="string">&quot;请输入用户名:&quot;</span> username</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">id</span> <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line">            <span class="keyword">then</span></span><br><span class="line">                <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$username</span> is exist!&quot;</span></span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">                <span class="built_in">read</span> -s -p <span class="string">&quot;请设置密码:&quot;</span> password</span><br><span class="line">                useradd <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line">                <span class="built_in">echo</span> <span class="variable">$password</span> | <span class="variable">$username</span> --stdin &amp;&gt;/dev/null</span><br><span class="line">                <span class="built_in">echo</span> -e <span class="string">&quot;\n create <span class="variable">$username</span> ok!&quot;</span></span><br><span class="line">            <span class="keyword">fi</span> </span><br><span class="line">            ;;</span><br><span class="line">    <span class="comment"># ……………………………………………………</span></span><br><span class="line">        4)</span><br><span class="line">            <span class="built_in">echo</span> <span class="string">&quot;退出!&quot;</span></span><br><span class="line">            <span class="built_in">exit</span></span><br><span class="line">        <span class="keyword">esac</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;请输入数字1或2或3或4!&quot;</span></span><br><span class="line">    <span class="keyword">fi</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><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">补充：&amp;&amp;可以连接2个命令</span><br><span class="line">--------------------------------------------------------------------</span><br><span class="line">&amp;&amp;可以连接2个命令</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">id</span> chen222</span><br><span class="line">uid=1017(chen222) gid=1017(chen222) 组=1017(chen222)</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">id</span> chen222 &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;chen222存在&quot;</span></span><br><span class="line">uid=1017(chen222) gid=1017(chen222) 组=1017(chen222)</span><br><span class="line">chen222存在</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">id</span> chen222 &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;chen222存在&quot;</span></span><br><span class="line">chen222存在</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：用户已存在 用id 判断比较好。返回值非0可能是命令执行错误</span></span><br></pre></td></tr></table></figure><hr><h2 id="二-变量">二. 变量<a class="header-anchor" href="#二-变量"></a></h2><p><strong>变量 全局/局部</strong></p><h3 id="Shell">Shell<a class="header-anchor" href="#Shell"></a></h3><p><code>Shell中定义的变量  默认全局变量</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><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><br><span class="line"><span class="built_in">local</span> a=10 局部变量</span><br><span class="line">示例1：<span class="built_in">local</span> 局部变量</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">func01</span></span>()&#123;</span><br><span class="line">    <span class="built_in">local</span> a=10</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">func01<span class="comment">#（注：调用函数）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# sh aaa.sh </span><br><span class="line"><span class="comment">#（注：为空。局部变量）</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例2：默认全局变量</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">func01</span></span>()&#123;</span><br><span class="line">    a=10</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">func01<span class="comment">#（注：调用函数）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# sh aaa.sh </span><br><span class="line">10<span class="comment">#（注：全局变量）</span></span><br></pre></td></tr></table></figure><h3 id="Python">Python<a class="header-anchor" href="#Python"></a></h3><p><code>Python定义的变量  默认局部变量</code></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></pre></td><td class="code"><pre><span class="line">===========================================================================================</span><br><span class="line"><span class="keyword">global</span> a 全局变量</span><br><span class="line">示例<span class="number">1</span>：<span class="keyword">global</span> a 全局变量</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func01</span>():</span><br><span class="line">    <span class="keyword">global</span> a <span class="comment">#（注：全局变量）</span></span><br><span class="line">    a = <span class="number">10</span></span><br><span class="line"></span><br><span class="line">func01()</span><br><span class="line"><span class="built_in">print</span>(a)</span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># python3 python_hanshu.py </span></span><br><span class="line"><span class="number">10</span></span><br><span class="line">============================================================================================</span><br><span class="line">示例<span class="number">2</span>：默认局部变量  只能在函数体内使用的变量</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func01</span>():</span><br><span class="line">    a = <span class="number">10</span></span><br><span class="line"></span><br><span class="line">func01()</span><br><span class="line"><span class="built_in">print</span>(a)</span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># python3 python_hanshu.py </span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;python_hanshu.py&quot;</span>, line <span class="number">5</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">    <span class="built_in">print</span>(a)</span><br><span class="line">NameError: name <span class="string">&#x27;a&#x27;</span> <span class="keyword">is</span> <span class="keyword">not</span> defined<span class="comment">#（注：局部变量）</span></span><br></pre></td></tr></table></figure><h3 id="Shell函数里传参（位置变量）">Shell函数里传参（位置变量）<a class="header-anchor" href="#Shell函数里传参（位置变量）"></a></h3><p>shell函数里传参（位置变量）</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></pre></td><td class="code"><pre><span class="line">示例：</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">Shell里传参</span><br><span class="line"><span class="function"><span class="title">func01</span></span>()&#123;</span><br><span class="line">    a=100</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$1</span> <span class="variable">$2</span> <span class="variable">$3</span>&quot;</span><span class="comment">#（注：函数的参数 [位置变量]）</span></span><br><span class="line">&#125;</span><br><span class="line">func01 第一个参数 第二个参数 第三个参数<span class="comment">#（注：调用参数）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$a</span></span><br></pre></td></tr></table></figure><h3 id="Python里传参">Python里传参<a class="header-anchor" href="#Python里传参"></a></h3><p>python里传参</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">示例：python里传参</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">func01</span>(<span class="params">x,y</span>):</span><br><span class="line">    <span class="keyword">global</span> a</span><br><span class="line">    a = <span class="number">10</span></span><br><span class="line"></span><br><span class="line">func01(<span class="number">1</span>,<span class="number">2</span>)</span><br><span class="line"><span class="built_in">print</span>(a)</span><br></pre></td></tr></table></figure><hr><h2 id="三-test">三. test<a class="header-anchor" href="#三-test"></a></h2><p><strong>test判断  等同于[]</strong></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">示例：<span class="built_in">test</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# a=123</span><br><span class="line">[root@sanchuang-linux chenpeng]# b=123</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">test</span> a==b</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">test</span> a==b &amp;&amp; <span class="built_in">echo</span> ok</span><br><span class="line">ok</span><br></pre></td></tr></table></figure><hr><h2 id="四-判断方式-test">四. 判断方式 []  [[]]  (())  test<a class="header-anchor" href="#四-判断方式-test"></a></h2><p><strong>判断方式 []  [[]]  (())  test</strong></p><ul class="lvl-0"><li class="lvl-2"><p>(( ))判断数字 &gt; &lt; == !=</p></li><li class="lvl-2"><p>[[ ]]判断字符串 或者 -eq -ne -gt -lt 判断数字</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox23"><label for="checkbox23">是不支持的，建议使用[[ ]]</label></p></li><li class="lvl-2"><p><strong>test(测试)判断，等同于1个中括号</strong></p></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></pre></td><td class="code"><pre><span class="line">示例：<span class="built_in">test</span></span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=123</span><br><span class="line">[root@sanchuang-linux ~]# b=123</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">test</span> a==b &amp;&amp; <span class="built_in">echo</span> ok</span><br><span class="line">ok</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">test</span> a==b &amp;&amp; <span class="built_in">echo</span> ok || <span class="built_in">echo</span> error</span><br><span class="line">ok</span><br></pre></td></tr></table></figure><hr><h2 id="五-连接运算">五. 连接运算<a class="header-anchor" href="#五-连接运算"></a></h2><p><strong>连接运算</strong></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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> <span class="string">&quot;abc&quot;</span>;<span class="built_in">echo</span> <span class="string">&quot;xyz&quot;</span></span><br><span class="line">abc</span><br><span class="line">xyz</span><br></pre></td></tr></table></figure><hr><h2 id="六-函数">六. 函数<a class="header-anchor" href="#六-函数"></a></h2><h3 id="函数的定义-使用">函数的定义/使用<a class="header-anchor" href="#函数的定义-使用"></a></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><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">add</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> “两数相加为:$(( <span class="variable">$num1</span> + <span class="variable">$num2</span> ))”</span><br><span class="line">&#125;</span><br><span class="line">add</span><br><span class="line">============================================================================================</span><br></pre></td></tr></table></figure><h3 id="函数的传参">函数的传参<a class="header-anchor" href="#函数的传参"></a></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">示例：位置参数传参</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">func01</span></span>()&#123;</span><br><span class="line">    a=100</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$1</span> <span class="variable">$2</span> <span class="variable">$3</span>&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">func01 第一个参数 第二个参数 第三个参数</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line">============================================================================================</span><br><span class="line">·函数内的变量定义   默认为全局变量</span><br><span class="line">·使用<span class="built_in">local</span>关键字 可以转换为局部变量</span><br></pre></td></tr></table></figure><hr><h2 id="七-seq">七. seq<a class="header-anchor" href="#七-seq"></a></h2><p><strong>seq命令</strong></p><p>seq命令 类似于 python中的range函数</p><p>用途：**打印出一串有序的数字 **</p><p>格式：seq<code>[选项]数字范围</code></p><p><strong>-s：指定分隔符</strong></p><p><strong>-w：指定同等宽带输出</strong></p><p>----------------------------------------</p><p>数字范围的展示：</p><p>[start] [step] end</p><p>start 和 step 都是选填的</p><p>step 为正，表示从小到大输出</p><p>step 为负，表示从大到小输出</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><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></pre></td><td class="code"><pre><span class="line">示例1：[start] [step] end</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">seq</span> 3 -1 1<span class="comment"># 注：中间是步长。左右是起始位置</span></span><br><span class="line">3</span><br><span class="line">2</span><br><span class="line">1</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">seq</span> 1 2 6</span><br><span class="line">1</span><br><span class="line">3</span><br><span class="line">5</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">seq</span> 1 -2 6<span class="comment"># 注：步长为负数时，从1到6没有输出</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">seq</span> 6 -2 1</span><br><span class="line">6</span><br><span class="line">4</span><br><span class="line">2</span><br><span class="line">示例2：# <span class="built_in">seq</span> 2 5 <span class="comment"># seq -w 9 12</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">seq</span> 2 5</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">[root@localhost ~]# <span class="built_in">seq</span> -w 9 12<span class="comment"># -w 指定同等宽度输出</span></span><br><span class="line">09</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</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">示例3：获取/etc/passwd最后一行，赋给一个变量</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">tail</span> -n1 /etc/passwd<span class="comment"># 注：获取最后一行 # tail -n1</span></span><br><span class="line">wtc:x:1029:1029::/home/wtc:/bin/bash</span><br><span class="line">[root@sanchuang-linux ~]# line=`<span class="built_in">tail</span> -n1 /etc/passwd`<span class="comment"># 注：方法1</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$line</span></span><br><span class="line">wtc:x:1029:1029::/home/wtc:/bin/bash</span><br><span class="line">[root@sanchuang-linux ~]# line1=$(<span class="built_in">tail</span> -n1 /etc/passwd)<span class="comment"># 注：方法2</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$line1</span></span><br><span class="line">wtc:x:1029:1029::/home/wtc:/bin/bash</span><br><span class="line">============================================================================================</span><br><span class="line">示例4：<span class="built_in">seq</span>命令 类似于 python中的range函数</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# vim seq_test.sh</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">seq</span> 2 10`<span class="comment"># 注：反引号 执行这个命令，获取命令的返回值</span></span><br><span class="line"><span class="keyword">do</span><span class="comment"># 注：seq 2 10 包括2，包括10</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">-----------------------------------------------------------------------</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> $(<span class="built_in">seq</span> 2 10)<span class="comment"># 注：也表示执行这个命令，获取命令的返回值</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@sanchuang-linux ~]# bash seq_test.sh </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">============================================================================================</span><br><span class="line">示例5：-s：指定分隔符</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">seq</span> -s <span class="string">&quot;+&quot;</span> 10<span class="comment"># -s：指定分隔符</span></span><br><span class="line">1+2+3+4+5+6+7+8+9+10<span class="comment"># 注：不搞开头，默认情况下 从1开始，到10</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">seq</span> 10<span class="comment">#注：默认情况下 连接符是 换行符</span></span><br><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></tr></table></figure><hr><h2 id="八-练习：创建用户">八. 练习：创建用户<a class="header-anchor" href="#八-练习：创建用户"></a></h2><p><strong>创建用户（3次重试机会）脚本</strong></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><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></pre></td><td class="code"><pre><span class="line">示例：<span class="built_in">seq</span>命令  创建失败 重试</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# vim user_add.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="comment"># 增加# 注：用户增加的部分</span></span><br><span class="line"><span class="function"><span class="title">add</span></span>()&#123;</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">seq</span> 3 -1 1`<span class="comment"># 注：seq 命令类似于pythonrange函数 3 2 1</span></span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;增加用户&quot;</span></span><br><span class="line">        <span class="built_in">read</span> -p <span class="string">&quot;请输入用户名：&quot;</span> username</span><br><span class="line">       <span class="built_in">id</span> <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;用户已存在,还有<span class="subst">$(( $i - 1)</span>)次机会&quot;</span> &amp;&amp; <span class="built_in">continue</span></span><br><span class="line">       <span class="comment">#if id $username &amp;&gt;/dev/null </span></span><br><span class="line">       <span class="comment">#then</span></span><br><span class="line">       <span class="comment">#     echo &quot;用户已存在，还有$(( $i -1 ))次机会&quot;</span></span><br><span class="line">       <span class="comment">#     continue</span></span><br><span class="line">       <span class="comment">#fi  </span></span><br><span class="line">       <span class="comment">#useradd $username &amp;&gt;/dev/null &amp;&amp; echo &quot;创建成功！&quot; &amp;&amp; echo $password | passwd $username --stdin &amp;&gt;/dev/null &amp;&amp; break || echo -e &quot;\n创建失败！&quot;</span></span><br><span class="line">       <span class="keyword">if</span> useradd <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line">       <span class="keyword">then</span></span><br><span class="line">           <span class="built_in">echo</span> <span class="string">&quot;创建<span class="variable">$&#123;username&#125;</span>成功！&quot;</span></span><br><span class="line">           <span class="built_in">read</span> -s -p <span class="string">&quot;请设置密码：&quot;</span> password</span><br><span class="line">           <span class="built_in">echo</span> <span class="variable">$password</span> | passwd <span class="variable">$username</span> --stdin &amp;&gt;/dev/null</span><br><span class="line">           <span class="built_in">break</span></span><br><span class="line">       <span class="keyword">else</span></span><br><span class="line">           <span class="built_in">echo</span> <span class="string">&quot;创建失败！,还有<span class="subst">$(($i-1)</span>)次机会！&quot;</span></span><br><span class="line">       <span class="keyword">fi</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment"># 删除</span></span><br><span class="line"><span class="function"><span class="title">del</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;删除用户&quot;</span></span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;请输入用户名：&quot;</span> username</span><br><span class="line">    userdel -r <span class="variable">$username</span> &amp;&gt;/dev/null &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;删除成功！&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;用户不存在，删除失败！&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment"># 查看</span></span><br><span class="line"><span class="function"><span class="title">seek</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;查看用户&quot;</span></span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;请输入用户名：&quot;</span> username</span><br><span class="line">    <span class="built_in">id</span> <span class="variable">$username</span> </span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;#############################&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;按1  增加用户，并且设置密码&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;按2  删除用户&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;按3  查看用户&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;按4  退出&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;#############################&quot;</span></span><br><span class="line"><span class="keyword">while</span> :</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;请输入你的选择：&quot;</span> options</span><br><span class="line">    <span class="keyword">case</span> <span class="variable">$options</span> <span class="keyword">in</span></span><br><span class="line">    1)</span><br><span class="line">        add</span><br><span class="line">        ;;</span><br><span class="line">    2)</span><br><span class="line">        del</span><br><span class="line">        ;;</span><br><span class="line">    3)</span><br><span class="line">        seek</span><br><span class="line">        ;;</span><br><span class="line">    4)</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;退出！&quot;</span></span><br><span class="line">        <span class="built_in">exit</span></span><br><span class="line">        ;;</span><br><span class="line">    *)</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;请输入指定内容 1-4！&quot;</span></span><br><span class="line">    <span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><hr><h2 id="九-循环获取文件或者命令输出的内容-3种">九. 循环获取文件或者命令输出的内容(3种)<a class="header-anchor" href="#九-循环获取文件或者命令输出的内容-3种"></a></h2><h3 id="重定向">重定向<a class="header-anchor" href="#重定向"></a></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></pre></td><td class="code"><pre><span class="line">示例1：重定向  <span class="keyword">while</span> <span class="built_in">read</span> a b c； &lt; a.txt</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> a b c</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">&quot;name is <span class="variable">$a</span>, sex is <span class="variable">$b</span>, age is <span class="variable">$c</span> &quot;</span></span><br><span class="line"><span class="keyword">done</span> &lt; a.txt<span class="comment"># 注：当前路径下的文件。可以接绝对路径</span></span><br><span class="line">============================================================================================</span><br></pre></td></tr></table></figure><h3 id="管道符号">管道符号<a class="header-anchor" href="#管道符号"></a></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">示例2：管道符号<span class="built_in">cat</span> a.txt | <span class="keyword">while</span> <span class="built_in">read</span> a b c</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="built_in">cat</span> a.txt | <span class="keyword">while</span> <span class="built_in">read</span> a b c</span><br><span class="line"><span class="keyword">do</span> </span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;name is <span class="variable">$a</span>, sex is <span class="variable">$b</span>, age is <span class="variable">$c</span> &quot;</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">============================================================================================</span><br></pre></td></tr></table></figure><h3 id="for循环">for循环<a class="header-anchor" href="#for循环"></a></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><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">示例3：<span class="keyword">for</span> 循环实现（注：使用<span class="keyword">for</span>循环去做，不太好）</span><br><span class="line"><span class="comment">#for循环默认以空白(空格/回车 制表符)分割</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;for 循环实现...........&quot;</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">ls</span>`<span class="comment"># i 代表空白输出的每个文件</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">示例3.2：i代表文件的每一项，以空白分割</span><br><span class="line">[root@sanchuang-linux ~]# vim file_test.sh</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">cat</span> a.txt`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@sanchuang-linux ~]# bash file_test.sh </span><br><span class="line">wenyao</span><br><span class="line">f</span><br><span class="line">18</span><br><span class="line">chenpeng</span><br><span class="line">m</span><br><span class="line">19</span><br><span class="line">wtc</span><br><span class="line">f</span><br><span class="line">17</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> a.txt </span><br><span class="line">wenyao f 18</span><br><span class="line">chenpeng m 19</span><br><span class="line">wtc f 17</span><br><span class="line">示例3.3：<span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">ls</span> -al`<span class="comment"># i代表当前目录下详细信息，i代表以空白分割的每一项</span></span><br></pre></td></tr></table></figure><hr><h2 id="十-练习：找出list-xml中主机为ZF的行然后循环输出ip与区服对应的关系">十. 练习：找出list.xml中主机为ZF的行然后循环输出ip与区服对应的关系<a class="header-anchor" href="#十-练习：找出list-xml中主机为ZF的行然后循环输出ip与区服对应的关系"></a></h2><p><strong>找出list.xml中主机为ZF的行然后循环输出ip与区服对应的关系</strong></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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> list.xml </span><br><span class="line"><span class="comment">####IP    主机名    区服#########</span></span><br><span class="line">127.0.0.1 ZF-1      1 33 49 57</span><br><span class="line">127.0.0.1 ZF-11     65 67 69</span><br><span class="line">127.0.0.1 HF-1      22 34 6</span><br><span class="line">127.0.0.1 HF-11     6 17 36</span><br><span class="line">127.0.0.1 ZF-12     1 2</span><br><span class="line">127.0.0.1 HF-1      34 7</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">步骤1：首先过滤出ZF所在的行</span><br><span class="line">[root@sanchuang-linux ~]# vim test6.sh </span><br><span class="line"><span class="comment">#!/bin/bash# 管道| 把输出 作为下一条命令的输入</span></span><br><span class="line"><span class="built_in">cat</span> list.xml |grep ZF |<span class="keyword">while</span> <span class="built_in">read</span> ip host qufu<span class="comment"># 首先过滤出ZF所在的行</span></span><br><span class="line"><span class="keyword">do</span><span class="comment"># while read 获取内容</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;ip:<span class="variable">$ip</span>, qufu:<span class="variable">$qufu</span>&quot;</span><span class="comment"># 注：参数3整个赋给$qufu</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> list.xml | grep ZF</span><br><span class="line">127.0.0.1 ZF-1      1 33 49 57</span><br><span class="line">127.0.0.1 ZF-11     65 67 69</span><br><span class="line">127.0.0.1 ZF-12     1 2</span><br><span class="line">[root@sanchuang-linux ~]# sh test6.sh <span class="comment"># 注：$ip  $host  $qufu  不一定需要对应</span></span><br><span class="line">ip:127.0.0.1, qufu:1 33 49 57<span class="comment"># 前两个对应的，把前两个都取了</span></span><br><span class="line">ip:127.0.0.1, qufu:65 67 69<span class="comment"># 后面有的话，就全部是后面的内容</span></span><br><span class="line">ip:127.0.0.1, qufu:1 2<span class="comment"># 没有的话就为空（取不到的话就为空）</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">步骤2：套个循环</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="built_in">cat</span> list.xml |grep ZF |<span class="keyword">while</span> <span class="built_in">read</span> ip host qufu</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="variable">$qufu</span><span class="comment"># 注：套个循环。for循环以空格进行分割</span></span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;ip:<span class="variable">$ip</span>, qufu:<span class="variable">$i</span>&quot;</span><span class="comment"># 注：这里是i。对区服进行循环</span></span><br><span class="line">    <span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@sanchuang-linux ~]# sh test6.sh </span><br><span class="line">ip:127.0.0.1, qufu:1</span><br><span class="line">ip:127.0.0.1, qufu:33</span><br><span class="line">ip:127.0.0.1, qufu:49</span><br><span class="line">ip:127.0.0.1, qufu:57</span><br><span class="line">ip:127.0.0.1, qufu:65</span><br><span class="line">ip:127.0.0.1, qufu:67</span><br><span class="line">ip:127.0.0.1, qufu:69</span><br><span class="line">ip:127.0.0.1, qufu:1</span><br><span class="line">ip:127.0.0.1, qufu:2</span><br></pre></td></tr></table></figure><hr><h2 id="十一-循环获取文件或者命令输出的内容">十一. 循环获取文件或者命令输出的内容<a class="header-anchor" href="#十一-循环获取文件或者命令输出的内容"></a></h2><p><strong>循环获取文件或者命令输出的内容</strong></p><ul class="lvl-0"><li class="lvl-2"><p>for i in 默认 以空白分割 循环获取每个元素</p></li><li class="lvl-2"><p>while read 每次获取整行</p></li></ul><p>while read的参数 可以接任意个，默认还是以空白分割</p><p>如果参数没有对应获取的值，那参数就为空</p><p>如果文件中空白分割的参数大于read接受的参数，那多出的参数都会赋给最后一个read接受的参数</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">管道  进制之间通信的一种方式</span><br></pre></td></tr></table></figure><hr><h2 id="十二-shell中的一维数组">十二. shell中的一维数组<a class="header-anchor" href="#十二-shell中的一维数组"></a></h2><p><strong>shell中的一维数组</strong></p><p>shell中的一维数组 使用<br>定义：使用<code>圆括号</code>，中间以 <code>空格</code> 作为分隔符<br>博客连接：<a href="https://www.cnblogs.com/tangshengwei/p/5446315.html">https://www.cnblogs.com/tangshengwei/p/5446315.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><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></pre></td><td class="code"><pre><span class="line">示例14.1：定义、索取</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=(xx yy zz)<span class="comment"># 注：a 是一个数组</span></span><br><span class="line">[root@sanchuang-linux ~]# a=(xx yy zz ff)<span class="comment"># 注：a 是一个数组</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[0]&#125;</span><span class="comment"># 注：通过索引查找，下标从0开始</span></span><br><span class="line">xx</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[1]&#125;</span><span class="comment"># 注：通过索引查找</span></span><br><span class="line">yy</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[3]&#125;</span></span><br><span class="line">ff</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[@]&#125;</span><span class="comment"># 注：$&#123;a[@]&#125; 表示它里面的每一个数，@ 取它里面的全部值</span></span><br><span class="line">xx yy zz ff<span class="comment"># 注：$@ 参数列表里面的全部内容</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[@]:1:4&#125;</span><span class="comment"># 注：索取（切片）</span></span><br><span class="line">yy zz ff</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=(xx yy zz ff)</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$a</span><span class="comment"># 注：echo $a  只取出一位数组里的第一个元素</span></span><br><span class="line">xx</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]&#125;</span><span class="comment"># 注：$&#123;a[*]&#125; 取出一位数组里面的全部内容，效果一样</span></span><br><span class="line">xx yy zz ff</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[@]&#125;</span><span class="comment"># 注：$&#123;a[@]&#125; 取出一位数组里面的全部内容</span></span><br><span class="line">xx yy zz ff</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a:0:4&#125;</span><span class="comment"># 注：对字符 xx 进行截取 从0开始</span></span><br><span class="line">xx</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a:1:4&#125;</span><span class="comment"># 注：对字符 xx 进行截取 从1开始</span></span><br><span class="line">x</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]:1:3&#125;</span><span class="comment"># 注：索取，效果一样（切片）</span></span><br><span class="line">yy zz ff</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=(1 2 3 4)</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]:1:3&#125;</span><span class="comment"># 注：索取，闭区间（切片）</span></span><br><span class="line">2 3 4</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="comment"># echo $&#123;#a[*]&#125;</span></span><br><span class="line"><span class="comment"># echo $&#123;#a[@]&#125;</span></span><br><span class="line">示例14.2：获取一位数组长度（元素个数）</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;#a[*]&#125;</span><span class="comment"># 注：不能用$a直接获取，因为 $a 代表 里面第一个元素</span></span><br><span class="line">4</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;#a[@]&#125;</span></span><br><span class="line">4</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;#a&#125;</span><span class="comment"># 注：第一个元素长度</span></span><br><span class="line">2</span><br><span class="line"><span class="comment">###########################################################################################</span></span><br><span class="line">示例14.3：获取字符串长度 <span class="built_in">echo</span> <span class="variable">$&#123;#b&#125;</span></span><br><span class="line">[root@sanchuang-linux ~]# b=abc</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;#b&#125;</span></span><br><span class="line">3</span><br><span class="line">============================================================================================</span><br><span class="line">修改/删除 元素（shell里面一维数组的修改/删除）</span><br><span class="line">示例14.4：修改/删除 元素</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]&#125;</span></span><br><span class="line">xx yy zz ff</span><br><span class="line">[root@sanchuang-linux ~]# a[3]=<span class="string">&quot;hh&quot;</span><span class="comment"># 注：修改元素</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]&#125;</span></span><br><span class="line">xx yy zz hh<span class="comment"># 注：清空数组 unset a</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">unset</span> a[3]<span class="comment"># 注：删除指定元素(下标为3)</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]&#125;</span></span><br><span class="line">xx yy zz</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]&#125;</span></span><br><span class="line">xx zz</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">unset</span> a[1]<span class="comment"># 注：删除不了</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]&#125;</span></span><br><span class="line">xx zz</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;!a[*]&#125;</span><span class="comment"># 注：加！ 看元素的下标</span></span><br><span class="line">0 2<span class="comment"># 注：删除后，不会重新分配下标。一开始每个值的下标都一一对应了，不会改</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">unset</span> a[2]<span class="comment"># 注：删除zz元素，unset a[2]，下标为2</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$&#123;a[*]&#125;</span></span><br><span class="line">xx</span><br><span class="line">[root@sanchuang-linux ~]# </span><br></pre></td></tr></table></figure><hr><h2 id="十三-linux里-生成随机数">十三. linux里 生成随机数<a class="header-anchor" href="#十三-linux里-生成随机数"></a></h2><p><strong>linux里 生成随机数</strong></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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$RANDOM</span> <span class="comment"># 注：自定义的环境变量</span></span><br><span class="line">15386</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$RANDOM</span> </span><br><span class="line">24960</span><br><span class="line"><span class="comment">############################################################################################</span></span><br><span class="line">知识点15.2 生成指定范围内的随机数</span><br><span class="line">示例1：产生10以内的随机数（不含10）</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $((<span class="variable">$RANDOM</span> % <span class="number">10</span>)) </span><br><span class="line">1</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $((<span class="variable">$RANDOM</span> % <span class="number">10</span>)) </span><br><span class="line">8</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $((<span class="variable">$RANDOM</span> % <span class="number">10</span>)) </span><br><span class="line">2</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $((<span class="variable">$RANDOM</span> % <span class="number">10</span>)) </span><br><span class="line">3</span><br></pre></td></tr></table></figure><hr><h2 id="十四-练习：编写一个随机抽取同学唱歌的程序，如果唱过了，就不能再次被抽到了">十四. 练习：编写一个随机抽取同学唱歌的程序，如果唱过了，就不能再次被抽到了<a class="header-anchor" href="#十四-练习：编写一个随机抽取同学唱歌的程序，如果唱过了，就不能再次被抽到了"></a></h2><p><strong>编写一个随机抽取同学唱歌的程序，如果唱过了，就不能再次被抽到了</strong></p><p>1、编写一个文件，里面存放我们歌手的名字 name.txt</p><p>2、随机抽取歌手# 1.循环抽取  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><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><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">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# vim geshou_test.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="comment"># 将name.txt的内容读取出来   # 注：反引号` ` 把cat命令的输出放到数组里</span></span><br><span class="line">singers=(`<span class="built_in">cat</span> name.txt`)<span class="comment"># 注：把读取的内容放到数组里面（cat读取）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;singers[@]&#125;</span><span class="comment"># 注：验证是否取出数据# 注：相对路径 指当前下的文件</span></span><br><span class="line"><span class="comment"># 有多少人</span></span><br><span class="line">total=<span class="variable">$&#123;#singers[@]&#125;</span><span class="comment"># 首先 获取人数（对singers长度进行统计）</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `<span class="built_in">seq</span> <span class="variable">$total</span>`<span class="comment"># 然后循环（for 循环次数，$total 人数进行循环）</span></span><br><span class="line"><span class="keyword">do</span><span class="comment"># 注：反引号` `  命令去执行它</span></span><br><span class="line">    <span class="built_in">read</span> -p <span class="string">&quot;请输入任意键进行抽取&quot;</span> <span class="comment"># 注：read 目的：敲一下键盘  才会接着循环</span></span><br><span class="line">    <span class="comment"># 随机抽取一个人演唱# 每次循环都是抽取 新的 列表里面的人数（因为下标问题）</span></span><br><span class="line">    random_num=$(( <span class="variable">$RANDOM</span> % <span class="variable">$&#123;#singers[*]&#125;</span> ))<span class="comment">#注：生成随机数，范围0 ~ 一维数组长度</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;随机数为：<span class="variable">$random_num</span>&quot;</span><span class="comment"># 注：随机抽取索引/下标</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;有请<span class="variable">$&#123;singers[$random_num]&#125;</span>献唱一首！大家热烈欢迎！&quot;</span></span><br><span class="line">    <span class="built_in">unset</span> singers[<span class="variable">$random_num</span>]<span class="comment"># 注：把选中的人删除（与python不同的是，删除以后下标不变）</span></span><br><span class="line">    singers=(`<span class="built_in">echo</span> <span class="variable">$&#123;singers[@]&#125;</span>`)<span class="comment"># 注：解决办法 重新赋值,赋值给一个新的一维数组</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;未献唱者具体名单为： <span class="variable">$&#123;singers[@]&#125;</span>&quot;</span> <span class="comment"># 注：↑也可以使用 singers=($&#123;singers[@]&#125;)</span></span><br><span class="line"><span class="keyword">done</span><span class="comment"># 注：↑也可以使用singers= `echo $&#123;singers[@]&#125;`</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">cat</span> name.txt <span class="comment"># 注：↑重新赋值后  下标会变 从0~总长度</span></span><br><span class="line">fengcheng</span><br><span class="line">zhanghuayou</span><br><span class="line">pengyifan</span><br><span class="line">chenpeng</span><br><span class="line">xulilin</span><br><span class="line">tangliangfei</span><br><span class="line">wangtiancheng</span><br><span class="line">lixinhai</span><br><span class="line">liangluyao</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">演示</span><br><span class="line">[root@sanchuang-linux chenpeng]# sh geshou_test.sh </span><br><span class="line">fengcheng zhanghuayou pengyifan chenpeng xulilin tangliangfei wangtiancheng lixinhai liangluyao</span><br><span class="line">请输入任意键进行抽取</span><br><span class="line">随机数为：2</span><br><span class="line">有请pengyifan献唱一首！大家热烈欢迎！</span><br><span class="line">未献唱者具体名单为： fengcheng zhanghuayou chenpeng xulilin tangliangfei wangtiancheng lixinhai liangluyao</span><br><span class="line">请输入任意键进行抽取</span><br><span class="line">随机数为：2</span><br><span class="line">有请chenpeng献唱一首！大家热烈欢迎！</span><br><span class="line">未献唱者具体名单为： fengcheng zhanghuayou xulilin tangliangfei wangtiancheng lixinhai liangluyao</span><br><span class="line"></span><br><span class="line"><span class="comment">#注：获取命令输出的时候  加``反引号</span></span><br></pre></td></tr></table></figure><hr><h2 id="十五-练习：产生5–10之间随机数">十五. 练习：产生5–10之间随机数<a class="header-anchor" href="#十五-练习：产生5–10之间随机数"></a></h2><p><strong>产生5–10之间随机数</strong></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">产生5--10之间随机数</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> $(( <span class="variable">$RANDOM</span> % <span class="number">10</span> ))<span class="comment"># 注：产生10以内随机数</span></span><br><span class="line">3</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> $(( <span class="variable">$RANDOM</span> % <span class="number">5</span> +<span class="number">5</span> ))<span class="comment"># 注：取5以内的随机数 +5</span></span><br><span class="line">6</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> $(( <span class="variable">$RANDOM</span> % <span class="number">5</span> +<span class="number">5</span> ))</span><br><span class="line">8</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">50--150之间随机数</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> $(( <span class="variable">$RANDOM</span> % <span class="number">100</span> +<span class="number">50</span> ))</span><br><span class="line">79                                                    <span class="comment"># 注：100是区间绝对值，50是初始值</span></span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">150-200之间随机数                      <span class="comment"># 注：150初始值， 50 + 150 末尾值</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $(( <span class="variable">$RANDOM</span> % <span class="number">50</span> + <span class="number">150</span> ))<span class="comment"># 注：150~200之间</span></span><br><span class="line">190</span><br></pre></td></tr></table></figure><hr><h2 id="十六-tr（替换命令）">十六. tr（替换命令）<a class="header-anchor" href="#十六-tr（替换命令）"></a></h2><p><strong>tr命令（替换命令）</strong></p><p>tr命令（主要用来做字符的替换） # 注：对文本处理常用</p><ul class="lvl-0"><li class="lvl-2"><p>字符转换工具</p></li><li class="lvl-2"><p>只能对<code>stdin</code>操作，不能直接对文件操作# 注：<strong>只能对标准输入进行操作</strong></p></li></ul><p>----------------------------------------------------</p><p>使用tr转换字符</p><ul class="lvl-0"><li class="lvl-2"><p>tr  SET1  SET2</p></li><li class="lvl-2"><p>用SET2中的字符替换掉SET1中同一位置的字符</p></li></ul><p><strong>tr -d  删除指定字符</strong><br><strong>tr -s  压缩相同字符，将连续的指定字符压缩成一个字符</strong></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></pre></td><td class="code"><pre><span class="line">示例</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">示例1：替换</span><br><span class="line"><span class="comment">#注：替换同位置的</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> 123456| <span class="built_in">tr</span> 345 xyz<span class="comment"># 注：把345替换成xyz</span></span><br><span class="line">12xyz6<span class="comment"># 注：只能对标准输入进行操作</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> 123456| <span class="built_in">tr</span> 3 xyz<span class="comment"># 注：把3替换成xyz</span></span><br><span class="line">12x456<span class="comment"># 注：只替换了x，对应位置的</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">示例2：删除 <span class="comment"># echo 123456| tr -d 34</span></span><br><span class="line"><span class="built_in">tr</span> -d  删除指定字符</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> 123456| <span class="built_in">tr</span> 3 <span class="string">&quot;&quot;</span><span class="comment"># 注：&quot;&quot; 不能为空，它要替换同位置的</span></span><br><span class="line"><span class="built_in">tr</span>: 当不截断设置1 时，字符串2 不能为空</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> 123456| <span class="built_in">tr</span> -d 34<span class="comment"># 注：删除接tr -d</span></span><br><span class="line">1256</span><br><span class="line">============================================================================================</span><br><span class="line"><span class="built_in">tr</span> -s  压缩相同字符，将连续的指定字符压缩成一个字符</span><br><span class="line">将连续的指定字符压缩成一个字符</span><br><span class="line">示例3：<span class="built_in">tr</span> -s  压缩相同字符</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> 111223333444445556666| <span class="built_in">tr</span> -s 34</span><br><span class="line">11122345556666<span class="comment"># 注：当有连续的时候压缩成一个</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> 11122333344444555666633377744| <span class="built_in">tr</span> -s 34</span><br><span class="line">1112234555666637774<span class="comment"># 注：并不是去重</span></span><br><span class="line">============================================================================================</span><br><span class="line">练习4：把环境变量里 : 替换成空格   <span class="comment"># 注：关键点 tr不能替换文件内容</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> <span class="variable">$PATH</span> |<span class="built_in">tr</span> <span class="string">&quot;:&quot;</span> <span class="string">&quot; &quot;</span><span class="comment"># 注：关键点 tr接收的是标准输入</span></span><br><span class="line">/lianxi/sc /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /root/bin /usr/local/nginx/sbin /root/bin /usr/local/nginx5/sbin /root/bin</span><br><span class="line">============================================================================================</span><br><span class="line">扩展5：替换文件里的内容，生成一个新文件</span><br><span class="line"><span class="comment">#注：把文件导进来  进行标准输入</span></span><br><span class="line">示例：将/etc/passwd里的 ：替换成空格</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">写法1：<span class="built_in">cat</span>导入</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">cat</span> /etc/passwd |<span class="built_in">tr</span> <span class="string">&quot;:&quot;</span> <span class="string">&quot; &quot;</span> &gt;/tmp/passwd</span><br><span class="line">[root@sanchuang-linux chenpeng]# less /tmp/passwd <span class="comment"># 注：：全变空格了</span></span><br><span class="line">写法2：<span class="built_in">tr</span>接收标准输入  重定向标准输入 <span class="built_in">tr</span> <span class="string">&quot;:&quot;</span> <span class="string">&quot; &quot;</span> &lt;/etc/passwd</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">tr</span> <span class="string">&quot;:&quot;</span> <span class="string">&quot; &quot;</span> &lt;/etc/passwd  &gt;/tmp/passwd2 </span><br><span class="line">[root@sanchuang-linux chenpeng]# less /tmp/passwd2<span class="comment"># 注：：全变空格了</span></span><br><span class="line"><span class="comment">#注：写法2把一个文件导进来，进行标准输入    tr &quot;:&quot; &quot; &quot; &lt;/etc/passwd</span></span><br><span class="line">============================================================================================</span><br><span class="line">扩展5.1 重定向标准输入</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">wc</span> -l /etc/passwd<span class="comment"># 注：wc -l 查看文件行数</span></span><br><span class="line">52 /etc/passwd</span><br><span class="line">示例：重定向标准输入</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">wc</span> -l &lt; /etc/passwd</span><br><span class="line">52</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Shell </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>10_Linux基础-SHELL入门1</title>
      <link href="/posts/30664.html"/>
      <url>/posts/30664.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-输入输出重定向">一. 输入输出重定向<a class="header-anchor" href="#一-输入输出重定向"></a></h2><p><strong>回顾1 输入输出重定向</strong></p><p>输入</p><p>read -p “请输入” a-p 提示  a 赋值给a</p><p>read -s 密码隐藏</p><hr><p>输出</p><p>​echo</p><p>​# echo -e “abc\t abc”转义字符输出</p><p>​abcabc</p><p>​# echo “abc\t abc”</p><p>​abc\t abc</p><p><code>echo -n  不接换行</code></p><p><code>echo -e  转义字符输出</code></p><hr><h2 id="二-2个特殊文件">二. 2个特殊文件<a class="header-anchor" href="#二-2个特殊文件"></a></h2><p><strong>知识点2  2个特殊文件</strong></p><p>两个特殊文件</p><p>·<code>/dev/null</code>：过滤标准错误信息</p><p>·<code>/dev/zero</code>：用来创建指定长度文件</p><p><code>/dev/null</code>：黑洞文件，不保存，不输出的信息，就丢到黑洞文件</p><p><code>/dev/zero</code>：用来生成指定大小的文件，生成一堆0</p><hr><p>示例：<code>/dev/zero</code>：用来生成指定大小的文件，生成一堆0</p><p><code>/dev/zero</code>一般用作生成指定大小的文件，做测试用</p><p>dd是一个备份命令，也可以产生一个指定大小的文件</p><p>if 输入文件 input file</p><p>of 输出文件 output file</p><p>bs 输出的数据的单位大小</p><p>count  输出的数据单位数量</p><p>示例：______<em>_____________________</em>____________________________</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">[root@sanchuang-linux dev]# <span class="built_in">dd</span> <span class="keyword">if</span>=/dev/zero of=/tmp/test.dd bs=1M count=5</span><br><span class="line">记录了5+0 的读入</span><br><span class="line">记录了5+0 的写出</span><br><span class="line">5242880 bytes (5.2 MB, 5.0 MiB) copied, 0.00196718 s, 2.7 GB/s</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">du</span> -sh /tmp/test.dd </span><br><span class="line">5.0M/tmp/test.dd</span><br><span class="line"><span class="keyword">if</span> 从哪里导进来 ， of 导出去这个文件 ， bs 数据单位大小  ， count数据单位数量</span><br></pre></td></tr></table></figure><hr><h2 id="三-here-document">三. here document<a class="header-anchor" href="#三-here-document"></a></h2><p><strong>知识点3 here document</strong></p><p><code>here document文档就在这里</code></p><p>&lt;&lt;</p><p>生成一个指定内容的文档。</p><p>简单脚本中使用</p><p>示例：</p><p>-----------------------------------------------------------</p><p>[root@sanchuang-linux chenpeng]# <code>cat &gt;here_test.txt &lt;&lt;EOF</code><br>&gt; nihao<br>&gt; sanchuang<br>&gt; huanying<br>&gt; world…<br>&gt; x y z<br><code>\&gt; EOF</code><br>[root@sanchuang-linux chenpeng]# cat here_test.txt<br>nihao<br>sanchuang<br>huanying<br>world…<br>x y z</p><hr><p><strong>知识点3.2 EOF是文档结束标志 可以自行定义（end of file）</strong></p><p>示例：</p><p>------------------------------------------------------</p><p>[root@sanchuang-linux chenpeng]# cat &gt;here_test &lt;&lt;<code>XYZ</code><br>&gt; nihao<br>&gt; hello world<br><code>&gt; XYZ</code><br>[root@sanchuang-linux chenpeng]# cat here_test<br>nihao<br>hello world</p><hr><h2 id="四-tee命令">四. tee命令<a class="header-anchor" href="#四-tee命令"></a></h2><p><strong>知识点4 tee命令</strong></p><p><code>tee命令  输出到屏幕也重定向到文件</code></p><p>示例：</p><p>----------------------------------</p><p>[root@sanchuang-linux chenpeng]# echo “aa” &gt;test_aa.txt#（注：默认不输出到屏幕）<br>[root@sanchuang-linux chenpeng]# cat test_aa.txt<br>aa<br>[root@sanchuang-linux chenpeng]# <code>echo &quot;bb&quot; |tee test_bb.txt#</code>（注：屏幕+文件）<br>bb<br>[root@sanchuang-linux chenpeng]# cat test_bb.txt<br>bb</p><hr><h2 id="五-清空文件内容">五. 清空文件内容<a class="header-anchor" href="#五-清空文件内容"></a></h2><p><strong>知识点5 清空文件内容</strong></p><p>[root@sanchuang-linux chenpeng]# <code>&gt;test_bb.txt</code><br>[root@sanchuang-linux chenpeng]# <code>echo &gt; test_bb.txt</code> #（注：有换行）<br>[root@sanchuang-linux chenpeng]# cat test_bb.txt</p><p>[root@sanchuang-linux chenpeng]# <code>echo -n &gt; test_bb.txt </code><br>[root@sanchuang-linux chenpeng]# cat test_bb.txt<br>[root@sanchuang-linux chenpeng]# <code>:&gt;test_bb.txt </code><br>[root@sanchuang-linux chenpeng]# cat test_bb.txt</p><hr><p><strong>知识点6 echo</strong></p><p><code>echo</code></p><p>在屏幕上显示一段文字或指定内容</p><p>输出变量，输出指定内容</p><p><code>-e 选项转义字符输出</code></p><p><code>-n 选项不接换行</code></p><hr><h2 id="六-SHELL入门">六. SHELL入门<a class="header-anchor" href="#六-SHELL入门"></a></h2><p><code>shell入门</code></p><p>shell 是一个用C语言写的程序，它是用户使用linux的桥梁</p><p>shell 脚本 实现自动化  重复性的操作编写脚本完成，减少人工失误</p><hr><h3 id="SHELL的变量">SHELL的变量<a class="header-anchor" href="#SHELL的变量"></a></h3><p><code>shell的变量</code></p><p>1、局部变量  定义在脚本或命令中</p><p>2、环境变量  shell启动的程序能访问到的环境变量 env、 echo $PATH</p><p>3、shell变量</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">示例：环境变量</span><br><span class="line">------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">which</span> <span class="built_in">ls</span></span><br><span class="line"><span class="built_in">alias</span> <span class="built_in">ls</span>=<span class="string">&#x27;ls --color=auto&#x27;</span></span><br><span class="line">/usr/bin/ls<span class="comment">#（注：环境变量）</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> <span class="variable">$PATH</span><span class="comment">#（注：环境变量）</span></span><br><span class="line">/lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/root/bin:/usr/local/nginx5/sbin:/root/bin</span><br><span class="line">示例2：局部变量</span><br><span class="line">-------------------------------------------</span><br><span class="line">a=1</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;a&#125;</span></span><br></pre></td></tr></table></figure><hr><p><strong>知识点8.2 变量名命名规则</strong></p><p><code>变量名命名规则：</code></p><p>由数字、字母、下划线组合，不能以数字开头</p><p>不能使用bash中的关键字</p><p><code>使用一个定义过的变量，需要在前面加上$符号</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></pre></td><td class="code"><pre><span class="line">示例：</span><br><span class="line">--------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">echo</span> <span class="variable">$PATH</span><span class="comment">#（注：环境变量）</span></span><br><span class="line">/lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/root/bin:/usr/local/nginx5/sbin:/root/bin</span><br></pre></td></tr></table></figure><hr><h3 id="SHELL接收参数">SHELL接收参数<a class="header-anchor" href="#SHELL接收参数"></a></h3><p><strong>知识点9 shell接收参数</strong></p><p>shell接收</p><p><code>位置变量 ：$1 - $9 ，分别代表参数列表中的 第1 - 9 个参数</code></p><p>可以重复使用（即脚本里可以出现两个$1）</p><hr><p><code>预定义变量，系统预留的一些变量：</code></p><p>$0 当前进程 或者 脚本名称</p><p>$! 后台运行的最后一个进程的pid号</p><p>$? 上一条命令程序返回值</p><p>$* 代表所有参数内容</p><p>$$ 表示当前进程pid号</p><p>$# 表示参数个数</p><p>$@ 代表所有参数（逐个提取）</p><hr><p><code># perror 1</code></p><p>查看命令的返回值，并且看返回值的<strong>具体含义</strong></p><p>$?  命令返回值为0 表示正常执行</p><p>​不为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></pre></td><td class="code"><pre><span class="line">示例如下：__________________________________</span><br><span class="line">[root@mysql-binary shell_test]# <span class="built_in">echo</span> $?</span><br><span class="line">1</span><br><span class="line">[root@mysql-binary shell_test]# perror 1</span><br><span class="line">OS error code   1:  Operation not permitted</span><br></pre></td></tr></table></figure><hr><p><code>#!/bin/bash脚本前最好加上这一行，默认使用什么解释器去执行</code></p><p><code>原因：类unix操作系统，unbuntu、debian、centos每个操作系统的默认bash可能不一样</code></p><hr><p><strong>示例1：<code>位置变量$1、$2</code> __________________________________</strong></p><p>[root@sanchuang-linux shell_test]# cat <a href="http://canshu.sh">canshu.sh</a><br>#!/bin/bash</p><p>echo “########这是$1########”#（注：位置变量）<br>echo “$1”#（注：位置变量）<br>echo “########这是$2########”#（注：位置变量）<br>echo “$2”#（注：位置变量）<br>[root@sanchuang-linux shell_test]# sh <a href="http://canshu.sh">canshu.sh</a> <code>&quot;hello&quot; &quot;world&quot;#</code>（注：传了2个参数）<br>########这是hello#########（注：参数1）<br>hello<br>########这是world#########（注：参数2）<br>world</p><hr><p><strong>示例2：<code>预定义变量 $0</code>__________________________________________________________</strong></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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux shell_test]# <span class="built_in">echo</span> <span class="variable">$0</span><span class="comment">#（注：$0 当前进程 或者 脚本名称）</span></span><br><span class="line">-bash</span><br><span class="line">[root@sanchuang-linux shell_test]# sh canshu.sh <span class="string">&quot;hello&quot;</span> <span class="string">&quot;world&quot;</span></span><br><span class="line"><span class="comment">########这是hello########</span></span><br><span class="line">hello</span><br><span class="line"><span class="comment">########这是world########</span></span><br><span class="line">world</span><br><span class="line">canshu.sh<span class="comment">#（注：$0 当前进程 或者 脚本名称）</span></span><br><span class="line">[root@sanchuang-linux shell_test]# <span class="built_in">cat</span> canshu.sh </span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;########这是<span class="variable">$1</span>########&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$1</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;########这是<span class="variable">$2</span>########&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$2</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$0</span>&quot;</span></span><br></pre></td></tr></table></figure><hr><p><strong>示例3：<code>预定义变量 $*  $#  $@</code>_____________________</strong></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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux shell_test]# vim canshu.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;########这是<span class="variable">$1</span>########&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$1</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;########这是<span class="variable">$2</span>########&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$2</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$0</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;这是所有:$*&quot;</span><span class="comment">#（注：$* 代表所有参数内容）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;参数#：<span class="variable">$#</span>&quot;</span><span class="comment">#（注：$# 表示参数个数）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;这是@：<span class="variable">$@</span>&quot;</span><span class="comment">#（注：$@ 代表所有参数（逐个提取））</span></span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux shell_test]# sh canshu.sh hello world 2020  <span class="comment">#（注：3个参数）</span></span><br><span class="line"><span class="comment">########这是hello########</span></span><br><span class="line">hello</span><br><span class="line"><span class="comment">########这是world########</span></span><br><span class="line">world</span><br><span class="line">canshu.sh</span><br><span class="line">这是所有:hello world 2020</span><br><span class="line">参数#：3</span><br><span class="line">这是@：hello world 2020</span><br></pre></td></tr></table></figure><hr><p><strong>知识点10 python中接收参数 sys模块</strong></p><p>python中</p><p>sys模块里面的argv属性。python后面 传过来的参数是一个<code>列表</code>，然后获取第一个第二个</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux ~]<span class="comment"># vim canshu.py</span></span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(sys.argv[<span class="number">1</span>],sys.argv[<span class="number">2</span>])<span class="comment">#（注：1接收参数1，2接收参数2）</span></span><br><span class="line"><span class="built_in">print</span>(sys.argv[<span class="number">0</span>])<span class="comment">#（注：0是文件名）</span></span><br><span class="line">----------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]<span class="comment"># python3 canshu.py &quot;hello&quot; &quot;world&quot;</span></span><br><span class="line">hello world</span><br><span class="line">canshu.py</span><br></pre></td></tr></table></figure><hr><h3 id="数据类型">数据类型<a class="header-anchor" href="#数据类型"></a></h3><p><strong>知识点11 数据类型</strong></p><p><code>shell常用数字、字符串、数组</code></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><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><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> abc</span><br><span class="line">abc</span><br><span class="line">[root@sanchuang-linux ~]# a=b</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line">b</span><br><span class="line">[root@sanchuang-linux ~]# a=<span class="string">&quot;b&quot;</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line">b</span><br><span class="line">[root@sanchuang-linux ~]# a=<span class="string">&#x27;b&#x27;</span></span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line">b</span><br><span class="line"></span><br><span class="line">示例：数字的定义_________________</span><br><span class="line">[root@sanchuang-linux ~]# a=1</span><br><span class="line">[root@sanchuang-linux ~]# a=2</span><br></pre></td></tr></table></figure><hr><h3 id="引号区别">引号区别<a class="header-anchor" href="#引号区别"></a></h3><p><strong>知识点12 引号区别：双引号可以识别变量，单引号不可以识别变量</strong></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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux ~]# <span class="built_in">head</span> -n1 /etc/passwd<span class="comment">#（注：输出passwd第一条）</span></span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cat</span> /etc/passwd |<span class="built_in">head</span> -n1<span class="comment">#（注：不建议用这个 2条命令）</span></span><br><span class="line">root:x:0:0:root:/root:/bin/bash</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><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 字符串操作</span></span><br><span class="line">line=`<span class="built_in">head</span> -n1 /etc/passwd`<span class="comment">#（注：使用反引号``）（注：把命令输出保存在line里面）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$line</span></span><br><span class="line">---------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# bash test2.sh </span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br></pre></td></tr></table></figure><p><strong>示例：双引号可以识别变量，单引号不可以识别变量_____________________________</strong></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="built_in">echo</span> <span class="string">&quot;字符串为：<span class="variable">$line</span>&quot;</span></span><br><span class="line">字符串为：root:x:0:0:root:/root:/bin/bash</span><br><span class="line">------------------------------------------</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;字符串为：$line&#x27;</span></span><br><span class="line">字符串为：<span class="variable">$line</span></span><br></pre></td></tr></table></figure><hr><h3 id="字符串操作">字符串操作<a class="header-anchor" href="#字符串操作"></a></h3><p><strong>知识点13 字符串操作</strong></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></pre></td><td class="code"><pre><span class="line">截取</span><br><span class="line">截取前4个字符：<span class="built_in">echo</span> <span class="variable">$&#123;line:0:4&#125;</span></span><br><span class="line">截取后9个字符  <span class="built_in">echo</span> <span class="variable">$&#123;line:0-9&#125;</span></span><br><span class="line">从倒数第九个字符开始截取4个字符 <span class="built_in">echo</span> <span class="variable">$&#123;line:0-9:4&#125;</span></span><br><span class="line">从左向右截取最后一个：后的字符   <span class="built_in">echo</span> <span class="variable">$&#123;line##*:&#125;</span></span><br><span class="line">从左向右截取第一个：后的字符     <span class="built_in">echo</span> <span class="variable">$&#123;line#*:&#125;</span></span><br><span class="line">从右往左截取最后一个：后的字符<span class="built_in">echo</span> <span class="variable">$&#123;line%%:*&#125;</span></span><br><span class="line">从右向左截取第一个：后的字符<span class="built_in">echo</span> <span class="variable">$&#123;line%:*&#125;</span></span><br><span class="line">字符串长度<span class="built_in">echo</span> <span class="variable">$&#123;#line&#125;</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><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></pre></td><td class="code"><pre><span class="line">示例：字符串操作_______________________________</span><br><span class="line"><span class="comment"># 字符串操作</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# vim test2.sh</span><br><span class="line">line=`<span class="built_in">head</span> -n1 /etc/passwd`</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$line</span><span class="comment">#（注：root:x:0:0:root:/root:/bin/bash）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;字符串为：<span class="variable">$line</span>&quot;</span><span class="comment">#（注：字符串为：root:x:0:0:root:/root:/bin/bash）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;字符串为：$line&#x27;</span><span class="comment">#（注：字符串为：$line）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;截取前4个字符：&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line:0:4&#125;</span><span class="comment">#（注：root）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;截取后9个字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line:0-9&#125;</span><span class="comment">#（注：/bin/bash）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从倒数第九个字符开始截取4个字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line:0-9:4&#125;</span><span class="comment">#（注：/bin）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从左向右截取最后一个：后的字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line##*:&#125;</span><span class="comment">#（注：/bin/bash）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从左向右截取第一个：后的字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line#*:&#125;</span><span class="comment">#（注：x:0:0:root:/root:/bin/bash）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从右往左截取最后一个：后的字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line%%:*&#125;</span><span class="comment">#（注：root）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;从右向左截取第一个：后的字符&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line%:*&#125;</span><span class="comment">#（注：root:x:0:0:root:/root）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;字符串长度&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;#line&#125;</span><span class="comment">#（注：31）</span></span><br><span class="line">-----------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# bash test2.sh </span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">字符串为：root:x:0:0:root:/root:/bin/bash</span><br><span class="line">字符串为：<span class="variable">$line</span></span><br><span class="line">截取前4个字符：</span><br><span class="line">root</span><br><span class="line">截取后9个字符</span><br><span class="line">/bin/bash</span><br><span class="line">从倒数第九个字符开始截取4个字符</span><br><span class="line">/bin</span><br><span class="line">从左向右截取最后一个：后的字符</span><br><span class="line">/bin/bash</span><br><span class="line">从左向右截取第一个：后的字符</span><br><span class="line">x:0:0:root:/root:/bin/bash</span><br><span class="line">从右往左截取最后一个：后的字符</span><br><span class="line">root</span><br><span class="line">从右向左截取第一个：后的字符</span><br><span class="line">root:x:0:0:root:/root</span><br><span class="line">字符串长度</span><br><span class="line">31</span><br></pre></td></tr></table></figure><hr><p><strong>练习13 截取百度网址</strong></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></pre></td><td class="code"><pre><span class="line">line=<span class="string">&quot;http://www.baidu.com/login&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 截取出：login</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line:0-5&#125;</span><span class="comment">#（注：取最后5个字符）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line##*/&#125;</span><span class="comment">#（注：从左往右最后一个/后的内容）</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 截取出：www.baidu.com/login</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line##*//&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 截取出：http://www.baidu.com</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line%/*&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 截取出：http:</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;line%%/*&#125;</span></span><br></pre></td></tr></table></figure><hr><h3 id="数值的运算与比较">数值的运算与比较<a class="header-anchor" href="#数值的运算与比较"></a></h3><p><strong>知识点14 数值的运算与比较</strong></p><p>数值的运算：<br>第一种： <code>$(( 表达式 ))</code><br>第二种： <code>$[ 表达式 ]</code><br>第三种： <code>expr 表达式</code></p><p>注意表达式运算符<code>左右空格</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></pre></td><td class="code"><pre><span class="line">示例：↓↓↓↓↓↓↓↓↓↓↓↓↓↓</span><br><span class="line">[root@sanchuang-linux ~]# a=10</span><br><span class="line">[root@sanchuang-linux ~]# b=20</span><br><span class="line">[root@sanchuang-linux ~]# $((<span class="variable">$a</span> + <span class="variable">$b</span>))</span><br><span class="line">-bash: 30: 未找到命令</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $((<span class="variable">$a</span> + <span class="variable">$b</span>))</span><br><span class="line">30</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> $[ <span class="variable">$a</span> +<span class="variable">$b</span> ]</span><br><span class="line">30</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">expr</span> <span class="variable">$a</span> + <span class="variable">$b</span></span><br><span class="line">30</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">expr</span> <span class="variable">$a</span>+<span class="variable">$b</span></span><br><span class="line">10+20</span><br></pre></td></tr></table></figure><hr><h3 id="SHELL结构语句，循环和判断">SHELL结构语句，循环和判断<a class="header-anchor" href="#SHELL结构语句，循环和判断"></a></h3><p><strong>知识点15 shell结构语句，循环和判断</strong></p><p><strong>知识点15.1 for循环</strong></p><p><strong>for循环</strong></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></pre></td><td class="code"><pre><span class="line">语法1：↓↓↓↓↓↓↓↓</span><br><span class="line">-----------------------</span><br><span class="line"><span class="keyword">for</span> 变量 <span class="keyword">in</span> 值1 值2</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">循环执行语句</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">=======================================</span><br><span class="line">语法2：↓↓↓↓↓↓↓</span><br><span class="line">---------------------------------------</span><br><span class="line"><span class="comment"># for ((i=0;i&lt;3;i++))</span></span><br><span class="line"><span class="keyword">for</span> ((初始化变量; 结束循环的条件; 运算))</span><br><span class="line"><span class="keyword">do</span> </span><br><span class="line">循环执行的语句</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><hr><p><strong>知识点15.2 while循环</strong></p><p><strong>While循环</strong></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">语法1：↓↓↓↓↓</span><br><span class="line">---------------------------------------</span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> line</span><br><span class="line"><span class="keyword">do</span> </span><br><span class="line">循环执行语句</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">=======================================</span><br><span class="line">语法2↓↓↓↓↓↓↓↓↓</span><br><span class="line">---------------------------------------</span><br><span class="line"><span class="keyword">while</span> [条件(非必选)]:</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">循环执行语句</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">=======================================</span><br><span class="line">注：也支持<span class="built_in">break</span>，<span class="built_in">continue</span></span><br></pre></td></tr></table></figure><hr><p><strong>知识点15 判断</strong></p><p><strong>知识点15.3 if语句</strong></p><p><strong>if语句</strong></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></pre></td><td class="code"><pre><span class="line">语法1：↓↓↓↓↓</span><br><span class="line">-------------------------</span><br><span class="line"><span class="keyword">if</span> 条件</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">执行语句</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">=========================</span><br><span class="line">语法2:↓↓↓↓↓</span><br><span class="line"><span class="keyword">if</span> 条件</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">执行语句</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">执行语句</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">==========================</span><br><span class="line">语法3：↓↓↓↓↓↓</span><br><span class="line">----------------------</span><br><span class="line"><span class="keyword">if</span> [ <span class="built_in">command</span> ];<span class="keyword">then</span></span><br><span class="line">符合该条件执行的语句</span><br><span class="line"><span class="keyword">elif</span> [ <span class="built_in">command</span> ];<span class="keyword">then</span></span><br><span class="line">符合该条件执行的语句</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">符合该条件执行的语句</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><hr><p><strong>知识点15.4 case语句</strong></p><p><strong>case语句</strong></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">语法：↓↓↓↓↓________________</span><br><span class="line"><span class="keyword">case</span> $变量名 <span class="keyword">in</span></span><br><span class="line">条件1)</span><br><span class="line">执行语句一</span><br><span class="line">;;</span><br><span class="line">条件2)</span><br><span class="line">执行语句二</span><br><span class="line">;;</span><br><span class="line">*）</span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><hr><p><strong>练习16</strong></p><p>编写一个shell脚本</p><p>接收用户输入的两个数，然后选择要对着两个数进行什么计算，并且输出结果</p><p>实现菜单选择</p><p>================</p><ol><li class="lvl-3"><p>add 加法</p></li><li class="lvl-3"><p>sub 减法</p></li><li class="lvl-3"><p>mul 乘法</p></li><li class="lvl-3"><p>exit 退出</p></li></ol><p>================</p><p>注：菜单选择用case、服务重启脚本用case</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></pre></td><td class="code"><pre><span class="line">示例：↓↓↓↓↓↓↓↓↓_________________________</span><br><span class="line">[root@sanchuang-linux chenpeng]# vim num_test.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入数字一：&quot;</span> num1</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入数字二：&quot;</span> num2</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;================&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;1.add 加法&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;2.sub 减法&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;3.mul 乘法&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;4.exit 退出&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;================&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入你的选择：&quot;</span> options</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$options</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;两数相加为：<span class="subst">$(($num1 + $num2)</span>)&quot;</span></span><br><span class="line">    ;;</span><br><span class="line">2)</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;两数相减为：<span class="subst">$(($num1 - $num2)</span>)&quot;</span></span><br><span class="line">    ;;</span><br><span class="line">3)</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;两数相乘为：<span class="subst">$(($num1 * $num2)</span>)&quot;</span></span><br><span class="line">    ;;</span><br><span class="line">4)</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;退出！&quot;</span></span><br><span class="line">    <span class="built_in">exit</span></span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line">-------------------------------------------------------------------------------------------</span><br><span class="line">整成函数形式</span><br><span class="line"><span class="function"><span class="title">add</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;两数相加为：<span class="subst">$(($num1 + $num2)</span>)&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="variable">$options</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line">    add<span class="comment">#（注：需要使用的时候调用）</span></span><br><span class="line">    ;;</span><br><span class="line">2)…………………………</span><br></pre></td></tr></table></figure><hr><h3 id="etc-init-d-服务的启动脚本">/etc/init.d  服务的启动脚本<a class="header-anchor" href="#etc-init-d-服务的启动脚本"></a></h3><p><strong>知识点17 /etc/init.d  服务的启动脚本</strong></p><p><strong>/etc/init.d/ 放着服务的启动脚本</strong></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">[root@sanchuang-linux chenpeng]# <span class="built_in">cd</span> /etc/init.d/              </span><br><span class="line">[root@sanchuang-linux init.d]# <span class="built_in">ls</span>                             </span><br><span class="line"><span class="built_in">functions</span>  README           </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><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="keyword">case</span>↓↓↓↓↓__________________</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$mode</span> <span class="keyword">in</span></span><br><span class="line">start)</span><br><span class="line">启动</span><br><span class="line">;;</span><br><span class="line">stop)</span><br><span class="line">关闭(使用<span class="built_in">kill</span>命令)</span><br><span class="line">;;</span><br><span class="line">restart)</span><br><span class="line">关闭</span><br><span class="line">启动</span><br><span class="line">;;</span><br><span class="line">reload)</span><br><span class="line">重新加载配置（使用<span class="built_in">kill</span> -HUP）</span><br><span class="line">;;</span><br><span class="line"><span class="keyword">esac</span>            </span><br></pre></td></tr></table></figure><hr><h3 id="kill">kill<a class="header-anchor" href="#kill"></a></h3><p><strong>知识点18 kill</strong></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"><span class="built_in">kill</span> 用来删除正在执行中的程序或者工作</span><br><span class="line"><span class="built_in">kill</span> 可以将指定的信息发送给程序</span><br><span class="line"></span><br><span class="line"><span class="comment"># kill -l 可以查看kill信号量（kill -L(小写)）</span></span><br><span class="line"><span class="comment"># kill -0 用来检测进程是否存在，当进程不存在时,kill -0 会报错</span></span><br><span class="line"><span class="comment"># kill -1 pid 重新加载进程（常用）</span></span><br><span class="line"><span class="comment"># kill -HUP pid 和  kill -1 pid是一样的</span></span><br><span class="line"><span class="comment"># kill -1 pid  或者  kill -HUP pid  都表示重新加载这个文件</span></span><br><span class="line"><span class="comment"># kill -9 强制杀死</span></span><br><span class="line"><span class="comment"># kill -15 正常停止一个进程</span></span><br><span class="line"><span class="built_in">kill</span> 不接信号量的时候，默认为信号15</span><br><span class="line">除了9号信号，其他信号进程都有权利拒绝执行！</span><br></pre></td></tr></table></figure><hr><p>注：重新加载  相当于  加载最新的配置  服务还是正常运行的（连接不会断）</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">示例：↓↓↓↓↓↓↓↓↓____________</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">kill</span> -l</span><br><span class="line"> 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP</span><br><span class="line"> 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL10) SIGUSR1</span><br><span class="line">…………………………</span><br><span class="line">63) SIGRTMAX-164) SIGRTMAX</span><br></pre></td></tr></table></figure><hr><h3 id="SHELL编程-if判断">SHELL编程  if判断<a class="header-anchor" href="#SHELL编程-if判断"></a></h3><p><strong>知识点19 shell编程  if判断</strong></p><p><strong>if 判断</strong></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">示例：↓↓↓↓↓↓____________________________________________________________</span><br><span class="line">[root@sanchuang-linux ~]# <span class="keyword">if</span> <span class="built_in">id</span> wenyao; <span class="keyword">then</span> <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span>; <span class="keyword">else</span> <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span>; <span class="keyword">fi</span></span><br><span class="line"><span class="built_in">id</span>: “wenyao”：无此用户</span><br><span class="line">error</span><br><span class="line">--------------------------------------------------------</span><br><span class="line">等同于：↓↓↓↓↓________________________________________________</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">id</span> wenyao; </span><br><span class="line"><span class="keyword">then</span> </span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span>; </span><br><span class="line"><span class="keyword">else</span> </span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;error&quot;</span>; </span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><hr><h3 id="">[ ]<a class="header-anchor" href="#"></a></h3><p><strong>知识点20 [ ]</strong></p><p><strong>[ ]表示条件测试</strong></p><p>注意这里的空格很重要。要注意在’[‘后面和’]'前面都必须要有空格。</p><hr><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></pre></td><td class="code"><pre><span class="line">常用判断：</span><br><span class="line">[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。</span><br><span class="line">[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。</span><br><span class="line">[ -e **** ] 判断文件/文件夹是否存在</span><br><span class="line"></span><br><span class="line">字符串判断：</span><br><span class="line">[ -z STRING ] 如果STRING的长度为零则返回为真，即空是真</span><br><span class="line">[ -n STRING ] 如果STRING的长度非零则返回为真，即非空是真</span><br><span class="line">[ STRING1 ]　 如果字符串不为空则返回为真,与-n类似</span><br><span class="line">[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真</span><br><span class="line">[ STRING1 != STRING2 ] 如果字符串不相同则返回为真</span><br><span class="line">[ STRING1 &lt; STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。</span><br><span class="line">[ STRING1 &gt; STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。</span><br><span class="line"></span><br><span class="line">数值判断</span><br><span class="line">[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=</span><br><span class="line">[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,&lt;&gt;</span><br><span class="line">[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,&gt;</span><br><span class="line">[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,&gt;=</span><br><span class="line">[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,&lt;</span><br><span class="line">[ INT1 -le INT2 ] INT1小于等于INT2返回为真,&lt;=</span><br><span class="line"></span><br><span class="line">逻辑判断</span><br><span class="line">[ ! EXPR ] 逻辑非，如果 EXPR 是<span class="literal">false</span>则返回为真。</span><br><span class="line">[ EXPR1 -a EXPR2 ] 逻辑与，如果 EXPR1 and EXPR2 全真则返回为真。</span><br><span class="line">[ EXPR1 -o EXPR2 ] 逻辑或，如果 EXPR1 或者 EXPR2 为真则返回为真。</span><br><span class="line">[ ] || [ ] 用OR来合并两个条件</span><br><span class="line">[ ] &amp;&amp; [ ] 用AND来合并两个条件</span><br></pre></td></tr></table></figure><hr><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">示例：↓↓↓↓↓↓↓↓↓↓↓↓↓</span><br><span class="line">[root@sanchuang-linux ~]# a=10</span><br><span class="line">[root@sanchuang-linux ~]# b=20</span><br><span class="line">[root@sanchuang-linux ~]# <span class="keyword">if</span> [ <span class="variable">$a</span> -gt <span class="variable">$b</span> ];<span class="keyword">then</span> <span class="built_in">echo</span> <span class="string">&quot;a&gt;b&quot;</span>;<span class="keyword">else</span> <span class="built_in">echo</span> <span class="string">&quot;a&lt;b&quot;</span>;<span class="keyword">fi</span><span class="comment">#（注：正确）</span></span><br><span class="line">a&lt;b</span><br><span class="line">[root@sanchuang-linux ~]# <span class="keyword">if</span> [ <span class="variable">$a</span> &gt; <span class="variable">$b</span> ];<span class="keyword">then</span> <span class="built_in">echo</span> <span class="string">&quot;a&gt;b&quot;</span>;<span class="keyword">else</span> <span class="built_in">echo</span> <span class="string">&quot;a&lt;b&quot;</span>;<span class="keyword">fi</span><span class="comment">#（注：出错）</span></span><br><span class="line">a&gt;b（注：使用2个中括号不出错）</span><br><span class="line">[root@sanchuang-linux ~]# <span class="keyword">if</span> [[ <span class="variable">$a</span> &gt; <span class="variable">$b</span> ]];<span class="keyword">then</span> <span class="built_in">echo</span> <span class="string">&quot;a&gt;b&quot;</span>;<span class="keyword">else</span> <span class="built_in">echo</span> <span class="string">&quot;a&lt;b&quot;</span>;<span class="keyword">fi</span><span class="comment">#（注：正确）</span></span><br><span class="line">a&lt;b</span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux ~]# <span class="keyword">if</span> [ <span class="variable">$a</span> -gt <span class="variable">$b</span> ] &amp;&amp; [ <span class="variable">$a</span> -ne 20 ];<span class="keyword">then</span> <span class="built_in">echo</span> <span class="string">&quot;输出a&gt;b&quot;</span>;<span class="keyword">else</span> <span class="built_in">echo</span> <span class="string">&quot;输出a&lt;b&quot;</span>;<span class="keyword">fi</span></span><br><span class="line">输出a&lt;b</span><br></pre></td></tr></table></figure><hr><p><strong>练习21</strong></p><p>判断当前目录下是否存在文件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><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><br><span class="line">写法1：</span><br><span class="line"><span class="keyword">if</span> [ -f a.txt ];</span><br><span class="line">    <span class="keyword">then</span> <span class="built_in">echo</span> <span class="string">&quot;文件存在&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">    <span class="built_in">touch</span> a.txt</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">-------------------------------------------------</span><br><span class="line">写法2：推荐（类似python的<span class="keyword">if</span>三元运算符）</span><br><span class="line">[ -f a.txt ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;文件已存在&quot;</span> || <span class="built_in">touch</span> a.txt</span><br></pre></td></tr></table></figure><hr><p>示例2：</p><p>编写一个脚本，实现如下功能</p><p>==============</p><p>1.增加用户并设置密码</p><p>2.删除用户</p><p>3.查看用户</p><p>4.退出</p><p>==============</p><p>输入的指定不是1-4，给提示给予提醒，并且如果不输入退出的话，可以循环添加。</p><p>按1  增加用户，并且设置密码 useradd  passwd</p><p>按2  删除用户   userdel -r</p><p>按3  查看用户  id</p><p>按4  退出    exit</p><hr><h3 id="-2">&amp;&amp; ||<a class="header-anchor" href="#-2"></a></h3><p><strong>知识点22 类似python的if三元运算符</strong></p><p><strong>使用&amp;&amp; || 来实现</strong></p><p>·cmd1 &amp;&amp; cmd2 如果cmd1执行成  功，或者为真，则执行cmd2</p><p>·cmd1 || cmd2 如果cmd1执行不成功，或者为假，则执行cmd2</p><p>·cmd1 &amp;&amp; cmd2 || cmd3 如果cmd1执行成功，就执行cmd2，不成功就执行cmd3</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">示例：上个练习↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓</span><br><span class="line">[ -f a.txt ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;文件已存在&quot;</span> || <span class="built_in">touch</span> a.txt</span><br><span class="line">[[ -f a.txt ]] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;文件已存在&quot;</span> || <span class="built_in">touch</span> a.txt<span class="comment">#（注：推荐使用两个中括号）</span></span><br><span class="line"></span><br><span class="line">示例：</span><br><span class="line">-------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=10</span><br><span class="line">[root@sanchuang-linux ~]# b=20</span><br><span class="line">[root@sanchuang-linux ~]# [ <span class="variable">$a</span> -gt <span class="variable">$b</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;输出 a&gt;b&quot;</span></span><br><span class="line">[root@sanchuang-linux ~]# [ <span class="variable">$a</span> -gt <span class="variable">$b</span> ] || <span class="built_in">echo</span> <span class="string">&quot;输出 a&lt;b&quot;</span></span><br><span class="line">输出 a&lt;b</span><br><span class="line">[root@sanchuang-linux ~]# [ <span class="variable">$a</span> -gt <span class="variable">$b</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;输出 a&gt;b&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;输出 a&lt;b&quot;</span></span><br><span class="line">输出 a&lt;b</span><br></pre></td></tr></table></figure><hr><h3 id="、-、-判断方式">[] 、[[]]、 (()) (判断方式)<a class="header-anchor" href="#、-、-判断方式"></a></h3><p><strong>知识点23 [] 、[[]]、 (()) (判断方式)</strong></p><p><input type="checkbox" id="checkbox21"><label for="checkbox21">会做单词拆分</label><br><input type="checkbox" id="checkbox20"><label for="checkbox20">很多表示都不是很支持，</label><strong>建议使用[[ ]]判断（2个中括号）</strong><br><strong>总结：</strong><br><strong><code>·建议使用</code>[[ ]]<code>来比较运算，进行判断</code></strong><br><strong><code>·字符串用</code>[[ ]]（推荐）</strong><br><strong><code>·数字用比较用</code>(( ))</strong><br>结论：建议使用[[ ]]来比较运算，进行判断</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><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></pre></td><td class="code"><pre><span class="line">示例1：<span class="keyword">if</span>判断时</span><br><span class="line">-------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# name=<span class="string">&quot;wen yao&quot;</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# [ <span class="variable">$name</span> == <span class="string">&quot;wen yao&quot;</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">-bash: [: 参数太多<span class="comment">#（注：自动做单词拆分）</span></span><br><span class="line">error</span><br><span class="line">[root@sanchuang-linux chenpeng]# [[ <span class="variable">$name</span> == <span class="string">&quot;wen yao&quot;</span> ]] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">ok<span class="comment">#（注：推荐使用2个中括号）</span></span><br><span class="line">[root@sanchuang-linux chenpeng]# [ <span class="string">&quot;<span class="variable">$name</span>&quot;</span> == <span class="string">&quot;wen yao&quot;</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">ok<span class="comment">#（注：使用引号连接在一起，表示一个整体）</span></span><br><span class="line">============================================================================================</span><br><span class="line"></span><br><span class="line">示例2：数值比较</span><br><span class="line">-------------------------------------------------------------------------------------------</span><br><span class="line">[root@mysql-binary shell_test]# <span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line">10</span><br><span class="line">[root@mysql-binary shell_test]# <span class="built_in">echo</span> <span class="variable">$b</span></span><br><span class="line">20</span><br><span class="line">[root@mysql-binary shell_test]# [[ <span class="variable">$a</span> &gt; <span class="variable">$b</span> ]] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">error</span><br><span class="line">[root@mysql-binary shell_test]# [ <span class="variable">$a</span> &gt; <span class="variable">$b</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">ok<span class="comment">#（注：出错）</span></span><br><span class="line">[root@mysql-binary shell_test]# (( <span class="variable">$a</span> == <span class="variable">$b</span> )) &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span> </span><br><span class="line">error</span><br><span class="line"></span><br><span class="line">示例：</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@mysql-binary shell_test]# a=10</span><br><span class="line">[root@mysql-binary shell_test]# b=20</span><br><span class="line">[root@mysql-binary shell_test]# [[ <span class="variable">$a</span> -eq <span class="variable">$b</span> ]] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;eroor&quot;</span></span><br><span class="line">eroor</span><br><span class="line">[root@mysql-binary shell_test]# (( <span class="variable">$a</span> -eq <span class="variable">$b</span> )) &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;eroor&quot;</span></span><br><span class="line">-bash: ((: <span class="number">10</span> -eq <span class="number">20</span> : 表达式中有语法错误 （错误符号是 &quot;<span class="number">20</span> &quot;）</span><br><span class="line">Eroor</span><br><span class="line">----------------------------------------------------------------------------</span><br><span class="line">[root@mysql-binary shell_test]# c=<span class="number">102</span></span><br><span class="line">[root@mysql-binary shell_test]# b=<span class="number">20</span></span><br><span class="line">[root@mysql-binary shell_test]# [[ <span class="variable">$c</span> &gt; <span class="variable">$b</span> ]] &amp;&amp; echo &quot;ok&quot; || echo &quot;eroor&quot;</span><br><span class="line">eroor</span><br><span class="line">[root@mysql-binary shell_test]# (( <span class="variable">$c</span> &gt; <span class="variable">$b</span> )) &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;eroor&quot;</span></span><br><span class="line">ok</span><br><span class="line"></span><br><span class="line">示例3:<span class="keyword">if</span>条件判断的2种写法</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=10</span><br><span class="line">[root@sanchuang-linux ~]# b=20</span><br><span class="line">[root@sanchuang-linux ~]# <span class="keyword">if</span> [[ <span class="variable">$a</span> &gt; <span class="variable">$b</span> ]]; <span class="keyword">then</span> <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span>; <span class="keyword">else</span> <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span>; <span class="keyword">fi</span></span><br><span class="line">error</span><br><span class="line">[root@sanchuang-linux ~]# [[ <span class="variable">$a</span> &gt; <span class="variable">$b</span> ]] &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">error</span><br><span class="line"></span><br><span class="line">示例：字符串比较(( ))  也可以</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=abc</span><br><span class="line">[root@sanchuang-linux ~]# b=abc1</span><br><span class="line">[root@sanchuang-linux ~]# (( <span class="variable">$a</span> &gt; <span class="variable">$b</span> )) &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">error</span><br><span class="line">[root@sanchuang-linux ~]# a=abc</span><br><span class="line">[root@sanchuang-linux ~]# b=bac1</span><br><span class="line">[root@sanchuang-linux ~]# (( <span class="variable">$a</span> &gt; <span class="variable">$b</span> )) &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">error</span><br><span class="line">[root@sanchuang-linux ~]# a=abc</span><br><span class="line">[root@sanchuang-linux ~]# b=abc</span><br><span class="line">[root@sanchuang-linux ~]# (( <span class="variable">$a</span> == <span class="variable">$b</span> )) &amp;&amp; <span class="built_in">echo</span> <span class="string">&quot;ok&quot;</span> || <span class="built_in">echo</span> <span class="string">&quot;error&quot;</span></span><br><span class="line">ok</span><br><span class="line"></span><br><span class="line">结论：建议使用[[ ]]来比较运算，进行判断</span><br></pre></td></tr></table></figure><hr><h3 id="SHELL函数-定义">SHELL函数 定义<a class="header-anchor" href="#SHELL函数-定义"></a></h3><p><strong>知识点24 Shell函数 定义</strong></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">示例：</span><br><span class="line"><span class="function"><span class="title">add</span></span>() &#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;两数相加为：<span class="subst">$(( $num1 + $num2 )</span>)&quot;</span><span class="comment">#（注：函数里面的操作内容）</span></span><br><span class="line">&#125;</span><br><span class="line">------------------------------------------------</span><br><span class="line">调用的时候 add</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$options</span> <span class="keyword">in</span> </span><br><span class="line">1)</span><br><span class="line">add</span><br><span class="line">;;</span><br><span class="line">2)……………………</span><br><span class="line">--------------------------------------------------------------------------------------------</span><br><span class="line"><span class="function"><span class="title">add</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;两数相加为：<span class="subst">$(($num1 + $num2)</span>)&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="variable">$options</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line">    add<span class="comment">#（注：需要使用的时候调用）</span></span><br><span class="line">    ;;</span><br><span class="line">2)…………………………</span><br></pre></td></tr></table></figure><hr><h3 id="判断方式-test">判断方式 []  [[]]  (())  test<a class="header-anchor" href="#判断方式-test"></a></h3><p><strong>知识点25 判断方式 []  [[]]  (())  test</strong></p><ul class="lvl-0"><li class="lvl-2"><p>(( ))判断数字 &gt; &lt; == !=</p></li><li class="lvl-2"><p>[[ ]]判断字符串 或者 -eq -ne -gt -lt 判断数字</p></li><li class="lvl-2"><p><input type="checkbox" id="checkbox22"><label for="checkbox22">是不支持的，建议使用[[ ]]</label></p></li><li class="lvl-2"><p>test(测试)判断，等同于1个中括号</p></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></pre></td><td class="code"><pre><span class="line">示例：<span class="built_in">test</span></span><br><span class="line">---------------------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# a=123</span><br><span class="line">[root@sanchuang-linux ~]# b=123</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">test</span> a==b &amp;&amp; <span class="built_in">echo</span> ok</span><br><span class="line">ok</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">test</span> a==b &amp;&amp; <span class="built_in">echo</span> ok || <span class="built_in">echo</span> error</span><br><span class="line">ok</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Shell </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>09_Linux基础-SHELL-标准输入与标准输出-重定向-管道</title>
      <link href="/posts/5276.html"/>
      <url>/posts/5276.html</url>
      
        <content type="html"><![CDATA[<blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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><br><span class="line">编辑文本文件/home/text/file1，分4行输入bbb bbb  bbb、 ddd ddd ddd、aaa aaa aaa、ccc ccc ccc。 保存不要退出；</span><br><span class="line">在末行模式下打开一个新文件/text/file2；</span><br><span class="line">在file2中输入内容为eee eee eee在这一行内容之后，  将file1的内容读入到file2中，接着在命令模式下按照 abcde的显示顺序调整每行的位置，最后保存退出；</span><br><span class="line">同时编辑file1和file2，接着从file1切换到file2，然后 再快速切换回来，接着将file2的内容读到file1内容的末尾，显示文件file1内容的行号，复制3到6行到file1 内容的末尾；</span><br><span class="line">利用替换命令将全文的每行第一个ccc都替换为333；</span><br><span class="line">将全文中所有aaa都替换为111，撤销行号，最后不保 存退出；</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><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">[root@sanchuang-linux chenpeng]# <span class="built_in">mkdir</span> /home/text2</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">cd</span> /home/text2</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">mkdir</span> /text2</span><br><span class="line">[root@sanchuang-linux text2]# vim file1</span><br><span class="line">:r /text2/file2</span><br><span class="line">aaa aaa aaa</span><br><span class="line">bbb bbb bbb</span><br><span class="line">ccc ccc ccc</span><br><span class="line">ddd ddd ddd</span><br><span class="line">eee eee eee</span><br><span class="line">[root@sanchuang-linux text2]# vim file1 /text2/file2</span><br><span class="line">:n</span><br><span class="line">:N</span><br><span class="line">:<span class="built_in">set</span> nu</span><br><span class="line">:%s/ccc/333</span><br><span class="line">:%s/aaa/111/g</span><br><span class="line">:<span class="built_in">set</span> nonu</span><br><span class="line">:q!</span><br></pre></td></tr></table></figure></blockquote><hr><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><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">练习1：</span><br><span class="line">1.进入/lianxi目录</span><br><span class="line"><span class="comment"># cd /lianxi</span></span><br><span class="line">2.复制/etc/passwd文件到当前目录下，然后使用vim编辑当前目录下的passwd</span><br><span class="line"><span class="comment"># cp /etc/passwd .  # vim passwd</span></span><br><span class="line">3.显示一下行号</span><br><span class="line">:<span class="built_in">set</span> nu</span><br><span class="line">4.复制第5到10行的内容，粘贴到末尾，删除最后一行的最后一个单词</span><br><span class="line">:5 ; 6yy ; G ; p ; dw</span><br><span class="line">5.删除第9行和第10行</span><br><span class="line">:9 ; 2dd</span><br><span class="line">6.将root改为gen</span><br><span class="line">:%s/root/gen/g</span><br><span class="line">7.删除部分bash字符串</span><br><span class="line">:%s/bash//gc</span><br><span class="line">8.快速到达第5行，然后再跳到第1行，再跳到最后一行</span><br><span class="line">:5 ; :1 ; G</span><br><span class="line">9.剪切第6-7行，粘贴到末尾</span><br><span class="line">:6 ; 2dd ; G ; p</span><br><span class="line">10.退出并且保存</span><br><span class="line">:wq</span><br><span class="line">11.复制/etc/hosts文件到当前目录下，将第1列的ip地址复制，然后粘贴到文件的末尾</span><br><span class="line"><span class="comment"># /etc/hosts . ; # vim hosts ; ctrl+v ; y ; G ;p</span></span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="一-SHELL-标准输入与标准输出">一. SHELL-标准输入与标准输出<a class="header-anchor" href="#一-SHELL-标准输入与标准输出"></a></h2><blockquote><p><strong>学习内容：重定向和文件目录高级操作</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">知识要点</span><br><span class="line">输入输出重定向</span><br><span class="line">管道及相关配套命令 数据提取及过滤</span><br><span class="line">文件差异对比和补丁生成及打补丁</span><br></pre></td></tr></table></figure></blockquote><h3 id="标准输入和标准输出">标准输入和标准输出<a class="header-anchor" href="#标准输入和标准输出"></a></h3><blockquote><p><strong>知识点1 标准输入和标准输出</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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></pre></td><td class="code"><pre><span class="line">---------------------------</span><br><span class="line">输入输出及重定向</span><br><span class="line">每个进程基本都会打开三个文件描述符</span><br><span class="line">0： 标准输入（从键盘）</span><br><span class="line">1： 标准输出 （输出到屏幕）</span><br><span class="line">2： 标准错误输出 （输出到屏幕）</span><br><span class="line"></span><br><span class="line">类型设备文件文件描述符（fd）默认设备</span><br><span class="line">标准输入  /dev/stdin  0      键盘</span><br><span class="line">标准正确输出 /dev/stdout 1显示器</span><br><span class="line">标准错误输出 /dev/stderr 2显示器</span><br><span class="line">-------------------------------------------------------</span><br><span class="line">标准输入（stdin）和标准输出（stdout）</span><br><span class="line">------------------------------------</span><br><span class="line">python中 &gt;&gt;&gt;help(print) file=sys.stdout 默认输出到屏幕（标准输出）</span><br><span class="line">------------------------------------------------------------------</span><br><span class="line">进程：正在进行的程序</span><br><span class="line">---------------------</span><br><span class="line">键盘 =》 标准输入 =》 终端程序 =》 标准输出     =》显示器</span><br><span class="line">标准错误输出 =》显示器</span><br><span class="line">----------------------------------------------------------</span><br><span class="line">https://blog.csdn.net/xiaofei0859/article/details/78448493?utm_source=blogxgwz9</span><br><span class="line">每个进程基本都会打开三个文件描述符</span><br><span class="line">0:标准输入（从键盘、语音、人脸识别……）</span><br><span class="line">1:标准输出（输出到屏幕）</span><br><span class="line">2:标准错误输入（输出到屏幕）</span><br><span class="line">---------------------------</span><br><span class="line">文件描述符：fd  就是每个进程打开的文件</span><br></pre></td></tr></table></figure></blockquote><h3 id="文件描述符">文件描述符<a class="header-anchor" href="#文件描述符"></a></h3><blockquote><p><strong>知识点1.1 文件描述符</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">文件描述符：</span><br><span class="line">linux内核给每个进程都创造一个文件描述符，这个表里记载了这个进程所打开的所有文件，为了方便进程知道自己打开了哪些文件呢，就给每个文件都进行了标号，这个编号就是文件描述符。</span><br><span class="line">此后，所有对文件的操作，就是用该编号。</span><br></pre></td></tr></table></figure></blockquote><h3 id="linux下面一切皆文件">linux下面一切皆文件<a class="header-anchor" href="#linux下面一切皆文件"></a></h3><blockquote><p><strong>知识点1.2 linux下面一切皆文件</strong></p><p>linux下面一切皆文件</p><p>disk磁盘</p><p><code>/dev目录下面基本都是块设备文件</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><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">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /dev</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">cd</span> disk</span><br><span class="line">[root@sanchuang-linux disk]# <span class="built_in">ls</span></span><br><span class="line">by-id  by-label  by-partuuid  by-path  by-uuid</span><br><span class="line">[root@sanchuang-linux disk]# <span class="built_in">cd</span> ..</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">ls</span> -ld sda1</span><br><span class="line">brw-rw----. 1 root disk 8, 1 10月  6 17:16 sda1</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">ls</span> -ld sda2</span><br><span class="line">brw-rw----. 1 root disk 8, 2 10月  6 17:16 sda2</span><br><span class="line">------------------------------------------------</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">cd</span> net</span><br><span class="line">[root@sanchuang-linux net]# <span class="built_in">ls</span></span><br><span class="line">tun</span><br><span class="line">[root@sanchuang-linux net]# </span><br><span class="line">----------------------------</span><br><span class="line">对文件的操作就是对设备的操作</span><br><span class="line">----------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /dev</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">ls</span></span><br><span class="line">stderr</span><br><span class="line">stdin</span><br><span class="line">Stdout</span><br><span class="line">fd</span><br><span class="line">……</span><br><span class="line">---------------------------------</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">cd</span> /dev</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">cd</span> fd</span><br><span class="line">[root@sanchuang-linux fd]# <span class="built_in">ls</span></span><br><span class="line">0  1  2  255 </span><br><span class="line">[root@sanchuang-linux fd]# <span class="built_in">ls</span> -al</span><br><span class="line">总用量 0</span><br><span class="line">dr-x------. 2 root root  0 10月 16 10:40 .</span><br><span class="line">dr-xr-xr-x. 9 root root  0 10月 16 10:40 ..</span><br><span class="line">lrwx------. 1 root root 64 10月 16 10:40 0 -&gt; /dev/pts/6<span class="comment">#（注：链接的意思，快捷方式 指向/dev/pts/6，标准输入到虚拟终端6）</span></span><br><span class="line">lrwx------. 1 root root 64 10月 16 10:40 1 -&gt; /dev/pts/6<span class="comment">#（注：标准输出到虚拟终端6）</span></span><br><span class="line">lrwx------. 1 root root 64 10月 16 10:40 2 -&gt; /dev/pts/6<span class="comment">#（注：标准错误输出到虚拟终端6）</span></span><br><span class="line">lrwx------. 1 root root 64 10月 16 11:24 255 -&gt; /dev/pts/6</span><br><span class="line">[root@sanchuang-linux fd]# </span><br><span class="line">---------------------------------------</span><br></pre></td></tr></table></figure></blockquote><h3 id="虚拟终端pts-真实终端tty">虚拟终端pts  真实终端tty<a class="header-anchor" href="#虚拟终端pts-真实终端tty"></a></h3><blockquote><p><strong>知识点1.3 虚拟终端pts  真实终端tty</strong></p><p>[root@sanchuang-linux dev]# cd /dev/<code>pts</code><br>[root@sanchuang-linux pts]# ls<br>0 1 2 3 4 5 6 ptmx<br>[root@sanchuang-linux pts]#</p><p><code>pts是别人连接到服务器的虚拟终端（远程控制）</code>。别人远程连接会创建虚拟终端</p><p>pts虚拟终端</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">-----------------------------------------------------</span><br><span class="line">Linux centos登录——》本地的终端shell环境  真实终端</span><br><span class="line">xshell连接   ——》虚拟终端</span><br><span class="line">--------------------------------</span><br><span class="line"><span class="built_in">tty</span> 本地真实终端</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">cd</span> /dev</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">ls</span></span><br><span class="line"><span class="built_in">tty</span></span><br></pre></td></tr></table></figure></blockquote><h3 id="查看当前linux登陆的用户情况">查看当前linux登陆的用户情况<a class="header-anchor" href="#查看当前linux登陆的用户情况"></a></h3><blockquote><p><strong>知识点1.4 查看当前linux登陆的用户情况</strong></p><p>查看当前linux登陆的用户情况 # <code>w</code></p><p>[root@sanchuang-linux dev]# <code>w</code><br>11:32:52 up 16:23,  4 users,  <code>load average</code>: 0.00, 0.00, 0.00<br>USER   TTY    FROM       LOGIN@  IDLE  JCPU  PCPU WHAT<br>root   <code>tty1</code>   -         0610月20  1:32m  0.60s  0.60s -bash<code>（注：bash环境）</code><br>root   <code>pts/1</code>   192.168.0.26   10:03  25:40  0.21s  0.21s -bash<code>（注：bash环境）</code><br>root   <code>pts/2</code>   10.122.155.164  08:52   2:29m  0.16s  0.13s vim -r a<code>（注：删除环境）</code><br>root   <code>pts/6</code>   192.168.0.26   10:40   4.00s  0.09s  0.01s w<code>（注：输入w命令环境）</code></p><p>----------↓解释----------------------------------------------------------------------------</p><p>USER：登录用户</p><p>TTY：终端类型  terminal type  面向用户使用的接口</p><p>​<code>tty1:真实终端</code></p><p>​tty1==&gt;<code>直接登录进去 操纵的第一个终端</code>（真实终端）</p><p>​Linux里最多允许<code>6个</code>可以直接登录的终端（即<code>真实终端tty</code>）</p><p>​tty2~tty6 需要的时候使用</p><p>​<code>Alt+F1</code> tty1 回到第一个终端</p><p>​<code>Alt+F2</code> tty2 回到第二个终端</p><p>​<code>pts/1:虚拟终端</code>，给别人用的。数量可以有很多个。有远程登录过来的时候，就会创建1个终端</p><p>FROM：从哪里来</p><p>WHAT：做什么事</p><p>load average机器的拼接负载</p><p>------------------------------</p><p>[root@sanchuang-linux dev]# w<br><code>11:39:04</code> up 16:29,  4 users,  <code>load average</code>: 0.00, 0.00, 0.00<br>USER   TTY    FROM       LOGIN@  IDLE  JCPU  PCPU WHAT<br>root   tty1   -         0610月20  1:38m  0.60s  0.60s -bash<br>root   pts/1   192.168.0.26   10:03  31:52  0.21s  0.21s -bash<br>root   pts/2   10.122.155.164  08:52   2:35m  0.16s  0.13s vim -r a<br>root   pts/6   192.168.0.26   10:40   0.00s  0.09s  0.00s w<br>[root@sanchuang-linux dev]# date<br>2020年 10月 16日 星期五 <code>11:39:06</code> CST</p><p>load average机器的平均负载</p><p>---------------------------</p></blockquote><h3 id="本地终端（真实终端）的创建、切换">本地终端（真实终端）的创建、切换<a class="header-anchor" href="#本地终端（真实终端）的创建、切换"></a></h3><blockquote><p><strong>知识点1.5 本地终端（真实终端）的创建、切换</strong></p><p>Alt+F2</p><p>本地最多能登录<code>6个终端</code></p><p><code>Alt+F1~F6</code>  切换本地登录的终端（真实终端）</p><p>-----------------------------------------</p><p>Alt+F2、Alt+F6</p><p>[root@sanchuang-linux dev]# <code>w</code><br>11:42:06 up 16:32,  6 users,  load average: 0.00, 0.00, 0.00<br>USER   TTY    FROM       LOGIN@  IDLE  JCPU  PCPU WHAT<br>root   <code>tty1</code>   -         0610月20  1:41m  0.60s  0.60s -bash<br>root   pts/1   192.168.0.26   10:03  34:54  0.21s  0.21s -bash<br>root   pts/2   10.122.155.164  08:52   2:38m  0.16s  0.13s vim -r a<br>root   pts/6   192.168.0.26   10:40   3.00s  0.09s  0.00s w<br>root   <code>tty2</code>   -         11:40   1:50  0.01s  0.01s -bash<br>root   <code>tty6</code>   -         11:41  13.00s  0.01s  0.01s -bash</p></blockquote><h3 id="如何拦截虚拟终端">如何拦截虚拟终端<a class="header-anchor" href="#如何拦截虚拟终端"></a></h3><blockquote><p><strong>知识点1.6 如何拦截虚拟终端</strong></p><p>如何拦截虚拟终端# <code>kill -9 pid</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></pre></td><td class="code"><pre><span class="line">-----------------------------------</span><br><span class="line">[root@sanchuang-linux dev]# ps aux</span><br><span class="line">USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND</span><br><span class="line">root           1  0.0  0.7 179304 13536 ?        Ss   10月15   0:07 /usr/lib/systemd/systemd --switched-root --system --dese</span><br><span class="line">root        1450  0.0  0.2  25588  3996 tty1     Ss+  10月15   0:00 -bash</span><br><span class="line">root       12692  0.0  0.2  34480  4444 ?        Ss   04:49   0:00 tmux</span><br><span class="line">……………………………………………………</span><br><span class="line">root       13025  0.0  0.2  25588  4048 pts/14   Ss+  05:14   0:00 -bash</span><br><span class="line">root       13046  0.0  0.2  25588  4032 pts/15   Ss+  05:14   0:00 -bash</span><br><span class="line">root       13286  0.0  0.2  25588  3940 pts/0    Ss+  05:28   0:00 -bash</span><br><span class="line">root       13614  0.0  0.2  25588  4016 pts/3    Ss+  06:23   0:00 -bash</span><br><span class="line">root       13635  0.0  0.2  25588  3956 pts/4    Ss   06:23   0:00 -bash</span><br><span class="line">root       13657  0.0  0.4  48860  8596 pts/4    S+   06:24   0:00 vim /home/text/file2</span><br><span class="line">[root@sanchuang-linux dev]# <span class="built_in">kill</span> -9 13046（注：杀死pid号13046的进程）</span><br><span class="line">------------------------------------------------------------------------</span><br><span class="line">ssh服务  22号端口  有端口肯定有服务</span><br><span class="line">起服务一定要有端口</span><br><span class="line">端口跟服务挂钩</span><br><span class="line"></span><br><span class="line">Mysql默认端口3306</span><br></pre></td></tr></table></figure></blockquote><h3 id="查看服务的默认端口">查看服务的默认端口<a class="header-anchor" href="#查看服务的默认端口"></a></h3><blockquote><p><strong>知识点1.7 查看服务的默认端口</strong></p><p>怎样查看服务的默认端口  # <code>less /etc/services</code></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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># less /etc/services</span></span><br><span class="line">tcpmux          1/tcp                           <span class="comment"># TCP port service multiplexer</span></span><br><span class="line">tcpmux          1/udp                           <span class="comment"># TCP port service multiplexer</span></span><br><span class="line">rje             5/tcp                           <span class="comment"># Remote Job Entry</span></span><br><span class="line">rje             5/udp                           <span class="comment"># Remote Job Entry</span></span><br><span class="line">…………</span><br></pre></td></tr></table></figure></blockquote><hr><blockquote><p><strong>知识点1.8 传输层协议 TCP、UDP</strong></p><p>传输层协议 TCP、UDP</p></blockquote><h3 id="杀死连接-限制连接">杀死连接  限制连接<a class="header-anchor" href="#杀死连接-限制连接"></a></h3><blockquote><p><strong>知识点1.9 杀死连接  限制连接</strong></p><p>杀死连接：</p><p><code>ps aux</code> 查看pts的连接pid</p><p>然后使用： <code>kill -9 xxx</code></p><p>-------------------------</p><p>限制连接：</p><p><code>iptables</code> 防火墙</p><p>或使用其他ssh相关的限制</p><p>-------------------------</p></blockquote><h3 id="proc目录">/proc目录<a class="header-anchor" href="#proc目录"></a></h3><blockquote><p><strong>知识点2.0 /proc目录</strong></p><p>/Proc目录  放一些正在运行的程序</p><p># <code>ls /proc</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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux ssh]# <span class="built_in">ls</span> /proc</span><br><span class="line">………………………………………………（删了很多）</span><br><span class="line">11     13657  1450   158  171  186  29  508  632  906  999        fb           loadavg       self           zoneinfo</span><br><span class="line">13025  14438  15     168  182  23   40  6    859  982  diskstats  kmsg         partitions    <span class="built_in">tty</span></span><br><span class="line">………………………………………………（删了很多）</span><br></pre></td></tr></table></figure></blockquote><h3 id="查看进程打开了哪些文件描述符">查看进程打开了哪些文件描述符<a class="header-anchor" href="#查看进程打开了哪些文件描述符"></a></h3><blockquote><p><strong>知识点2.1 查看进程打开了哪些文件描述符 proc/1450/fd</strong></p><p>查看进程打开了哪些文件描述符</p><p>[root@mysql-binary fd]# ls</p><p><code>0  1  2  255</code></p><p>[root@mysql-binary fd]# pwd</p><p><code>/proc/1680/fd</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></pre></td><td class="code"><pre><span class="line">-----------------------------------------</span><br><span class="line">[root@sanchuang-linux ssh]# <span class="built_in">cd</span> /proc/1450</span><br><span class="line">[root@sanchuang-linux 1450]# <span class="built_in">ls</span></span><br><span class="line">attr        <span class="built_in">comm</span>             fd        map_files   net            pagemap      schedstat     </span><br><span class="line">………………………………（删了很多）</span><br><span class="line">[root@sanchuang-linux 1450]# <span class="built_in">cd</span> fd</span><br><span class="line">[root@sanchuang-linux fd]# <span class="built_in">ls</span></span><br><span class="line">0  1  2  255  3  4</span><br><span class="line">[root@sanchuang-linux fd]# <span class="built_in">pwd</span></span><br><span class="line">/proc/1450/fd</span><br></pre></td></tr></table></figure></blockquote><hr><h2 id="二-重定向">二. 重定向<a class="header-anchor" href="#二-重定向"></a></h2><blockquote><p><code>重定向：改变标准输入、标准输出的方向就是重定向</code></p><p>--------------------------------------------------------------------------------------------</p><p>类型操作符用途</p><p>重定向标准<code>输出</code>&gt;将命令的执行结果<code>输出到指定的文件</code>中，而不是直接显示在屏幕上</p><p>​&gt;&gt;将命令执行的结果<code>追加输出到指定文件</code></p><p>重定向标准<code>输入</code>&lt;将命令中<code>接收输入的途径</code>由默认的键盘<code>更改 为指定的文件</code></p></blockquote><h3 id="echo">echo<a class="header-anchor" href="#echo"></a></h3><blockquote><p><strong>知识点3.1 echo</strong></p><p><code>echo -n  不接换行</code></p><p><code>echo -e  转义字符输出</code></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><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">[root@sanchuang-linux redirect]# <span class="built_in">echo</span> <span class="string">&quot;xxx&quot;</span></span><br><span class="line">xxx</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">echo</span> -n <span class="string">&quot;xxx&quot;</span></span><br><span class="line">xxx[root@sanchuang-linux redirect]#</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">echo</span> <span class="string">&quot;xx \n x1x1&quot;</span></span><br><span class="line">xx \n x1x1</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">echo</span> -e <span class="string">&quot;xx \n x1x1&quot;</span></span><br><span class="line">xx </span><br><span class="line"> x1x1</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line">---------------------------------</span><br><span class="line"><span class="built_in">echo</span> -n 不接换行</span><br><span class="line"><span class="built_in">echo</span> -e 转义字符输出</span><br></pre></td></tr></table></figure><h3 id="重定向（改变原来的输出方式）">重定向（改变原来的输出方式）<a class="header-anchor" href="#重定向（改变原来的输出方式）"></a></h3><blockquote><p><strong>知识点3.2 重定向（改变原来的输出方式）</strong></p><p>重定向（改变原来的输出方式）</p><p>[root@sanchuang-linux redirect]# <code>echo &quot;xxx&quot; &gt;file.txt</code><br>[root@sanchuang-linux redirect]# <code>cat file.txt</code><br><code>xxx</code></p></blockquote><h3 id="脚本运行-标准错误输出、标准正确输出-（显示）">脚本运行 标准错误输出、标准正确输出 （显示）<a class="header-anchor" href="#脚本运行-标准错误输出、标准正确输出-（显示）"></a></h3><blockquote><p><strong>知识点3.3 脚本运行 标准错误输出、标准正确输出 （显示）</strong></p><p>脚本一行一行 从上到下执行</p><p>[root@sanchuang-linux redirect]# vim <a href="http://test.sh">test.sh</a><br>[root@sanchuang-linux redirect]# cat <a href="http://test.sh">test.sh</a><br><code>t</code><br><code>date</code><br>[root@sanchuang-linux redirect]# sh <a href="http://test.sh">test.sh</a><br><code>test.sh:行1: t: 未找到命令</code><br><code>2020年 10月 16日 星期五 14:49:40 CST</code></p><p>--------------------------------------------</p><p>注↑：标注错误输出 、正常输出</p></blockquote><h3 id="重定向">重定向<a class="header-anchor" href="#重定向"></a></h3><blockquote><p><strong>知识点3 重定向</strong></p><p><code>重定向：改变标准输入、标准输出的方向就是重定向</code></p><p>--------------------------------------------------------------------------------------------</p><p>类型操作符用途</p><p>重定向标准<code>输出</code>&gt;将命令的执行结果<code>输出到指定的文件</code>中，而不是直接显示在屏幕上</p><p>​&gt;&gt;将命令执行的结果<code>追加输出到指定文件</code></p><p>重定向标准<code>输入</code>&lt;将命令中<code>接收输入的途径</code>由默认的键盘<code>更改 为指定的文件</code></p><p>--------------------------------------------------------------------------------------------</p><p>操作如下</p><p><strong>知识点3.4 # sh <a href="http://test.sh">test.sh</a> &gt; test_result.txt</strong></p><p><code>标准错误输出不会重定向到文件，正确输出会重定向到文件</code></p><p>[root@sanchuang-linux redirect]# vim <a href="http://test.sh">test.sh</a><br>[root@sanchuang-linux redirect]# cat <a href="http://test.sh">test.sh</a><br><code>t</code><br><code>date</code><br>[root@sanchuang-linux redirect]# sh <a href="http://test.sh">test.sh</a><br><a href="http://test.sh">test.sh</a>:行1: t: 未找到命令<br>2020年 10月 16日 星期五 14:49:40 CST<br>[root@sanchuang-linux redirect]# sh <a href="http://test.sh">test.sh</a> <code>&gt;</code> test_result.txt<br><a href="http://test.sh">test.sh</a>:行1: t: 未找到命令<code>（注：标准错误输出显示在屏幕上，不重定向到文件）</code><br>[root@sanchuang-linux redirect]# cat test_result.txt<br>2020年 10月 16日 星期五 14:50:32 CST<code>（注：正确输出会重定向到文件）</code></p><p>=========================================================</p><p><code>重定向 &gt; 默认只会重定向标准输出</code></p></blockquote><h3 id="重定向-标准错误">重定向  标准错误<a class="header-anchor" href="#重定向-标准错误"></a></h3><blockquote><p><strong>知识点3 重定向  标准错误</strong></p><p><code>标准错误：通过该设备报告执行出错信息</code></p><p>--------------------------------------------------------------------------------------------</p><p>类型操作符</p><p>重定向标准错误 2&gt;</p><p>​2&gt;&gt;</p><p>重定向<code>标准输出和标准错误</code>到<code>同一个文件</code>2&gt;&amp;1 或者&gt;&amp;或者 &amp;&gt;</p><p>重定向<code>标准输出和标准错误</code>到<code>不同文件</code>&gt; 文件1 2 &gt;文件2（没教）</p><p>--------------------------------------------------------------------------------------------</p><p>操作如下</p><p><strong>知识点3.5.1 # sh <a href="http://test.sh">test.sh</a> 2&gt; test_result.txt</strong></p><p># sh <a href="http://test.sh">test.sh</a> <code>2&gt;</code> test_result.txt <code>重定向标准错误</code><code>（注：与&gt;效果相反）</code></p><p>正确输出显示在屏幕上，标准错误输出重定向到文件</p><p><code>只输出了错误的</code></p><p>[root@sanchuang-linux redirect]# sh <a href="http://test.sh">test.sh</a> <code>2&gt;</code> test_result.txt<br><code>2020年 10月 16日 星期五 14:52:33 CST</code>（注：正确输出显示在屏幕上）<br>[root@sanchuang-linux redirect]# cat test_result<code>.txt</code><br><code>test.sh:行1: t: 未找到命令</code>（注：标准错误输出重定向到文件）</p></blockquote><hr><blockquote><p><strong>知识点3.5.2 # sh <a href="http://test.sh">test.sh</a> &amp;&gt; test_result.txt</strong></p><p># sh <a href="http://test.sh">test.sh</a> <code>&amp;&gt;</code> test_result.txt</p><p><code>把正确的错误的都重定向到 文件</code></p><p>[root@sanchuang-linux redirect]# sh <a href="http://test.sh">test.sh</a> <code>&amp;&gt;</code> test_result.txt<br>[root@sanchuang-linux redirect]# cat test_result.txt<br><a href="http://test.sh">test.sh</a>:行1: t: 未找到命令<br>2020年 10月 16日 星期五 14:54:05 CST</p><p><code>与下面效果相同</code></p></blockquote><hr><blockquote><p><strong>知识点3.5.3 # sh <a href="http://test.sh">test.sh</a> &gt; test_result.txt 2&gt;&amp;1</strong></p><p># sh <a href="http://test.sh">test.sh</a> <code>&gt;</code> test_result.txt <code>2&gt;&amp;1</code></p><p><code>把错误输出重定向向到标准输出</code></p><p>[root@sanchuang-linux redirect]# sh <a href="http://test.sh">test.sh</a> &gt; test_result.txt <code>2&gt;&amp;1</code><br>[root@sanchuang-linux redirect]# cat test_result.txt<br><a href="http://test.sh">test.sh</a>:行1: t: 未找到命令<br>2020年 10月 16日 星期五 14:55:16 CST</p><p><code>两者效果等同</code></p></blockquote><hr><blockquote><p><strong>知识点3.5.4 # sh <a href="http://test.sh">test.sh</a> &gt; test_result.txt 1&gt;&amp;2</strong></p><p># sh <a href="http://test.sh">test.sh</a> <code>&gt;</code> test_result.txt <code>1&gt;&amp;2</code></p><p><code>把标准输出重定向错误输出</code></p><p><code>*输出到屏幕上 （*注：不重定向到文件）</code></p><p>[root@sanchuang-linux redirect]# sh <a href="http://test.sh">test.sh</a> &gt; test_result.txt <code>1&gt;&amp;2</code><br><a href="http://test.sh">test.sh</a>:行1: t: 未找到命令（注：输出到屏幕上）<br>2020年 10月 16日 星期五 14:56:19 CST（注：输出到屏幕上）</p><p>[root@sanchuang-linux redirect]# cat test_result.txt<br>[root@sanchuang-linux redirect]#</p></blockquote><h3 id="使用重定向清空文件的几种方式">使用重定向清空文件的几种方式<a class="header-anchor" href="#使用重定向清空文件的几种方式"></a></h3><blockquote><p><strong>知识点3.6 使用重定向清空文件的几种方式</strong></p><p>使用重定向清空文件的几种方式：</p><p># <code>&gt;</code>stdout_test.txt</p><p># <code>echo &gt;</code>stdout_test.txt （注：有空格）</p><p># <code>echo &quot;&quot;</code>&gt;stdout_test.txt （注：有空格）</p><p># <code>:&gt;</code>stdout_test.txt</p><p># <code>echo -n &quot;&quot; &gt;</code> stdout_test.txt</p><p>代码如下</p><p>--------------------------------------------------------------------------------------------</p><p>[root@sanchuang-linux redirect]# vim stdout_test.txt<br>[root@sanchuang-linux redirect]# <code>&gt;stdout_test.txt（注：清空）</code><br>[root@sanchuang-linux redirect]# cat stdout_test.txt<br>[root@sanchuang-linux redirect]# echo “aaa”&gt; stdout_test.txt<br>[root@sanchuang-linux redirect]# cat stdout_test.txt<br>aaa<br>[root@sanchuang-linux redirect]# <code>echo &gt;stdout_test.txt （注：有空格）</code><br>[root@sanchuang-linux redirect]# cat stdout_test.txt</p><p>[root@sanchuang-linux redirect]# echo “aaa”&gt;stdout_test.txt<br>[root@sanchuang-linux redirect]# <code>echo &quot;&quot;&gt;stdout_test.txt （注：有空格）</code><br>[root@sanchuang-linux redirect]# cat stdout_test.txt</p><p>[root@sanchuang-linux redirect]# echo “aaa”&gt;stdout_test.txt<br>[root@sanchuang-linux redirect]# <code>:&gt;stdout_test.txt （注：清空）</code><br>[root@sanchuang-linux redirect]# cat stdout_test.txt</p><p>[root@sanchuang-linux chenpeng]# <code>echo -n &quot;&quot; &gt; stdout_test.txt（注：清空）</code><br>[root@sanchuang-linux chenpeng]# cat stdout_test.txt<br>[root@sanchuang-linux chenpeng]#</p></blockquote><hr><blockquote><p>**知识点3.6.1 # <code>echo -n &quot;&quot;</code>&gt;stdout_test.txt **</p><p># <code>echo -n &quot;&quot;</code>&gt;stdout_test.txt</p><p><code>echo默认情况会接一个换行符  不想换行 接-n</code></p><p>[root@sanchuang-linux redirect]# echo “aaa”&gt;stdout_test.txt<br>[root@sanchuang-linux redirect]# cat stdout_test.txt<br>aaa<br>[root@sanchuang-linux redirect]# echo “”&gt;stdout_test.txt<br>[root@sanchuang-linux redirect]# cat stdout_test.txt <code>（注：有空格）</code></p><p>[root@sanchuang-linux redirect]# <code>echo -n &quot;&quot;&gt;</code>stdout_test.txt <code>（注：清空，没有空格）</code><br>[root@sanchuang-linux redirect]#</p></blockquote><h3 id="重定向-与">重定向 &gt; 与 &gt;&gt;<a class="header-anchor" href="#重定向-与"></a></h3><blockquote><p><strong>知识点3.7 重定向 &gt; 与 &gt;&gt;</strong></p><p>重定向&gt; 与 &gt;&gt;</p><p><code>&gt;</code> 是以<code>覆盖</code>的方式写入</p><p><code>&gt;&gt;</code>   是以<code>追加</code>的方式写入</p><p>代码如下</p><p>--------------------------------------------------------------------------------------------</p><p>[root@sanchuang-linux redirect]# echo <code>&quot;aaa&quot; &gt;</code> stdout_test.txt</p><p>[root@sanchuang-linux redirect]# cat stdout_test.txt<br><code>aaa</code><br>[root@sanchuang-linux redirect]# echo <code>&quot;bb&quot; &gt;&gt;</code> stdout_test.txt<br>[root@sanchuang-linux redirect]# cat stdout_test.txt<br><code>aaa</code><br><code>bb</code><br>[root@sanchuang-linux redirect]#</p></blockquote><h3 id="重定向标准输入-read输入">重定向标准输入  read输入<a class="header-anchor" href="#重定向标准输入-read输入"></a></h3><blockquote><p><strong>知识点3.8 重定向标准输入  read输入</strong></p><p><code>重定向标准输入  read输入</code></p><p>（注：用到了tmux）</p><p>While 循环</p><p>echo “<code>$a   $b   $c</code>”</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><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">脚本1 3个参数 3个参数</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> abc.sh</span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> a b c</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$a</span>    <span class="variable">$b</span>    <span class="variable">$c</span>&quot;</span></span><br><span class="line"><span class="keyword">done</span> &lt; f1.txt</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口1）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# vim f1.txt</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> f1.txt</span><br><span class="line">xx yy zz</span><br><span class="line">aa bb cc</span><br><span class="line"></span><br><span class="line">（注：窗口2）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# sh abc.sh</span><br><span class="line">xx    yy    zz</span><br><span class="line">aa    bb    cc</span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口3）</span><br></pre></td></tr></table></figure><blockquote><p>echo “<code>$a -- $b</code>”</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><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">脚本2 2个参数 3个参数</span><br><span class="line">[root@sanchuang-linux redirect]# vim abc.sh</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> abc.sh</span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> a b</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$a</span> -- <span class="variable">$b</span>&quot;</span></span><br><span class="line"><span class="keyword">done</span> &lt; f1.txt</span><br><span class="line">[root@sanchuang-linux redirect]#</span><br><span class="line"></span><br><span class="line">（注：窗口1）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# vim f1.txt</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> f1.txt </span><br><span class="line">xx yy zz</span><br><span class="line">aa bb cc</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口2）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">（注：默认空格分割参数，xx 和yy zz）</span><br><span class="line">[root@sanchuang-linux redirect]# sh abc.sh </span><br><span class="line">xx -- yy zz</span><br><span class="line">aa -- bb cc</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口3）</span><br></pre></td></tr></table></figure><blockquote><p>echo “line:<code>$line</code>”</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><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></pre></td><td class="code"><pre><span class="line">脚本3 1个参数 3个参数</span><br><span class="line">[root@sanchuang-linux redirect]# vim abc.sh</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> abc.sh </span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> line </span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;line:<span class="variable">$line</span>&quot;</span></span><br><span class="line"><span class="keyword">done</span> &lt; f1.txt</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口1）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# vim f1.txt</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> f1.txt </span><br><span class="line">xx yy zz</span><br><span class="line">aa bb cc</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口2）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# sh abc.sh </span><br><span class="line">line:xx yy zz</span><br><span class="line">line:aa bb cc</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口3）</span><br></pre></td></tr></table></figure><blockquote><p>echo “<code>$a -- $b -- $c -- $d -- $e</code>”</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><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">脚本4 5个参数 3个参数</span><br><span class="line">[root@sanchuang-linux redirect]# vim abc.sh</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> abc.sh </span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> a b c d e </span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$a</span> -- <span class="variable">$b</span> -- <span class="variable">$c</span> -- <span class="variable">$d</span> -- <span class="variable">$e</span>&quot;</span></span><br><span class="line"><span class="keyword">done</span> &lt; f1.txt</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口1）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# vim f1.txt</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> f1.txt </span><br><span class="line">xx yy zz</span><br><span class="line">aa bb cc</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口2）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# sh abc.sh </span><br><span class="line">xx -- yy -- zz --  -- </span><br><span class="line">aa -- bb -- cc --  -- </span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口3）</span><br><span class="line">=================================</span><br></pre></td></tr></table></figure><hr><blockquote><p><strong>知识点3.9 上课练习  重定向标准输入  read输入</strong></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><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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux redirect]# vim student_information.sh</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> student_information.sh </span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;========学生信息管理系统===============&quot;</span></span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> name sex age</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;==姓名：<span class="variable">$name</span>, 性别:<span class="variable">$sex</span>, 年龄:<span class="variable">$age</span>==&quot;</span></span><br><span class="line"><span class="keyword">done</span> &lt; stu_info.txt</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;========================================&quot;</span></span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口1 tmux）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# <span class="built_in">cat</span> stu_info.txt</span><br><span class="line">wenyao 18 f</span><br><span class="line">fengcheng 78 m</span><br><span class="line">chenpeng 80 m</span><br><span class="line">[root@sanchuang-linux redirect]# </span><br><span class="line"></span><br><span class="line">（注：窗口2 tmux）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux redirect]# sh student_information.sh </span><br><span class="line">========学生信息管理系统===============</span><br><span class="line">==姓名：wenyao, 性别:18, 年龄:f==</span><br><span class="line">==姓名：fengcheng, 性别:78, 年龄:m==</span><br><span class="line">==姓名：chenpeng, 性别:80, 年龄:m==</span><br><span class="line">========================================</span><br><span class="line">[root@sanchuang-linux redirect]#</span><br><span class="line"></span><br><span class="line">（注：窗口3 tmux）</span><br></pre></td></tr></table></figure><hr><h2 id="三-SHELL-脚本练习及管道">三. SHELL-脚本练习及管道<a class="header-anchor" href="#三-SHELL-脚本练习及管道"></a></h2><blockquote><p><strong>知识点4.0 接受从键盘的输入  管道符号</strong></p><p>脚本  接受从键盘的输入</p><p>要求：输入用户名和密码 创建相应的用户</p><p>需求分析：接受用户输入</p><p>​创建用户</p><p>​设置密码</p><p>-----相关知识点----------------------------------</p><p>管道符号 <code>| ：上一条命令的输出作为下一条命令的输入</code></p><p>yum list 默认输出到屏幕</p><p>yum list | grep tmux  yumlist的输出 作为grep tmux命令的输入</p></blockquote><hr><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><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">创建用户 useradd wy</span><br><span class="line">[root@sanchuang-linux ~]# useradd wy</span><br><span class="line">[root@sanchuang-linux ~]# passwd wy</span><br><span class="line">更改用户 wy 的密码 。</span><br><span class="line">新的 密码：</span><br><span class="line">无效的密码： 密码少于 8 个字符</span><br><span class="line">重新输入新的 密码：</span><br><span class="line">passwd：所有的身份验证令牌已经成功更新。</span><br><span class="line">==============================================================</span><br><span class="line">重新给用户wy设置密码</span><br><span class="line">[root@sanchuang-linux ~]# <span class="built_in">echo</span> <span class="string">&quot;yyyzzz123&quot;</span> |passwd wy --stdin</span><br><span class="line">stdin 标准输入</span><br></pre></td></tr></table></figure></blockquote><hr><blockquote><p><strong>*4.1 初始脚本1</strong></p><p>（注：# passwd在bash中执行时会在中间停止，让用户进行输入密码</p><p>​# <code>为了防止shell停止使用参数--stdin</code>，让passwd介绍标准输入，echo是标准输出</p><p>​来自：<a href="https://blog.csdn.net/qq_31820885/article/details/78100587%EF%BC%89">https://blog.csdn.net/qq_31820885/article/details/78100587）</a></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><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux chenpeng]# vim test.sh</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入用户名：&quot;</span> username</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请设置密码：&quot;</span> password</span><br><span class="line"></span><br><span class="line">useradd <span class="variable">$username</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$password</span> | passwd <span class="variable">$username</span> --stdin</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$username</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$password</span></span><br><span class="line"></span><br><span class="line">[root@sanchuang-linux chenpeng]# sh test.sh</span><br><span class="line">请输入用户名：cp1</span><br><span class="line">请设置密码：123456</span><br><span class="line">更改用户 cp1 的密码 。</span><br><span class="line">passwd：所有的身份验证令牌已经成功更新。</span><br><span class="line">cp1</span><br><span class="line">123456</span><br><span class="line">[root@sanchuang-linux chenpeng]# <span class="built_in">id</span> cp1</span><br><span class="line">uid=1009(cp1) gid=1009(cp1) 组=1009(cp1)</span><br><span class="line">[root@sanchuang-linux chenpeng]# less /etc/passwd</span><br><span class="line">root:x:0:0:root:/root:/bin/bash</span><br><span class="line">………………</span><br><span class="line">wy:x:1008:1008::/home/wy:/bin/bash</span><br><span class="line">cp1:x:1009:1009::/home/cp1:/bin/bash</span><br></pre></td></tr></table></figure><blockquote><p>============================================================================================</p><p><strong>*4.2 python 与 shell 程序运行出错</strong></p><p>python中如果程序运行中出现错误，后续操作会终止</p><p>shell 中如果出现错误，操作会继续向下执行</p><p><strong>*4.3 优化脚本2</strong></p><p>用户创建脚本优化：</p><p>1.让命令的标准输出和标准错误输出都输出到黑洞文件</p><p>echo $password | passwd $username --stdin <code>&amp;&gt;/dev/null</code></p><p>2.密码隐藏<code>-s</code></p><p>read -s -p “请设置密码：” password</p><p>3.判断用户是否存在</p><p>条件语句：</p><p><code>if   条件   then</code></p><p>​<code>语句体1</code></p><p><code>else</code></p><p>​<code>语句体2</code></p><p><code>fi</code></p><p><strong>*4.3 优化脚本2</strong></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><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">[root@sanchuang-linux chenpeng]# vim test.sh</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入用户名：&quot;</span> username</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">cat</span> /etc/passwd |grep <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$username</span> is exist!&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">    <span class="built_in">read</span> -s -p <span class="string">&quot;请设置密码：&quot;</span> password</span><br><span class="line">    useradd <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$password</span> | passwd <span class="variable">$username</span> --stdin &amp;&gt;/dev/null</span><br><span class="line">    <span class="built_in">echo</span> -e <span class="string">&quot;\n create <span class="variable">$username</span> ok!&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">----------------------------------------------------------</span><br><span class="line">[root@sanchuang-linux chenpeng]# sh test.sh </span><br><span class="line">请输入用户名：cp1</span><br><span class="line">cp1 is exist!</span><br><span class="line">[root@sanchuang-linux chenpeng]# sh test.sh </span><br><span class="line">请输入用户名：cp8</span><br><span class="line">请设置密码：</span><br><span class="line"> create cp8 ok!</span><br><span class="line">[root@sanchuang-linux chenpeng]# </span><br></pre></td></tr></table></figure><blockquote><p><strong>4.3.2 脚本优化3</strong></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><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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux chenpeng]# vim test.sh</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入用户名：&quot;</span> username</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">cat</span> /etc/passwd |grep <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$username</span> is exist!&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">    <span class="built_in">read</span> -s -p <span class="string">&quot;请设置密码：&quot;</span> password</span><br><span class="line">    useradd <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$password</span> | passwd <span class="variable">$username</span> --stdin &amp;&gt;/dev/null</span><br><span class="line">    <span class="built_in">echo</span> -e <span class="string">&quot;\n create <span class="variable">$username</span> ok!&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">          </span><br><span class="line">（tmux 窗口1）                                                                                                       </span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux chenpeng]# sh test.sh </span><br><span class="line">请输入用户名：chen5556</span><br><span class="line">chen5556 is exist!</span><br><span class="line">[root@sanchuang-linux chenpeng]# sh test.sh </span><br><span class="line">请输入用户名：chen7778</span><br><span class="line">请设置密码：</span><br><span class="line"> create chen7778 ok!</span><br><span class="line">[root@sanchuang-linux chenpeng]# </span><br><span class="line"></span><br><span class="line">（tmux 窗口2）</span><br></pre></td></tr></table></figure><blockquote><p><strong>4.3.4 脚本改善 最终版</strong></p><p>[root@sanchuang-linux chenpeng]# <code>id chen5557</code><br>uid=1019(chen5557) gid=1019(chen5557) 组=1019(chen5557)</p><p>--------------------------------------------------------</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><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></pre></td><td class="code"><pre><span class="line">[root@sanchuang-linux chenpeng]# vim test.sh</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">&quot;请输入用户名:&quot;</span> username</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">id</span> <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$username</span> is exist!&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">   <span class="built_in">read</span> -s -p <span class="string">&quot;请设置密码:&quot;</span> password</span><br><span class="line">   useradd <span class="variable">$username</span> &amp;&gt;/dev/null</span><br><span class="line">   <span class="built_in">echo</span> <span class="variable">$password</span> | passwd <span class="variable">$username</span> --stdin &amp;&gt;/dev/null</span><br><span class="line">   <span class="built_in">echo</span> -e <span class="string">&quot;\n create <span class="variable">$username</span> ok!&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">（tmux 窗口1）</span><br><span class="line">──────────────────────────────────────────────</span><br><span class="line">[root@sanchuang-linux chenpeng]# sh test.sh </span><br><span class="line">请输入用户名:chen5556</span><br><span class="line">chen5556 is exist!</span><br><span class="line">[root@sanchuang-linux chenpeng]# sh test.sh </span><br><span class="line">请输入用户名:chen7777</span><br><span class="line">请设置密码:</span><br><span class="line"> create chen7777 ok!</span><br><span class="line">[root@sanchuang-linux chenpeng]# </span><br><span class="line"></span><br><span class="line">（tmux 窗口2）</span><br></pre></td></tr></table></figure><h3 id="查看用户是否存在">查看用户是否存在<a class="header-anchor" href="#查看用户是否存在"></a></h3><blockquote><p><strong>*4.4 查看用户是否存在</strong></p><p>[root@sanchuang-linux ~]# <code>cat /etc/passwd</code> |grep cp1<br><code>cp1</code>: x:1009:1009::/home/<code>cp1</code>:/bin/bash</p></blockquote><h3 id="上一条命令返回值">上一条命令返回值 $?<a class="header-anchor" href="#上一条命令返回值"></a></h3><blockquote><p><strong>*4.5 上一条命令返回值 $?</strong></p><p>$? 上一个命令的返回值</p><p>上一条命令返回值：  保存在 --&gt;$?</p><p>为0是成功</p><p>为1是失败</p><p><code>命令返回值为0  表示执行成功</code></p><p>​<code>1  执行失败</code></p><p>​<code>227  没有这条命令</code></p><p>命令返回值 $?</p></blockquote><hr><blockquote><p><strong>*4.6 命令返回值  不精确的判断用户是否存在</strong></p><p>不精确地判断用户是否存在</p><p>[root@sanchuang-linux ~]# cat /etc/passwd |<code>grep cp1</code>（注：不精确地判断用户是否存在）<br><code>cp1</code>: x:1009:1009::/home/<code>cp1</code>:/bin/bash<br>[root@sanchuang-linux ~]# echo $?（注：为0是成功）<br>0<br>[root@sanchuang-linux ~]# cat /etc/passwd |grep cp9<br>[root@sanchuang-linux ~]# echo $?（注：为1是失败）<br>1</p><p>=======================================================</p><p>命令返回值 id</p><p>[root@sanchuang-linux ~]# <code>id cp1</code><br><code>uid</code>=1009(cp1) <code>gid</code>=1009(cp1) <code>组</code>=1009(cp1)<br>[root@sanchuang-linux ~]# echo $?<br><code>0</code><br>[root@sanchuang-linux ~]# id cp9<br>id: “cp9”：无此用户<br>[root@sanchuang-linux ~]# echo $?<br><code>1</code><br>[root@sanchuang-linux ~]#</p><p>上一条命令返回值： 保存在 ——&gt;$?</p><p>--------------------------------------------------------</p><p><code>命令返回值为0  表示执行成功</code></p><p>​<code>1  执行失败</code></p><p>​<code>227  没有这条命令</code></p></blockquote><hr><blockquote><p><strong>*4.7 精确的判断用户是否存在 （完善脚本）</strong></p><p>想要精确匹配的话，就把过滤的范围缩小一点：</p><p>^wy:  以wy: 开头</p><p><code>^…：以什么开头，整行以什么开头</code></p><p><code>…$：以什么结尾，整行以什么结尾</code></p><p>[root@sanchuang-linux ~]# cat /etc/passwd |<code>grep &quot;^wy:&quot;</code><br><code>wy:</code> x:1008:1008::/home/wy:/bin/bash</p><p>[root@sanchuang-linux ~]# useradd wy:<br>useradd：无效的用户名“wy:”</p></blockquote><h3 id="wc命令-重定向标准输入">wc命令  &lt;重定向标准输入<a class="header-anchor" href="#wc命令-重定向标准输入"></a></h3><blockquote><p><strong>知识点5.1 wc命令  &lt;重定向标准输入</strong></p><p>wc（字数统计）命令</p><p>格式：<code>wc[选项]...目标文件...</code></p><p><code>-l：统计行数</code></p><p><code>-w：统计字数</code> （前后都是空白的一组字符）</p><p><code>-c：统计字符数</code>（可见和不可见的字符）</p><p>例：</p><p># wc /etc/hosts</p><p><code>4</code> <code>23</code> <code>185</code> /etc/hosts</p><p>（* 注：4行，23个单词，185个字节）</p><p>代码如下</p><p>---------------------------------------------------------------</p><p>[root@sanchuang-linux ~]# <code>wc -l</code> backup_log.sh  （注：查看文件有多少行）<br>0 backup_log.sh<br>[root@sanchuang-linux ~]# <code>wc &lt;</code> backup_log.sh （输入重定向）<br>0 0 0<br>[root@sanchuang-linux ~]# wc  backup_log.sh<br>0 0 0 backup_log.sh</p><p>[root@sanchuang-linux lianxi]# <code>wc -l</code> sshd_config2（注：查看文件有多少行）<br>148 sshd_config2<br>[root@sanchuang-linux lianxi]# <code>wc &lt;</code> sshd_config2（注：<code>标准输入  输入重定向</code>）<br>148  559 4425<br>[root@sanchuang-linux lianxi]# wc sshd_config2 （注：wc(字数统计)命令）<br>148  559 4425 sshd_config2</p></blockquote><hr><blockquote><p><strong>知识点5.2 重定向 发信息 echo “hello brother” &gt; /dev/pts/22</strong></p><p>[root@sanchuang-linux ~]# w<br>17:20:37 up 19:51,  7 users,  load average: 0.00, 0.00, 0.02<br>USER   TTY    FROM       LOGIN@  IDLE  JCPU  PCPU WHAT<br>root   tty1   -         0610月20  7:20m  0.60s  0.60s -bash<br>root   pts/7   192.168.0.30   14:30  42:37  0.09s  0.00s tmux<br>root   pts/21  192.168.0.30   16:48  21.00s  0.14s  0.14s -bash<br>root   <code>pts/22</code>  192.168.0.30   17:20   0.00s  0.02s  0.01s <code>w</code></p><p>----------------------------------------------------------------------</p><p># <code>echo &quot;hello brother&quot; &gt; /dev/pts/22</code></p><p>重定向 发信息</p></blockquote><h3 id="xargs-管道符号">xargs  管道符号<a class="header-anchor" href="#xargs-管道符号"></a></h3><blockquote><p><strong>知识点5.3 xargs  管道符号</strong></p><p>xargs 将前面命令的<code>输出</code>送给后面的命令<code>作为参数</code>使用</p><p><code>xargs 和 管道符号 一般配套使用</code></p><p>-------------------------------------------------</p><p>在当前路径查看.txt结尾的文件</p><p>find . -name “*.txt”</p><p>------------------------------------</p><p>管道 与 xargs</p><p>将管道前的输出作为参数赋给后面的命令</p><p><code>find . -name &quot;*.txt&quot; | xargs rm -rf</code></p><p>--------------------------------------------------------------------------------------</p><p>管道与xargs</p><p>xargs 可以将管道或标准输入（stdin）数据转换成命令行参数，也能够从文件的输出中读取数据。</p><p>[root@mysql-binary vim_test]# find . -name “*.sh” <code>|xargs ls -al</code></p><p>[root@mysql-binary vim_test]# find . -name “*.txt” <code>| xargs rm -rf</code></p><p>（注：ls -al 看文件详细信息）</p><p>代码如下</p><p>------------------------------------------------------------------</p><p>[root@sanchuang-linux chenpeng]# find . -name “*.sh” <code>|xargs ls -al</code><br>-rw-r–r–. 1 root root  77 10月 16 15:30 ./redirect/abc.sh<br>-rw-r–r–. 1 root root 206 10月 16 15:45 ./redirect/student_information.sh<br>-rw-r–r–. 1 root root 300 10月 16 17:15 ./test.sh<br>[root@sanchuang-linux chenpeng]# ls -al <a href="http://test.sh">test.sh</a><br>-rw-r–r–. 1 root root 300 10月 16 17:15 <a href="http://test.sh">test.sh</a></p></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Shell </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>08_Linux基础-vim-tmux-字符编码</title>
      <link href="/posts/33007.html"/>
      <url>/posts/33007.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-vim">一. vim<a class="header-anchor" href="#一-vim"></a></h2><blockquote><p>文本编辑器-vim（<mark>编辑文本</mark>）</p></blockquote><blockquote><p>Windows：记事本、word、sublime、pycharm</p><p>能编辑音乐、视频、图片？答：不能，<mark>只能编辑文本</mark></p></blockquote><blockquote><p>Linux：</p><p>​vi（<mark>字符界面</mark>），vim（<mark>字符界面</mark>），gedit（<mark>图形化</mark>）</p><p><mark>unix 都会安装vi</mark></p><p>vim 是vi的<mark>加强版</mark>（在vi基础上添加其他功能）</p></blockquote><h3 id="vim编辑器作用">vim编辑器作用<a class="header-anchor" href="#vim编辑器作用"></a></h3><blockquote><p>vim编辑器<mark>作用</mark>：</p><p><mark>1、编写脚本、程序</mark></p><p><mark>2、修改配置文件</mark></p><p><mark>3、做一些文本处理</mark></p></blockquote><h3 id="vim模式">vim模式<a class="header-anchor" href="#vim模式"></a></h3><blockquote><p>vim有三种最常用最基本的模式：命令模式、编辑模式（插入模式）、末行模式、可视模式，替换模式</p><p>vim有三种最常用最<mark>基本</mark>的模式：</p><p><mark>命令模式</mark></p><p><mark>编辑模式</mark></p><p><mark>末行模式</mark></p><p>还有另外两种<mark>不常用</mark>模式：</p><p><mark>视图模式</mark></p><p><mark>替换模式</mark></p></blockquote><h4 id="vim命令模式">vim命令模式<a class="header-anchor" href="#vim命令模式"></a></h4><blockquote><p><mark>命令模式：vim  a  /  ESC</mark></p><p>​<mark>无法编辑</mark>，只允许删除、复制、粘贴、撤销等快捷操作，打开文件时<mark>默认</mark>进行此模式</p><p><mark>yy复制</mark></p><p><mark>p粘贴</mark></p><p><mark>dd删除</mark></p><p><mark>u撤销</mark></p><p><mark>命令模式</mark> 相当于一个<mark>中间</mark>介</p><p>每个模式<mark>退出</mark> 都会<mark>回到命令模式</mark>，命令模式可以进入所有模式</p></blockquote><h4 id="vim编辑模式">vim编辑模式<a class="header-anchor" href="#vim编辑模式"></a></h4><blockquote><p>编辑模式 ESC  <mark>i</mark></p><p>– 插入 –</p><p>​插入模式，进行<mark>文本编辑</mark></p><p>-----------------------------------------------------------------------</p><p>操作键功能</p><p>​<mark>i</mark>光标在<mark>当前</mark>位置进入插入模式</p><p>​I光标<mark>跳到行首</mark>并进入插入模式</p><p>​a光标<mark>后退一格</mark>并进入插入模式</p><p>​A光标<mark>退到行尾</mark>并进入插入模式</p><p>​<mark>o</mark>在光标所在<mark>行下新起一行</mark>并进入插入模式</p><p>​<mark>O</mark>在光标所在<mark>行上新起一行</mark>并进入插入模式</p><p>​s<mark>删除</mark>光标<mark>所在字符</mark>并进入插入模式</p><p>​S<mark>删除</mark>光标所在<mark>行</mark>并进入插入模式</p></blockquote><h4 id="vim末行模式">vim末行模式<a class="header-anchor" href="#vim末行模式"></a></h4><blockquote><p>末行模式 ESC  <mark>:</mark></p><p>:</p><p>输入命令，设置环境，保存文件，查找替换</p><p>----------------------------------------------------</p><p>操作键功能</p><p>​<mark>:q</mark>如果未对文件做改动则<mark>退出</mark></p><p>​<mark>:q!</mark><mark>放弃保存</mark>并<mark>退出</mark></p><p>​<mark>:wq保存</mark>当前文件并<mark>退出</mark></p><p>​<mark>:wq!强制保存</mark>当前文件并<mark>退出</mark></p><p>​<mark>:x保存</mark>当前文件并<mark>退出</mark></p><p>​<mark>:x!强制保存</mark>当前文件并<mark>退出</mark></p><p>​<mark>ZZ保存</mark>当前文件并<mark>退出</mark></p></blockquote><h4 id="vim视图模式">vim视图模式<a class="header-anchor" href="#vim视图模式"></a></h4><blockquote><p>视图模式 ESC  <mark>v、V、ctrl+v</mark></p><p>– 可视 行 –</p><p>​选择特定的块文本，进行复制，修改等</p><p>小<mark>v</mark>：选择<mark>行指定的部分</mark></p><p>大<mark>V</mark>：选择<mark>整个行</mark></p><p><mark>Ctrl + v</mark> :选择<mark>块</mark> 插入按I  退出模式进人命令模式（Esc），这个时候就全部加上</p></blockquote><h4 id="vim替换模式">vim替换模式<a class="header-anchor" href="#vim替换模式"></a></h4><blockquote><p>替换模式 ESC  <mark>R</mark></p><p>– 替换 –</p><p>-----------------------------------</p><p>123 hello456 789<br>xxx helloyyy zzz<br>xxx yyy zzz</p></blockquote><h3 id="练习">练习<a class="header-anchor" href="#练习"></a></h3><blockquote><p><strong>课堂练习1 插入模式</strong></p><p>123 456<br>123 4<br>xyz 789<br>4<br>xyz 789</p><p>---------------------------------------------------------</p><p>步骤：</p><p><mark>v</mark> 小v 可视模式 visual —》选择一部分</p><p><mark>y</mark>  按y复制</p><p><mark>o</mark> 按o另起一行，进入插入模式</p><p><mark>P</mark> 再按esc，再p，按p粘贴</p></blockquote><blockquote><p><strong>课堂练习2</strong></p><p>123 TEST 456 789<br>xxx TEST yyy zzz</p><p>---------------------------------------------------------</p><p>选择块插入</p><p>ctrl + v：选择块</p><p>插入按大I</p><p>ESC  退出模式进入命令模式，这个时候就全部加上</p></blockquote><h3 id="vim常用快捷方式">vim常用快捷方式<a class="header-anchor" href="#vim常用快捷方式"></a></h3><blockquote><p>vim 常用快捷方式</p><p>vim打开文件：</p><p># vim e<br># <mark>vim +5 e</mark></p><p>表示打开文件e，并且<mark>将光标移动到第3行</mark></p><p># <mark>vim +/aa e</mark></p><p>打开文件e，并且<mark>高亮显示aa字符</mark></p></blockquote><h3 id="退出vim编辑器的方法">退出vim编辑器的方法<a class="header-anchor" href="#退出vim编辑器的方法"></a></h3><blockquote><p>vim保存退出：</p><p>操作键功能</p><p>​<mark>:q</mark>如果未对文件做改动则<mark>退出</mark></p><p>​<mark>:q!</mark>放弃保存并<mark>退出</mark></p><p>​<mark>:wq</mark><mark>保存</mark>当前文件并<mark>退出</mark></p><p>​<mark>:wq!</mark><mark>强制保存</mark>当前文件并<mark>退出</mark></p><p>​<mark>:x</mark><mark>保存</mark>当前文件并<mark>退出</mark></p><p>​<mark>:x!</mark><mark>强制保存</mark>当前文件并<mark>退出</mark></p><p>​<mark>ZZ</mark><mark>保存</mark>当前文件并<mark>退出</mark> （注：命令模式退出）</p></blockquote><h3 id="光标移动">光标移动<a class="header-anchor" href="#光标移动"></a></h3><blockquote><p>光标移动：上下左右方向键（k，j，h，l）</p><p>-------------------------------------------------</p><p>操作类型 操作键功能</p><p><mark>光标</mark>方向移动 <mark>k，j，h，l</mark><mark>上、下、左、右</mark></p><p>==============================================================</p><p><mark>翻页</mark> Page Down或Ctrl+F向<mark>下</mark>翻动一整页内容</p><p>​ Page Up或Ctrl+B向<mark>上</mark>翻动一整页内容</p><p>==============================================================</p><p><mark>行内</mark>快速跳转 Home键或“^”、数字“0”跳转至<mark>行首（注：“^”尖符号）</mark></p><p>​End键或“$”键跳转到<mark>行尾</mark></p><p>==============================================================</p><p><mark>行间</mark>快速跳转</p><p>1G或者gg跳转到文件的<mark>首行</mark></p><p>G  跳转到文件的<mark>末尾行</mark></p><p>#G跳转到文件中的<mark>第#行</mark></p><p>（末行模式）:40跳转到<mark>40行</mark></p><p>w  <mark>每个单词</mark>的<mark>首字母</mark>跳转</p><p>e   <mark>每个单词</mark>的<mark>尾字母</mark>跳转</p></blockquote><h3 id="vim设置">vim设置<a class="header-anchor" href="#vim设置"></a></h3><blockquote><p><strong>vim设置</strong></p><p>（末行模式）:set number<mark>设置行数</mark></p><p>（末行模式）:set nonumber <mark>取消设置</mark></p><p>--------------------------------------</p><figure class="highlight vim"><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">set</span> <span class="keyword">number</span></span><br><span class="line"></span><br><span class="line"> <span class="number">1</span> aa bb <span class="keyword">cc</span></span><br><span class="line"> <span class="number">2</span> dd ee ff</span><br><span class="line"> <span class="number">1</span> aa bb <span class="keyword">cc</span></span><br><span class="line"> <span class="number">2</span> dd ee ff</span><br><span class="line"> <span class="number">3</span> aa bb <span class="keyword">cc</span></span><br></pre></td></tr></table></figure></blockquote><h3 id="删除（剪切）、复制、粘贴">删除（剪切）、复制、粘贴<a class="header-anchor" href="#删除（剪切）、复制、粘贴"></a></h3><blockquote><p>操作类型</p><p>操作键功能</p><p>--------------------------------------</p><p><strong>删除</strong> （*注：一般==^行首，$行尾==）</p><p><mark>x或d或Del删除</mark>光标处的<mark>单个字符</mark></p><p><mark>dd删除</mark>当前光标<mark>所在行</mark></p><p><mark>#dd删除</mark>从光标处开始的==#行内容==</p><p>d==^==<mark>删除</mark>当前<mark>光标之前到行首</mark>的所有字符</p><p>d==$==删除当前<mark>光标处到行尾</mark>的所有字符</p><p>d<mark>w</mark><mark>删除一个单词</mark>（word)，以空格、冒号等 符号</p><p>------------------------------------------------------</p><p><strong>复制</strong></p><p><mark>yy复制</mark>当前行<mark>整行</mark>的内容到剪贴板</p><p><mark>#yy复制</mark>从光标处开始的==#行==内容</p><p>------------------------------------------------------</p><p><strong>粘贴</strong></p><p>小<mark>p</mark>将<mark>缓冲区</mark>中的内容<mark>粘贴</mark>到光标位置处<mark>之后</mark></p><p>大<mark>P粘贴</mark>到光标位置处<mark>之前</mark></p></blockquote><h3 id="文件内容查找">文件内容查找<a class="header-anchor" href="#文件内容查找"></a></h3><blockquote><p>文件内容查找</p><p>操作键功能</p><p>==/==word<mark>从上而下</mark>在文件中查找字符串“word”</p><p>==?==word<mark>从下而上</mark>在文件中查找字符串“word”</p><p>小<mark>n</mark><mark>定位下一个</mark>匹配的被查找字符串</p><p>大<mark>N</mark><mark>定位上一个</mark>匹配的被查找字符串</p><p>（注：/word 和 ?word 不同点：<mark>方向相反</mark>）</p></blockquote><h3 id="取消高亮、设置行数、取消行数设置">取消高亮、设置行数、取消行数设置<a class="header-anchor" href="#取消高亮、设置行数、取消行数设置"></a></h3><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">取消高亮 ：noh</span><br><span class="line">设置行数：set nu</span><br><span class="line">取消：set nonu</span><br></pre></td></tr></table></figure><hr><h2 id="二-vim-tmux及字符编码问题">二. vim-tmux及字符编码问题<a class="header-anchor" href="#二-vim-tmux及字符编码问题"></a></h2><blockquote><p><strong>文件内容替换</strong></p><p>文件内容替换(末行模式）</p><p>命令功能</p><p><mark>😒 /old/new</mark>将<mark>当前行</mark>中查找到的<mark>第一个</mark>字符“old”串<mark>替换</mark>为“new”</p><p><mark>😒 /old/new/g</mark> 将<mark>当前行</mark>中查找到的<mark>所有</mark>字符串“old”<mark>替换</mark>为“new”</p><p><mark>:#,# s</mark>/old/new/<mark>g</mark>在<mark>行号“#,#”<mark>范围内替换</mark>所有</mark>的字符串“old”为“new”</p><p><mark>:% s</mark>/old/new/<mark>g</mark>   在<mark>整个文件</mark>范围内替换<mark>所有</mark>的字符串“old”为“new” global</p><p><mark>😒</mark> /old/new/<mark>gc</mark>在替换命令末尾加入<mark>c命令</mark>，将对每个替换动作<mark>提示</mark>用 户进行<mark>确认</mark>Confirm</p><p><mark>:%s</mark>/feng//<mark>g</mark> 将<mark>所有</mark>的feng<mark>删除</mark></p><p>（注：😒/…/… 当前行 第一个str</p><p>​😒/…/…/g当前行 所有str</p><p>​:#,#s/…/…/g 行号#,# 所有str</p><p>​:%s/…/…/g 整个文档 所有str</p><p>​😒/…/…/gc 整个文档 所有str 确认提示</p><p>​:%s/…//g 整个文档 所有str 删除）</p><p>（注：s  —— 替换</p><p>​ 😒 —— 当前行替换</p><p>​#,#  —— 行号#到#</p><p>​% —— 整个文档</p><p>​g —— 所有字符串</p><p>​c —— 确认提示</p><p>​:%s/…//g —— 整个文档 所有str 删除）</p></blockquote><blockquote><p><mark>缓存：swp文件</mark></p><p><mark>编写文件时 1.txt</mark></p><p><mark>先把1.txt文件拷贝一份，拷贝成.1.txt.swp文件，真正编辑的是这个文件</mark></p><p><mark>保存时，会将.1.txt.swp覆盖1.txt</mark></p><p>-------------------------------------------------------------------------------------------</p><p><strong>相关操作</strong></p><p>一个终端下# vim 2.txt,另一个终端敲# ls -al,提示如下</p><p>[root@sanchuang-linux cp]# <mark>ls -al</mark><br>总用量 88<br>-rw-r–r–.  1 root root  4096 10月 15 15:05 <mark>.2.txt.swp</mark></p><p>===========================================================================================</p><p>在另一个终端# vim 2.txt，提示如下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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></pre></td><td class="code"><pre><span class="line">发现交换文件 &quot;.2.txt.swp&quot;</span><br><span class="line">            所有者: root    日期: Thu Oct 15 15:05:45 2020</span><br><span class="line">            文件名: ~root/cp/2.txt</span><br><span class="line">            修改过: 否</span><br><span class="line">            用户名: root      主机名: sanchuang-linux</span><br><span class="line">           进程 ID: 3129 (仍在运行)</span><br><span class="line">正在打开文件 &quot;2.txt&quot;</span><br><span class="line">              日期: Thu Oct 15 15:05:22 2020</span><br><span class="line"></span><br><span class="line">(1) Another program may be editing the same file.  If this is the case,</span><br><span class="line">    be careful not to end up with two different instances of the same</span><br><span class="line">    file when making changes.  Quit, or continue with caution.</span><br><span class="line">(2) An edit session for this file crashed.</span><br><span class="line">    如果是这样，请用 &quot;:recover&quot; 或 &quot;vim -r 2.txt&quot;</span><br><span class="line">    恢复修改的内容 (请见 &quot;:help recovery&quot;)。</span><br><span class="line">    如果你已经进行了恢复，请删除交换文件 &quot;.2.txt.swp&quot;</span><br><span class="line">    以避免再看到此消息。</span><br><span class="line"></span><br><span class="line">交换文件 &quot;.2.txt.swp&quot; 已存在！</span><br><span class="line">以只读方式打开([O]), 直接编辑((E)), 恢复((R)), 退出((Q)), 中止((A)): </span><br></pre></td></tr></table></figure><p>===========================================================================================</p><p>:wq 写入时，提示如下</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">&quot;2.txt&quot;                                                                                          </span><br><span class="line">警告: 此文件自读入后已发生变动！！！</span><br><span class="line">确实要写入吗 (y/n)?</span><br></pre></td></tr></table></figure></blockquote><blockquote><p><mark>* 注意</mark>：进入命令模式，按数字键，之后再进入插入模式的话，会将输入内容按照之前按的数字大小复制成多份</p><p>（注：步骤</p><p>​vim 1.txt ——&gt; 先按数字3 ——&gt; 按i进入插入模式 ——&gt; abc ——&gt; Esc ——&gt; abcabcabc）</p></blockquote><blockquote><p><strong>打开新文件或读入其他文件内容 &amp;&amp; 撤销和另存为</strong></p><p>打开新文件 <mark>:e</mark>  或 读入其他文件内容 <mark>:r</mark></p><p>命令功能</p><p><mark>:e</mark> ~/install.log<mark>打开</mark>新的<mark>文件</mark>进行<mark>编辑</mark></p><p><mark>:r</mark> /etc/filesystems在<mark>当前文件</mark>中<mark>读入其他文件内容</mark> （注：即追加内容）</p><p>撤销和另存为 <mark>:w</mark></p><p><mark>:w</mark> /tmp/hello.txt把当前文件另存为/tmp目录下的hello.txt</p><p><mark>同时编辑</mark>多个文件</p><p># <mark>vim 1.txt 2.txt</mark></p><p><mark>:n</mark> 编辑上一个</p><p><mark>:N</mark> 编辑下一个</p><p>===========================================================================================</p><p>例：</p><p># vim 2.txt</p><p><mark>:e 1.txt</mark></p><p>（注：进入1.txt进行编辑）</p><p>--------------------------</p><p># vim 2.txt</p><p><mark>:r 1.txt</mark></p><p>（注：读入1.txt文件的内容。在当前光标下一行插入1.txt文件内容）</p><p>===========================================================================================</p><p>撤销和另存为 <mark>:w</mark></p><p>命令  功能</p><p><mark>:w</mark> /tmp/hello.txt把当前文件另存为/tmp目录下的hello.txt</p><p>===========================================================================================</p><p>例：</p><p># vim 1.txt</p><p><mark>:w /root/cp/test.txt</mark></p><p>（注：将文件1.txt另存为在/root/cp/目录下，<mark>改名为test.txt</mark>）</p></blockquote><blockquote><p><strong>vim的配置（3种）</strong></p><p>--------------------------------------------------------------------------------------------</p><p>第一种</p><p><mark>vim设置</mark>：（末行模式）</p><p>一次性设置行数：（只在当前编辑时生效）</p><p>:set number</p><p>取消</p><p>:set nonumber</p><p>--------------------------------------------------------------------------------------------</p><p>第二种</p><p><mark>全局配置文件</mark>：</p><p># vim /etc/vimrc</p><p># cp /etc/vimrc{,.bak} （注：效果等同于 # cp /etc/vimrc /etc/vimrc.bak）</p><p>​   （* 注↑：备份操作。修改全局配置文件前先备份。出错就回滚）</p><p>set number   （注：<mark>设置行数</mark>）</p><p>set <mark>showcmd</mark>   （注：<mark>显示当前键入命令</mark>）</p><p>set encoding=utf-8  （注：<mark>设置编码</mark>）</p><p>set tabstop=4   （注：<mark>设置tab键的空格数</mark>）</p><p>--------------------------------------------------------------------------------------------</p><p>第三种：(只针对当前用户生效)</p><p><mark>编写 ~/.vimrc</mark></p><p>[root@sanchuang-linux ~]# vim <mark>.vimrc</mark></p><p>[root@sanchuang-linux ~]# cat .vimrc</p><p>set number</p><p>set showcmd</p><p>set encoding=utf-8</p><p>set tabstop=4</p></blockquote><h3 id="tmux">tmux<a class="header-anchor" href="#tmux"></a></h3><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><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">tmux shell里面多屏幕编辑</span><br><span class="line">安装：</span><br><span class="line"><span class="comment"># yum install tmux  -y  </span></span><br><span class="line">tmux</span><br><span class="line">Ctrl+b 上下左右</span><br><span class="line">Ctrl+b <span class="built_in">shift</span> +＂</span><br><span class="line">Ctrl+b <span class="built_in">shift</span> + %</span><br><span class="line">Ctrl+b + c  创造新的一页</span><br><span class="line">Ctrl+b + p  返回上一页</span><br><span class="line">Ctrl+b + n  返回下一页</span><br><span class="line">Ctrl+b + x 关闭当前小窗口 </span><br><span class="line">ctrl+d关闭</span><br><span class="line">Ctrl+b + b + ! 删除</span><br><span class="line"></span><br><span class="line">Ctrl+b + d 暂存，保存当前的tmux状态并退出tmux</span><br></pre></td></tr></table></figure></blockquote><blockquote><p>tmux：</p><p>安装：yum install tmux</p><p>tmux：</p><p>一：敲tmux 进入会话</p><p>窗口底部有绿杠表示进入了tmux</p><p>----------------------------------------------------------------------------------------------------------</p><p>左右分屏：先按<mark>ctrl + b</mark>，然后再按shift+==%==号</p><p>上下分屏：先按<mark>ctrl + b</mark>,   然后再按shift+<mark>&quot;</mark></p><p>上下左右移动光标： <mark>ctrl + b</mark>，再按<mark>上下左右</mark>方向键</p><p>删除一个分割： 光标移动到那个分割屏幕，然后按<mark>ctrl +d</mark></p><p>新增一个新的窗口（新增一页）：<mark>ctrl+b</mark>，然后按<mark>c</mark></p><p>返回上一页： <mark>ctrl+b</mark> 然后按<mark>p</mark></p><p>返回下一页： <mark>ctrl+b</mark> 然后按<mark>n</mark></p><p>----------------------------------------------------------------------------------------------------------</p><p>保存当前的tmux状态，并退出tmux：</p><p>使用： <mark>ctrl+b</mark>  然后按<mark>d</mark></p><p>----------------------------------------------------------------------------------------------------------</p><p>查看当前保存的会话状态</p><p>[root@mysql-binary ~]# <mark>tmux ls</mark></p><p>0: 2 windows (created Thu Oct 15 16:31:27 2020) [139x22]</p><p>1: 2 windows (created Thu Oct 15 16:45:40 2020) [139x22]</p><p>-------------------------------------------------------------------------------------------------------------</p><p>进入第一个会话状态：</p><p><mark>tmux a -t 0</mark></p><p>-------------------------------------------------------------------------------------------------------------</p><p><mark>设置tmux</mark>，跟vim的末行模式很像：</p><p>按<mark>ctrl+b</mark> ,然后按==：<mark>（这时窗口底部就会有</mark>黄色==的杠）</p><p>设置<mark>同步</mark>：  <mark>ctrl+b</mark> 然后按==：== 然后输入<mark>set synchronize-panes on</mark></p><p>​                  取消同步<mark>set synchronize-panes off</mark></p></blockquote><blockquote><p><strong>tmux终端关闭，执行的程序会继续执行 （* tmux的好处）</strong></p><p>tmux 终端关闭，不是tmux会话关闭。tmux 终端关闭，那之前执行的程序都会继续执行。</p><p>不使用tmux，默认情况下，终端关闭，执行的程序也会关闭。 测试如下</p><p>================================================================</p><p>测试：</p><p><mark>编写脚本：</mark></p><p># cat <a href="http://sleep.sh">sleep.sh</a><br>echo “begin…”<br>sleep 100<br>echo “end…”</p><p>=======================</p><p><mark>运行脚本</mark><br># sh <a href="http://sleep.sh">sleep.sh</a><br>begin…</p><p>=======================</p><p>运行脚本：<mark>（放到后台运行）</mark></p><p># sh <a href="http://sleep.sh">sleep.sh</a> <mark>&amp;</mark></p><p>=======================</p><p><mark>查看进程有没有运行</mark></p><p># <mark>ps -ef |grep sleep</mark><br>root    13133  13112  0 17:12 pts/6   00:00:00 sh <a href="http://sleep.sh">sleep.sh</a><br>root    13134  13133  0 17:12 pts/6   00:00:00 sleep 100<br>root    13190  13140  0 17:12 pts/16  00:00:00 grep --color=auto sleep</p><p>=======================</p><p><mark>关闭终端之后再重新开启连接，查看进程有没有运行。</mark></p><p>结果：没有运行</p><p>……</p><p>=======================</p><p><mark>在tmux下 运行脚本</mark></p><p>……</p><p><mark>tmux关闭后  会话还在，程序还会一直运行</mark></p><p># ps -ef |grep sleep<br>root    13278  13003  0 17:17 pts/13  00:00:00 sh <a href="http://sleep.sh">sleep.sh</a><br>root    13279  13278  0 17:17 pts/13  00:00:00 sleep 100<br>root    13284  13140  0 17:17 pts/16  00:00:00 grep --color=auto sleep</p><p>=======================</p></blockquote><h3 id="编码">编码<a class="header-anchor" href="#编码"></a></h3><blockquote><p><strong>编码</strong></p><p>编码：<a href="http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html">http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html</a></p><p>文件编码一般2种方式：<mark>ascii 和 unicode</mark></p><p>UTF-8 是 Unicode 的实现方式之一</p><p><mark>转编码</mark>：</p><p># <mark>iconv -f</mark> utf-8 <mark>-t</mark> gbk <mark>code_test.txt</mark> &gt;<mark>code_test1.txt</mark></p><p>ASCII 码 最多能表示256个字，不够用</p><p>unicode  万国码，每个字给你一个序号</p><p>UTF-8 是 Unicode 的实现方式之一，规定怎么存储在计算机。</p><p>（UTF-8对ascii码/英文码友好）</p><p><mark>以什么编码方式存储，就要以什么编码方式解码</mark></p><p>utf-8、utf-16</p><p>国内编码 gbk、gb2131</p><p>===============================================</p><p><mark>系统语言设置环境：</mark></p><p># <mark>locale</mark></p><p>LANG=zh_CN.UTF-8</p><p>LC_CTYPE=“zh_CN.UTF-8”</p><p>LC_NUMERIC=“zh_CN.UTF-8”</p><p>LC_TIME=“zh_CN.UTF-8”</p><p>LC_COLLATE=“zh_CN.UTF-8”</p><p>LC_MONETARY=“zh_CN.UTF-8”</p><p>LC_MESSAGES=“zh_CN.UTF-8”</p><p>LC_PAPER=“zh_CN.UTF-8”</p><p>LC_NAME=“zh_CN.UTF-8”</p><p>LC_ADDRESS=“zh_CN.UTF-8”</p><p>LC_TELEPHONE=“zh_CN.UTF-8”</p><p>LC_MEASUREMENT=“zh_CN.UTF-8”</p><p>LC_IDENTIFICATION=“zh_CN.UTF-8”</p><p>LC_ALL=</p><p>===============================================</p><p><mark>file code_test.txt 注：查看文件编码类型</mark></p><p># locale 系统语言设置环境</p><p># file code_test1.txt 看文件编码方式</p><p>系统、文件、shell  三者统一 ，不会乱码</p><p>===============================================</p><p>上课代码操作：</p><p># mkdir vim_test<br># cd vim_test/<br># ls<br># rz -E（注：将windows code_test.txt文件上传linux）<br>rz waiting to receive.<br># ls<br>code_test.txt<br># vim code_test.txt<br># <mark>file code_test.txt （注：查看文件编码类型）</mark><br>code_test.txt: UTF-8 Unicode text<br># iconv -f utf-8 -t <mark>gbk</mark> code_test.txt &gt;code_test1.txt（注：转国标码）<br># <mark>file code_test1.txt</mark><br>code_test1.txt: <mark>ISO-8859 text（注：国标码）</mark><br># vim code_test1.txt （注：显示乱码）<br>#</p><p>为什么出现乱码？答：以utf-8的方式打开gbk编码</p><p>以什么编码方式存储，就要以什么编码方式解码</p></blockquote><h3 id="总结（xmind）">总结（xmind）<a class="header-anchor" href="#总结（xmind）"></a></h3><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205041447906.png" alt=""></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><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><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br></pre></td><td class="code"><pre><span class="line">vim文本编辑器</span><br><span class="line">vi，vim</span><br><span class="line">vim常见模式</span><br><span class="line">命令模式</span><br><span class="line">文件打开默认就是命令模式</span><br><span class="line">ESC键到达</span><br><span class="line">编辑模式</span><br><span class="line">a,i,o,s（支持大写）</span><br><span class="line">末行模式</span><br><span class="line">：</span><br><span class="line">可视模式</span><br><span class="line">v</span><br><span class="line">选中文本指定部分</span><br><span class="line">V</span><br><span class="line">选择文本指定行</span><br><span class="line">ctrl+v</span><br><span class="line">选择文本指定块</span><br><span class="line">替换模式</span><br><span class="line">R</span><br><span class="line">基本使用</span><br><span class="line">命令模式</span><br><span class="line">删除</span><br><span class="line">x 、d</span><br><span class="line"><span class="built_in">dd</span></span><br><span class="line">5dd</span><br><span class="line">复制</span><br><span class="line">yy</span><br><span class="line">3yy</span><br><span class="line">粘贴</span><br><span class="line">p </span><br><span class="line">撤销</span><br><span class="line">u</span><br><span class="line">查找</span><br><span class="line">/</span><br><span class="line">光标移动</span><br><span class="line">上下左右方向键（k,j,h,l）</span><br><span class="line">文件首</span><br><span class="line">gg</span><br><span class="line">文件尾</span><br><span class="line">G</span><br><span class="line">移动到特定行</span><br><span class="line">5G</span><br><span class="line">：5</span><br><span class="line">行首</span><br><span class="line">home键</span><br><span class="line">0</span><br><span class="line">^</span><br><span class="line">行尾</span><br><span class="line">end键</span><br><span class="line">$</span><br><span class="line">上翻页</span><br><span class="line">page up， ctrl+b</span><br><span class="line">下翻页</span><br><span class="line">pagedowm， ctrl+f</span><br><span class="line">编辑模式</span><br><span class="line">i</span><br><span class="line">I</span><br><span class="line">o</span><br><span class="line">O</span><br><span class="line">a</span><br><span class="line">A</span><br><span class="line">s</span><br><span class="line">S</span><br><span class="line">可视模式</span><br><span class="line">复制y</span><br><span class="line">插入 I</span><br><span class="line">末行模式</span><br><span class="line">退出和保存</span><br><span class="line">q</span><br><span class="line">q!</span><br><span class="line">wq</span><br><span class="line">wq!</span><br><span class="line">x</span><br><span class="line">ZZ命令模式退出</span><br><span class="line">替换</span><br><span class="line">：s/old/new</span><br><span class="line">:s/old/new/g</span><br><span class="line">:%s/old/new</span><br><span class="line">:%s/old/new/g</span><br><span class="line">:3,5s/old/new/g</span><br><span class="line">:%s/old/new/gc</span><br><span class="line">设置</span><br><span class="line">文件操作</span><br><span class="line">：e  编辑新文件</span><br><span class="line">：r  导入文件内容</span><br><span class="line">：w  另存文件路径</span><br><span class="line">vim  1.txt 2.txt</span><br><span class="line">：n 编辑下一个</span><br><span class="line">：N 编辑上一个</span><br><span class="line">vim常见快捷方式使用</span><br><span class="line">vim file1 file2 file3</span><br><span class="line">vim +10  file</span><br><span class="line">vim +/aa file</span><br><span class="line">vim的配置</span><br><span class="line">临时配置</span><br><span class="line">末行模式</span><br><span class="line">：<span class="built_in">set</span> nu</span><br><span class="line">全局配置</span><br><span class="line">/etc/vimrc</span><br><span class="line">用户配置</span><br><span class="line">~/.vimrc</span><br><span class="line">tmux</span><br><span class="line">tmux：</span><br><span class="line">安装：yum install tmux</span><br><span class="line">tmux： </span><br><span class="line">一：敲tmux 进入会话</span><br><span class="line">窗口底部有绿杠表示进入了tmux</span><br><span class="line"></span><br><span class="line">左右分屏：先按ctrl + b ，然后再按<span class="built_in">shift</span>+% 号</span><br><span class="line">上下分屏：先按ctrl + b, 然后再按 <span class="built_in">shift</span>+<span class="string">&quot;</span></span><br><span class="line"><span class="string">上下左右移动光标： ctrl + b 再按上下左右方向键</span></span><br><span class="line"><span class="string">删除一个分割： 光标移动到那个分割屏幕，然后按ctrl +d</span></span><br><span class="line"><span class="string">新增一个新的窗口（新增一页）：  ctrl+b 然后按c</span></span><br><span class="line"><span class="string">返回上一页： ctrl+b 然后按p</span></span><br><span class="line"><span class="string">返回下一页： ctrl+b 然后按n</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">保存当前的tmux状态，并退出tmux：</span></span><br><span class="line"><span class="string">使用： ctrl+b  然后按d</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">查看当前保存的会话状态</span></span><br><span class="line"><span class="string">[root@mysql-binary ~]# tmux ls</span></span><br><span class="line"><span class="string">0: 2 windows (created Thu Oct 15 16:31:27 2020) [139x22]</span></span><br><span class="line"><span class="string">1: 2 windows (created Thu Oct 15 16:45:40 2020) [139x22]</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">进入第一个会话状态：</span></span><br><span class="line"><span class="string">tmux a -t 0</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">设置tmux，跟vim的末行模式很像：</span></span><br><span class="line"><span class="string">按ctrl+b ,然后按：  （这时窗口底部就会有黄色的杠）</span></span><br><span class="line"><span class="string">设置同步：  ctrl+b 然后按：  然后输入set synchronize-panes on</span></span><br><span class="line"><span class="string">                           取消同步set synchronize-panes off</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">tmux 终端关闭，不是tmux会话关闭。那之前执行的程序都会继续执行。</span></span><br><span class="line"><span class="string">不使用tmux，默认情况下，终端关闭，执行的程序也会关闭。</span></span><br><span class="line"><span class="string">文件编码</span></span><br><span class="line"><span class="string">iconv -f utf-8 -t gbk file.txt &gt; file2.txt</span></span><br><span class="line"><span class="string">查看系统语言环境</span></span><br><span class="line"><span class="string">locale</span></span><br><span class="line"><span class="string">ascii</span></span><br><span class="line"><span class="string">unicode</span></span><br><span class="line"><span class="string">utf-8</span></span><br><span class="line"><span class="string">utf-16</span></span><br><span class="line"><span class="string">gbk</span></span><br><span class="line"><span class="string">gb2132</span></span><br></pre></td></tr></table></figure></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Vim </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>07_Linux基础-计划任务-备份脚本-变量定义和使用</title>
      <link href="/posts/29955.html"/>
      <url>/posts/29955.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-计划任务">一. 计划任务<a class="header-anchor" href="#一-计划任务"></a></h2><blockquote><p>主要内容：周期性的计划任务crontab</p><p><mark>/var/spool/cron/ 统一存放计划任务的目录</mark></p><p><mark>/var/log/cron日志文件</mark></p><p><mark>/etc/cron cron.daily/ cron.hourly/ cron.monthly/ cron.weekly/ crontab的顺风车</mark></p><p>/etc/crontab</p><p><mark>crontab -l</mark></p><p><mark>crontab -e</mark></p><p>crontab <mark>-u cali</mark> -e</p><p>crontab  -u  cali  -l</p><p>​<mark>如何知道计划任务是否执行？</mark></p><p>​<mark>用户没有登录，计划任务是否执行？答：会执行</mark></p><p>​<mark>黑客也会去利用计划任务定时执行程序，你如何去检查？</mark></p><p>​<mark>annacron 将电脑主机因为系统故障关机导致计划任务没有被执行，正常启动后，anacron会去检测没有执行的计划任何，重新执行一次</mark></p><p>at  一次性的计划任务</p><p><mark>at 11:45</mark></p><p><mark>at -l</mark></p></blockquote><h3 id="cron">cron<a class="header-anchor" href="#cron"></a></h3><blockquote><p>计划任务</p><p>​1.什么是计划任务？ （闹钟）</p><p>​计划什么时候去做什么事情</p></blockquote><blockquote><p>一次性的计划任务</p><p>​at</p><p>周期性的计划任务</p><p>​crontab</p></blockquote><blockquote><p>linux系统里的<mark>执行计划任务的进程</mark>–》<mark>crond</mark></p><p>crond会<mark>每分钟</mark>去检查下所有用户的计划任务</p><p># ps aux|grep crond</p><p>root     887  0.0  0.1  36300  3508 ?     Ss  9月24  0:00 /usr/sbin/<mark>crond</mark> -n</p><p>root    16948  0.0  0.0  12320  984 pts/0   S+  10:05  0:00 grep --color=auto <mark>crond</mark></p><p># cd  <mark>/var/spool/cron/（注：统一存放计划任务的目录）</mark></p><p># ls</p><p>#</p></blockquote><blockquote><p>计划任务  原理</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205032051307.png" alt=""></p></blockquote><blockquote><p>原理  时间的格式和语法（笔试）</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205032052474.png" alt=""></p><p>（注：每个用户都可以用的命令）</p><p># <mark>crontab -l（注：查看当前用户的计划任务）</mark>（每个用户只能看自己的，root用户能看所有的）</p><p>no crontab for root</p><p>#</p><p># <mark>crontab -e（注：创建计划任务）</mark></p><p>…… （注：vim编辑器 本质上是文本文件）</p><p># crontab -l</p><p><mark>30 4  *  * *</mark>  bash  /lianxi/9_25/backup_log.sh</p><p><mark>*/5 * * * *</mark>  bash /lianxi/9_25/backup_log.sh</p><p><mark>50  3  6-9  10 *</mark> bash  /lianxi/9_25/backup_log.sh</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205032053580.png" alt=""></p><p><mark>*</mark>  该范围内的任意时间</p><p><mark>，</mark> 间隔的多个不连续时间点</p><p><mark>-</mark>  一个连续的时间范围</p><p><mark>/n</mark> 指定间隔的时间频率</p><p>​<mark>（注：crond进程 最低的时间间隔是1分钟）</mark></p><p>（注：时间不能冲突 日期和星期不能冲突）</p></blockquote><blockquote><p>#</p><p># cd  <mark>/var/spool/cron/（注：统一存放计划任务的目录，一个用户对应一个文件名）</mark></p><p># ls</p><p>cali  liangluyao  <mark>root</mark></p><p># <mark>cat  root （注：文件里面 就是cronta  -e编辑的）</mark></p><p>30  4  *  *  *  bash  /lianxi/9_25/backup_log.sh</p><p>*/5  *  *  *  *  bash  /lianxi/9_25/backup_log.sh</p><p>50  3  6-9  10  *  bash  /lianxi/9_25/backup_log.sh</p><p>#</p><p># ll<mark>（注：每一个用户的计划任务都会放在/var/spool/cron/目录下）</mark></p><p>总用量 12</p><p>-rw-------. 1 <mark>cali</mark>    cali     31 9月  25 10:27 cali</p><p>-rw-------. 1 <mark>liangluyao</mark> liangluyao  31 9月  25 10:28 liangluyao</p><p>-rw-------. 1 <mark>root</mark>    root    139 9月  25 10:25 root</p><p>#</p></blockquote><blockquote><p><mark>问：如何知道计划任务是否执行？</mark></p><p><mark>答：看日志文件，/var/log/cron。</mark></p><p>​<mark>或者直接去看效果。</mark></p><p>======================</p><p>日志文件==（注：记录crond执行的计划任务，存放在/var/log/cron，用来排错。）==</p><p># tail  -f  <mark>/var/log/cron</mark> （注：tail  -f 盯着文件末尾看）</p><p>Sep 25 10:30:01 sanchuang-linux CROND[17143]: (root) CMD (bash /lianxi/9_25/backup_log.sh)</p><p>Sep 25 10:30:01 sanchuang-linux CROND[17147]: (liangluyao) CMD (date &gt;&gt;~/liang.txt)</p><p>Sep 25 10:30:02 sanchuang-linux CROND[17119]: (root) CMDOUT (tar: 从成员名中删除开头的“/”)</p><p>Sep 25 10:30:02 sanchuang-linux CROND[17119]: (root) CMDOUT (tar: /var/log/audit/audit.log: 在我们读入文件时文件发生了变化)</p><p>Sep 25 10:30:02 sanchuang-linux CROND[17155]: (cali) CMD (date &gt;&gt;~/cali.txt)</p></blockquote><blockquote><p>示例1（root用户）：</p><p>每天早上7:50自动开启sshd服务，22点50时关闭</p><p><mark>service sshd start （注：开启sshd服务）</mark></p><p><mark>service sshd stop （注：关闭sshd服务）</mark></p><p>50  7 * *  *  service sshd start</p><p>50 22  *  *  * service sshd stop</p><p>每隔5天的12点整<mark>清空</mark>一次FTP服务器公共目录/var/ftp/pub</p><p>0  12  <em>/5  *  *  rm -rf /var/ftp/pub==/</em> （注：清空：删除里面所有东西）==</p><p>每周六的7:30时，<mark>重新</mark>启动httpd服务</p><p><mark>service httpd  restart （注：重启httpd服务）</mark></p><p>30  7  * *  6  service  httpd restart</p><p>每周一、三、五的17:30时，打包备份/etc/httpd目录</p><p>30  17  *  * 1,3,5  tar  czf /<mark>backup</mark>/httpd.tar.gz  /etc/httpd  <mark>（注：/backup/是备份目录）</mark></p><p>示例2（jerry用户）：<mark>（注：宿主目录：~/）</mark></p><p>每周日晚上23:55时将“/etc/passwd”文件的内容复制到<mark>宿主目录</mark>中，保存为pwd.txt文件</p><p>55 23  *  *  0  <mark>/usr/bin/cp</mark> /etc/passwd  ~/pwd.txt<mark>（注：命令的绝对路径）</mark></p></blockquote><blockquote><p>/etc/crontab 是cron的一个配置文件</p><p># vim /etc/crontab</p><p>SHELL=/bin/bash （注：计划任务执行命令时用/bin/bash执行）</p><p><mark>PATH</mark>=/sbin:/bin:/usr/sbin:/usr/bin <mark>（注：它有自己的PATH变量，和shell的PATH变量不同）</mark></p><p>MAILTO=root<mark>（注：所有 计划任务里的命令，建议使用命令的绝对路径，因为PATH变量的问题）</mark></p><p>​<mark>（注↑：默认情况，计划任务出了问题，crontab会给root发邮件）</mark></p><p># For details see man 4 crontabs</p><p># Example of job definition:（注：对命令的解释）</p><p># .---------------- minute (0 - 59)</p><p># |  .------------- hour (0 - 23)</p><p># |  |  .---------- day of month (1 - 31)</p><p># |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr …</p><p># |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat</p><p># |  |  |  |  |</p><p># *  *  *  *  * user-name  command to be executed</p></blockquote><blockquote><p># crontab <mark>-u cali</mark> -e <mark>（注：用root用户为cali创建计划任务）</mark></p><p># crontab  -u  cali  -l  （注：查看）</p></blockquote><blockquote><p>1.电脑关机了计划任务是否执行？答：不执行</p><p><mark>2.用户没有登录，计划任务是否执行？答：会执行</mark></p></blockquote><blockquote><p># <mark>w  （注：查看哪个用户从哪里登录）</mark></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205032102651.jpg" alt=""></p><p># <mark>tail  -f  /var/log/cron（注：日志文件）</mark></p></blockquote><blockquote><p><mark>3.黑客也会去利用计划任务定时执行程序，你如何去检查？</mark></p><p>​去==/var/spool/cron==目录下查看每一个计划任务文件</p><p>​看日志 <mark>/var/log/cron</mark></p><p>​crontd的顺风车目录（如下）</p><p>#</p><p># <mark>cd  /etc/cron*******</mark></p><p>cron.d/    <mark>cron.daily/</mark>  cron.deny   <mark>cron.hourly/  cron.monthly/</mark> crontab    <mark>cron.weekly/</mark></p><p># cd  /etc/cron</p><p>（注：crontab的顺风车）</p><p><mark>黑客也可以把需要执行的程序放到这些文件夹里</mark></p><p><mark>cron.daily  --》Linux系统里要求crond每天去执行的事情</mark></p><p><mark>cron.hourly  --》Linux系统里要求crond每小时去执行的事情</mark></p><p><mark>cron.monthly --》Linux系统里要求crond每月去执行的事情</mark></p><p><mark>cron.weekly  --》Linux系统里要求crond每周去执行的事情</mark></p><p>（注：# ls  cron.daily</p><p>​ logrotate(每天都会执行，crond每天运行一次（脚本，用sh执行）)</p><p>​# ls  cron.hourly</p><p>​0<mark>anacron(annacron 将电脑主机因为系统故障关机导致计划任务没有被执行，正常启动后，anacron会去检测没有执行的计划任何，重新执行一次)</mark></p></blockquote><h3 id="at">at<a class="header-anchor" href="#at"></a></h3><blockquote><p>at 命令 一次性的计划任务</p><p>yum  install at  -y</p><p># <mark>at 11:45</mark></p><p>warning: commands will be executed using /bin/sh</p><p>at&gt; touch $(date +%F).txt</p><p>at&gt; <EOT><mark>（注：退出 Ctrl+D）</mark></p><p>job 1 at Fri Sep 25 11:45:00 2020</p><p>Can’t open /var/run/atd.pid to signal atd. No atd running?</p><p># <mark>at -l（注：查看）</mark></p><p>1Fri Sep 25 11:45:00 2020 a root</p><p>#</p></blockquote><hr><h2 id="二-计划任务练习-备份脚本">二. 计划任务练习-备份脚本<a class="header-anchor" href="#二-计划任务练习-备份脚本"></a></h2><blockquote><p>主要内容：<mark>chmod  777</mark> /opt/fnum.txt  （注：<mark>设置任何用户都可以对文件/opt/fnum.txt读写执行</mark>）</p><p><mark>2&gt;/dev/null</mark></p><p><mark>/dev/null 特殊的文件，相当于黑洞文件，任何的内容重定向到这个文件都会消失，不保存</mark></p><p><mark>正确的输出重定向</mark></p><p><mark>&gt;</mark></p><p><mark>&gt;&gt;</mark></p><p><mark>错误的输出重定向</mark></p><p><mark>2&gt;</mark></p><p><mark>2&gt;&gt;  追加</mark></p><p><mark>不管正确的还是错误的都往一个文件里重定向</mark></p><p><mark>&amp;&gt;</mark></p><p><mark>&amp;&gt;&gt;  追加</mark></p><p><mark>&gt;1.txt  清空1.txt文件里的内容</mark></p><p><mark>删除xull这个用户所有的计划任务</mark> rm  -rf  /var/spool/cron/xull</p><p>​<mark># crontab  -u xull -r （注 *）</mark></p><p>取消计划任务</p></blockquote><blockquote><p>脚本+计划任务=自动化</p><p>先编写脚本，再创建计划任务</p></blockquote><h3 id="计划任务实验">计划任务实验<a class="header-anchor" href="#计划任务实验"></a></h3><blockquote><p>计划任务实验：</p><p>1.为root用户编写计划任务：每周2、4、6的10点到17点的每隔5分钟自动将/etc/passwd、/etc/shadow这2个重要系统文件到user.备份的日期和时间.tar.gz这种名称的文件里（例如：user.201202011615.tar.gz）备份文件放到/opt/目录下面。</p><p>backup_shadow_pwd.sh</p><p># cat backup_shadow_pwd.sh</p><p>#!/bin/bash</p><p>mkdir -p  /opt#注：date +%Y%m%d%H%M%S ， <mark>date后面有空格</mark></p><p>tar czf  /opt/user.$(date +%Y%m%d%H%M%S).tar.gz  /etc/passwd  /etc/shadow</p><p>#$(date +%Y-%m-%d-%H)注意空格 上面的</p><p><mark>crontab  -e</mark></p><p>*/5  10-17  *  * 2,4,6  bash  /lianxi/9_25/backup_shadow_pwd.sh #<mark>（注：路径要接对，绝对路径）</mark></p></blockquote><blockquote><p>2.<mark>root用户</mark>在/opt<mark>新建</mark>了一个文件fnum.txt专门用来统计普通用户的文件个数。请<mark>为普通用户hello编写计划任务</mark>：要求每5分钟，将系统中属于hello用户的文件的个数自动保存到/opt/fnum.txt文件中。内容格式为：“日期时间  姓名 拥有的文件个数是：数目”。每行中间用“*************************”隔开</p><p>file_num.sh</p><p># touch  /opt/fnum.txt  （注：<mark>新建空文件，普通用户建不了，root用户去建</mark>）</p><p># <mark>chmod  777</mark> /opt/fnum.txt  （注：<mark>设置任何用户都可以对文件/opt/fnum.txt读写执行</mark>）</p><p>[cali@sanchuang-linux ~]$ crontab  -l</p><p>*/5 * * * *  date &gt;&gt;~/cali.txt</p><p>5 12-18 * * *  date &gt;&gt;~/cali.txt</p><p>*/1 * * * * bash /home/cali/file_num.sh</p><p>[cali@sanchuang-linux ~]$ pwd</p><p>/home/cali</p><p>$ cat file_num.sh <mark>（注：脚本放在普通用户家目录里）</mark></p><p>#!/bin/bash</p><p>fnum=$(find / -user cali  -type f  <mark>2&gt;/dev/null</mark> |wc -l) <mark>（注：普通用户 文件权限不够 是出错的）</mark></p><p>（注↑：错误重对象）</p><p>ctime=$(date +%F_%H%M%S)</p><p>echo “${ctime}  cali  the number of files : $fnum”  <mark>&gt;&gt;/opt/fnum.txt （注：追加重定向 写到文件里去）</mark></p><p>echo “******************************” <mark>&gt;&gt;/opt/fnum.txt （注：追加重定向 写到文件里去）</mark></p><p>$</p><p>$ crontab  -e==（注：是哪个用户就哪个用户创建计划任务，==cali创建）</p><p>*/1 *  *  *  * bash /home/cali/file_num.sh</p><p>$ pwd</p><p>/home/cali<mark>（注：脚本的路径）</mark></p></blockquote><blockquote><p>每行中间用“*************************”隔开 解决方法</p><p># cat <a href="http://a.sh">a.sh</a></p><p>echo “helllo”</p><p>echo “**********************”</p><p>echo “cali”</p><p>echo “**********************”</p><p>#</p><p># num=$(find / -user liangluyao |wc -l)</p></blockquote><blockquote><p>$ find / -user cali  -type f  2&gt;/dev/null|wc -l</p><p><mark>/dev/null 特殊的文件，相当于黑洞文件，任何的内容重定向到这个文件都会消失，不保存</mark></p><p>null 零，空，无效的</p></blockquote><h3 id="重定向">重定向<a class="header-anchor" href="#重定向"></a></h3><blockquote><p><mark>正确的输出重定向</mark></p><p><mark>&gt;</mark></p><p><mark>&gt;&gt;</mark></p><p>======</p><p><mark>错误的输出重定向</mark></p><p><mark>2&gt;</mark></p><p><mark>2&gt;&gt;  追加</mark></p><p>======</p><p><mark>不管正确的还是错误的都往一个文件里重定向</mark></p><p><mark>&amp;&gt;</mark></p><p><mark>&amp;&gt;&gt;  追加</mark></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205032115780.jpg" alt=""></p><p><mark>ls 命令执行成功重定向到1.txt  执行失败重定向到2.txt</mark></p><p>$ <mark>ls &gt;1.txt  2&gt;2.txt</mark></p><p>$ <mark>&gt;1.txt  清空1.txt文件里的内容</mark></p><p>$ cat 1.txt</p><p>$</p><p>$ ls &amp;&gt;1.txt <mark>不管正确的还是错误的都往一个文件里重定向</mark></p></blockquote><h3 id="练习总结">练习总结<a class="header-anchor" href="#练习总结"></a></h3><blockquote><p>练习总结：</p><p>问题：</p><ol><li class="lvl-3"><p>2&gt;/dev/null</p></li><li class="lvl-3"><p>如何查看效果</p></li></ol><p># cat  fnum.txt</p><p># tail  -f  /var/log/cron  （日志文件）</p><ol start="3"><li class="lvl-3"><p>取消计划任务</p></li></ol><p><mark>删除xull这个用户所有的计划任务</mark> rm  -rf  /var/spool/cron/xull</p><p>​<mark># crontab  -u xull -r （注 *）</mark></p><p>将文件里的计划任务注释或者删除 #*/1  *  *  *  *  bash  /home/xull/file_num.sh</p><p># cd  /var/spool/cron/ ——》# rm  -rf  xull  <mark># crontab  -u xull -r</mark></p><p># cd  /var/spool/cron/ ——》# vim  xull ——》 加 # 注释掉</p><ol start="4"><li class="lvl-3"><p>某个用户的计划任务如何创建</p></li><li class="lvl-3"><p>文件的路径问题和权限问题（root可以访问任务地方的文件，但是普通不行，只能访问有限的路径）</p></li></ol><p>将root用户的所有计划任务追加到xull用户的计划任务里</p><p># cd  /var/spool/cron</p><p># cat  root  &gt;&gt;xull（注：注意权限问题，能否访问）</p><p>每一个用户的计划任务都存放在一个文件里  /var/spool/cron/</p></blockquote><blockquote><p>2.root用户在/opt2新建了一个文件fnum.txt专门用来统计普通用户的文件个数。请为普通用户xull编写计划任务：要求每5分钟，将<mark>系统中属于xull用户的文件的个数</mark>自动保存到/opt2/fnum.txt文件中。内容格式为：“日期时间  姓名 拥有的文件个数是：数目”。每行中间用“*************************”隔开</p><p>使用root用户新建/opt2目录</p><p>mkdir  /opt2</p><p>cd  /opt2/</p><p>touch  /opt2/fnum.txt 文件</p><p>chmod  777  /opt2/fnum.txt授权</p><p><mark>xull用户需要去编写脚本，创建计划任务（普通用户）</mark></p><p><mark>脚本：建议放在用户的家目录下</mark></p><p># su - xull</p><p>上一次登录：五 9月 25 15:53:35 CST 2020pts/1 上</p><p>$ pwd</p><p><mark>/home/xull</mark></p><p>$ ls</p><p>$ vim  file_num.sh （注：脚本放到自己的家目录下，用户xull去创建）</p><p>$ cat  file_num.sh</p><p>#!/bin/bash</p><p>num=$(find  / -user  xull  -type  f 2&gt;/dev/null |wc -l)</p><p>#current time （注：当前的时间）</p><p>ctime=$(date +%F%H%M%S)</p><p>echo  “<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>c</mi><mi>t</mi><mi>i</mi><mi>m</mi><mi>e</mi></mrow><mi>x</mi><mi>u</mi><mi>l</mi><mi>l</mi><mtext>文件数量是</mtext></mrow><annotation encoding="application/x-tex">{ctime}  xull  文件数量是</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal">im</span><span class="mord mathnormal">e</span></span><span class="mord mathnormal">xu</span><span class="mord mathnormal" style="margin-right:0.01968em;">ll</span><span class="mord cjk_fallback">文件数量是</span></span></span></span>num”  &gt;&gt;/opt2/fnum.txt（注：&gt;&gt;追加）</p><p>echo “****************************”  &gt;&gt;/opt2/fnum.txt（注：一行隔开）</p><p>$</p><p>（注：vim交互式的。脚本是背后执行的，用echo）</p><p>$ crontab -e</p><p>*/1  * * * *  bash /home/xull/file_num.sh</p><p>$</p><p>切换到root用户</p><p>$ exit</p><p># cd  /var/spool/cron/ （注：该目录下文件存放计划任务）</p><p># ls</p><p>cali  liangluyao  root  <mark>xull</mark></p><p>#cat  xull（注：文件存放计划任务）</p><p><mark>*/1  * * * *  bash /home/xull/file_num.sh</mark></p></blockquote><hr><h2 id="三-黑客-计划任务">三. 黑客-计划任务<a class="header-anchor" href="#三-黑客-计划任务"></a></h2><blockquote><p>主要内容：假如你是黑客，想在别人的机器上，每10分钟让它的服务器重启一次或者每天重启一次</p><p>关机命令：init 6</p><p>​reboot</p><p><mark>1.停止crond服务</mark></p><p># service crond stop</p><p>2.查找可能存放计划任务的目录</p><p>/var/spool/cron（注：先挪走）</p><p>/etc/cron.d （注：与cron.hourly 有关）</p><p>/etc/cron.weekly</p><p>/etc/cron.daily</p><p>/etc/cron.monthly</p><p>3.检查发现没有问题了，再重新启动crond服务</p><p># service crond start</p><p>Redirecting to /bin/systemctl start crond.service</p><p># ps aux|grep crond</p><p>实在有的话</p><p># tail  -f  /var/log/cron  （日志文件）</p><p>开机启动流程</p><p># cd  /root  （注：root用户家目录下）</p><p># ls  -a  （注：隐藏文件）</p><p># vim  .bashrc</p><p># vim  .bash_profile</p><p># vim  /etc/profile （注：可以快捷筛选查找 /reboot  /init）</p><p># vim  /etc/bashrc  （注：可以快捷筛选查找 /reboot  /init）</p><p># cat  /etc/rc.local</p></blockquote><blockquote><p>假如你是黑客，想在别人的机器上，每10分钟让它的服务器重启一次或者每天重启一次</p><p>====</p><p>192.168.0.45  root  123456</p><p>关机命令：init 6</p><p>​reboot</p><p>============================</p><p>在各个路径下看  有没有可疑的 init6  和  reboot</p><p><mark>1.停止crond服务</mark></p><p># service crond stop</p><p>2.查找可能存放计划任务的目录</p><p>/var/spool/cron（注：先挪走）</p><p>/etc/cron.d （注：与cron.hourly 有关）</p><p>/etc/cron.weekly</p><p>/etc/cron.daily</p><p>/etc/cron.monthly</p><p>3.检查发现没有问题了，再重新启动crond服务</p><p># service crond start</p><p>Redirecting to /bin/systemctl start crond.service</p><p># ps aux|grep crond</p><p>root     1506  3.6  0.1  36304  3656 ?     Ss  16:54  0:00 /usr/sbin/crond -n</p><p>root     1511  0.0  0.0  12320  1052 pts/0   S+  16:54  0:00 grep --color=auto crond</p><p>#</p><p>实在有的话</p><p># tail  -f  /var/log/cron  （日志文件）</p><p>（注：通过日志去排查）</p><p>=============================</p><p>集中放计划任务的地方 /var/spool/cron/</p><p># cd  /var/spool/cron/</p><p># ls</p><p>cali  liangluyao  root  xull</p><p># cat  cali</p><p>……（查看有没有可疑的，vim全部注释掉）</p><p>或者把所有文件全部挪走，如下操作</p><p># ls</p><p>cali  liangluyao  root  xull</p><p># mkdir  /backup  （注：根下面建一个/backup 目录）/backup 备份目录</p><p>mv  *  /backup/  （把文件cali  liangluyao  root  xull 挪到 /backup 目录下）</p><p>计划任务停了，crond不会执行</p><p># cd  /backup/</p><p># ls</p><p>cali  liangluyao  root  xull</p><p># cat  cali（注：把计划任务文件挪走后，再再/backup目录下 一个个排查）</p><p>……</p><p># cat  liangluyao</p><p>……</p><p># w（注：查看哪些用户登录）</p><p>=======================================</p><p>顺风车</p><p># cd  /etc/cron.daily</p><p>​# ls</p><p>​# vim …</p><p># cd  /etc/cron.hourly/</p><p># cd  /etc/cron.monthly</p><p># cd  /etc/cron.weekly</p><p># cd  /etc/cron.d （注：每小时执行是每小时的第一分钟执行）</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205032124429.jpg" alt=""></p><p>（注：run-parts 是一个命令，运行这个文件夹里的所有文件）</p><p>=======================================================</p><p>开机启动流程</p><p># cd  /root  （注：root用户家目录下）</p><p># ls  -a  （注：隐藏文件）</p><p># vim  .bashrc</p><p># vim  .bash_profile</p><p># vim  /etc/profile （注：可以快捷筛选查找 /reboot  /init）</p><p># vim  /etc/bashrc  （注：可以快捷筛选查找 /reboot  /init）</p><p># cat  /etc/rc.local</p><p>===============================================================================</p></blockquote><hr><h2 id="四-变量定义和使用">四. 变量定义和使用<a class="header-anchor" href="#四-变量定义和使用"></a></h2><blockquote><p>主要内容：</p><p>​变量的命名：1.下划线命名法 （shell里建议）2.驼峰命名法3.匈牙利命名法</p><p>​变量命名的注意事项</p><p>​shell里如果变量没有定义，输出的是空值</p><p>​<mark>env</mark>  查看shell里的<mark>环境变量</mark></p><p>​<mark>set</mark>  查看当前shell里<mark>所有的变量</mark></p><p>​<mark>export 输出变量为全局变量</mark></p><p>​# <mark>echo $$  （注：显示当前bash的进程号）（注：$$代表当前bash的进程号）</mark></p><p>​# <mark>bash（注：起一个子进程，子bash）</mark></p><p>​# <mark>echo “$mv  $sg hello”（注：输出一串内容的时候，用双引号引起来）</mark></p><p>​# <mark>echo ‘$mv  $sg hello’（注：单引号：所见即所得  $接变量名不会引用变量的值）</mark></p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">shell编程</span><br><span class="line">1.变量的定义</span><br><span class="line">variable  变量的</span><br><span class="line"></span><br><span class="line">sg=tanglf</span><br><span class="line"></span><br><span class="line">变量的命名：</span><br><span class="line">1.下划线命名法 （shell里建议）</span><br><span class="line">sc_sg=tanglf</span><br><span class="line">2.驼峰命名法</span><br><span class="line">ScSg=wangtc</span><br><span class="line">小驼峰</span><br><span class="line">scSg=wangtc</span><br><span class="line">大驼峰</span><br><span class="line">ScSg=wangtc</span><br><span class="line">3.匈牙利命名法</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">变量命名的注意事项：</span><br><span class="line">1.不是以数字开头</span><br><span class="line">2.不要全部是数字</span><br><span class="line">3.不要包含特殊符号 #!@^$&lt;&gt;等</span><br><span class="line">4.=左右不能有空格</span><br></pre></td></tr></table></figure><blockquote><p>linux系统里的环境变量都是大写的</p><p>自定义变量尽量使用小写</p><p>变量尽量要先定义后使用</p><p>shell里如果变量没有定义，输出的是空值</p><p># sc_sg=zhangxueyou</p><p># echo  $sg_sg</p><p>​<mark>（←注：变量sg_sg没有定义，输出的是空值）</mark></p><p># echo $sc_sg</p><p>zhangxueyou</p><p># <mark>echo <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mi>g</mi><mi>s</mi><mi>g</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">sgsg/</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord">/</span></span></span></span>mvmv</mark></p><p><mark>/（←注：变量{sgsg} {mvmv}没有定义，输出的是“/”根）</mark></p><p>#</p><p># rm -rf  <mark><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mi>g</mi><mi>s</mi><mi>g</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">sgsg/</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord">/</span></span></span></span>mvmv</mark></p><p>rm: 在’/’ 进行递归操作十分危险</p><p>rm: 使用 --no-preserve-root 选项跳过安全模式</p><p>#</p></blockquote><blockquote><p><mark>env</mark>  查看shell里的<mark>环境变量</mark></p><p><mark>set</mark>  查看当前shell里<mark>所有的变量</mark></p><p>变量是有作用域</p><p>全局变量</p><p>局部变量</p><p><mark>export 输出变量为全局变量</mark></p><p>​<mark>用法：先定义再输出</mark></p></blockquote><blockquote><p>ssh访问22号端口，sshd监听22号端口</p><p>web服务是80端口</p></blockquote><blockquote><p># <mark>echo $$  （注：显示当前bash的进程号）（注：$$代表当前bash的进程号）</mark></p><p>1425</p><p>#</p><p># <mark>export sg （注：输出sg这个变量为全局变量）</mark></p></blockquote><blockquote><p># echo $$</p><p><mark>1425</mark></p><p># mv=xull</p><p># <mark>bash（注：起一个子进程，子bash）</mark></p><p># echo $mv</p><p>​<mark>（注：输出为空，变量不继承）</mark></p><p># echo $$</p><p><mark>1598</mark></p></blockquote><blockquote><p># mv=xull</p><p># <mark>export mv（注：输出变量为全局变量）（注：export 输出）</mark></p><p># <mark>bash（注：起一个子进程，子bash）</mark></p><p># echo $mv</p><p>Xull<mark>（注：子进程继承了变量）</mark></p><p>#</p></blockquote><blockquote><p># vim  /root/.bash_profile</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202205032135309.jpg" alt=""></p></blockquote><blockquote><p><mark>输出一串内容的时候，用双引号引起来</mark></p><p><mark>单引号：所见即所得  $接变量名不会引用变量的值</mark></p><p># echo <mark>“$mv  $sg hello”（注：输出一串内容的时候，用双引号引起来）</mark></p><p>xull  wangtc hello</p><p># echo <mark>‘$mv  $sg hello’（注：单引号：所见即所得  $接变量名不会引用变量的值）</mark></p><p>$mv  $sg hello</p><p>#</p></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
            <tag> Crontab </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>06_Linux基础-NGINX和浏览器、网页的关系-压缩命令-配置NGINX支持下载功能-备份脚本</title>
      <link href="/posts/10149.html"/>
      <url>/posts/10149.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-NGINX和浏览器、网页的关系">一. NGINX和浏览器、网页的关系<a class="header-anchor" href="#一-NGINX和浏览器、网页的关系"></a></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></pre></td><td class="code"><pre><span class="line">nginx是一个web服务器</span><br><span class="line">html语言编写网页</span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span>  /usr/local/nginx  html</span><br><span class="line"><span class="built_in">cd</span>  html/ （注：存放网页路径）</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">思考：</span><br><span class="line">1.网页和nginx的关系</span><br><span class="line">nginx将网页发送给浏览器</span><br><span class="line">2.浏览器和nginx的关系</span><br><span class="line">浏览器问nginx要网页</span><br><span class="line">nginx将网页发送给浏览器</span><br><span class="line">3.浏览器和网页的关系</span><br><span class="line">浏览器是能读懂网页的html，js，css代码，渲染出效果</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202204232005482.png" alt=""></p><figure class="highlight plaintext"><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">web:网站</span><br><span class="line">表单信息放到数据库里去，nginx只能访问静态页面，Python把信息传到数据库里。Python——》flask web后端——》user表</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">如何判断nginx是否运行？</span><br><span class="line">1.看进程</span><br><span class="line">ps aux|grep nginx</span><br><span class="line">2.看端口</span><br><span class="line">netstat -anplut</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">项目组：</span><br><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.dba</span><br><span class="line">6.项目经理</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><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 /usr/local/nginx/html/放网页</span><br><span class="line">rz 只能传文件，不能传文件夹</span><br></pre></td></tr></table></figure><hr><h2 id="二-云服务器ssh登陆-安装NGINX-上传网页">二. 云服务器ssh登陆-安装NGINX-上传网页<a class="header-anchor" href="#二-云服务器ssh登陆-安装NGINX-上传网页"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">自己的虚拟机的linux系统里呢？（如何上传自己的网页到linux系统呢）</span><br><span class="line">Xshell连过去</span><br><span class="line">自己的云服务器，如何上传自己的网页到云服务器呢？</span><br><span class="line">1.xshell  --》公网ip（云服务器的公网ip）106.54.83.86 （注：xshell连接）</span><br><span class="line"> 用户名root  --》密码是有个初始密码 （注：passwd 改密码）</span><br><span class="line">2.自己去编译安装nginx--》建议使用脚本安装--&gt;启动nignx</span><br><span class="line">3.上传自己的网页到nginx的html目录下 （注：scp或上传Windows【中间环节】）</span><br><span class="line">4.去访问106.54.83.86</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><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><br><span class="line"><span class="comment"># cat onekey_install_nginx_v2.sh </span></span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#1.下载nginx软件包</span></span><br><span class="line"><span class="built_in">mkdir</span> -p /nginx2</span><br><span class="line"><span class="built_in">cd</span> /nginx2</span><br><span class="line">curl  -O http://nginx.org/download/nginx-1.19.2.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment">#2.解压,进入文件夹</span></span><br><span class="line"></span><br><span class="line">tar xf  nginx-1.19.2.tar.gz</span><br><span class="line"><span class="built_in">cd</span>  nginx-1.19.2</span><br><span class="line"></span><br><span class="line"><span class="comment">#3.编译前的配置</span></span><br><span class="line"> <span class="comment">#新建用户sanchuang9</span></span><br><span class="line">useradd sanchuang9</span><br><span class="line"> <span class="comment">#安装gcc和pcre-devel软件包，因为nginx需要这些软件，解决软件的依赖关系</span></span><br><span class="line">yum install  gcc make   pcre-devel zlib-devel  -y</span><br><span class="line"> <span class="comment">#配置nginx，指定安装路径和启动nginx的用户名</span></span><br><span class="line">./configure  --prefix=/usr/local/nginx2  --user=sanchuang9 </span><br><span class="line"></span><br><span class="line"><span class="comment">#4.编译</span></span><br><span class="line">make</span><br><span class="line"><span class="comment">#5.编译安装</span></span><br><span class="line">make  install</span><br><span class="line"></span><br><span class="line"><span class="comment">#6.关闭防火墙服务和设置开机不要启动</span></span><br><span class="line"></span><br><span class="line">service firewalld  stop</span><br><span class="line">systemctl <span class="built_in">disable</span>  firewalld </span><br><span class="line"></span><br><span class="line"><span class="comment">#7.修改PATH变量，方便可以直接使用nginx</span></span><br><span class="line"><span class="built_in">echo</span>  <span class="string">&quot;PATH=<span class="variable">$PATH</span>:/usr/local/nginx2/sbin&quot;</span>  &gt;&gt;/root/.bashrc</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></pre></td><td class="code"><pre><span class="line">ip add 看的是私网IP</span><br><span class="line">scp  远程copy</span><br><span class="line">/usr/local/nginx/sbin/nginx 启动nginx</span><br><span class="line">ps aux|grep nginx 查看nginx进程</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">搞一个自己的网站</span><br><span class="line">1.购买一个云服务器--》阿里云或者腾讯云，华为云，亚马逊免费试用 --》学生版 10元/月</span><br><span class="line">2.购买域名  5元/年</span><br><span class="line">在哪里购买的云服务器，就在哪里买域名，方便备案</span><br><span class="line">3.备案</span><br><span class="line">如果不备案，不能正常的使用域名去访问</span><br></pre></td></tr></table></figure><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"><span class="built_in">cat</span> /etc/centos-release 查看centos版本</span><br></pre></td></tr></table></figure><hr><h2 id="三-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能">三. 压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能<a class="header-anchor" href="#三-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能"></a></h2><blockquote><p>主要内容：压缩命令-tar（重点） 对文件和文件夹进行压缩</p><p>​<mark>tar  -czf   --&gt;.tar.gz</mark></p><p>​<mark>tar  cjf    --&gt;.tar.bz2</mark></p><p>​<mark>tar  cJf    --&gt;.tar.xz</mark></p><pre><code>  ==tar  tf   \*.tar.\*==</code></pre><p>​<mark>tar  xf   *.tar.*</mark></p><p>​# tar xf  boot_log_passwd.tar.gz  <mark>-C</mark> /zhanghuayou/</p><p>​压缩命令-xz-gzip-bzip2-zip：都只能对文件进行压缩</p><p>​zip --&gt;.zip</p><p>​gzip --&gt;.gz</p><p>​xz  —&gt;.xz</p><p>​bzip2 --&gt;.bz2</p><p>​zip  yum  install  zip unzip -y</p><p>​<mark>zip chenpeng.txt.zip  chenpeng.txt</mark></p><p>​<mark>unzip passwd.zip</mark></p><p>​gzip</p><p>​<mark>gzip hosts</mark></p><p>​<mark>gunzip hosts.gz</mark></p><p>​<mark>zcat messages.gz</mark></p><p>​xz</p><p>​<mark>xz hosts</mark></p><p>​<mark>unxz  hosts.xz</mark></p><p>​<mark>xzcat messages.xz</mark></p><p>​bzip2  yum  install  bzip2  -y</p><p>​<mark>bzip2  passwd</mark></p><p>​<mark>bunzip2  passwd.bz2</mark></p><p>​<mark>bzcat  passwd.bz2</mark></p><p>​配置nginx服务器支持下载功能</p></blockquote><h3 id="压缩命令-xz-gzip-bzip2-zip-tar">压缩命令-xz-gzip-bzip2-zip-tar<a class="header-anchor" href="#压缩命令-xz-gzip-bzip2-zip-tar"></a></h3><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">备份的时候，能节约空间</span><br><span class="line">网络传送的时候，能节约时间</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">windows里有哪些解压缩软件？</span><br><span class="line">winrar</span><br><span class="line">7z</span><br><span class="line">好压</span><br><span class="line">快压</span><br><span class="line">Zip</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">windows里的.rar压缩文件传递到linux里，是否能打开</span><br><span class="line">sc.rar （注：rar解压不了，linux里没这个软件，需要安装才有）</span><br><span class="line">sc.zip  --&gt;linux默认支持</span><br><span class="line">windows能解压linux里的所有的压缩文件</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><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">nginx-1.19.2.tar.gz  linux里的压缩文件</span><br><span class="line">压缩文件红色的，可执行文件绿色的</span><br></pre></td></tr></table></figure><h3 id="zip">zip<a class="header-anchor" href="#zip"></a></h3><blockquote><p>zip</p><p>zip只能对文件进行压缩，不能对文件夹进行压缩</p><p>​yum  install  zip unzip -y <mark>（注：zip需要安装）</mark></p><p>zip 打压缩包</p><p>unzip 解压的</p></blockquote><blockquote><p># <mark>zip chenpeng.txt.zip  chenpeng.txt</mark> （注：<mark>用法</mark>）</p><p>​压缩后的文件    源文件</p><p>[root@sanchuang-linux lianxi]# zip passwd.zip  passwd</p><p>adding: passwd (deflated 61%)（注:deflated压缩，泄气）</p><p>ll  -h 看大小</p><p>passwd.zip</p><p># <mark>unzip passwd.zip  解压</mark></p><p>Archive:  passwd.zip</p><p>inflating: passwd</p><p># ls</p><p>passwd  passwd.zip</p><p><mark>zip的缺点：有源文件和新文件</mark></p></blockquote><h3 id="gzip">gzip<a class="header-anchor" href="#gzip"></a></h3><blockquote><p>gzip</p><p>gzip可以直接在源文件上压缩，后缀名是.gz （注：与zip的区别，理解为zip的升级版）</p><p>​<mark>（注：gzip不需要安装）</mark></p><p>hosts  passwd  passwd.zip</p></blockquote><blockquote><p># <mark>gzip hosts （用法）</mark> gzip + 源文件</p><p># ls</p><p>hosts.gz  passwd  passwd.zip</p><p># <mark>gunzip hosts.gz （解压）</mark></p><p># <mark>zcat messages.gz  （查看压缩文件）</mark></p></blockquote><h3 id="xz">xz<a class="header-anchor" href="#xz"></a></h3><blockquote><p>xz<mark>（注：xz不需要安装）</mark></p><p><a href="https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.8.11.tar.xz">https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.8.11.tar.xz</a></p></blockquote><blockquote><p># <mark>xz hosts （用法）</mark></p><p># ls</p><p>hosts.xz  passwd  passwd.zip</p><p># <mark>unxz  hosts.xz （解压）</mark></p><p># ls</p><p>hosts  passwd  passwd.zip</p><p># <mark>xzcat messages.xz  （查看压缩文件）</mark></p><p>gz与xz 比较，xz效果好</p><p>推荐使用xz</p></blockquote><h3 id="bzip2">bzip2<a class="header-anchor" href="#bzip2"></a></h3><blockquote><p>bzip2<mark>（注：bzip2需要安装）</mark></p><p>yum  install  bzip2  -y</p></blockquote><blockquote><p># <mark>bzip2  passwd（用法）</mark></p><p>passwd.bz2</p><p># <mark>bunzip2  passwd.bz2  （解压）</mark></p><p>passwd</p><p># <mark>bzcat  passwd.bz2  （查看压缩文件）</mark></p></blockquote><blockquote><p>zip --&gt;.zip</p><p>gzip --&gt;.gz</p><p>xz  —&gt;.xz</p><p>bzip2 --&gt;.bz2</p></blockquote><h3 id="tar">tar<a class="header-anchor" href="#tar"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">tar  --&gt;兼并了gzip,xz,bzip2</span><br><span class="line"></span><br><span class="line">tarball  --&gt;使用tar命令打的压缩包--》归档文件--》压缩文件--》一个压缩包里可以包含很多的文件</span><br><span class="line"></span><br><span class="line">tar是可以对文件和文件夹进行压缩的</span><br><span class="line"></span><br><span class="line">Compressed TAR Archive    [compressed压缩的  archive归档]</span><br><span class="line"></span><br><span class="line">https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.8.11.tar.xz</span><br><span class="line">http://nginx.org/download/nginx-1.19.2.tar.gz</span><br><span class="line">mysql-8.0.21-linux-glibc2.12-i686.tar.xz</span><br><span class="line">https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.46.tar.bz2</span><br></pre></td></tr></table></figure><h3 id="配置NGINX服务器支持下载功能">配置NGINX服务器支持下载功能<a class="header-anchor" href="#配置NGINX服务器支持下载功能"></a></h3><blockquote><p>(autoindex auto 自动 index索引)</p><p># cd /usr/local/nginx/conf/<mark>（注：配置目录）</mark></p><p>#</p><p># vim nginx.conf   <mark>（注2：修改配置文件）即加上autoindex on；这一行</mark></p><p>​    location / {</p><p>​      root  html;     （注4：指定nginx的存放网页的目录为html–》网页根目录）</p><p>​      index  index.html index.htm;  （注5：配置nginx服务器支持的首页为index.html  或者index.htm  index.html的优先级要高，没有index.html的时候，就会去查找index.htm）</p><p>​      <mark>autoindex on;      （注3：添加配置，让nginx支持显示文件夹里的内容）</mark></p><p>​    }</p><p># /usr/local/nginx/sbin/nginx  -s reload  重新加载nginx</p></blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202204232026925.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202204232026825.png" alt=""></p><p>压缩包上传</p><hr><h2 id="四-tar命令">四. tar命令<a class="header-anchor" href="#四-tar命令"></a></h2><blockquote><p>tar命令</p><p>用途：制作归档文件、释放归档文件</p><p>格式：tar  [选项]…  归档文件名  源文件或目录</p><p>​       tar  [选项]…  归档文件名  [-C 目标目录]</p><p>常用命令选项</p><p>-c：创建 .tar 格式的包文件  create</p><p>-x：解开.tar格式的包文件  extract提取</p><p>-v：输出详细信息  verbose冗余的</p><p>-f：表示使用归档文件  file</p><p>-t：列表查看包内的文件  list</p><p>常用命令选项</p><p>-C：解包时进入指定的目标文件夹</p><p><mark>-z：调用gzip程序进行压缩或解压</mark></p><p><mark>-j：调用bzip2程序进行压缩或解</mark></p><p><mark>-J：调用xz程序进行压缩或解压</mark></p></blockquote><blockquote><p>=== <mark>（经典组合）</mark></p><p><mark>创建压缩包</mark></p><p>​<mark>tar  -czf   --&gt;.tar.gz</mark></p><p>​<mark>tar  cjf    --&gt;.tar.bz2</mark></p><p>​<mark>tar  cJf    --&gt;.tar.xz</mark></p><p><mark>创建压缩包到指定的路径 使用绝对路径</mark></p><p># tar czf  /zhanghuayou/passwd.tar.gz  <mark>/etc/passwd</mark></p><p>tar: 从成员名中删除开头的“/”</p></blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202204232028186.png" alt=""></p><blockquote><p><mark>查看压缩包里的内容</mark></p><pre><code>  ==tar  tf   \*.tar.\*==</code></pre></blockquote><blockquote><p><mark>解压–》默认解压到当前目录</mark></p><p>​<mark>tar  xf  *.tar.*</mark></p><p>​<mark>-C 解压到指定的路径</mark></p><p># tar xf  boot_log_passwd.tar.gz  <mark>-C</mark> /zhanghuayou/</p></blockquote><blockquote><p># mkdir tar</p><p># cd tar</p><p># ls</p><p># tar  czf  passwd.tar.gz  <mark>/etc/passwd</mark></p><p><mark>tar: 从成员名中删除开头的“/”</mark></p><p># ls</p><p>passwd.tar.gz</p><p># tar  tf passwd.tar.gz</p><p><mark>etc/passwd（注：/ 没有了）</mark></p><p>[root@sanchuang-linux tar]# ls</p><p>passwd.tar.gz</p><p># tar  xf passwd.tar.gz</p><p># ls</p><p><mark>etc</mark> passwd.tar.gz<mark>（注2：解压后是文件夹etc,没有“/”）</mark></p><p># cd etc/</p><p># ls</p><p>passwd</p><p>#</p></blockquote><blockquote><p><mark>给文件夹打压缩包</mark></p><p># tar  cJf  boot.tar.xz  /boot</p><p># tar czf  boot.tar.gz /boot</p><p># tar cjf  boot.tar.bz2 /boot</p><p># <mark>time tar czf  boot.tar.gz /boot （注：压缩命令前接 time 可以看时间）</mark></p><p>tar: 从成员名中删除开头的“/”</p><p>real0m8.467s</p><p>user0m6.851s</p><p>sys0m2.226s</p><p>#</p><p><mark>（注：↓接v可以看过程，信息输出。一般写脚本不接v）</mark></p><p># tar  czvf boot_log_passwd.tar.gz  /boot  /var/log  /etc/passwd <mark>（注：文件和目录）</mark></p><p># tar  czf boot_log_passwd.tar.gz  /boot  /var/log  /etc/passwd</p><p>tar: 从成员名中删除开头的“/”</p><p>tar: 从硬连接目标中删除开头的“/”</p><p>#</p><p><mark>后面打包的文件如果压缩文件的名字一样，会覆盖</mark></p></blockquote><hr><h2 id="五-压缩练习-备份脚本">五. 压缩练习-备份脚本<a class="header-anchor" href="#五-压缩练习-备份脚本"></a></h2><blockquote><p>主要内容：</p><p>排错多个文件 exclude 排除 <mark>（难点）</mark></p><p># tar  <mark>–exclude</mark>=/boot/{grub2,efi,loader}  <mark>-czvf</mark>  no_grub_boot.tar.gz  /boot</p><p># <mark>date +%Y%m%d%H%M%S</mark></p><p>20200924170954</p><p>当前的日期往后面推10天</p><p># <mark>date  -d  “10 days”</mark></p><p>如何得到命令的执行结果赋值给变量</p><p><mark>方法1：</mark></p><p>​ctime=$(date  +%F)</p><p><mark>方法2：反引号</mark></p><p>​ctime=`date  +%F`</p><p>命令的嵌套</p><p><mark>设置时间 -s</mark></p><p># <mark>date -s ‘2020-10-10’（注：调时间）</mark></p><p># date -s  <mark>‘2020-10-10 9:53:00’（注：指定小时分钟秒）</mark></p><p># <mark>cal  看日历</mark>  calendar（日历）</p><p># <mark>cal  2020</mark> 看2020年日历</p></blockquote><hr><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">压缩练习：</span><br><span class="line">1.在windows里使用winrar软件压缩2个文件，一个是.rar格式的文件，一个是.zip的文件，具体压缩那个文件，你自己定义</span><br><span class="line">2.将文件传输到linux系统的/lianxi目录下，尝试解压.zip的文件</span><br><span class="line"><span class="comment"># unzip</span></span><br><span class="line">3.复制/etc/passwd文件到/lianxi目录下，将/lianxi目录下的passwd文件压缩成passwd.xz</span><br><span class="line"><span class="comment"># cp /etc/passwd . # xz passwd </span></span><br><span class="line">4.复制/etc/ssh/sshd_config 文件到/lianxi目录下，然后进行压缩为sshd_config.gz</span><br><span class="line"><span class="comment"># cp /etc/ssh/sshd_config . # gzip sshd_config</span></span><br><span class="line">5.查看passwd.xz里的内容，查看sshd_config.gz里的内容</span><br><span class="line"><span class="comment"># xzcat passwd.xz # zcat sshd_config.gz</span></span><br><span class="line">6.新建文件夹/backup_sc，然后复制/lianxi下的passwd.xz和sshd_config.gz到/backup_sc目录里</span><br><span class="line">7.到/backup_sc目录里解压passwd.xz和sshd_config.gz文件</span><br><span class="line">8.将/lianxi下的sshd_config.gz传到windows系统里看是否可以解压？</span><br></pre></td></tr></table></figure><blockquote><p>练习8：</p><p>​1.创建一个目录在/lianxi下叫tar</p><p># mkdir /lianxi/tar</p><p>​2.进入tar目录，复制/etc/hosts文件和/etc/passwd到tar目录下</p><p># cd /lianxi/tar # cp /etc/hosts . # cp /etc/passwd .</p><p>​3.复制/boot目录到tar目录下</p><p># cp /boot . -r</p><p>​4.将当前目录下的boot目录打包放在/lianxi/tar目录下叫boot.tar.gz</p><p># tar czf boot.tar.gz boot</p><p>​5.查看boot.tar.gz文件里的内容</p><p># tar tf boot.tar.gz</p><p>​6.将hosts文件和passwd文件打包放到host_passwd.tar.bz2文件</p><p># tar cjf host_passwd.tar.bz2 hosts passwd</p><p>​7.查看host_passwd.tar.bz2文件里的内容</p><p># tar tf host_passwd.tar.bz2</p><p>​8.将/boot/目录和/etc/passwd、/var/log目录备份到/lianxi目录下叫boot_pw_log.tar.xz</p><p># tar cJf /lianxi/boot_pw_log.tar.xz /boot /etc/passwd /var/log</p><p>​9.新建/bak目录，然后将/lianxi目录下的boot_pw_log.tar.xz解压到/bak目录下</p><p># mkdir -p /bak # tar xf boot_pw_log.tar.xz -C /bak</p><p>​10.将/boot目录下的除grub2目录以外的所有文件都备份到/bak目录下叫no-grub.tar.gz</p><p>tar czvf --exclude  <mark>（难点）</mark></p><p># tar  <mark>–exclude=/boot/grub2  -czvf</mark>  no_grub_boot.tar.gz  /boot</p><p>centos8里的 （注：<mark>–exclude=/boot/grub2  -czvf  前后不能错，grub2不能接/，-czvf  -不能省略</mark>）</p><p># tar  <mark>–exclude=/boot/grub2  -czvf</mark>  no_grub_boot.tar.gz  /boot</p><p>centos7里的</p><p># tar czvf  no_grub2_boot.tar.gz  /boot  <mark>–exclude=/boot/grub2</mark></p><p>排错多个文件 exclude 排除 <mark>（难点）</mark></p><p># tar  <mark>–exclude</mark>=/boot/{grub2,efi,loader}  <mark>-czvf</mark>  no_grub_boot.tar.gz  /boot</p><p>（注：目录结构 {} 表示多个）</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">练习：</span><br><span class="line"></span><br><span class="line">编写一个脚本实现备份/var/log目录下的所有文件到/bak目录下，要求文件名是包含当天日期，精确到秒，文件名例如：2013-6-6-2_30_20-log.tar.gz。同时要求删除/bak目录下七天前的备份文件，只保留最近7天的文件。</span><br></pre></td></tr></table></figure><blockquote><p>需求分析：</p><p><mark>年月日小时分钟秒</mark></p><p><mark>时间戳：年月日小时分钟秒</mark></p><p>​获得当前的日期  date</p><p>%Y   year<mark>（注：年）</mark></p><p>%m   month (01…12)<mark>（注：月）</mark></p><pre><code>  %M   minute (00..59)==（注：分钟）==</code></pre><p>%d   day of month (e.g., 01)<mark>（注：日）</mark></p><p>%H   hour (00…23)<mark>（注：小时）</mark></p><p>%S   second (00…60)<mark>（注：秒）</mark></p><p>%F   full date; same as %Y-%m-%d<mark>（注：年月日）</mark></p><p># <mark>date +%Y%m%d%H%M%S</mark></p><p>20200924170954</p><p># <mark>date +%Y-%m-%d%H%M%S</mark></p><p>2020-09-24171008</p><p># <mark>date +%Y-%m-%d_%H_%M_%S</mark></p><p>2020-09-24_17_10_31</p><p>#</p><p>当前的日期往后面推10天<mark>（推迟时间）</mark></p><p># <mark>date  -d  “10 days”</mark></p><p>2020年 10月 04日 星期日 17:21:27 CST</p><p># <mark>date  -d  10days</mark></p><p>2020年 10月 04日 星期日 17:21:37 CST</p><p>#</p><p># <mark>date  -d  10hours</mark></p><p>2020年 09月 25日 星期五 03:22:13 CST</p><p>#</p></blockquote><blockquote><p>如何得到命令的执行结果赋值给变量</p><p><mark>方法1：$()（更好，因为可以嵌套）</mark></p><p>​ctime=$(date  +%F)</p><p><mark>方法2：反引号（不能嵌套）</mark></p><p>​ctime=`date  +%F`</p><p># <mark>ctime=$(date  +%F)</mark></p><p># echo $ctime</p><p>2020-09-24</p><p># <mark>sctime=`date +%F`</mark></p><p># echo $sctime</p><p>2020-09-24</p><p>#</p><p># <mark>touch $(date  +%F).txt</mark></p><p># sg=zhanghuayou</p><p># echo $sg</p><p>zhanghuayou</p><p># echo $sg1</p><p>​（注：该行输出为空）</p><p># echo ==${sg}==1</p><p>zhanghuayou<mark>1</mark></p><p>#</p><p>删除/bak目录下七天前的备份文件</p><p>find  /bak  -type f  -mtime +7  -name  “*.tar.gz”  -exec rm  -rf  {}  ;</p><p>脚本名字：</p><p>​backup_log.sh</p></blockquote><blockquote><p>命令的嵌套</p><p># which mkdir</p><p>/usr/bin/mkdir</p><p># rpm -qf /usr/bin/mkdir</p><p>coreutils-8.30-6.el8_1.1.x86_64</p><p># softname=<mark>$(rpm -qf <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>w</mi><mi>h</mi><mi>i</mi><mi>c</mi><mi>h</mi><mi>m</mi><mi>k</mi><mi>d</mi><mi>i</mi><mi>r</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mtext>（注：</mtext></mrow><annotation encoding="application/x-tex">(which mkdir))（注：</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">hi</span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.03148em;">hmk</span><span class="mord mathnormal">d</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mclose">))</span><span class="mord cjk_fallback">（注：</span></span></span></span>() 好，可以嵌套）</mark></p><p># echo $softname</p><p><mark>coreutils-8.30-6.el8_1.1.x86_64</mark></p><p># softname2=<mark>`rpm -qf `which mkdir``</mark></p><p><mark>rpm：未给出要查询的参数</mark></p><p><mark>mkdir: 缺少操作数</mark></p><p>请尝试执行 “mkdir --help” 来获取更多信息。</p><p>#</p></blockquote><hr><blockquote><p>编写一个脚本实现<mark>备份</mark>/var/log目录下的所有文件到/bak目录下，要求文件名是包含当天日期，精确到秒，文件名例如：2013-6-6-2_30_20-log==.tar.gz==。同时要求删除/bak目录下七天前的备份文件，只保留最近7天的文件。</p><p><mark>通过文件名知道使用tar命令，而不是cp</mark></p></blockquote><blockquote><p># mkdir /lianxi/9_25</p><p># cd /lianxi/9_25</p><p># vim  backup_log.sh</p><p>#!/bin/bash</p><p>#获得当前的时间，精确到秒</p><p>ctime=$(date  +%Y%m%d%H%M%S)</p><p>#备份</p><p>mkdir  -p  /bak</p><p>tar  czf  /bak/${ctime}-log.tar.gz  /var/log</p><p>#删除7天前的<mark>备份文件</mark>，只保留最近的7天内的文件</p><p>find  /bak  -type  f  -mtime  +7  <mark>-name  “*log.tar.gz”</mark> -exec  rm  -rf  {}  ;</p></blockquote><blockquote><p>怎么验证删除7天前的文件？</p><p>答：调时间</p><p><mark>设置时间 -s</mark></p><p># date</p><p>2020年 09月 25日 星期五 09:53:18 CST</p><p># <mark>date -s ‘2020-10-10’（注：调时间）</mark></p><p>2020年 10月 10日 星期六 00:00:00 CST</p><p>#</p><p># date -s  <mark>‘2020-10-10 9:53:00’（注：指定小时分钟秒）</mark></p><p>2020年 10月 10日 星期六 09:53:00 CST</p><p>#</p><p># date  -s ‘2020-9-25 9:55:00’</p><p>2020年 09月 25日 星期五 09:55:00 CST</p><p>#</p></blockquote><blockquote><p># <mark>cal  看日历</mark>  calendar（日历）</p><p># <mark>cal  2020</mark> 看2020年日历</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202204232047523.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202204232047209.png" alt=""></p></blockquote><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Nginx </tag>
            
            <tag> Linux </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>05_Linux基础-NGINX编译安装^判断是否启动^修改端口^启动停止重启^相关路径^中文乱码</title>
      <link href="/posts/43579.html"/>
      <url>/posts/43579.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-回顾">一. 回顾<a class="header-anchor" href="#一-回顾"></a></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><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></pre></td><td class="code"><pre><span class="line">//service  sshd  restart  刷新sshd服务</span><br><span class="line">        信息会写到/var/log/messages里，<span class="built_in">tail</span>  -f  /var/log/messages动态监控</span><br><span class="line">        /var/log/messages 记录日志</span><br><span class="line">//root用户有权限，可以更改普通用户密码，密码123也能成功</span><br><span class="line">一个安全的密码有：大小写、数字、特殊符号、足够的长度 Sanchuang123#</span><br><span class="line">//1.显示ps aux查看进程命令输出信息，从第2行到9行，并且显示行号。</span><br><span class="line">        ps  aux|<span class="built_in">cat</span>  -n|<span class="built_in">head</span>  -9|<span class="built_in">tail</span>  -8</span><br><span class="line">        ps  aux|<span class="built_in">cat</span>  -n|sed  -n  ‘2,9p’</span><br><span class="line">        2.使用find命令查找出/find目录下大小大于1M并且名字里包含vmlinuz的文件</span><br><span class="line">        find  /find  -size  +1M  -iname  “*vmlinuz*”</span><br><span class="line">        find  /find  -size  +1M  -iname  “*vmlinuz*”  -<span class="built_in">exec</span>  <span class="built_in">ls</span>  -hl  &#123;&#125;  \;</span><br><span class="line">        （注1：<span class="built_in">ls</span>  -hl命令）</span><br><span class="line">查找出daydayup的文件然后删除它</span><br><span class="line">        find  /  -name  “daydayup”  -<span class="built_in">exec</span>  <span class="built_in">rm</span>  -rf  &#123;&#125;  \;</span><br><span class="line">        （注2：字符串用””引号引起来）</span><br><span class="line">        3.将最近3小时内/lianxi目录下文件大小大于10K的文件 移动到/back目录下</span><br><span class="line">        find /lianxi  -mmin -180 -size +10k -<span class="built_in">type</span> f -<span class="built_in">exec</span> <span class="built_in">mv</span>  &#123;&#125;  /back \;</span><br><span class="line">        4.查找/home目录下用户是root，文件类型是f，这2个条件必须满足，然后再满足大小大于2k或者文件名包含cali的文件中的一个条件，查找出来后，复制到/lianxi目录下。</span><br><span class="line">find /home  -user root  -<span class="built_in">type</span> f  \( -size +2k  -o  -name <span class="string">&quot;*cali*&quot;</span>  \)  -<span class="built_in">exec</span>  <span class="built_in">cp</span> &#123;&#125; /lianxi   \;</span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><h2 id="二-NGINX">二. NGINX<a class="header-anchor" href="#二-NGINX"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//nginx是一个web服务器软件，是使用c语言开发的软件，俄罗斯人开发</span><br><span class="line">        http://nginx.org/</span><br><span class="line">        nginx是开源免费的软件（增值的插件收费）</span><br><span class="line">        国内知名互联网公司都在使用nginx：</span><br><span class="line">淘宝，腾讯，百度，京东，小米，美团，字节跳动，金山云，37互娱等</span><br><span class="line">http://nginx.org/en/download.html</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160925990.png" alt=""></p><figure class="highlight plaintext"><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">前端 —— web服务器 —— 后端数据库</span><br><span class="line">Html,css,js   nginx,python      mysql,redis</span><br></pre></td></tr></table></figure><h3 id="编译安装">编译安装<a class="header-anchor" href="#编译安装"></a></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><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></pre></td><td class="code"><pre><span class="line">//一键安装脚本</span><br><span class="line">    [root@sanchuang-linux nginx]# <span class="built_in">cat</span> onekey_install_nginx.sh </span><br><span class="line">    <span class="comment">#!/bin/bash</span></span><br><span class="line">    <span class="comment">#↑声明脚本用bash去执行</span></span><br><span class="line">    <span class="comment">#1.下载nginx软件包</span></span><br><span class="line">    <span class="built_in">mkdir</span> -p /nginx2</span><br><span class="line">    <span class="built_in">cd</span> /nginx2</span><br><span class="line">    curl  -O http://nginx.org/download/nginx-1.19.2.tar.gz</span><br><span class="line"></span><br><span class="line">    <span class="comment">#2.解压,进入文件夹</span></span><br><span class="line">    tar xf  nginx-1.19.2.tar.gz</span><br><span class="line">    <span class="built_in">cd</span>  nginx-1.19.2</span><br><span class="line"></span><br><span class="line">    <span class="comment">#3.编译前的配置</span></span><br><span class="line">     <span class="comment">#新建用户sanchuang9</span></span><br><span class="line">    useradd sanchuang9</span><br><span class="line">     <span class="comment">#安装gcc和pcre-devel软件包，因为nginx需要这些软件，解决软件的依赖关系</span></span><br><span class="line">    yum install  gcc make   pcre-devel zlib-devel  -y</span><br><span class="line">     <span class="comment">#配置nginx，指定安装路径和启动nginx的用户名</span></span><br><span class="line">    ./configure  --prefix=/usr/local/nginx2  --user=sanchuang9 </span><br><span class="line"></span><br><span class="line">    <span class="comment">#4.编译</span></span><br><span class="line">    make</span><br><span class="line">    <span class="comment">#5.编译安装</span></span><br><span class="line">    make  install</span><br><span class="line"></span><br><span class="line">    <span class="comment">#6.关闭防火墙服务和设置开机不要启动</span></span><br><span class="line">    service firewalld  stop</span><br><span class="line">    systemctl <span class="built_in">disable</span>  firewalld </span><br><span class="line"></span><br><span class="line">    <span class="comment">#7.修改PATH变量，方便可以直接使用nginx</span></span><br><span class="line">    <span class="built_in">echo</span>  <span class="string">&quot;PATH=<span class="variable">$PATH</span>:/usr/local/nginx2/sbin&quot;</span>  &gt;&gt;/root/.bashrc</span><br></pre></td></tr></table></figure><h3 id="具体步骤">具体步骤<a class="header-anchor" href="#具体步骤"></a></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></pre></td><td class="code"><pre><span class="line">具体步骤</span><br><span class="line">//nginx的安装部署</span><br><span class="line">    <span class="comment">#1.下载nginx软件包</span></span><br><span class="line">    <span class="built_in">mkdir</span> -p /nginx</span><br><span class="line">    <span class="built_in">cd</span> /nginx（注2：进入指定路径）</span><br><span class="line">    curl  -O http://nginx.org/download/nginx-1.19.2.tar.gz（注1:curl是linux下面的字符界面浏览器）</span><br><span class="line">    curl是字符界面的一个浏览器 （注3：-O就是下载到当前）</span><br><span class="line"></span><br><span class="line">    <span class="comment">#2.解压,进入文件夹（注3：#1完成后，nginx软件包下载完成，是一个红色的压缩包.tar.gz）</span></span><br><span class="line">    tar xf  nginx-1.19.2.tar.gz（注1：解压后得到一个文件夹，深蓝色。.tar.gz是linux的压缩格式）</span><br><span class="line">    <span class="built_in">cd</span>  nginx-1.19.2（注2：进入这个得到的目录下）</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></pre></td><td class="code"><pre><span class="line">详细操作</span><br><span class="line">//cd  nginx-1.19.2</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160927086.png" alt=""></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"> configure配置</span><br><span class="line"><span class="comment"># ./configure  --help（注1：告诉我们可以配置什么东西）</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160927097.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160928420.png" alt=""></p><blockquote><p>​<mark>–prefix=PATH指定安装路径</mark></p><p>​--sbin-path=PATH指定二进制程序路径</p><p>​--error-log-path=PATH指定错误日志路径</p><p>​--pid-path=PATH指定pid路径</p><p>​<mark>–user=USER 指定启动nginx的用户</mark></p><p>​<mark>–group=GROUP指定启动nginx的组</mark></p></blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160928130.png" alt=""></p><blockquote><p>​--with开启某样功能</p><p>​--without  禁用某样功能</p></blockquote><blockquote><p>详细操作</p><p>​新建用户sanchuang（自动建一个同名的组）</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160930690.png" alt=""></p><p>​# ./configure  --prefix=/usr/local/nginx  --user=sanchuang</p><p>​（注1：配置nginx，指定安装路径和启动nginx的用户名）（下一步）</p></blockquote><blockquote><p>详细操作</p><p>​解决依赖关系</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160931910.png" alt=""></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">//没有PCRE这个库</span><br><span class="line">yum install  gcc  pcre-devel  -y （devel开发包）</span><br><span class="line">//装好后，继续配置</span><br><span class="line"><span class="comment"># ./configure  --prefix=/usr/local/nginx  --user=sanchuang</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160931499.png" alt=""></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">//没有zlib这个库</span><br><span class="line">    yum install  zlib-devel  -y</span><br><span class="line">    （注1：开发库一般会提供很多的接口、很多的包、函数给我们）</span><br><span class="line">//装好后继续</span><br><span class="line"><span class="comment"># ./configure  --prefix=/usr/local/nginx  --user=sanchuang</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160932904.png" alt=""></p><p>​生成makefile文件（配置单）后面根据这个文件编译</p><p>​指定路径↓↓</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160932599.png" alt=""></p><p>​编译前的配置完成，如下</p></blockquote><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 3.编译前的配置</span></span><br><span class="line"><span class="comment"># 新建用户sanchuang</span></span><br><span class="line">useradd sanchuang</span><br><span class="line"><span class="comment"># 安装gcc和pcre-devel软件包，因为nginx需要这些软件，解决软件的依赖关系</span></span><br><span class="line">yum install  gcc make   pcre-devel zlib-devel  -y</span><br><span class="line"><span class="comment"># 配置nginx，指定安装路径和启动nginx的用户名</span></span><br><span class="line">./configure  --prefix=/usr/local/nginx  --user=sanchuang </span><br></pre></td></tr></table></figure></blockquote><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"><span class="comment"># 4.编译（注1：源码 编译成 二进制代码）</span></span><br><span class="line">make</span><br><span class="line">yum  install  make  -y</span><br><span class="line"><span class="comment"># 5.编译安装（注2：本质上是cp，编译好的二进制程序是放在当前目录下）</span></span><br><span class="line">make  install（注2：make install 就是把当前下面的东西拷贝到/usr/local/niginx/下指定路径下去）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160934530.png" alt=""></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></pre></td><td class="code"><pre><span class="line">// 进入/usr/local/nginx/目录（安装完成后）</span><br><span class="line"><span class="comment"># cd /usr/local/nginx/</span></span><br><span class="line"><span class="comment"># ls</span></span><br><span class="line">conf  html  logs  sbin</span><br><span class="line"></span><br><span class="line">conf是存放nginx的配置文件</span><br><span class="line">html是存放网页的目录</span><br><span class="line">logs 是存放日志文件的目录</span><br><span class="line">sbin 是存放可执行程序，也就是nginx的启动程序</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">//运行nginx程序</span><br><span class="line"> <span class="comment"># cd sbin/</span></span><br><span class="line"> <span class="comment"># ls</span></span><br><span class="line"> nginx</span><br><span class="line"> <span class="comment"># ./nginx  运行nginx程序</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160935178.png" alt=""></p><p>​//接下来判断nginx是否启动</p></blockquote><h3 id="判断服务是否启动">判断服务是否启动<a class="header-anchor" href="#判断服务是否启动"></a></h3><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></pre></td><td class="code"><pre><span class="line">判断一个服务是否启动的方法：</span><br><span class="line">//1.看是否有相关的进程</span><br><span class="line"><span class="comment"># ps aux|grep nginx</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160936274.png" alt=""></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">有两个进程，主进程和工作进程（注1：有这两个进程，说明nginx程序起来了）</span><br><span class="line">2.看是否有进程占用的端口号</span><br><span class="line"> <span class="comment"># yum install  lsof   net-tools  -y（注2：用来看端口号的软件”）</span></span><br><span class="line"> <span class="comment"># lsof -i:80  只是看80端口被那个进程占用了（注3：两个命令都可以看端口号开没开）</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160937120.png" alt=""></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"><span class="comment"># netstat -anplut  查看本机上所有的开放的端口（注3：两个命令都可以看端口号开没开）</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160937067.png" alt=""></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">（注4：0.0.0.0表示本机上所有的ip地址，：80表示所有ip地址上的80端口）</span><br><span class="line">（注5：端口号在：80体现）</span><br><span class="line">开启了防火墙，所以Windows上的浏览器访问不过去</span><br><span class="line"><span class="comment"># service firewalld stop  关闭防火墙服务</span></span><br><span class="line"><span class="comment"># systemctl  disable firewalld  设置防火墙服务开机不要启动</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160937982.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">如下↓↓</span><br></pre></td></tr></table></figure></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#6.关闭防火墙服务和设置开机不要启动</span></span><br><span class="line"> service firewalld  stop</span><br><span class="line"> systemctl <span class="built_in">disable</span>  firewalld </span><br></pre></td></tr></table></figure></blockquote><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></pre></td><td class="code"><pre><span class="line">详细操作</span><br><span class="line">刚在启动nginx 是在/usr/local/nginx/sbin目录下启动的 ./nginx</span><br><span class="line">怎么样让我们在任何地方敲nginx它都能找到</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160938411.png" alt=""></p><figure class="highlight plaintext"><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">做法：修改PATH变量</span><br><span class="line">如下</span><br></pre></td></tr></table></figure></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#7.修改PATH变量，方便可以直接使用nginx</span></span><br><span class="line"><span class="built_in">echo</span>  <span class="string">&quot;PATH=<span class="variable">$PATH</span>:/usr/local/nginx/sbin&quot;</span>  &gt;&gt;/root/.bashrc</span><br><span class="line">（注1：<span class="built_in">echo</span> 在屏幕上输出，&gt;&gt;输出重对象，追加进去，把它写到/root/.bashrc里）</span><br><span class="line">（注2：写脚本特别喜欢用重对象）</span><br></pre></td></tr></table></figure></blockquote><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">编译安装的步骤：3部曲</span><br><span class="line">1.  编译前的配置  --》  生成配置单 （Makefile）</span><br><span class="line">./configure  --prefix=/usr/local/nginx  --user=sanchuang</span><br><span class="line">2.  编译   --》根据配置单制作</span><br><span class="line">make</span><br><span class="line">3.  编译安装  --》将编译好的程序安装</span><br><span class="line">make install</span><br></pre></td></tr></table></figure></blockquote><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">改首页</span><br><span class="line"> <span class="comment"># cd  /usr/local/nginx/html/</span></span><br><span class="line"> <span class="comment"># ls</span></span><br><span class="line"> 50x.html  index.html</span><br><span class="line"> <span class="comment"># vim index.html   编辑下首页文件</span></span><br><span class="line"> （注1：index.html  首页：打开网站看到的第一个页面 --》首先看到的页面）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160940865.png" alt=""></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">vim 编辑器的复制和粘贴</span><br><span class="line">yy 是复制当前行（注2：按下ESC后）</span><br><span class="line">p 粘贴到下一行</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160940638.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160940080.png" alt=""></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">//vim  chenpeng.html</span><br><span class="line"><span class="built_in">ls</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160941813.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160941822.png" alt=""></p><figure class="highlight plaintext"><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">（注3：这里建的html叫什么名字，外面接的时候就要/接它）</span><br><span class="line">（注4：默认情况下首页都叫index.html  nginx里的规定）</span><br></pre></td></tr></table></figure></blockquote><h3 id="回顾">回顾<a class="header-anchor" href="#回顾"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">web服务器：网站方面的应用 web server</span><br><span class="line">提供网站服务</span><br><span class="line"></span><br><span class="line">server  服务器</span><br><span class="line">client   客户机</span><br><span class="line">broswer 浏览器</span><br><span class="line">http访问的端口是80</span><br><span class="line">https访问的端口是443</span><br><span class="line">nginx可以监听两个端口（80、443）（要记）</span><br><span class="line">https传输的内容经过加密，更加安全（注1：很多电商网站和银行网上支付都是https）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160942822.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">//安装两个nginx不冲突，路径不同就行。同时启动不能占用相同的端口</span><br><span class="line">    nginx卸载，直接把这个目录删掉 rm  -rf</span><br><span class="line"></span><br><span class="line">    脚本的意义：提前设置好的程序，按照程序去走</span><br><span class="line">      下到指定目录的路径</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160942770.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//80端口被占用，新建的nginx启动不了</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160943828.png" alt=""></p><h3 id="修改-8080-端口">修改 8080 端口<a class="header-anchor" href="#修改-8080-端口"></a></h3><blockquote><p>//配置新的nginx使用8080端口 （注2：vim nginx.conf  80 /usr/local/nginx2/conf）</p><p>​（注3：改端口号，改了配置文件一定要重启reload）</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"><span class="comment"># pwd</span></span><br><span class="line">/usr/local/nginx2/conf</span><br><span class="line"><span class="comment"># ls</span></span><br><span class="line">fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params</span><br><span class="line">fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default</span><br><span class="line">fastcgi_params        koi-win                 nginx.conf          scgi_params.default  win-utf</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># vim nginx.conf</span></span><br><span class="line">       listen       8080;   修改端口号80为8080（注1：找到这一行，修改8080）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160945122.png" alt=""></p><p>//启动nginx的路径 /usr/local/nginx/sbin/nginx</p><p>//netstat  -anplut 查看端口号</p><p>​有两个nginx，一个nginx监听8080端口，一个nginx监听80端口</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160945730.png" alt=""></p><p>​两个nginx不冲突，多个nginx可以共存</p><p>//访问</p><p>​192.168.0.45</p><p>​192.168.0.45:8080</p><p>​可以 1个机器里面跑了2个网站</p></blockquote><h3 id="启动-停止-重启-NGINX">启动/停止/重启 NGINX<a class="header-anchor" href="#启动-停止-重启-NGINX"></a></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></pre></td><td class="code"><pre><span class="line">//启动nginx</span><br><span class="line">        <span class="comment"># /usr/local/nginx/sbin/nginx</span></span><br><span class="line">        <span class="comment"># /usr/local/nginx2/sbin/nginx</span></span><br><span class="line">停止nginx</span><br><span class="line">        <span class="comment"># /usr/local/nginx/sbin/nginx  -s stop</span></span><br><span class="line">        <span class="comment"># /usr/local/nginx2/sbin/nginx  -s stop</span></span><br><span class="line">重启(重新加载)（注1：修改了配置文件一定要reload重启）</span><br><span class="line">    <span class="comment"># /usr/local/nginx2/sbin/nginx -s reload</span></span><br><span class="line">    （注1：修改了配置文件一定要reload重启，不然不会生效）</span><br></pre></td></tr></table></figure><h3 id="相关路径">相关路径<a class="header-anchor" href="#相关路径"></a></h3><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160948321.png" alt=""></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">//conf 放配置文件</span><br><span class="line">修改nginx监听的端口号  conf/nginx.conf</span><br><span class="line">修改nginx首页index.html内容 html/index.html</span><br><span class="line">启动nginx/usr/local/nginx/sbin/nginx</span><br><span class="line">重启nginx/usr/local/nginx/sbin/nginx  -s  reload（注1：前提条件nginx启动了）</span><br></pre></td></tr></table></figure><h3 id="编写自己的网页">编写自己的网页<a class="header-anchor" href="#编写自己的网页"></a></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><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></pre></td><td class="code"><pre><span class="line">//编写一个自己的网页 sc.html</span><br><span class="line">里面需要有文字，图片，链接</span><br><span class="line"></span><br><span class="line">        /usr/local/nginx2/html （注1：存放网页的地方）</span><br><span class="line">        <span class="comment"># vim  sc.html</span></span><br><span class="line">        &lt;html&gt; （注4：html语言 有头有尾）</span><br><span class="line">            &lt;<span class="built_in">head</span>&gt; （注2：头部）</span><br><span class="line">                &lt;title&gt;welcome to sanchuang&lt;/title&gt; （注3：标题）</span><br><span class="line">            &lt;/head&gt;</span><br><span class="line">            &lt;body&gt; （注5：body部分就是一段一段的话）</span><br><span class="line">                &lt;p&gt;my name is chenpeng&lt;/p&gt; （注6：p段落标记，表示一段）</span><br><span class="line">                &lt;p&gt;my phone number is 18874991147&lt;/p&gt;</span><br><span class="line">                &lt;p&gt;&lt;h1&gt;chenpeng  linux&lt;/h1&gt; （注7：h1字体加粗）</span><br><span class="line">                &lt;p&gt;&lt;a href=<span class="string">&quot;https://www.qq.com&quot;</span>&gt;qq.com&lt;/a&gt;&lt;/p&gt;</span><br><span class="line">                &lt;p&gt;&lt;a href=<span class="string">&quot;https://www.taobao.com&quot;</span>&gt;taobao.com&lt;/a&gt;&lt;/p&gt;</span><br><span class="line">                &lt;p&gt;&lt;a href=<span class="string">&quot;https://www.jd.com&quot;</span>&gt;jd.com&lt;/a&gt;&lt;/p&gt; （注10：链接 a标签  href）</span><br><span class="line">                &lt;img src=<span class="string">&quot;linghuchong.jpg&quot;</span>&gt;（注12：图片img  src，图片放在sc.html同一文件夹下）</span><br><span class="line">                &lt;p&gt;&lt;a href=<span class="string">&quot;index.html&quot;</span>&gt;index.html&lt;/a&gt;（注13：链接到首页）</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">            &lt;/body&gt;</span><br><span class="line">        &lt;/html&gt;</span><br><span class="line">    （注8：ESC  :w 只保存，不退出）</span><br><span class="line">    （注9：访问 192.168.0.45:8080/sc.html）</span><br><span class="line">    （注11：首页（样例）/usr/local/nginx/html/index.html）</span><br><span class="line">    修改网页不需要重新启动nginx服务,只要刷新浏览器就可以了</span><br><span class="line">    只有修改了nginx的配置文件，才需要重新启动nginx服务  nginx -s reload</span><br><span class="line">//这是在8080端口，放到80端口操作↓↓</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160951912.png" alt=""></p><h3 id="vim-基本使用">vim 基本使用<a class="header-anchor" href="#vim-基本使用"></a></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></pre></td><td class="code"><pre><span class="line">//vim的基本使用</span><br><span class="line">        1.按i 进入输入模式</span><br><span class="line">        2.按ESC返回到命令模式</span><br><span class="line">            yy  复制当前行</span><br><span class="line">            2yy 复制两行  nyy复制多行</span><br><span class="line">            p   粘贴（往下粘贴)</span><br><span class="line">            u   撤销</span><br><span class="line">            <span class="built_in">dd</span>  删除当前行</span><br><span class="line">            2dd 删除两行  ndd删除多行</span><br></pre></td></tr></table></figure><h3 id="中文乱码">中文乱码<a class="header-anchor" href="#中文乱码"></a></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></pre></td><td class="code"><pre><span class="line">//解决访问时中文乱码问题</span><br><span class="line">    &lt;<span class="built_in">head</span>&gt;</span><br><span class="line">    &lt;meta  charset=”utf8”&gt;</span><br><span class="line">    &lt;/head&gt;</span><br><span class="line">    （注1：可以在Windows sublime软件写*.html文件 上传到linux  /usr/local/nginx/hml 里）</span><br></pre></td></tr></table></figure><hr><h2 id="三-Windows、Linux-文件传输">三. Windows、Linux 文件传输<a class="header-anchor" href="#三-Windows、Linux-文件传输"></a></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><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">//Windows、linux文件传输</span><br><span class="line">    解决文件传输的问题</span><br><span class="line">    1.rz 和sz</span><br><span class="line">        <span class="comment"># yum  install lrzsz  -y</span></span><br><span class="line">        <span class="comment"># rz    从windows里上传文件到linux里  receive （注3：传到你当前路径 z是模式）</span></span><br><span class="line">        <span class="comment"># sz abcd.txt   从linux里发送文件abcd.txt到windows里  send  （注4:z是模式）</span></span><br><span class="line">2.xftp传输</span><br><span class="line">需要安装xftp（注1：左右边直接拖过来）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203160950271.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">（yum  provides  rz  注2：查询rz命令是哪个软件包提供的）</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Nginx </tag>
            
            <tag> Linux </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>04_Linux基础-.&amp;..-cat-tac-重定向-EOF-基本命令</title>
      <link href="/posts/62964.html"/>
      <url>/posts/62964.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-回顾">一. 回顾<a class="header-anchor" href="#一-回顾"></a></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><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><br><span class="line">//将/home/目录下的所有文件和文件夹复制到/jindafu目录下</span><br><span class="line"><span class="built_in">cp</span>  /home/*  .  -r</span><br><span class="line"><span class="comment">#注：复制文件夹 接-r递归复制(因为提到了文件夹)</span></span><br><span class="line"><span class="comment">#注：所有通配符*</span></span><br><span class="line">//复制/etc/hosts文件到jindafu,不给予覆盖提醒</span><br><span class="line">用<span class="built_in">cp</span>的绝对路径</span><br><span class="line"><span class="built_in">which</span>  <span class="built_in">cp</span>得到<span class="built_in">cp</span>的路径</span><br><span class="line">/usr/bin/cp  /etc/hosts  .</span><br><span class="line"><span class="comment">#注：不给予提醒 输入cp命令的绝对路径因为cp命令是别名 所有会有提醒</span></span><br><span class="line">//将xiena目录改名为xienana</span><br><span class="line"><span class="built_in">mv</span>  xiena/  xienana</span><br><span class="line">//将singer目录下的所有文件复制到hejiong目录下</span><br><span class="line"><span class="built_in">cp</span>  haiquan/singer/*  hejiong/</span><br><span class="line"><span class="comment">#注：所有通配符*</span></span><br><span class="line"><span class="comment">#注：复制文件不接-r</span></span><br><span class="line">//删除所有的xienana目录</span><br><span class="line">find命令 或 tree查看xienana在哪  <span class="built_in">rm</span>  -rf  路径</span><br><span class="line">find  /hunantv/  -name  “xienana”  -<span class="built_in">exec</span>  <span class="built_in">rm</span>  -rf  &#123;&#125; \;</span><br><span class="line">//查看目录结构 tree  查看类型 file</span><br><span class="line">//<span class="built_in">echo</span>  <span class="variable">$PS1</span>  <span class="variable">$PS2</span> 怎么看PS1 PS2</span><br><span class="line">//hostname  查看主机名</span><br><span class="line">//<span class="built_in">echo</span>  <span class="variable">$SHELL</span>  查看默认shell  （是bash）</span><br><span class="line">//<span class="built_in">cat</span>  /ect/shells  查看机器里有哪些shell</span><br><span class="line">sh  bash  <span class="built_in">exit</span></span><br><span class="line"><span class="comment">#/etc存放配置文件</span></span><br><span class="line">//d  目录</span><br><span class="line">-  普通文件</span><br><span class="line">l  链接文件</span><br><span class="line">c  字符设备文件（显示）</span><br><span class="line">b  块设备文件 （磁盘）</span><br><span class="line">//reboot  重启机器</span><br><span class="line">//clear  清屏</span><br><span class="line">//别名 <span class="built_in">alias</span> , <span class="built_in">unalias</span> , vim  /root/.bashrc</span><br><span class="line">//<span class="built_in">env</span>  环境变量  <span class="built_in">set</span>  所有变量</span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><h2 id="二-…-删不掉">二. . … 删不掉<a class="header-anchor" href="#二-…-删不掉"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">//rm  -rf  不会删除隐藏文件</span><br><span class="line">rm  -rf  .lixh  删除隐藏文件</span><br><span class="line">.和..删不掉</span><br></pre></td></tr></table></figure><hr><h2 id="三-cat">三. cat<a class="header-anchor" href="#三-cat"></a></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></pre></td><td class="code"><pre><span class="line">//<span class="built_in">ls</span>  查看文件夹里的内容</span><br><span class="line">        <span class="built_in">cat</span> 1.查看文件里的内容</span><br><span class="line">        2.可以将多个文件连接到一起输出</span><br><span class="line">        -n, --number  给输出的行进行编号</span><br><span class="line">        用处2： <span class="built_in">cat</span>  tangliangfei.txt  wangtc.txt （连接功能）</span><br><span class="line">        先将tangliangfei.txt内容输出，再将wangtc.txt内容输出</span><br></pre></td></tr></table></figure><h3 id="tac-与-cat">tac 与 cat<a class="header-anchor" href="#tac-与-cat"></a></h3><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">//tac 逆序显示，从最后一行到第一行</span><br><span class="line">不能接-n</span><br><span class="line">cat 正序显示，从第一行到最后一行 (有-n选项)</span><br></pre></td></tr></table></figure><hr><h2 id="四-重定向">四. 重定向<a class="header-anchor" href="#四-重定向"></a></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">//&gt;  输出重定向，会覆盖原来的内容，如果文件不存在会自动新建</span><br><span class="line">重定向：就是将在屏幕上输出的内容，改变输出的方向，输出到文件里</span><br><span class="line">&gt;&gt;  追加输出重定向，不会覆盖原来的内容，只是在末尾追加，如果文件不存在会自动新建</span><br><span class="line">&gt;会覆盖原来的内容，&gt;&gt;不覆盖，末尾追加</span><br><span class="line"><span class="comment"># cat  tangliangfei.txt  wangtc.txt  &gt;tang_wang.txt</span></span><br><span class="line"><span class="comment"># echo 123456789  &gt;&gt;tang_wang.txt </span></span><br><span class="line">（学会<span class="built_in">cat</span>与&gt;、&gt;&gt;的组合）</span><br></pre></td></tr></table></figure><hr><h2 id="五-here-document">五. here document<a class="header-anchor" href="#五-here-document"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">//生成指定内容的文件 --》here document  --》主要用在写脚本生成指定的内容</span><br><span class="line">//  &lt;&lt;EOF 定义的结束字符串</span><br><span class="line">当输入EOF的时候，结束  end of file </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><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"># cat   &gt;chenpeng.txt  &lt;&lt;EOF  （注1：后面不一定非得EOF，但要起的有意义）</span></span><br><span class="line">&gt; chen peng（注2:1个&gt;符号，原来内容会被覆盖）</span><br><span class="line">&gt; jiangsu</span><br><span class="line">&gt; xinhua</span><br><span class="line">&gt; nongda</span><br><span class="line">&gt; linux</span><br><span class="line">&gt; cali</span><br><span class="line">&gt; EOF （注3：点回车）</span><br><span class="line"></span><br><span class="line"><span class="comment"># cat &gt;&gt;cali.txt &lt;&lt;end（注1：2个&gt;符号，内容追加，不覆盖）</span></span><br><span class="line">&gt; sanchuang</span><br><span class="line">&gt; nongda</span><br><span class="line">&gt; changsha</span><br></pre></td></tr></table></figure><hr><h2 id="六-Shell-脚本">六. Shell 脚本<a class="header-anchor" href="#六-Shell-脚本"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//shell脚本： 其实是一个文件，文件里面有很多的linux命令，这个文件可以执行，被执行的时候，会执行文件里的所有的命令</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><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="comment"># vim  first_shell.sh</span></span><br><span class="line"><span class="comment">#!/bin/bash（注1：声明这个脚本使用的解释器是bash）</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span>  -p  /test（注2：存在不报错，不存在就新建）</span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> /test</span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> sc&#123;1..100&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">touch</span> pengyf&#123;1..100&#125;.txt</span><br><span class="line"></span><br><span class="line"><span class="built_in">cp</span> /etc/hosts  /test</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> &gt;sanchuang.txt  &lt;&lt;<span class="string">EOF（注3：回车后直接打，文本文件里没有提示符&gt;）</span></span><br><span class="line"><span class="string">sanchuang   hunan  changsha  furongqu hunannongda</span></span><br><span class="line"><span class="string">feng de yong</span></span><br><span class="line"><span class="string">linux</span></span><br><span class="line"><span class="string">EOF</span>（注4：结束）</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;####################################&quot;</span></span><br><span class="line"><span class="built_in">cat</span>  -n  sanchuang.txt </span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;####################################&quot;</span></span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">脚本写好了↑↑↑</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><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># bash  first_shell.sh   执行脚本（注：内容如下）</span></span><br><span class="line"><span class="comment">####################################</span></span><br><span class="line">     1sanchuang   hunan  changsha  furongqu hunannongda</span><br><span class="line">     2feng de yong</span><br><span class="line">     3linux</span><br><span class="line"><span class="comment">####################################</span></span><br><span class="line">//脚本在执行的时候，是从第1条命令，自上而下执行，如果中间有命令执行失败，后面的命令还是会执行的（Python中间出错，没有异常捕获的话，不再执行）</span><br></pre></td></tr></table></figure><hr><h2 id="七-more">七. more<a class="header-anchor" href="#七-more"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">// more命令  分页显示 （注1：没有-n选项，cat有-n选项）</span><br><span class="line">用途：全屏方式分页显示文件内容</span><br><span class="line">交互操作方法：</span><br><span class="line">     按Enter键向下逐行滚动</span><br><span class="line">     按空格键向下翻一屏、按b键向上翻一屏   back</span><br><span class="line">     按q键退出 （注2：显示完自动退出，与less的差别）</span><br></pre></td></tr></table></figure><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"><span class="comment"># more  messages </span></span><br></pre></td></tr></table></figure><hr><h2 id="八-ps-aux">八. ps aux<a class="header-anchor" href="#八-ps-aux"></a></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></pre></td><td class="code"><pre><span class="line">//<span class="comment"># ps aux  查看linux当前运行的进程的信息--》任务管理器（ps  -aux也可以）</span></span><br><span class="line">        <span class="comment"># ps -aux|more</span></span><br><span class="line">        <span class="comment"># cat messages |more 和 more messages 一样</span></span><br><span class="line">        <span class="comment"># cat -n messages |more 显示行号</span></span><br></pre></td></tr></table></figure><hr><h2 id="九-less">九. less<a class="header-anchor" href="#九-less"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">// less命令</span><br><span class="line">用途：与more命令相同，但扩展功能更多</span><br><span class="line">交互操作方法：</span><br><span class="line"> 与more命令基本类似，但个别操作会有些出入</span><br><span class="line">【page down】【page up】上翻下翻页（注1：more不支持）</span><br><span class="line">显示完不退出，按q退出 （注2：与more的差别）</span><br><span class="line">（注3：也支持空格、b、Enter，凡是more支持的less都支持）</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># less messages </span></span><br><span class="line"><span class="comment"># cat messages |less</span></span><br></pre></td></tr></table></figure><hr><h2 id="十-head">十. head<a class="header-anchor" href="#十-head"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">// head命令（注1：默认取前10行，连续的几行）</span><br><span class="line">        用途：查看文件开头的一部分内容（默认为10行）</span><br><span class="line">        格式：head -n number 文件名</span><br><span class="line">        格式：head -数字  文件名</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></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span>  -n  passwd  |<span class="built_in">head</span>  显示前10行，有编号</span><br><span class="line"><span class="built_in">head</span>  passwd  显示前10行，没有编号</span><br><span class="line"><span class="built_in">head</span>  -5  passwd  显示前5行（没编号）</span><br><span class="line"><span class="built_in">head</span>  -n  5  passwd  显示前5行（没编号，与上一条命令效果一样）</span><br></pre></td></tr></table></figure><hr><h2 id="十一-tail">十一. tail<a class="header-anchor" href="#十一-tail"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">// tail命令</span><br><span class="line">        用途：查看文件结尾的少部分内容（默认为10行）</span><br><span class="line">        格式：tail  -n  number 文件名</span><br><span class="line">        格式：tail  -数字   文件名</span><br><span class="line">           tail  -f  文件名  = tailf# 注：tailf不知道怎么用</span><br><span class="line">#注：tail  -f 动态的监控文件末尾的变化</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><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="built_in">tail</span>  passwd  取末尾10行（无编号）</span><br><span class="line"><span class="built_in">cat</span>  -n  passwd  |<span class="built_in">tail</span>  取末尾10行（有编号）</span><br><span class="line"><span class="built_in">cat</span>  -n  passwd  |<span class="built_in">tail</span>  -5  取末尾5行（有编号）</span><br><span class="line"><span class="built_in">cat</span>  -n  passwd  |<span class="built_in">tail</span>  -1  最后1行（有编号）</span><br><span class="line"><span class="built_in">cat</span>  -n  passwd  |<span class="built_in">tail</span>  -n  3  取末尾3行（有编号）</span><br><span class="line"></span><br><span class="line"><span class="built_in">tail</span>  -n  2  passwd  显示最后2行</span><br><span class="line"><span class="built_in">tail</span>  -n  -2  passwd  与上条效果一样</span><br><span class="line"><span class="built_in">tail</span>  -n  +2  passwd  显示从第2行到末尾  （注1：用处：统计有多少行的时候，不想显示首行，统计磁盘挂载的时候不想看到标题这一行）</span><br><span class="line">    （注2：<span class="built_in">df</span>  -Th 显示linux里的磁盘分区的使用情况）</span><br><span class="line">    <span class="built_in">df</span>  -Th|<span class="built_in">tail</span>  -n  +2  统计磁盘挂载不显示标题行</span><br><span class="line">    <span class="built_in">df</span>  -Th|<span class="built_in">tail</span>  -n  +2|<span class="built_in">wc</span>  -l  统计行数</span><br><span class="line"></span><br><span class="line"><span class="comment"># tail -f feng.txt   动态的监控文件末尾的变化</span></span><br><span class="line">（注4：经常用来查看日志文件的变化，根据日志的记录去排错）</span><br><span class="line">（注2：重新打开窗口连过去，右边修改文件内容，左边动态监控文件末尾的变化，一有新的内容就显示）（注3：Ctrl+C 强行终止）</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">tail  -f 扩展 </span><br><span class="line">特别适合看某些日志文件</span><br><span class="line">        /var  存放动态变化的文件  variable  变量，变化的，可变的</span><br><span class="line">        log  日志：是程序记录它发生的事情</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># cd  /var/log（注1：/var/log 存放大量日志文件）</span></span><br><span class="line"><span class="comment"># tail  -f  secure   查看secure日志文件 （注2：secure 安全）</span></span><br><span class="line">（注3：别的窗口做操作，日志文件末尾动态更新）</span><br></pre></td></tr></table></figure><hr><h2 id="十二-sed">十二. sed<a class="header-anchor" href="#十二-sed"></a></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><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">    1.取出passwd的第3行</span><br><span class="line">    <span class="comment"># cat -n /etc/passwd|head -3|tail -1 （注1：先取前3行，再取最后1行，用|管道）</span></span><br><span class="line">    <span class="comment"># cat  /etc/passwd|head -3|tail -1 （注2：与上面命令比，没有编号3）</span></span><br><span class="line">2.取出passwd文件的第5行到10行</span><br><span class="line"><span class="comment">#注：这种 先看末尾 用head 因为行数是从前到后计算的</span></span><br><span class="line">    <span class="comment"># cat -n /etc/passwd|head |tail -6 （注3：先head取默认前10行，再取后六行）</span></span><br><span class="line">   （注4：从第5行到10行，<span class="built_in">tail</span>  -6，不是-5）</span><br><span class="line"><span class="comment"># cat -n messages |head -200|tail -101  （100到200行）</span></span><br><span class="line">3.取出第3行，第5行，第10行</span><br><span class="line"><span class="comment"># sed  -n  &#x27;1p;3p;5p&#x27;  passwd （注5：-n是选项，符合要求的选项显示出来，不是显示行号的意思）</span></span><br><span class="line"></span><br><span class="line">练习3扩展</span><br><span class="line">// sed</span><br><span class="line">-n 作用：只是显示符合要求的行（注9：不符合要求的行不显示）</span><br><span class="line">            1p;3p;5p</span><br><span class="line">            1p 显示第1行  p 是<span class="built_in">print</span>命令</span><br><span class="line">; 命令连接符号</span><br><span class="line">        <span class="comment"># cat  -n  passwd  |sed  -n  ‘1p;3p;5p’ （注6：显示1、3、5行，有编号）</span></span><br><span class="line">        <span class="comment"># sed  -n  &#x27;1p;3p;5p&#x27;  passwd （注7：没有编号）</span></span><br><span class="line">      （注10：用双引号””也可以）</span><br><span class="line">        <span class="comment"># cat -n passwd |sed -n  &#x27;3p;5p;10p&#x27;  显示不连续的3,5,10行的内容(这样写显示行号)</span></span><br><span class="line">        <span class="comment"># cat -n passwd |sed -n  &#x27;3,10p&#x27; 显示第3行到第10行的内容，中间是连续的</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># cat -n passwd |sed  &#x27;3,10p&#x27;（注8：sed后不接-n的话，会显示所有的行[包括不符合要求的行]，只不过3到10行输出两遍，所有一定要接-n）</span></span><br><span class="line"></span><br><span class="line">总结：sed  1.显示连续的  2.显示不连续的</span><br></pre></td></tr></table></figure><hr><h2 id="十三-grep">十三. grep<a class="header-anchor" href="#十三-grep"></a></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></pre></td><td class="code"><pre><span class="line">//grep 文本过滤 （过滤的是文件，不是文件夹目录）</span><br><span class="line">        grep  “root”  /etc/passwd 包含root的行</span><br><span class="line">        grep  “^liang”  /etc/passwd 以liang开头的行</span><br><span class="line">        grep  “bash$”  /etc/passwd 以bash结尾的行</span><br><span class="line">        Ctrl + c 终止</span><br><span class="line">//文本处理三剑客 sed  grep  awk</span><br></pre></td></tr></table></figure><hr><h2 id="十四-which">十四. which<a class="header-anchor" href="#十四-which"></a></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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">which</span>  查找可执行文件并显示所在的位置</span><br><span class="line">搜索范围由PATH环境变量指定</span><br><span class="line">    <span class="comment"># which  mkdir</span></span><br><span class="line">    /usr/bin/mkdir</span><br><span class="line">    <span class="comment"># cd /usr/bin/</span></span><br><span class="line">    <span class="comment"># ll mkdir</span></span><br><span class="line">    -rwxr-xr-x. 1 root root 195192 4月  10 02:53 <span class="built_in">mkdir</span></span><br><span class="line"></span><br><span class="line">    rwxr-xr-x 权限</span><br><span class="line">    r  读  <span class="built_in">read</span>   --》<span class="built_in">cat</span>  vim</span><br><span class="line">    w  写  write  --》 vim   &gt;&gt;</span><br><span class="line">    x  执行 execute   ---》运行</span><br><span class="line"></span><br><span class="line">    <span class="comment"># ll first_shell.sh</span></span><br><span class="line">    -rw-r--r--. 1 root root…… （注1：脚本无可执行权限）</span><br><span class="line">    <span class="comment"># bash  first_shell.sh  （注2：用bash去执行它）</span></span><br><span class="line">    <span class="comment"># chmod  +x  first_shell.sh  （注3：给它可执行权限）</span></span><br><span class="line">    -rwxr-xr-x.  root root……  （注4：有可执行权限了）</span><br><span class="line">    <span class="comment"># ./first_shell.sh  （注5：直接执行，直接在当前终端执行，当前bash执行）</span></span><br><span class="line">    <span class="comment"># /lianxi/first_shell.sh  （注6：接绝对路径，接文件，直接执行）</span></span><br><span class="line">    <span class="comment"># chmod  -x  first_shell.sh  （注7：取消可执行权限）</span></span><br><span class="line">    <span class="comment"># /lianxi/first_shell.sh </span></span><br><span class="line">    -bash: /lianxi/first_shell.sh: 权限不够  （取消可执行权限后不能直接执行）</span><br></pre></td></tr></table></figure><h3 id="whereis">whereis<a class="header-anchor" href="#whereis"></a></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><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">//whereis 查找命令放到哪里（注1：跟<span class="built_in">which</span>很像）（注2：没什么用，man手册在哪里不是很重要）</span><br><span class="line"><span class="comment"># whereis  mkdir</span></span><br><span class="line"><span class="built_in">mkdir</span>:  /usr/bin/mkdir  /usr/share/man/man1/mkdir.1.gz</span><br><span class="line">（注2：压缩文件，是它的文档）</span><br><span class="line">        1.查看命令安放路径</span><br><span class="line">        2.该命令man手册的路径（man的时候看的内容的存放路径）</span><br><span class="line">//whereis和<span class="built_in">which</span>的区别</span><br><span class="line">        Which不显示man手册的路径，whereis显示man手册的路径</span><br><span class="line">        <span class="comment"># whereis  mkdir</span></span><br><span class="line">        <span class="built_in">mkdir</span>:  /usr/bin/mkdir  /usr/share/man/man1/mkdir.1.gz</span><br><span class="line">        <span class="comment"># which  mkidr</span></span><br><span class="line">        /usr/bin/mkdir</span><br><span class="line">//whereis和<span class="built_in">which</span> 都是到PATH变量里去找的 （共同点）</span><br></pre></td></tr></table></figure><hr><h2 id="十五-PATH">十五. PATH<a class="header-anchor" href="#十五-PATH"></a></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><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">//PATH是路径</span><br><span class="line"><span class="built_in">which</span>命令在查找命令的时候，会到PATH变量指定的路径下查找</span><br><span class="line"><span class="comment"># which fengdeyong</span></span><br><span class="line">/usr/bin/which: no fengdeyong <span class="keyword">in</span> (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)</span><br><span class="line">(备注1：红色为路径  备注2：多个文件夹用：冒号隔开)</span><br><span class="line"><span class="comment"># echo $PATH  （注3：$PATH 引用PATH变量）</span></span><br><span class="line">/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin</span><br><span class="line">查找的顺序是从左往右找，如果在第1个里面找到了，就不会往后面找，以此类推</span><br></pre></td></tr></table></figure><h3 id="深入理解-PATH-变量的作用">深入理解 PATH 变量的作用<a class="header-anchor" href="#深入理解-PATH-变量的作用"></a></h3><blockquote><p>1.编写一个schello.c的文件</p><figure class="highlight c"><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="meta"># vim schello.c （注1：编写脚本如下）</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;hello,world\n&quot;</span>); （注<span class="number">2</span>：\n 换行）</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;i am cali\n&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta"># file schello.c </span></span><br><span class="line">schello.c: C source, ASCII text （注<span class="number">3</span>：C语言文件，文本文件，机器不能识别）</span><br></pre></td></tr></table></figure><p>2.编译成二进制程序文件</p><p>gcc 是linux里的一个编译器，将c源码文件编译成二进制文件</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203131403345.png" alt=""></p><p>gcc 是linux里的一个编译器，将c源码文件编译成二进制文件</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"><span class="comment"># yum  install  gcc -y</span></span><br><span class="line"><span class="comment"># gcc  -o  schello  schello.c  （注1：-o  输出一个二进制文件）（注2：编译schello.c的命令）</span></span><br><span class="line"><span class="comment"># ls（↑↑注3：schello产生的文件，schello原来文件）</span></span><br><span class="line">schello  schello.c （注2：生成绿色可执行权限的文件 schello）</span><br><span class="line"><span class="comment"># ll</span></span><br><span class="line">总用量 20</span><br><span class="line">-rwxr-xr-x. 1 root root 12744 9月  18 15:12 schello</span><br><span class="line">-rw-r--r--. 1 root root    93 9月  18 15:08 schello.c</span><br><span class="line"><span class="comment"># ./schello        （注4：./ 运行）</span></span><br><span class="line"><span class="comment"># /lianxi/sc/schello  （注5：绝对路径运行，./相对路径或绝对路径都可以运行）</span></span><br><span class="line"><span class="comment"># schello 不能运行 （注6：linux不知道schello放在哪里，它只会到PATH变量里去找）</span></span><br><span class="line">-bash: schello:未找到命令 （注7：PATH变量没有当前所在路径，没有/lianxi/sc）</span><br><span class="line">（解决如下）</span><br></pre></td></tr></table></figure></blockquote><h3 id="要让-Linux-系统知道我们的命令在哪里？">要让 Linux 系统知道我们的命令在哪里？<a class="header-anchor" href="#要让-Linux-系统知道我们的命令在哪里？"></a></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><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">1.适应PATH变量，将我们的命令复制到PATH变量已有的路径下</span><br><span class="line"><span class="comment"># echo $PATH</span></span><br><span class="line">/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin</span><br><span class="line"><span class="comment"># cp  schello  /usr/local/bin/</span></span><br><span class="line"><span class="comment"># schello （注1：成功运行）</span></span><br><span class="line">hello,world</span><br><span class="line">i am cali</span><br><span class="line"><span class="comment"># which schello</span></span><br><span class="line">/usr/local/bin/schello （注2：复制到PATH变量的路径下后bash可以找到schello）</span><br><span class="line">2.修改PATH变量，添加我们自己的命令所在的路径</span><br><span class="line">①临时修改PATH变量</span><br><span class="line"><span class="comment"># PATH=/lianxi/sc:$PATH   临时修改PATH变量</span></span><br><span class="line">（注3：先引用PATH变量的值，在和/lianxi/sc:字符串拼凑在一起再赋值给PATH变量）</span><br><span class="line">（注3：<span class="variable">$PATH</span>——》/lianxi/sc:+<span class="variable">$PATH</span>重新组合——》赋值PATH变量  从右到左）</span><br><span class="line"><span class="comment"># echo $PATH</span></span><br><span class="line">/lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin</span><br><span class="line">（注4：新的PATH变量，前面多了/lianxi/sc:）</span><br><span class="line">[root@sanchuang-linux sc]# <span class="built_in">which</span> schello（注5：<span class="built_in">which</span> 可以找到）</span><br><span class="line">/lianxi/sc/schello</span><br><span class="line"><span class="comment"># schello （注6：bash可以运行）</span></span><br><span class="line">hello,world</span><br><span class="line">i am cali</span><br><span class="line">②永久有效</span><br><span class="line">修改文件，添加PATH变量，让它永久生效</span><br><span class="line"><span class="comment"># vim  /root/.bashrc  </span></span><br><span class="line">.bashrc这个文件是linux系统开机启动或者用户登录都会运行这个文件里的命令，所以才会永久有效</span><br><span class="line">PATH=/lianxi/sc:<span class="variable">$PATH</span> （注1:打进去，放到最后一行）</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><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="built_in">mkdir</span> 用C写的</span><br><span class="line"></span><br><span class="line">//<span class="comment"># yum  install  python3  -y   安装python3软件</span></span><br><span class="line">        <span class="comment"># python3 （注1：进入Python3解释器）</span></span><br><span class="line">        &gt;&gt;&gt; a = 10 （注2：提示符&gt;&gt;&gt;）</span><br><span class="line">        &gt;&gt;&gt; b = 20 （注4：Python不需要编译，Python代码直接运行，用Python解释器去解释）</span><br><span class="line">        &gt;&gt;&gt; sg = <span class="string">&quot;tangliangfei&quot;</span></span><br><span class="line">        &gt;&gt;&gt; c = a  + b</span><br><span class="line">        &gt;&gt;&gt; c</span><br><span class="line">        30</span><br><span class="line">        &gt;&gt;&gt; <span class="built_in">print</span>(sg) （注3：输出）</span><br><span class="line">        tangliangfei</span><br><span class="line">        &gt;&gt;&gt; <span class="built_in">exit</span>() （注5：<span class="built_in">exit</span>()退出出 <span class="built_in">exit</span>()是<span class="built_in">exit</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><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></pre></td><td class="code"><pre><span class="line">//扩展</span><br><span class="line">.py结尾的文件，是python程序文件</span><br><span class="line">.sh结尾，shell脚本</span><br><span class="line">.c结尾，c语言</span><br><span class="line"><span class="comment"># vim  sc_py_hello.py</span></span><br><span class="line"><span class="comment">#!/usr/bin/python3 （注1：which python3——》/usr/bin/python3）</span></span><br><span class="line">   （注2：申明脚本是Python脚本，里面的命令用Python3解释器去解释）</span><br><span class="line">username = input(<span class="string">&quot;please input your name:&quot;</span>)（注3：引号里面只是提示符，提示输什么）</span><br><span class="line">   （注4：input()函数会接收你输入的东西，赋值给username）</span><br><span class="line">age = input(<span class="string">&quot;please input your age:&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(f<span class="string">&quot;your name is &#123;username&#125; ,your age is &#123;age&#125;&quot;</span>)（注5：<span class="built_in">print</span>(f ) 语法）</span><br><span class="line">   （注6：&#123;username&#125;&#123;age&#125; 引用变量的值）</span><br><span class="line"></span><br><span class="line"><span class="comment"># ls</span></span><br><span class="line">schello  schello.c  sc_py_hello.py</span><br><span class="line"><span class="comment"># python3  sc_py_hello.py （注7：直接执行Python3，类似于bash  a.sh）</span></span><br><span class="line">please input your name:cali</span><br><span class="line">please input your age:18</span><br><span class="line">your name is cali ,your age is 18</span><br><span class="line">[root@sanchuang-linux sc]# <span class="built_in">cat</span> sc_py_hello.py </span><br><span class="line"> </span><br><span class="line"><span class="comment"># /lianxi/sc/sc_py_hello.py （注1：不能直接运行，如下 权限不够，pwd查看路径）</span></span><br><span class="line">-bash: /lianxi/sc/sc_py_hello.py: 权限不够</span><br><span class="line"><span class="comment"># chmod +x sc_py_hello.py （注2：给它可执行权限）</span></span><br><span class="line"><span class="comment"># /lianxi/sc/sc_py_hello.py （注3：可以直接执行了）</span></span><br><span class="line">please input your name:wangtc</span><br><span class="line">please input your age:18</span><br><span class="line">your name is wangtc ,your age is 18</span><br><span class="line"></span><br><span class="line">//怎样让sc_py_hello.py 在PATH变量里运行</span><br><span class="line">    <span class="comment"># which  sc_py_hello.py （注1：能运行，因为之前在PATH变量里已经添加这个路径了(/lianxi/sc)）</span></span><br><span class="line">    <span class="comment"># sc_py_hello.py （注2：能运行，因为之前在PATH变量里已经添加这个路径了(/lianxi/sc)）</span></span><br><span class="line">    <span class="comment"># echo  $PATH</span></span><br><span class="line">    /lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin</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><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><br><span class="line">1.把它放到PATH变量所在的路径里面，并2.给它可执行权限 就能直接运行</span><br><span class="line">   <span class="comment"># chmod  -x  sc_py_hello.py （注3：取消可执行权限）</span></span><br><span class="line">   <span class="comment"># sc_py_hello.py  （注4：不给它可执行权限，路径放在PATH变量所在的路径下，也不能直接执行）</span></span><br><span class="line">-bash:  /lianxi/sc/sc_py_hello.py： 权限不够</span><br><span class="line"> 总结：写的Python程序，一定要1.给它可执行权限，并2.把它放到PATH变量所在路径下面，不然不能执行</span><br><span class="line">   //扩展  （注2:总结:文件名字很长，想敲个短一点的命令，考虑用别名 [快捷键]）</span><br><span class="line">   <span class="comment"># alias sc_py_hello=sc_py_hello.py   定义别名，可以缩短命令的长度</span></span><br><span class="line">   <span class="comment"># sc_py_hello（注1：不想输这么长，可以使用别名，别名可以用来偷懒）</span></span><br><span class="line">   please input your name:feng （运行成功，条件是在PATH变量路径下和可执行权限，如上面的操作）</span><br><span class="line">   please input your age:19</span><br><span class="line">   your name is feng ,your age is 19</span><br><span class="line">   <span class="comment"># which sc_py_hello</span></span><br><span class="line">   <span class="built_in">alias</span> sc_py_hello=<span class="string">&#x27;sc_py_hello.py&#x27;</span></span><br><span class="line">/lianxi/sc/sc_py_hello.py</span><br></pre></td></tr></table></figure><hr><h2 id="十六-bash">十六. bash<a class="header-anchor" href="#十六-bash"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">//bash 是linux非常好的shell解析器 （注1：2件事要做）</span><br><span class="line">1.查找命令 --》PATH变量的路径下</span><br><span class="line">2.告诉内核去启动命令（运行这个命令）</span><br></pre></td></tr></table></figure><hr><h2 id="十七-usr">十七. /usr<a class="header-anchor" href="#十七-usr"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">// /usr  存放linux程序的目录   unix  system  resource </span><br><span class="line">    /usr/bin  存放二进制程序，所有的用户都可以使用  binary</span><br><span class="line">    /usr/sbin   存放二进制程序，有比较高的权限（root）的用户执行的程序  super user binary</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><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># which  useradd（注1：查找useradd命令路径）</span></span><br><span class="line">/usr/sbin/useradd （注2：存放在sbin目录下）</span><br><span class="line"><span class="comment"># su  -  xulilin （注3：切换为普通用户）</span></span><br><span class="line">$ <span class="built_in">which</span>  useradd</span><br><span class="line">$ /usr/sbin/useradd</span><br><span class="line">$ useradd  xu123 （注4：普通用户不能执行sbin/下高级别命令）</span><br><span class="line">……报错useradd:Permission denied （注5：权限被拒绝）</span><br></pre></td></tr></table></figure><hr><h2 id="十八-locate">十八. locate<a class="header-anchor" href="#十八-locate"></a></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></pre></td><td class="code"><pre><span class="line">//locate 知识点（注4：需要安装）（注5经常需要更新# updatedb）</span><br><span class="line"><span class="comment"># yum provides locate -y  查询locate是哪个软件包提供的（注1：新知识点）</span></span><br><span class="line">mlocate-0.26-20.el8.x86_64 : An utility <span class="keyword">for</span> finding files by name</span><br><span class="line">（注3：yum  provides …… -y 查询某命令是哪个软件包提供的）</span><br><span class="line">（注2：从结果知道 mlocate提供locate命令）</span><br><span class="line"><span class="comment"># yum install  mlocate -y 安装mlocate软件</span></span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">locate命令</span><br><span class="line">格式：locate 文件名</span><br><span class="line">（注5：locate是到自己的数据库查找的，能具体到/下面，且必须更新自己的数据库）</span><br><span class="line">根据每天更新的数据库(/var/lib/mlocate)查找，速度块</span><br><span class="line">/var/lib/mlocate/mlocate.db</span><br><span class="line">database  数据库（注6：db的解释）</span><br><span class="line">数据库里的内容还是根据/目录下的内容生成</span><br><span class="line">每天会自动更新数据库/var/lib/mlocate/mlocate.db</span><br><span class="line">手动更新数据库updatedb</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><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="comment"># updatedb   生成和更新数据库mlocate.db （注1：手动更新）</span></span><br><span class="line"><span class="comment"># cd /var/lib/mlocate/</span></span><br><span class="line"><span class="comment"># ls</span></span><br><span class="line">mlocate.db</span><br><span class="line"><span class="comment"># locate mkdir（注2：将linux系统里面文件名里面包含了mkdir的文件全部找出来）</span></span><br><span class="line">/usr/bin/mkdir</span><br><span class="line">/usr/lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py</span><br><span class="line">/usr/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.opt-1.pyc</span><br><span class="line">/usr/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc</span><br><span class="line">/usr/share/man/man1/mkdir.1.gz</span><br><span class="line"><span class="comment"># which mkdir（注3：只是找到/usr下的mkdir，其他地方的mkdir没找出来）</span></span><br><span class="line">/usr/bin/mkdir</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">locate查找的范围：</span><br><span class="line">/--》mlocate.db里去查找（注2：在 根下面自己的数据库mlocate.db下面去查找）</span><br><span class="line">方式：模糊查找，文件名里包含就可以</span><br><span class="line">缺点：新的文件，有时候找不到，因为没有更新数据库   --》updatedb（注3：手动更新）</span><br><span class="line">可以查找任何文件（注4：新建的文件，# updatedb手动更新数据库，否则找不到）</span><br><span class="line">which 查找的范围：PATH变量</span><br><span class="line">方式：精确查找（注1：文件名必须一模一样）</span><br><span class="line">只能查找命令</span><br></pre></td></tr></table></figure><h3 id="which、whereis、locate、find">which、whereis、locate、find<a class="header-anchor" href="#which、whereis、locate、find"></a></h3><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">//which、whereis、locate、find 命令查找类</span><br><span class="line">        Which、whereis  只能找命令</span><br><span class="line">        loacte  也可以查找普通文件、可以查找任何文件</span><br></pre></td></tr></table></figure><hr><h2 id="十九-find">十九. find<a class="header-anchor" href="#十九-find"></a></h2><blockquote><p>//*find命令</p><p>​ 格式：find  [查找范围]  [查找条件] [动作]</p><p>​find 可以找1.命令、2.文件 （即任何文件）</p><p>​ （注1：融合了which、whereis、locate所有功能）</p><p>​find命令</p><p>​用途：用于查找文件或目录</p><p>​格式：find  [查找范围]  [查找条件] [动作]</p><p>​常用查找条件</p><p>​<mark>-name</mark>：按文件名称查找</p><p>​<mark>-iname</mark>：按文件名称查找,不区分大小写</p><p>​<mark>-size</mark>：  按文件大小查找</p><p>​-user：  按文件属主查找</p><p>​<mark>-type</mark>：  按文件类型查找</p><p>​-perm ：按文件权限查找</p><p>​<mark>-mtime</mark> ：按文件更改时间查找</p><p>​-newer：按比某个文件更新的查找</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><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">-name和-iname</span><br><span class="line">    <span class="comment"># find /lianxi  -name &quot;lixh.txt&quot;（注1：精确查找，-name根据文件名来）</span></span><br><span class="line">    /lianxi/lixh.txt</span><br><span class="line">    <span class="comment"># find  / -name  &quot;schello&quot;（注2：精确查找，可以/下查找）</span></span><br><span class="line">    /lianxi/sc/schello</span><br><span class="line">    <span class="comment"># find  / -name  &quot;schello*&quot;（注3：*模糊查找，可以/下查找）</span></span><br><span class="line">    /lianxi/sc/schello.c</span><br><span class="line">    /lianxi/sc/schello</span><br><span class="line">    <span class="comment"># find  / -name  &quot;li*.txt&quot;（注4：*模糊查找）</span></span><br><span class="line">    <span class="comment"># find  / -iname  &quot;lixh.txt&quot; （注5：-iname 查找的文件名不区分大小写）</span></span><br><span class="line">    /lianxi/lixh.txt</span><br><span class="line">    /lianxi/LIXH.TXT</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><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">-size （大小）</span><br><span class="line">    <span class="comment"># ll  -h  看文件夹下的每个文件的大小</span></span><br><span class="line">    <span class="comment"># du  -a 查看文件夹下的每个文件的大小（单位KB）</span></span><br><span class="line">     <span class="built_in">du</span>  -ah  查看文件夹下的每个文件的大小 （单位K、M、G）</span><br><span class="line">    <span class="comment"># find  /boot  -size  +1M（注1：+1M 大于1M的 全部找出来）（注2：-1M、1M：小于1M，等于1M）</span></span><br><span class="line">    /boot/grub2/fonts/unicode.pf2  （注3:查找的结果不是特别精准）</span><br><span class="line">    /boot/initramfs-4.18.0-193.el8.x86_64kdump.img</span><br><span class="line">    /boot/initramfs-4.18.0-193.el8.x86_64.img</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><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">-<span class="built_in">type</span> （类型）</span><br><span class="line">    <span class="comment"># find  .  -type  d （注1：查找目录）</span></span><br><span class="line">    <span class="comment"># find  .  -type  f （注2：查找普通文件）</span></span><br><span class="line">    <span class="comment"># find  .  -type  l （注3：链接文件）</span></span><br><span class="line">    <span class="comment"># find  .  -type  c （注4：字符设备文件）</span></span><br><span class="line">    <span class="comment"># find  .  -type  b （注5：块设备文件）</span></span><br><span class="line">    <span class="comment"># find  .  -type  p （注6：管道文件）</span></span><br><span class="line">    <span class="comment"># find  .  -type  s （注7：socket文件）（进程与进程通信的文件）</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">-mtime （以24小时为单位） 按文件更改时间查找</span><br><span class="line">-mmin  （以分钟为单位）</span><br><span class="line">    <span class="comment"># find  .  -time  +1  1天以前</span></span><br><span class="line">    <span class="comment"># find  .  -time  -1  1天以内</span></span><br><span class="line">    <span class="comment"># find  .  -mmin  -30  30分钟以内</span></span><br><span class="line">    <span class="comment"># find  .  -mmin  +30  30分钟以前</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></pre></td><td class="code"><pre><span class="line">-user （属于哪个用户创建的文件）（用处不大）</span><br><span class="line">    <span class="comment"># find  .  -user  root</span></span><br><span class="line">    <span class="comment"># find  /  -user  cali</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></pre></td><td class="code"><pre><span class="line">-newer （比指定文件更新的文件，后建的文件）</span><br><span class="line"><span class="comment"># find  .  -newer  feng.txt</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><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></pre></td><td class="code"><pre><span class="line">//特殊查找条件</span><br><span class="line">-o ：逻辑或，只要所给的条件中有一个满足，寻找条件就算满足 or</span><br><span class="line">-not :逻辑非，在命令中可用“!”表示。该运算符表示查找不满足所给条件的文件</span><br><span class="line">-a：逻辑与，系统默认是与，可不加，表示只有当所给的条件都满足时，寻找条件才算满and</span><br><span class="line"></span><br><span class="line">  find  /boot -size +1024k  -a -name “vmlinuz*”（注1：逻辑与 -a可不加，系统默认逻辑与）</span><br><span class="line">  find  /boot -size +1024k  -o -name “vmlinuz*”</span><br><span class="line">  find  .  -user nie  -<span class="built_in">type</span> f   -size  +1k  -o  -name  <span class="string">&quot;vmlinuz*&quot;</span> </span><br><span class="line">  find  .  -user nie  -<span class="built_in">type</span> f  \( -size +1k -o -name <span class="string">&quot;vmlinuz*&quot;</span> \)  （注3：()改变了优先级,\解释在下方）（注5：\(  \)即()  改变了优先级）</span><br><span class="line">  find   /home  ！-user  hello  -<span class="built_in">exec</span>  <span class="built_in">ls</span>  -ld  &#123;&#125;  \;</span><br><span class="line">\  转义字符 （注2：因为小括号()有特殊作用，接上/以后让它表示只是小括号）</span><br><span class="line">默认情况下-a的优先级高，先执行逻辑与（-a），再执行逻辑或（-o）</span><br><span class="line"><span class="comment"># find  / -iname &quot;*.conf&quot;  -size +1k  -type f  -user root -o -size +10M</span></span><br><span class="line">（注4：前面先组合成一个条件，要么满足-o前面的，要么满足-o后面的条件）</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><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="built_in">exec</span> 和 -ok</span><br><span class="line">  <span class="comment"># find  /lianxi  -name  &quot;li*.txt&quot;  -exec  rm -rf  &#123;&#125;  \;（注1：前面是查找，-exec表示要执行的动作）相关解释如下</span></span><br><span class="line">    -<span class="built_in">exec</span>  执行后面的命令</span><br><span class="line">    <span class="built_in">rm</span> -rf  具体删除命令</span><br><span class="line">    &#123;&#125; 代表前面的find查找出来的内容，理解为一个容器存放前面find查找到的内容</span><br><span class="line">    \; 表示find命令结束符号</span><br><span class="line">    <span class="comment"># find /lianxi -name &quot;*.txt&quot;  -size +1k  -type f  -exec cp &#123;&#125; /fengdeyong \;</span></span><br><span class="line">    （注2：文件名.txt结尾的，大小大于1k的，文件，拷贝到fengdeyong里面）</span><br><span class="line">    （注3：find 找/lianxi 下的每一层）</span><br><span class="line">    -ok</span><br><span class="line">    -ok 让你确认一下，再执行</span><br><span class="line">    <span class="comment"># find . -name &quot;*wang*&quot; -ok rm -rf &#123;&#125; \;</span></span><br><span class="line">    &lt; <span class="built_in">rm</span> ... ./wangtc.txt &gt; ? y</span><br><span class="line">    &lt; <span class="built_in">rm</span> ... ./tang_wang.txt &gt; ? y</span><br><span class="line"></span><br><span class="line">总结：-<span class="built_in">exec</span>执行命令，不给与确认（写脚本常用，方便）</span><br><span class="line"> -ok 执行命令，需要确认</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><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></pre></td><td class="code"><pre><span class="line">-maxdepth  查找文件时，目录的深度</span><br><span class="line">    <span class="comment"># find  .  -name  bb</span></span><br><span class="line">    ./aa/bb</span><br><span class="line">    ./aa/bb/bb</span><br><span class="line">    ./bb</span><br><span class="line">    <span class="comment"># find  .  -maxdepth  1  -name  bb（注2：只挖1级）</span></span><br><span class="line">    ./bb</span><br><span class="line">    <span class="comment"># find  .  -maxdepth  2  -name  bb（注3：只挖2级）</span></span><br><span class="line">    ./aa/bb</span><br><span class="line">    ./bb</span><br><span class="line">    <span class="comment"># find  .  -maxdepth  3  -name  bb（注4：只挖3级）</span></span><br><span class="line">    ./aa/bb</span><br><span class="line">    ./aa/bb/bb</span><br><span class="line">    ./bb</span><br><span class="line">    （注1：不接-maxdepth的话，有多少层挖多少层）</span><br><span class="line">    <span class="comment"># find /lianxi  -name  &quot;*.txt&quot;</span></span><br><span class="line">    （注6：不接-maxdepth，东西太多了，挖的太深了）</span><br><span class="line">    /lianxi/tangliangfei.txt</span><br><span class="line">    /lianxi/chenpeng.txt</span><br><span class="line">    /lianxi/cali.txt</span><br><span class="line">    /lianxi/feng.txt</span><br><span class="line">    /lianxi/aa/bb/feng.txt</span><br><span class="line">    /lianxi/aa/feng.txt</span><br><span class="line">    <span class="comment"># find /lianxi -maxdepth 1 -name  &quot;*.txt&quot;</span></span><br><span class="line">    （注5：这种情况用的多，只想找1层的，只挖/lianxi下面的，子文件夹、子子文件夹下面都不要）</span><br><span class="line">    /lianxi/tangliangfei.txt（注7：显示如下）</span><br><span class="line">    /lianxi/chenpeng.txt</span><br><span class="line">    /lianxi/cali.txt</span><br><span class="line">    /lianxi/feng.txt</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><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">//！取反 的使用，接上面的命令（注1：lianxi下面的不是*.txt的）</span><br><span class="line">    <span class="comment"># find  /lianxi  -maxdepth  1  !  -name  &quot;*.txt&quot;（只对后面的条件取反）</span></span><br><span class="line">    /lianxi</span><br><span class="line">    /lianxi/passwd</span><br><span class="line">    /lianxi/first_shell.sh</span><br><span class="line">    /lianxi/messages</span><br><span class="line">    /lianxi/sc</span><br><span class="line">    /lianxi/LIXH.TXT</span><br><span class="line">    /lianxi/aa</span><br><span class="line">    /lianxi/bb</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>03_Linux基础-文件类型-主辅提示符-第1提示符-3个时间-stat-其他基础命令</title>
      <link href="/posts/43225.html"/>
      <url>/posts/43225.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-stat-与-ll">一. stat 与 ll<a class="header-anchor" href="#一-stat-与-ll"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">//stat 与 ll stat 只能看自己。 ll能看文件夹下面的东西。</span><br><span class="line">//选项组合（不分先后顺序）  如  ls  -Al  （2个功能一起显示）</span><br><span class="line">//du  -sh统计文件和文件夹大小</span><br><span class="line">//mkdir  -p如果父目录不存在，就新建</span><br><span class="line">如果文件夹存在，就不报错</span><br><span class="line">    //写脚本经常用到</span><br><span class="line">    -v给提醒（显示已经创建成功）（没什么用）</span><br></pre></td></tr></table></figure><h3 id="stat-与-ll-与-ls-l-d">stat 与 ll 与 ls -l -d<a class="header-anchor" href="#stat-与-ll-与-ls-l-d"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//stat 与 ll 与 ls  -l  -d</span><br><span class="line">stat 只能看本身的文件信息（文件夹本身）</span><br><span class="line">ll能看文件夹下面的东西（文件夹里面的）</span><br><span class="line">ls  -l  -d 只看它自己的详细信息 不看里面的（文件夹本身）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101921976.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101921851.png" alt=""></p><hr><h2 xx,xxx="" id="二-集合">二. 集合<a class="header-anchor" href="#二-集合"></a></h2><h3 id="1条命令建多个文件夹">1条命令建多个文件夹<a class="header-anchor" href="#1条命令建多个文件夹"></a></h3><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">#注：关键点&#123;&#125;</span><br><span class="line">//mkdir  hunantv/&#123;weishi,jingshi,dushi&#125;一条命令建多个文件夹</span><br><span class="line">在 China_voice路径下建 hunantv文件夹下的 文件夹（hunantv在 China_voice下）</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;weishi,jingshi,dushi&#125; 表示一个集合，有共同的上一级目录</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101918842.png" alt=""></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">只建一个文件夹的时候，不能用 &#123; &#125; 括起来，&#123; &#125; 会成为文件名。</span><br><span class="line">//一条命令完成（日常用的不多）里面有好几级</span><br><span class="line">父目录不存在时候  接 -p  选项</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101918797.png" alt=""></p><hr><h2 id="三-1-100">三. {1..100}<a class="header-anchor" href="#三-1-100"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">#注：mkdir sc&#123;1..100&#125;</span><br><span class="line">#注：rm  -rf  sc&#123;1..100&#125;</span><br><span class="line">//mkdir sc&#123;1..100&#125;产生1到100的文件</span><br><span class="line">&#123;1..100&#125; 代表 1 到 100的集合 和前面的sc 组合</span><br><span class="line">mkdir  可以一次性建立多个  的功能</span><br><span class="line">//rm  -rf  sc&#123;1..100&#125;</span><br><span class="line">rm  -rf  sc*  2种都能删</span><br><span class="line">//mandatory 命令的</span><br><span class="line">arguments 参数</span><br><span class="line">//mkdir  -p如果父目录不存在，就新建</span><br><span class="line">如果文件夹存在，就不报错</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101920498.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101920800.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//mkdir  -v给提醒</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101920641.png" alt=""></p><hr><h2 id="四-du-sh">四. du -sh<a class="header-anchor" href="#四-du-sh"></a></h2><figure class="highlight plaintext"><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">//du  -sh  查看目录大小</span><br><span class="line">命令  选项  参数</span><br></pre></td></tr></table></figure><hr><h2 id="五-cd">五. cd<a class="header-anchor" href="#五-cd"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">//cd  -  返回上一次所在的路径</span><br><span class="line">cd  .  进入当前目录</span><br><span class="line">cd  ..  返回到上一级目录</span><br><span class="line">cd  ~  返回到当前用户的家目录</span><br><span class="line">cd    返回到当前用户的家目录</span><br><span class="line">cd命令</span><br><span class="line">用途：切换工作目录（Change Directory）</span><br><span class="line">格式：cd  [目录位置]</span><br><span class="line">#注：特殊目录 </span><br><span class="line">.     当前目录</span><br><span class="line">..     上一级目录</span><br><span class="line">~     用户主目录（家目录）</span><br><span class="line">-     上一次所在的工作目录（遥控器上的返回键）</span><br><span class="line">//useradd  xulilin  新建用户</span><br><span class="line">cd  ~xulilin  进入xulilin这个用户的家目录</span><br><span class="line">[root@localhost xulilin]# pwd</span><br><span class="line">/home/xulilin</span><br><span class="line">//mkdir新建目录</span><br><span class="line">touch  qijian新建空文件</span><br><span class="line">touch  hengshan/yilin.txt</span><br></pre></td></tr></table></figure><hr><h2 id="六-cp-r">六. cp -r<a class="header-anchor" href="#六-cp-r"></a></h2><figure class="highlight plaintext"><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">//cp  /etc/hosts  songshan/复制文件不接 -r</span><br><span class="line">cp  hengshan/  songsahn/  -r  复制文件夹接 -r</span><br></pre></td></tr></table></figure><hr><h2 id="七-file">七. file<a class="header-anchor" href="#七-file"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//file  taishan  查看文件类型</span><br></pre></td></tr></table></figure><hr><h2 id="八-文件类型">八. 文件类型<a class="header-anchor" href="#八-文件类型"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">//经典文件类型：目录directory</span><br><span class="line">空文件empty</span><br><span class="line">文本文件text</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101925631.png" alt=""></p><figure class="highlight plaintext"><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">//du  -sh  taishan/  查看文件大小</span><br><span class="line">//rm  -rf  tianshan/  删除</span><br></pre></td></tr></table></figure><hr><h2 id="九-cp">九. cp<a class="header-anchor" href="#九-cp"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//cp复制的时候：</span><br><span class="line">复制，粘贴，重命名一步到位（重命名要后面不存在）</span><br><span class="line">cp  a.txt  abc.txt （目录下有2个文件 a.txt  abc.txt）</span><br><span class="line">cp  a.txt  songshan/feng.txt （复制到songshan下改名叫feng.txt）</span><br><span class="line">cp  hengshan/  songshan/nanyue_hs  -r（复制文件夹接-r）</span><br><span class="line">复制hengshan到songshan下 改名nanyue_hs</span><br></pre></td></tr></table></figure><hr><h2 id="十-mv">十. mv<a class="header-anchor" href="#十-mv"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//mv剪切，粘贴，重命名一步到位（重命名要后面不存在）</span><br><span class="line">mv  a.txt  hengshan/aaa.txt （剪切粘贴，重命名为aaa.txt）</span><br><span class="line">mv  songshan/  hengshan/shaolinshi （移动粘贴重命名为shaolinshi）</span><br><span class="line">移动重命名不需要接-r选项（与 cp 的不同点）</span><br></pre></td></tr></table></figure><hr><h2 id="十一-主辅提示符">十一. 主辅提示符<a class="header-anchor" href="#十一-主辅提示符"></a></h2><figure class="highlight plaintext"><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><br><span class="line">[登录用户@主机名 工作目录]</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">辅助提示符</span><br><span class="line">#  $</span><br><span class="line"> [root@localhost xuxia]#</span><br><span class="line">[root@localhost wuxia]# </span><br><span class="line">[xulilin@localhost ~]$ </span><br><span class="line">//linux是一个多用户多任务的操作系统</span><br><span class="line">root用户家目录  /root</span><br><span class="line">普通用户家目录/home下面跟用户名同名</span><br></pre></td></tr></table></figure><hr><h2 id="十二-echo">十二. echo<a class="header-anchor" href="#十二-echo"></a></h2><figure class="highlight plaintext"><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">//echo  输出  相当于print</span><br><span class="line">PS1 是linux系统里内置的一个变量，不需要我们定义</span><br></pre></td></tr></table></figure><hr><h2 id="十三-第1提示符">十三. 第1提示符<a class="header-anchor" href="#十三-第1提示符"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">第1提示符变量 PS1   prompt symbol 提示 符号 variable 变量</span><br></pre></td></tr></table></figure><h3 id="u-h-W-解释">[\u@\h \W]$解释<a class="header-anchor" href="#u-h-W-解释"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">//# echo $PS1# 注：第一提示符</span><br><span class="line">[\u@\h \W]\$</span><br><span class="line">解释：</span><br><span class="line">\u  引用当前的用户  user</span><br><span class="line">   \u  the username of the current user</span><br><span class="line">\h  引用当前的主机名   hostname</span><br><span class="line">\W 引用当前工作的目录的名字  working</span><br><span class="line">\$  当用户为root的时候，就输出#,如果不是root就是$符号</span><br><span class="line">\t  当前的时间</span><br></pre></td></tr></table></figure><h3 id="临时修改PS1变量">临时修改PS1变量<a class="header-anchor" href="#临时修改PS1变量"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//# PS1=&#x27;[\h@\u \t@\W]\$&#x27;  临时修改PS1变量（没必要改知道就行）\t 当前的时间</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></pre></td><td class="code"><pre><span class="line">[localhost@root 11:01:07@~]#</span><br><span class="line">[localhost@xulilin 11:03:08@boot]<span class="variable">$PS1</span>=<span class="string">&#x27;[\h#\u \t@\W]\$&#x27;</span></span><br><span class="line">[localhost#xulilin 11:03:32@boot]$  // <span class="comment"># 也可以</span></span><br></pre></td></tr></table></figure><h3 id="第1、2提示符">第1、2提示符<a class="header-anchor" href="#第1、2提示符"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">//# echo  $PS1</span><br><span class="line">[\u@\h \W]\$</span><br><span class="line"># echo  $PS2   第2提示符</span><br><span class="line">&gt;</span><br><span class="line">//一行没输完  会显示第2提示符&gt;（只是提醒的作用）</span><br></pre></td></tr></table></figure><hr><h2 id="十四-变量名">十四. $+变量名<a class="header-anchor" href="#十四-变量名"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$PS1  $+变量名  引用某个变量</span><br><span class="line">//# echo  $PS1</span><br><span class="line">[\u@\h \W]\$</span><br><span class="line">//sg=&quot;tangliangfei&quot;  定义一个变量sg 赋值tangliangfei 右边赋值左边</span><br><span class="line">echo $sg  输出sg这个变量的值</span><br><span class="line">shell编程里引用变量需要接$+变量名</span><br><span class="line">Shell编程  linux里的命令编程</span><br><span class="line">//mv=&quot;liangly&quot;</span><br><span class="line">echo $sg  $mv</span><br><span class="line">tangliangfei liangly  （都显示）</span><br></pre></td></tr></table></figure><hr><h2 id="十五-id">十五. id<a class="header-anchor" href="#十五-id"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//id  命令</span><br><span class="line">[root@localhost china_voice]# id  </span><br><span class="line">uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023</span><br><span class="line">root用户 uid 为0</span><br><span class="line">user id 用户的编号 uid</span><br><span class="line">group id 组的编号  gid</span><br></pre></td></tr></table></figure><hr><h2 id="十六-Linux命令">十六. Linux命令<a class="header-anchor" href="#十六-Linux命令"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">//Linux命令</span><br><span class="line">用于实现某一类功能的指令或程序 </span><br><span class="line">命令的执行依赖于解释器程序（例如：/bin/bash）</span><br><span class="line">//人 &lt;——&gt; bash &lt;——&gt; 内核 &lt;——&gt; 硬件</span><br><span class="line">bash  就是解释器  相当于翻译 C语言写的 程序 工具</span><br><span class="line">Linux命令的分类</span><br><span class="line">内部命令：属于Shell解释器的一部分</span><br><span class="line">外部命令：独立于Shell解释器之外的程序文件</span><br><span class="line">//shell：是一类程序，用来解释用户输入的命令，然后告诉内核去执行这些命令</span><br><span class="line">bsh</span><br><span class="line">sh</span><br><span class="line">csh</span><br><span class="line">bash</span><br><span class="line">ksh</span><br><span class="line">bash是最流行的shell--》几乎所有的linux系统默认的shell都是bash</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101946989.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">人——BASH——kernel</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101946345.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">（大概了解）</span><br></pre></td></tr></table></figure><hr><h2 id="十七-cat-etc-shells">十七. cat /etc/shells<a class="header-anchor" href="#十七-cat-etc-shells"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">//cat /etc/shells  查看本机里有哪些shell</span><br><span class="line">/bin/sh   比较老的shell</span><br><span class="line">/bin/bash  </span><br><span class="line">/usr/bin/sh</span><br><span class="line">/usr/bin/bash</span><br><span class="line">//sh  敲sh，使用sh，没有提示符，退出去 敲bash 或者 exit （父子进程）</span><br><span class="line">//切换shell  sh  和  bash  命令  exit</span><br></pre></td></tr></table></figure><hr><h2 id="十八-ln-s">十八. ln -s<a class="header-anchor" href="#十八-ln-s"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">#注：链接文件 天蓝色</span><br><span class="line">//ln  -s</span><br><span class="line">ln  创建链接文件（快捷方式）</span><br><span class="line">不要去删除原文件，不然会导致链接文件不可用 (一闪一闪 冒红)</span><br><span class="line">ln  -s  源文件  链接文件ln  -s  xulilin  xll</span><br><span class="line">-s  symbol link 符号链接（软链接 soft）</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># mkdir changsha</span></span><br><span class="line"><span class="comment"># ln -s  changsha cs  </span></span><br><span class="line"><span class="comment"># ll</span></span><br><span class="line">lrwxrwxrwx. 1 root root  8 9月  17 11:19 cs -&gt; changsha </span><br></pre></td></tr></table></figure><hr><h2 id="十九-echo-SHELL">十九. echo $SHELL<a class="header-anchor" href="#十九-echo-SHELL"></a></h2><figure class="highlight plaintext"><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">//# echo $SHELL 查看linux系统里默认的shell</span><br><span class="line">/bin/bash</span><br></pre></td></tr></table></figure><hr><h2 id="二十-env">二十. env<a class="header-anchor" href="#二十-env"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">//# env  查看当前用户的环境变量（linux系统里预先定义的变量）  environment</span><br><span class="line">当前用户的很多进程都可以使用的变量</span><br><span class="line">环境变量--》全局变量</span><br></pre></td></tr></table></figure><hr><h2 id="二一-set">二一. set<a class="header-anchor" href="#二一-set"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># set  查看所有的变量（自定义变量和环境变量）</span><br></pre></td></tr></table></figure><hr><h2 id="二二-内部外部命令">二二. 内部外部命令<a class="header-anchor" href="#二二-内部外部命令"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//bash - GNU Bourne-Again SHell</span><br><span class="line">BASH_BUILTINS  builtin 内置（内部）  built in</span><br><span class="line">额外安装的命令--》外部命令</span><br><span class="line">通过安装bash这个程序就可以得到的命令--》bash的内部命令</span><br><span class="line">yum  install tree -ytree命令是外部命令，需要额外安装</span><br><span class="line">mkdir ip 外部命令  cd echo exit 内部命令</span><br></pre></td></tr></table></figure><hr><h2 id="二三-which">二三. which<a class="header-anchor" href="#二三-which"></a></h2><figure class="highlight plaintext"><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">//which bash  查看bash命令存放在哪里</span><br><span class="line">/usr/bin/bash</span><br></pre></td></tr></table></figure><hr><h2 id="二四-rpm">二四. rpm<a class="header-anchor" href="#二四-rpm"></a></h2><h3 id="rpm-qf">rpm -qf<a class="header-anchor" href="#rpm-qf"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">#注：rpm -qf查询命令通过那个软件包安装过来的</span><br><span class="line">#注：先用which 查看命令的绝对路径</span><br><span class="line">//rpm -qf /usr/bin/bash  查询/usr/bin/bash是通过哪个软件包安装过来的</span><br><span class="line">bash-4.4.19-10.el8.x86_64</span><br></pre></td></tr></table></figure><h3 id="rpm">rpm<a class="header-anchor" href="#rpm"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">//rpm 是linux里的软件管理的命令，例如安装，卸载软件</span><br><span class="line">-qf 查询文件是通过那个软件安装过来的</span><br><span class="line">//# which ip</span><br><span class="line">/usr/sbin/ip</span><br><span class="line"># rpm -qf /usr/sbin/ip</span><br><span class="line">iproute-5.3.0-1.el8.x86_64</span><br><span class="line">//bin  二进制 binary  </span><br></pre></td></tr></table></figure><hr><h2 id="二五-usr">二五. /usr<a class="header-anchor" href="#二五-usr"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#注：/usr存放安装软件的目录unix system resource</span><br><span class="line">///usr   是linux里存放安装软件的目录   unix system resource  unix 系统资源</span><br><span class="line">相当于windows里的Program Files</span><br><span class="line">//链接文件 浅蓝色</span><br><span class="line">正常文件 深蓝色</span><br><span class="line">///  根目录</span><br><span class="line">/root    root用户的家目录</span><br><span class="line">/home/用户名同名的目录   普通用户的家目录</span><br></pre></td></tr></table></figure><hr><h2 id="二六-与-root关系">二六. / 与 /root关系<a class="header-anchor" href="#二六-与-root关系"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//根目录和root用户的家目录的关系？</span><br><span class="line">/root  在/目录下，是包含关系</span><br><span class="line">//~ 代表家目录，当你所在的文件夹的路径是家目录，就会显示 ~</span><br><span class="line">普通用户只能进自己家目录，root用户能进任何家目录↓↓↓</span><br></pre></td></tr></table></figure><h3 id="进入其他用户家目录">进入其他用户家目录<a class="header-anchor" href="#进入其他用户家目录"></a></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></pre></td><td class="code"><pre><span class="line">[xulilin@localhost /]$ <span class="built_in">cd</span> ~xulilin<span class="comment"># 注：普通用户只能进自己家目录</span></span><br><span class="line">[xulilin@localhost ~]$ <span class="built_in">cd</span> ~cali</span><br><span class="line">-bash: <span class="built_in">cd</span>: /home/cali: 权限不够</span><br><span class="line">[xulilin@localhost ~]$ <span class="built_in">exit</span></span><br><span class="line">注销</span><br><span class="line">[root@localhost ~]# <span class="built_in">cd</span>  ~cali</span><br><span class="line">[root@localhost cali]# <span class="built_in">pwd</span></span><br><span class="line">/home/cali</span><br><span class="line">[root@localhost cali]# </span><br></pre></td></tr></table></figure><hr><h2 id="二七-hostname">二七. hostname<a class="header-anchor" href="#二七-hostname"></a></h2><figure class="highlight plaintext"><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">//# hostname 查看主机名</span><br><span class="line">localhost.localdomain</span><br></pre></td></tr></table></figure><h3 id="临时、永久修改主机名">临时、永久修改主机名<a class="header-anchor" href="#临时、永久修改主机名"></a></h3><h3 id="临时修改">临时修改<a class="header-anchor" href="#临时修改"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//# hostname  sanchuang-linux  临时修改主机名（不能用下划线_）</span><br><span class="line">接着重新登录 su - root（当前终端登录）/ 或者重新建立一个连接（开一个终端登录） 重启后失效</span><br><span class="line">//为什么要修改主机名？</span><br><span class="line">方便识别，区别不同的服务器</span><br></pre></td></tr></table></figure><h3 id="永久修改">永久修改<a class="header-anchor" href="#永久修改"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">//*永久修改主机名</span><br><span class="line"># vim  /etc/hostname  改这个文件，打个新名字。</span><br><span class="line"># cat  /etc/hostname </span><br><span class="line">sanchuang-linux</span><br><span class="line">重启后生效</span><br><span class="line">//reboot  重启</span><br><span class="line">//不一定非得 虚拟机 登录后 xshell才能登录</span><br><span class="line">//提示符</span><br><span class="line">PS1第一提示符</span><br><span class="line">PS2第二提示符</span><br></pre></td></tr></table></figure><hr><h2 id="二八-vim">二八. vim<a class="header-anchor" href="#二八-vim"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">//vim编辑器的使用</span><br><span class="line">vim 是linux里的字符界面的文本编辑器 ——》记事本  只能写文字</span><br><span class="line">安装vimyum   install  vim  -y</span><br><span class="line">//vim  sc.txt</span><br><span class="line">1.按字母键i进入输入模式  insert</span><br><span class="line">2.输入内容，可以是中文或者英文</span><br><span class="line">3.按ESC键，返回到命令模式  escape 离开，逃离</span><br><span class="line">4.输入:wq  退出并且保存  write  quit</span><br><span class="line">  :q!  退出不保存</span><br><span class="line">  :q  退出（没有修改可以退出）</span><br></pre></td></tr></table></figure><hr><h2 id="二九-cat">二九. cat<a class="header-anchor" href="#二九-cat"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//# cat  sc.txt   查看文本文件里的内容</span><br></pre></td></tr></table></figure><hr><h2 id="三十-快捷键">三十. 快捷键<a class="header-anchor" href="#三十-快捷键"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">//快捷键</span><br><span class="line">//ctrl + l</span><br><span class="line">//ctrl + c强行终止命令  # ^ C</span><br><span class="line">比如 ping  www.baidu.com  ctrl + c</span><br><span class="line">//tab补齐命令  # mkd （之后按2下tab键）mkd开头的命令都列出来了</span><br><span class="line">补齐路径  # mkdir wang 唯一性就直接补齐  否则敲两下 列出wang…</span><br><span class="line">能识别唯一性的时候，按一次tab键</span><br><span class="line">不能识别唯一性的时候，需要按2次，然后自己输入</span><br><span class="line">// 上下方向键，可以调用以前使用过的命令</span><br></pre></td></tr></table></figure><hr><h2 id="三一-pwd">三一. pwd<a class="header-anchor" href="#三一-pwd"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//pwd  查看工作目录</span><br><span class="line">cd    切换工作目录</span><br><span class="line">cd  ~ （cd） 进入用户家目录</span><br><span class="line">cd  -返回上一次目录</span><br><span class="line">cd  ~  liangluyao  进入liangluyao家目录</span><br><span class="line">cd  ..  返回上一级目录</span><br></pre></td></tr></table></figure><hr><h2 id="三二-别名">三二. 别名<a class="header-anchor" href="#三二-别名"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//ll  是 ls  -l  --color=auto的别名</span><br><span class="line">//# alias  查看linux里有哪些定义好的别名</span><br><span class="line">//# alias  c=clear  临时定义c是clear的别名</span><br><span class="line">clear 是linux系统里的命令  命令有选项的 要同’ ’ （单引号）引起来 </span><br><span class="line">再开启一个终端 就没效了 临时定义</span><br><span class="line">c是自定义的名字，定义别名的时候，不要和系统里已经存在的命令冲突</span><br></pre></td></tr></table></figure><h3 id="取消别名">取消别名<a class="header-anchor" href="#取消别名"></a></h3><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">//unalias取消别名</span><br><span class="line"># alias mkdir=ls</span><br><span class="line"># unalias  mkdir  取消别名</span><br></pre></td></tr></table></figure><h3 id="永久修改别名">永久修改别名<a class="header-anchor" href="#永久修改别名"></a></h3><figure class="highlight plaintext"><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">//# vim  /root/.bashrc  永久修改别名，需要重新登陆，或者su切换用户到root</span><br><span class="line">.bashrc 是一个隐藏文件  按i进去 进行别名定义——》ESC  :wq</span><br></pre></td></tr></table></figure><hr><h2 id="三三-ls">三三. ls<a class="header-anchor" href="#三三-ls"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">//ls命令</span><br><span class="line">用途：列表（List）显示目录内容 </span><br><span class="line">格式：ls  [选项]...  [目录或文件名]</span><br><span class="line">        常用命令选项</span><br><span class="line">        -l ：以长格式显示</span><br><span class="line">        -d：显示目录本身的属性</span><br><span class="line">        -t： 按文件修改时间进行排序</span><br><span class="line">        -r ：将目录的内容清单以英文字母顺序的逆序显示</span><br><span class="line">        -a：显示所有子目录和文件的信息，包括隐藏文件</span><br><span class="line">        -A：类似于“-a”，但不显示“.”和“..”目录的信息</span><br><span class="line">        -h：以更易读的字节单位（K、M等）显示信息</span><br><span class="line">        //  必须和 -l 一起用</span><br><span class="line">        -h, --human-readable</span><br><span class="line">    with -l and -s, print sizes like 1K 234M 2G etc.</span><br><span class="line">        -R：递归显示内容</span><br><span class="line">        一层一层显示，作用远远不及 tree好，很繁琐</span><br><span class="line">//ls查看当前 目录</span><br><span class="line">        ls  /boot  查看/boot 下目录</span><br><span class="line">        ls  -l  -d  /boot  只显示本身的文件夹信息 ls -ld / ls -dl</span><br><span class="line">        ls  -t  时间  文件修改时间排序</span><br><span class="line">        ls  -r  英文字母 逆序显示</span><br><span class="line">        ls  -l  -h  /boot  显示/boot的各个文件的大小</span><br><span class="line">        -h  必须和  -l  一起用  显示大小 K M G</span><br></pre></td></tr></table></figure><h3 id="ls-l">\ls -l<a class="header-anchor" href="#ls-l"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//\ls  -l  不显示列出的文件类型颜色</span><br></pre></td></tr></table></figure><h3 id="ls-l-grep-“-d”">ls -l |grep “^d”<a class="header-anchor" href="#ls-l-grep-“-d”"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">//# ls  -l|grep  &quot;^d&quot;  </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">//grep ：文本过滤的命令</span><br><span class="line">会根据匹配的字符串去过滤，显示出匹配内容的行</span><br><span class="line"></span><br><span class="line">//^d  表示以d开头的行</span><br><span class="line">//# ll|grep &quot;txt&quot;</span><br><span class="line">        -rw-r--r--. 1 root root  0 9月  17 15:58 a.txt</span><br><span class="line">        -rw-r--r--. 1 root root  0 9月  17 16:02 sc10.txt</span><br><span class="line">        # ll|grep &quot;^d&quot;</span><br><span class="line">        drwxr-xr-x. 5 root root 48 9月  17 09:51 hunantv</span><br><span class="line">        drwxr-xr-x. 4 root root 42 9月  17 09:54 jiangsutv</span><br><span class="line">        # ll|grep &quot;^-&quot;</span><br><span class="line">        -rw-r--r--. 1 root root  0 9月  17 15:58 a.txt</span><br><span class="line">        -rw-r--r--. 1 root root  0 9月  17 16:02 sc10.txt</span><br><span class="line">        # ll|grep &quot;^-&quot;|wc -l</span><br><span class="line">        11</span><br></pre></td></tr></table></figure><hr><h2 id="三四-ASCII">三四. ASCII<a class="header-anchor" href="#三四-ASCII"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">//ASCII  美国信息交换标准代码</span><br><span class="line">数字、大写字母、小写字母 ASCII码值 小——》大</span><br><span class="line">//一个字节=8位</span><br><span class="line">101010101</span><br><span class="line">//man  ls  ——》/-h  查找 -h</span><br><span class="line">//# man ls</span><br><span class="line">            回车：一行一行的往下走</span><br><span class="line">            /-h  查找包含-h的行</span><br><span class="line">            n   查找下一个 next</span><br><span class="line">            N   查找上一个   next</span><br><span class="line">            q   退出</span><br></pre></td></tr></table></figure><hr><h2 id="三五-文件类型">三五. 文件类型<a class="header-anchor" href="#三五-文件类型"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">//文件类型缩写应用</span><br><span class="line">        常规文件    - 保存数据</span><br><span class="line">        目录       d  存放文件  directory</span><br><span class="line">        符号链接文件    l指向其它文件  link</span><br><span class="line">        字符设备文件   ccharacter  --》与字符显示相关的文件</span><br><span class="line">        块设备文件b block --&gt;存放数据的块文件</span><br><span class="line">        s socket文件</span><br><span class="line">        p 管道文件 pipe</span><br></pre></td></tr></table></figure><hr><h2 id="三六-「drwxr-xr-x-5-root-root-48-9月-17-09-51-hunantv」解释">三六. 「drwxr-xr-x. 5 root root 48 9月  17 09:51 hunantv」解释<a class="header-anchor" href="#三六-「drwxr-xr-x-5-root-root-48-9月-17-09-51-hunantv」解释"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">//[root@sanchuang-linux china_voice]# ls  -l</span><br><span class="line">总用量 0</span><br><span class="line">drwxr-xr-x. 5 root root 48 9月  17 09:51 hunantv</span><br><span class="line">            d 代表文件类型  directory 目录</span><br><span class="line">            rwxr-xr-x 权限  r 读 read   w写 write   x 执行 execute</span><br><span class="line">            . 和selinux权限相关</span><br><span class="line">            5 文件的链接数</span><br><span class="line">            root  用户 </span><br><span class="line">            root  组</span><br><span class="line">            48  文件大小</span><br><span class="line">            9月  17 09:51  文件的创建时间</span><br></pre></td></tr></table></figure><h2 id="三七-wc">三七. wc<a class="header-anchor" href="#三七-wc"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">//wc 是一个统计命令，可以统计文件里有多少行，多少单词，多少字节</span><br><span class="line">-l 统计行数  lines</span><br><span class="line">wc  -l  统计行数</span><br></pre></td></tr></table></figure><h3 id="不显示文件名">不显示文件名<a class="header-anchor" href="#不显示文件名"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">//# wc -l  a.txt  (wc  -l 也可以统计文件的行数) 直接统计会显示文件名</span><br><span class="line">3 a.txt</span><br><span class="line">//# cat a.txt |wc -l （cat管道传给wc 不会显示文件名）</span><br><span class="line">3</span><br><span class="line">//# cat /etc/passwd|wc -l</span><br><span class="line">27</span><br><span class="line">//# cat /etc/passwd|grep &quot;liang&quot;</span><br><span class="line">    liangluyao:x:1001:1001::/home/liangluyao:/bin/bash</span><br><span class="line">    liangluyao2:x:1002:1002::/home/liangluyao2:/bin/bash</span><br><span class="line">    # cat /etc/passwd|grep &quot;root&quot;</span><br><span class="line">    root:x:0:0:root:/root:/bin/bash</span><br><span class="line">    operator:x:11:0:operator:/root:/sbin/nologin</span><br></pre></td></tr></table></figure><h3 id="练习">练习<a class="header-anchor" href="#练习"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">//1.统计出/dev目录下有多少字符设备文件</span><br><span class="line"> ll  /dev|grep “^c”|wc  -l</span><br><span class="line">2.统计出/dev目录下有多少块设备文件</span><br><span class="line"> ll  /dev|grep “^b”|wc  -l</span><br><span class="line">        3.统计/etc/目录下有多少文件夹和普通的文件</span><br><span class="line">         ll  /dev|grep “^-”|wc  -l  文件</span><br><span class="line">         ll  /dev|grep “^d”|wc  -l文件夹</span><br><span class="line">         ll  -R  /etc|grep “^-”|wc  -l统计/etc和子文件夹下的所有普通文件 更彻底（包含子目录下）</span><br><span class="line">         ll  -R  /etc|grep “^d”|wc  -l统计/etc和子文件夹下的所有文件夹  更彻底（包含子目录下）</span><br><span class="line">        4.统计/etc/ssh/sshd_config文件有多少行</span><br><span class="line">     cat  /etc/ssh/sshd_config  |wc  -l</span><br><span class="line">//统计文件夹里有多少文件</span><br><span class="line">    ll  |  grep  wc </span><br><span class="line">//统计文件有多少行</span><br><span class="line">    cat   |  wc</span><br></pre></td></tr></table></figure><hr><h2 id="三八-du">三八. du<a class="header-anchor" href="#三八-du"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">//du  统计目录及文件的空间占用情况  disk  usage（估算值，并不是很准确）</span><br><span class="line">        *du  -sh  统计汇总的大小（常用）黄金组合</span><br><span class="line">            -s</span><br><span class="line">              -s, --summarize 汇总的大小</span><br><span class="line">                      display only a total for each argument</span><br><span class="line">            -h  </span><br><span class="line">             -h, --human-readable</span><br><span class="line">                      print sizes in human readable format (e.g., 1K 234M 2G)</span><br><span class="line">            -a 统计文件和文件夹</span><br><span class="line">                 -a, --all</span><br><span class="line">              write counts for all files, not just directories</span><br></pre></td></tr></table></figure><h3 id="du-sh-与-ll-h-区别">du -sh 与 ll -h 区别<a class="header-anchor" href="#du-sh-与-ll-h-区别"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">        du  -sh  /boot</span><br><span class="line">        ll  -h  /boot</span><br><span class="line">//# ll  -h  /boot  只能统计文件的大小，文件夹里的所有的文件不会汇总</span><br><span class="line">        总用量 134M</span><br><span class="line">        du  -sh可以汇总</span><br><span class="line">        ll  -h 就是你文件里面有多少个单词 多少个字符</span><br><span class="line">        # du -sh /boot</span><br><span class="line">        140M/boot</span><br><span class="line">        # ll -h  -d /boot</span><br><span class="line">        dr-xr-xr-x. 6 root root 4.0K 9月  13 14:38 /boot</span><br><span class="line">//英文字母，数字 占1个字节</span><br><span class="line">        中文字母：utf8编码   3个字节</span><br><span class="line">        ll  -h 统计的是一个文件里有多少字符</span><br><span class="line"> 统计文件里面文字的字节数</span><br><span class="line">du  统计占用多少块</span><br><span class="line">统计文件存放在磁盘上消耗了多少个块</span><br><span class="line">//1个块的大小就是4096 （4K）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203110716996.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//touch新建空文件</span><br><span class="line">更新时间</span><br><span class="line">//stat  host  查看三个时间</span><br><span class="line">        最近访问</span><br><span class="line">        最近更改</span><br><span class="line">        最近改动</span><br></pre></td></tr></table></figure><hr><h2 id="三九-改为英文编码">三九. 改为英文编码<a class="header-anchor" href="#三九-改为英文编码"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//改为英文编码</span><br><span class="line">        # LANG=en_US.UTF8</span><br><span class="line">        # ll hosts </span><br><span class="line">        -rw-r--r--. 1 root root 158 Sep 17 16:57 hosts</span><br></pre></td></tr></table></figure><hr><h2 id="四十-3个时间">四十. 3个时间<a class="header-anchor" href="#四十-3个时间"></a></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><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="comment"># stat hosts </span></span><br><span class="line">  File: hosts</span><br><span class="line">  Size: 158       Blocks: 8          IO Block: 4096   regular file</span><br><span class="line">Device: fd00h/64768dInode: 17162314    Links: 1</span><br><span class="line">Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)</span><br><span class="line">Context: unconfined_u:object_r:default_t:s0</span><br><span class="line">Access: 2020-09-17 16:57:57.748799777 +0800</span><br><span class="line">Modify: 2020-09-17 16:57:57.748799777 +0800</span><br><span class="line">Change: 2020-09-17 16:57:57.748799777 +0800</span><br><span class="line"> Birth: -</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">时间：</span><br><span class="line">访问时间  access time  --》atime     打开这个文件  cat</span><br><span class="line">修改时间  modify time  --》mtime    修改里面的内容，增加，删除内容等  vim</span><br><span class="line">更改时间  change time  --》ctime    更改了文件的属性（名字，权限，大小，时间，用户，组）</span><br><span class="line">精确到纳秒</span><br><span class="line">touch  hosts三个时间都更新（都改了）</span><br></pre></td></tr></table></figure><hr><h2 id="四一-chmod">四一. chmod<a class="header-anchor" href="#四一-chmod"></a></h2><figure class="highlight plaintext"><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">//chmod 修改权限  change  mode </span><br><span class="line">chmod  a+w  hosts</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203110720169.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chown 修改属主和属组  change  owner</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203110721123.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">vim  hosts  输入  ：wq  修改数据</span><br><span class="line">//+0800 表示东八区  中国的上海，北京 </span><br><span class="line">乌鲁木齐  东六区</span><br><span class="line">//# cp /etc/passwd  .  将/etc/passwd复制到当前目录</span><br><span class="line">现在我们敲的cp，都是 cp  -i ，cp是别名</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">    <span class="comment"># alias</span></span><br><span class="line">    <span class="built_in">alias</span> c=<span class="string">&#x27;clear&#x27;</span></span><br><span class="line">    <span class="built_in">alias</span> <span class="built_in">cp</span>=<span class="string">&#x27;cp -i&#x27;</span></span><br><span class="line">-i, --interactive 交互式</span><br><span class="line">          prompt before overwrite (overrides a previous -n option)</span><br></pre></td></tr></table></figure><hr><h2 id="四二-cp的时候覆盖文件，不给予提醒的方法">四二. cp的时候覆盖文件，不给予提醒的方法<a class="header-anchor" href="#四二-cp的时候覆盖文件，不给予提醒的方法"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//cp的时候覆盖文件，不给与提醒的方法</span><br><span class="line">1.取消别名  --》不推荐</span><br><span class="line"># unalias cp</span><br><span class="line">2.使用cp命令的绝对路径  --》推荐</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"> <span class="comment"># which  cp</span></span><br><span class="line"><span class="built_in">alias</span> <span class="built_in">cp</span>=<span class="string">&#x27;cp -i&#x27;</span></span><br><span class="line">  /usr/bin/cp</span><br><span class="line"><span class="comment"># /usr/bin/cp  feng  changsha/ -r</span></span><br><span class="line"><span class="comment"># /usr/bin/cp  feng  changsha/ -r  再次复制 覆盖不给提醒</span></span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>02_Linux基础-文件系统层次结构-提示符-进程-隐藏文件-通配符-绝对相对路径-其他基础命令</title>
      <link href="/posts/34556.html"/>
      <url>/posts/34556.html</url>
      
        <content type="html"><![CDATA[<h2 id="一-基本命令">一. 基本命令<a class="header-anchor" href="#一-基本命令"></a></h2><h3 id="ls">ls<a class="header-anchor" href="#ls"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls --- 查看文件夹内容 ==&gt; list</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061401811.png" alt=""></p><h4 id="ls-l">ls -l<a class="header-anchor" href="#ls-l"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//ls  -l显示文件的详细信息</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061441930.png" alt=""></p><figure class="highlight plaintext"><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">//ls  -l显示文件的详细信息 (大概能看到文件时间 ，不详细)</span><br><span class="line">ll是 ls  -l  的别名</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071140074.png" alt=""></p><h4 id="其他参数">其他参数<a class="header-anchor" href="#其他参数"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">-l  显示文件的详细信息</span><br><span class="line">// use a long listing format ( 使用长格式显示 )</span><br><span class="line">-a  显示所有的文件和文件夹包括.和..</span><br><span class="line">-A  显示所有的文件和y文件夹，但是不包括.和..</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//ls  -a   显示所有的文件和文件夹 包括 . 和 ..</span><br></pre></td></tr></table></figure><hr><h3 id="mkdir">mkdir<a class="header-anchor" href="#mkdir"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mkdir --- 新建文件夹 ==&gt; make directory(目录)</span><br><span class="line"></span><br><span class="line">--- mkdir可以一次性建多个文件夹 空格隔开</span><br><span class="line">--- 默认情况下 新建文件夹放在你所在的文件夹里</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061402859.png" alt=""></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">--- windows下</span><br><span class="line">--- dir ==&gt; Windows里面显示文件夹下内容 (等同于Linux ls)</span><br><span class="line">--- mkdir ==&gt; Windows里建目录</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061402223.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061402977.png" alt=""></p><h4 id="mkdir-p">mkdir -p<a class="header-anchor" href="#mkdir-p"></a></h4><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">//mkdir  -p  ( -P 的作用 )</span><br><span class="line">1 .如果文件存在就不报错</span><br><span class="line">2 .当父目录不存在就新建</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061427602.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">//-p, --parents  [ 选项 ]</span><br><span class="line">              no error if existing, make parent directories as needed</span><br><span class="line">              1.如果文件存在就不报错</span><br><span class="line">               2.当父目录不存在就新建</span><br><span class="line">//参数： 参与进来的操作的对象</span><br><span class="line">   也可以没有</span><br><span class="line">如果没有参数，当前目录就是参数</span><br></pre></td></tr></table></figure><hr><h3 id="cd">cd<a class="header-anchor" href="#cd"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd --- 进入目录 ==&gt; change directory to other directory</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061403502.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061403973.png" alt=""></p><hr><h3 id="pwd">pwd<a class="header-anchor" href="#pwd"></a></h3><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">pwd --- 显示当前所在路径 </span><br><span class="line">print working directory name</span><br><span class="line">Print name of current/working directory</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061404419.png" alt=""></p><hr><h3 id="man">man<a class="header-anchor" href="#man"></a></h3><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">man --- 查询命令的使用手册（指南）</span><br><span class="line">--- 按 q 退出  quit</span><br><span class="line">--- manual 手册，指南</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061404282.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061404178.png" alt=""></p><hr><h3 id="…">. &amp; …<a class="header-anchor" href="#…"></a></h3><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">.. --- 代表上一级目录</span><br><span class="line">---cd .. 返回上一级目录</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061405670.png" alt=""></p><hr><h3 id="useradd">useradd<a class="header-anchor" href="#useradd"></a></h3><figure class="highlight plaintext"><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">useradd cpen --- 新建一个普通用户</span><br><span class="line">su - cpen --- 切换用户登录</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><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">root用户的家目录在/root</span><br><span class="line">普通用户的家目录在/home目录下和用户名同名的目录</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061409446.png" alt=""></p><hr><h3 id="su-exit">su &amp; exit<a class="header-anchor" href="#su-exit"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">--- su - cpen 切换用户登录</span><br><span class="line">--- - 是一个选项</span><br><span class="line"></span><br><span class="line">--- exit 注销</span><br><span class="line">--- 退出用户/注销 exit</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061410466.png" alt=""></p><hr><h3 id="rm-rf">rm -rf<a class="header-anchor" href="#rm-rf"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">--- rm -rf 删除</span><br><span class="line">rm --- 删除的命令 (remove)</span><br><span class="line">-rf --- 强制删除不给提醒</span><br><span class="line"></span><br><span class="line">rm -rf /china--- 删除/china目录</span><br><span class="line">--- /china --- 绝对路径</span><br></pre></td></tr></table></figure><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">[root@localhost china]# <span class="built_in">rm</span>  -rf  jiangxi/  删除数据一定要注意，非常不安全</span><br></pre></td></tr></table></figure><h4 id="rm-rf-2">rm -rf *<a class="header-anchor" href="#rm-rf-2"></a></h4><figure class="highlight plaintext"><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">rm  -rf  *</span><br><span class="line">rm  -rf  *  删除当前目录下所有的文件，但是隐藏文件不删除</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071112309.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071114881.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071114740.png" alt=""></p><hr><h3 id="tree">tree<a class="header-anchor" href="#tree"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">yum install tree -y</span><br><span class="line">--- yum - linux里软件管理的命令</span><br><span class="line">--- install - 安装</span><br><span class="line">--- tree - 安装的具体软件名</span><br><span class="line">--- -y 自动安装，不需要输入yes确认</span><br><span class="line"></span><br><span class="line">tree --- 查看目录结构</span><br><span class="line">yum install tree -y</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061411723.png" alt=""></p><hr><h3 id="tab">tab<a class="header-anchor" href="#tab"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--- 文件路径补齐：tab键</span><br></pre></td></tr></table></figure><hr><h3 id="passwd">passwd<a class="header-anchor" href="#passwd"></a></h3><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">//给用户设置密码passwd  username</span><br><span class="line">默认情况：root用户可以给任何一个用户设置密码</span><br><span class="line">普通用户只能给自己设置密码（root授权除外）</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><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><br><span class="line">回文123321（上海自来水来自海上）从左、右边念一样</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061420578.png" alt=""></p><hr><h3 id="w">w<a class="header-anchor" href="#w"></a></h3><figure class="highlight plaintext"><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">//查看有哪些用户登录在linux系统里 w</span><br><span class="line">What</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061424409.png" alt=""></p><hr><h3 id="ssh">ssh<a class="header-anchor" href="#ssh"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//ssh  ip地址连接到相同网段 的主机上</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061425076.png" alt=""></p><hr><h3 id="Ctrl-L">Ctrl + L<a class="header-anchor" href="#Ctrl-L"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//清屏  Ctrl + L</span><br></pre></td></tr></table></figure><hr><h3 id="touch">touch<a class="header-anchor" href="#touch"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//touch</span><br><span class="line">1 .如果文件不存在，新建空文件</span><br><span class="line">2 .如果文件存在，就是更新时间</span><br><span class="line">//touch  a.txt  建立文本文件</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071137858.png" alt=""></p><hr><h3 id="date">date<a class="header-anchor" href="#date"></a></h3><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071137661.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//更新时间</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071138288.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//date  查看当前时间</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101206464.png" alt=""></p><hr><h3 id="stat">stat<a class="header-anchor" href="#stat"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//stat查看文件的状态（详细信息）</span><br><span class="line">stat  status 状态</span><br><span class="line">文件名、大小、用户、时间</span><br><span class="line">比 ls  -l 更加详细的信息</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071141730.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071141483.png" alt=""></p><hr><h3 id="cp">cp<a class="header-anchor" href="#cp"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//cp  复制（复制的同时会粘贴） copy</span><br><span class="line">将文件复制到文件夹</span><br><span class="line">cp  sc.txt  hunan</span><br><span class="line"> 源   目的地</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101210796.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">//cp  -r</span><br><span class="line">-r  复制文件夹的时候，需要接的选项  递归复制 ( 将子文件夹也复制过去 )</span><br><span class="line">#注：-r一般表示递归</span><br><span class="line">linux里的操作哲学：</span><br><span class="line">1.没有消息就是好消息</span><br><span class="line">2. 一切皆文件</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101211902.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101211678.png" alt=""></p><figure class="highlight plaintext"><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><br><span class="line">空文件夹，不会提醒 是否覆盖</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101211150.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101212054.png" alt=""></p><hr><h3 id="mv">mv<a class="header-anchor" href="#mv"></a></h3><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">//mvmv - move (rename) files</span><br><span class="line">1 .移动--》当后面接的文件夹存在就是移动（剪切） move 后面必须是文件夹，不能是文件。</span><br><span class="line">2 .改名字（重命名）--》当后面接的文件夹不存在就是重命名</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1.移动  外面就没有这些文件了</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101218793.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">2.重命名</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101218882.png" alt=""></p><hr><h3 id="du-sh">du -sh<a class="header-anchor" href="#du-sh"></a></h3><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">//查看文件夹大小  du  -sh</span><br><span class="line">-sh  是选项</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101219312.png" alt=""></p><hr><h2 id="二-目录结构">二. 目录结构<a class="header-anchor" href="#二-目录结构"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Linux目录结构</span><br><span class="line">--- / 根目录</span><br><span class="line">--- /root 家目录</span><br><span class="line">--- /是一个文件夹，/下的root 也是个文件夹</span><br><span class="line">--- Linux目录结构 ==&gt; 文件夹的结构 ==&gt; 倒立的树 ==&gt; 树目录结构</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061406632.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061406966.png" alt=""></p><h3 id="家目录">家目录<a class="header-anchor" href="#家目录"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">/root 是root用户的家目录</span><br><span class="line">--- root用户是linux超级用户</span><br><span class="line">--- 家目录：用户登录进入Linux系统所在的目录 (home directory)</span><br><span class="line"></span><br><span class="line">普通用户的家目录在根下面的 home 下面</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061407565.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--- ~ 所在路径是用户的家目录</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061407832.png" alt=""></p><h3 id="文件系统层次结构">文件系统层次结构<a class="header-anchor" href="#文件系统层次结构"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//linux 文件系统层次结构 </span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071128624.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//危险操作,不能做</span><br><span class="line">rm  -rf  /</span><br><span class="line">rm  -rf  /*</span><br><span class="line">cd  / ——》 rm  -rf  *</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071129791.png" alt=""></p><hr><h2 id="三-提示符">三. 提示符<a class="header-anchor" href="#三-提示符"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">提示符</span><br><span class="line">--- # root使用的提示符</span><br><span class="line">--- $ 普通用户使用的提示符</span><br></pre></td></tr></table></figure><hr><h2 id="四-进程">四. 进程<a class="header-anchor" href="#四-进程"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">//进程  子进程、父进程</span><br><span class="line">bash 终端交互程序</span><br><span class="line">sshd进程远程登录</span><br><span class="line">sshd 监听 22号接口</span><br><span class="line">sshd 起的bash</span><br><span class="line">bash 接受人输入的东西（人机交互的程序）</span><br><span class="line">内核管操作系统，操作系统最核心的软件</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061418027.png" alt=""></p><hr><h2 id="五-通用命令格式">五. 通用命令格式<a class="header-anchor" href="#五-通用命令格式"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">//linux命令的通用命令格式</span><br><span class="line">命令字符  [选项]  [参数]   //  “[ ]” 里的 可接可不接</span><br><span class="line">如：ls   -l  /home</span><br><span class="line">[选项] 和 [参数] 有时候顺序可以颠倒</span><br><span class="line">//option 选项： 是可供选项的项目，可接可不接，有特殊作用</span><br></pre></td></tr></table></figure><hr><h2 id="六-隐藏文件">六. 隐藏文件<a class="header-anchor" href="#六-隐藏文件"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//. 开头的文件在linux下是隐藏文件</span><br></pre></td></tr></table></figure><hr><h2 id="七">七. *<a class="header-anchor" href="#七"></a></h2><figure class="highlight plaintext"><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><br><span class="line">//ls  -A   显示所有的文件和文件夹，但是不包括 . 和 ..</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071116926.png" alt=""></p><figure class="highlight plaintext"><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><br><span class="line">ls  -al (常见)ls  -a  -l</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071116336.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071117622.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">//一般不分先后顺序</span><br><span class="line">[root@localhost ~]# ls  -al</span><br><span class="line">[root@localhost ~]# ls  -la</span><br><span class="line">[root@localhost ~]# ls  -a  -l</span><br><span class="line">[root@localhost ~]# ls  -l  -a</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><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><br><span class="line">可以没有参数和选项</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071126544.png" alt=""></p><hr><h2 id="八-通配符">八. * ? 通配符<a class="header-anchor" href="#八-通配符"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">//rm   -rf  删除</span><br><span class="line">  -rf  强制删除</span><br><span class="line">* 代表任意字符  通配符</span><br><span class="line">? 代表一个字符  通配符</span><br><span class="line"></span><br><span class="line">-r递归</span><br><span class="line">-f强制删除，不给予提醒忽略不存在的文件</span><br><span class="line">-f, --force 强制删除。忽略不存在的文件，不提示确认</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101214413.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101214632.png" alt=""></p><hr><h2 id="九-绝对路径、相对路径">九. 绝对路径、相对路径<a class="header-anchor" href="#九-绝对路径、相对路径"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">//相对路径 和 绝对路径</span><br><span class="line">//绝对路径</span><br><span class="line">不考虑你当前的位置，从“/”到达目标文件需要经过的文件系统目录树的所有分支/home/hello/docs/share</span><br><span class="line">从/开始，一层一层往下走，不能跳跃，而且是绝对不会搞错的路径</span><br><span class="line">//相对路径</span><br><span class="line">参照你当前的位置，到达目标文件需要经过的文件系统目录树的所有分</span><br><span class="line">不以“/”开头</span><br><span class="line">不是以/开头的路径，可进可退</span><br><span class="line">以当前目录作为参照物</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071134064.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203071134553.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">//cd  ./hunan（不要这么写） 和 cd  hunan  效果一样</span><br></pre></td></tr></table></figure><hr><h2 1..100="" id="十">十.<a class="header-anchor" href="#十"></a></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></pre></td><td class="code"><pre><span class="line"><span class="comment">#注：这些操作也可以↓</span></span><br><span class="line">[root@cPen_centos8 lianxi]# <span class="built_in">rm</span> -rf &#123;1..50&#125;.txt</span><br><span class="line">[root@cPen_centos8 ~]# <span class="built_in">echo</span> &#123;1..10&#125;</span><br><span class="line">1 2 3 4 5 6 7 8 9 10</span><br><span class="line">//<span class="built_in">touch</span>  sc&#123;1..100&#125;.txt</span><br><span class="line"><span class="built_in">mkdir</span>  hunan&#123;1..100&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101215608.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203101216340.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">//rm  -rf  hunan*删除上面建的文件</span><br><span class="line">rm  -rf  sc*.txt删除上面建的.txt文件</span><br><span class="line">//touch  sc&#123;1..100&#125;.txt创建文件 sc1.txt、sc2.txt……sc100.txt</span><br><span class="line">cp  *.txt  beijing复制文件不需要接 -r 复制这些文件到beijing 文件夹下</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>01_Linux基础-部署-VMware-Xshell-Xftp-内核-安迪比尔定理</title>
      <link href="/posts/48860.html"/>
      <url>/posts/48860.html</url>
      
        <content type="html"><![CDATA[<p>CentOS开源 免费 — <mark>CentOS是Linux里的开源免费版本</mark></p><h2 id="一-配置虚拟机">一. 配置虚拟机<a class="header-anchor" href="#一-配置虚拟机"></a></h2><h3 id="1-新建虚拟机">1. 新建虚拟机<a class="header-anchor" href="#1-新建虚拟机"></a></h3><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061328865.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061328202.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061328076.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061329324.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061329906.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061332226.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061332550.png" alt=""></p><h3 id="2-放-镜像文件">2. 放 镜像文件<a class="header-anchor" href="#2-放-镜像文件"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">镜像文件其实就是 系统盘</span><br><span class="line">iso结尾，iso其实就是压缩格式的文件 --- 里面很多文件</span><br><span class="line"></span><br><span class="line">从虚拟机里出来：按 Ctrl + Alt</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061334787.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061334233.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061334094.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061334231.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061334174.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061334283.png" alt=""></p><h3 id="总结">总结<a class="header-anchor" href="#总结"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">注①：root用户不需要创建，默认有，用户名就叫root</span><br><span class="line">Linux里的超级用户 root 123456</span><br><span class="line"></span><br><span class="line">注②：用虚拟机的意思其实和花钱买云服务器一模一样</span><br><span class="line"></span><br><span class="line">注③：1个CPU核心 对应 4G内存</span><br><span class="line"></span><br><span class="line">注④：企业服务器用xeon（至强）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061336083.png" alt=""></p><hr><h2 id="二-云厂商">二. 云厂商<a class="header-anchor" href="#二-云厂商"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">阿里云</span><br><span class="line">--- 阿里云国际第四大云服务，主要业务在国内</span><br><span class="line">--- 国际上：亚马逊云、Google云、微软云、阿里云</span><br><span class="line">--- 带宽在云服务器里面是稀缺资源，越大价格越贵</span><br><span class="line">--- 学习时购买一个学生机（阿里云/腾讯云） </span><br></pre></td></tr></table></figure><hr><h2 id="三-CPU">三. CPU<a class="header-anchor" href="#三-CPU"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">cpu的概念 --- 大脑</span><br><span class="line">处理器：CPU中央处理器 （Central Processing Unit）</span><br><span class="line">--- 颗：物理的</span><br><span class="line">--- 核心：逻辑的</span><br><span class="line"></span><br><span class="line">1颗CPU里面有8个核 ==&gt; 1个鸡蛋2个黄</span><br><span class="line">--- 核心越多CPU的处理能力越强，速度越快</span><br><span class="line"></span><br><span class="line">--- 个人电脑用酷睿，企业的服务器用至强（xeon）</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">电脑cpu厂家：</span><br><span class="line">- Intel英特尔美国</span><br><span class="line">Core酷睿 i3 i5 i7 i9 ==&gt; 个人电脑</span><br><span class="line">Xeon至强 ==&gt; 服务器使用的CPU</span><br><span class="line">- AMD美国</span><br></pre></td></tr></table></figure><hr><h2 id="四-虚拟机-2G2核">四. 虚拟机 2G2核<a class="header-anchor" href="#四-虚拟机-2G2核"></a></h2><p><mark>虚拟机2G2C怎么回事？</mark></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">并不是分2个核2G给它，虚拟机跑起来后其实是进程，名字叫VMware .exe 不会消耗1个G，也就几百兆。虚拟机模拟出来的操作系统配置是两个核一个G，虚拟出的虚幻世界，进程并不会消耗一个G两个核，但确实会用电脑里面的cpu。都是模拟出来的，假的。</span><br></pre></td></tr></table></figure><hr><h2 id="五-虚拟机软件">五. 虚拟机软件<a class="header-anchor" href="#五-虚拟机软件"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">部署环境</span><br><span class="line">--- 软件：vmware workstation 15 pro</span><br><span class="line">--- xshell - windows里连接Linux系统的工具 ==&gt; 远程连接工具</span><br><span class="line">--- xftp - windows里和Linux之间传输文件的工具</span><br></pre></td></tr></table></figure><h3 id="Xshell">Xshell<a class="header-anchor" href="#Xshell"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">登录提示符 (vmware)</span><br><span class="line">--- Localhost 代表本机的主机名(默认主机名)==&gt; local 本地；host 主机(电脑)</span><br><span class="line">--- login 登录</span><br><span class="line">--- root Linux里的超级用户，默认有 不需要新建</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061343511.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">--- exit 退出系统 / 注销</span><br><span class="line">--- Ctrl + L 清除屏幕</span><br><span class="line">--- ip add 查看ip地址 ==&gt; 每台计算机都需要一个ip地址 去上网</span><br><span class="line">--- inet ==&gt; Internet</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061343105.png" alt=""></p><h4 id="使用步骤">使用步骤<a class="header-anchor" href="#使用步骤"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">1. 双击 Xshell</span><br><span class="line"></span><br><span class="line">2. 未知主机秘钥，点“接受并保存”</span><br><span class="line"></span><br><span class="line">3. 用户名输入“root”密码输入“123456”，点确定（点记住用户名、密码）</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061345353.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--- 看到# 显示连接成功 ==&gt; 在Windows里成功连到Linux</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061345565.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061346527.png" alt=""></p><figure class="highlight plaintext"><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">--- 调背景的（ANSI Colors），可以调成白色背景</span><br><span class="line">--- 旁边的A logo 可以调字体</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/202203061346372.png" alt=""></p><hr><h2 id="六-CentOS">六. CentOS<a class="header-anchor" href="#六-CentOS"></a></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">CentOS --- Community ENTerprise Operating System ==&gt; 社区企业版操作系统</span><br><span class="line">Red Hat Enterprise Linux (RHEL) ==&gt; 红帽企业版linux系统 ==&gt; 开源 ==&gt; centos</span><br><span class="line">CentOS 山寨的Redhat ==&gt; CentOS被Redhat收购了</span><br></pre></td></tr></table></figure><h3 id="内核">内核<a class="header-anchor" href="#内核"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">内核</span><br><span class="line">--- 主要使用 C语言 编写 ==&gt; 开源免费</span><br><span class="line">--- 安卓/centos/redhat/Ubuntu用的Linux内核</span><br><span class="line">--- Linus李纳斯 写出内核，还写了GIT 版本控制软件</span><br><span class="line">--- 内核相当于汽车的发动机</span><br></pre></td></tr></table></figure><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">kernel内核</span><br><span class="line">--- 内核：Linux系统内部最核心的软件</span><br><span class="line">--- http://www.kernel.org/ ==&gt; organization 组织</span><br></pre></td></tr></table></figure><h4 id="内核作用">内核作用<a class="header-anchor" href="#内核作用"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">内核的作用：</span><br><span class="line">- 1.对CPU进行调度管理</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></tr></table></figure><hr><h2 id="七-Linux-与-Windows-区别">七. Linux 与 Windows 区别<a class="header-anchor" href="#七-Linux-与-Windows-区别"></a></h2><figure class="highlight plaintext"><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">Linux和windows的区别：</span><br><span class="line">--- Linux开源</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><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="comment"># root @ CentOS in ~ [13:51:11]</span></span><br><span class="line">$ <span class="built_in">uname</span> -r</span><br><span class="line">4.18.0-193.14.2.el8_2.x86_64</span><br><span class="line"></span><br><span class="line"><span class="comment"># 解释</span></span><br><span class="line">--- el8 ==&gt; Enterprise Linux 8</span><br><span class="line">--- x86_64 ==&gt; 系统64位</span><br><span class="line">- 64位 CPU一次性处理数据的大小</span><br><span class="line">- 1字节 = 8位</span><br><span class="line">- CPU带领操作系统的发展</span><br></pre></td></tr></table></figure><hr><h2 id="八-安迪比尔定理">八. 安迪比尔定理<a class="header-anchor" href="#八-安迪比尔定理"></a></h2><figure class="highlight plaintext"><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><br><span class="line">--- CPU带领操作系统的发展 ==&gt; 硬件与软件，现在手机行业</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">安迪-比尔定理 （Andy and Bill’s Law）是对IT产业中软件和硬件升级换代关系的一个概括。原话是 “Andy gives, Bill takes away.（安迪提供什么，比尔拿走什么。）” 安迪指英特尔前CEO安迪·格鲁夫，比尔指微软前任CEO比尔·盖茨，这句话的意思是，硬件提高的性能，很快被软件消耗掉了。</span><br></pre></td></tr></table></figure><hr>]]></content>
      
      
      <categories>
          
          <category> Linux </category>
          
      </categories>
      
      
        <tags>
            
            <tag> Linux </tag>
            
        </tags>
      
    </entry>
    
    
  
  
</search>
