<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>NineBytes Blog</title><description>owo</description><link>https://blog.ninebytes.cc.cd/</link><language>en</language><item><title>Astro Fuwari食用教程</title><link>https://blog.ninebytes.cc.cd/posts/tech14-astro-fuwari%E9%83%A8%E7%BD%B2/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech14-astro-fuwari%E9%83%A8%E7%BD%B2/</guid><description>Astro Fuwari部署指南，教你如何快速搭建自己的博客</description><pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;1、准备环境&lt;/h1&gt;
&lt;p&gt;Fuwari README 已经写了要求：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;依赖&lt;/th&gt;
&lt;th&gt;版本要求&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;&amp;gt;=20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pnpm&lt;/td&gt;
&lt;td&gt;&amp;gt;=9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;先检查你的电脑有没有 Node，打开 PowerShell：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有安装的话会报错，如果有的话则会输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\NineBytes&amp;gt; node -v
v22.14.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果没有安装：点击&lt;a href=&quot;https://nodejs.org/&quot;&gt;这里&lt;/a&gt;安装Node.js，建议安装LTS版本。&lt;/p&gt;
&lt;p&gt;安装 pnpm
执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g pnpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后将会输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\NineBytes&amp;gt; npm install -g pnpm

added 1 package in 2s

1 package is looking for funding
  run `npm fund` for details
PS C:\Users\NineBytes&amp;gt; pnpm -v
11.17.0
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;2、下载Fuwari源码&lt;/h1&gt;
&lt;p&gt;提供2种方式下载Fuwari源码，2种方法择一即可：&lt;/p&gt;
&lt;h2&gt;1.Git Clone&lt;/h2&gt;
&lt;p&gt;找一个你放博客的位置，例如&lt;code&gt;D:\Fuwari&lt;/code&gt;
切换到你的博客存放目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd &apos;D:\Fuwari&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;克隆Fuwari仓库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/saicaca/fuwari.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd fuwari
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2.下载ZIP&lt;/h2&gt;
&lt;p&gt;点击&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;这里&lt;/a&gt;打开Fuwari Github仓库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Code
 ↓
Download ZIP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解压即可。&lt;/p&gt;
&lt;h1&gt;3、安装依赖&lt;/h1&gt;
&lt;p&gt;进入 fuwari&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd &apos;fuwari&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下载依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次下载会下载很多东西，耐心等待即可，我就等了十几秒&lt;br /&gt;
下载完成后可能会出现：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Done in 17.8s
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;4、本地启动&lt;/h1&gt;
&lt;p&gt;使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后会出现类似：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\NineBytes\***\***\Fuwari&amp;gt; pnpm dev

&amp;gt; fuwari@0.0.1 dev C:\Users\NineBytes\Documents\Blog Project\Fuwari
&amp;gt; astro dev

15:57:50 [types] Generated 2ms
15:57:51 [content] Syncing content
15:57:51 [content] Synced content
15:57:51 [vite] Forced re-optimization of dependencies

 astro  v5.13.10 ready in 3521 ms

┃ Local    http://localhost:4321/
┃ Network  use --host to expose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在PowerShell窗口内按住&lt;code&gt;Ctrl&lt;/code&gt;键对着&lt;code&gt;Local&lt;/code&gt;后边的链接单击&lt;br /&gt;
或使用浏览器在地址栏内输入&lt;code&gt;http://localhost:4321&lt;/code&gt;打开Fuwari首页
&lt;img src=&quot;/article/Tech/20260725/1.png&quot; alt=&quot;1&quot; /&gt;
至此，Fuwari已经部署到你的电脑上，修改各项配置文件还有编写你的文章即可食用😋&lt;/p&gt;
</content:encoded></item><item><title>CloudFlare Workers反向代理GitHub文件加速部署</title><link>https://blog.ninebytes.cc.cd/posts/tech13-cloudflare-workers%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86github%E6%96%87%E4%BB%B6%E5%8A%A0%E9%80%9F%E9%83%A8%E7%BD%B2/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech13-cloudflare-workers%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86github%E6%96%87%E4%BB%B6%E5%8A%A0%E9%80%9F%E9%83%A8%E7%BD%B2/</guid><description>CloudFlare恩情一辈子还不完 ~</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;首先打开你的CloudFlare Workers，然后点击&lt;code&gt;创建应用程序&lt;/code&gt;，点击&lt;code&gt;从&quot;Hello World!开始&quot;&lt;/code&gt;。
&lt;img src=&quot;/article/Tech/20260708/1.png&quot; alt=&quot;1&quot; /&gt;
然后点击&lt;code&gt;部署&lt;/code&gt;。
&lt;img src=&quot;/article/Tech/20260708/2.png&quot; alt=&quot;2&quot; /&gt;
workers创建好后点击&lt;code&gt;编辑代码&lt;/code&gt;。
&lt;img src=&quot;/article/Tech/20260708/3.png&quot; alt=&quot;3&quot; /&gt;
然后打开我的&lt;a href=&quot;https://github.com/ninebytes687/GitHub-Proxy&quot;&gt;GitHub仓库&lt;/a&gt;，复制worker.js代码并替换掉你新建的workers。&lt;br /&gt;
绑定一个你自定义的二级域名。
&lt;img src=&quot;/article/Tech/20260708/4.png&quot; alt=&quot;4&quot; /&gt;
然后点击&lt;code&gt;设置&lt;/code&gt;，在&lt;code&gt;变量和密钥&lt;/code&gt;栏中点击&lt;code&gt;添加&lt;/code&gt;。
&lt;img src=&quot;/article/Tech/20260708/5.png&quot; alt=&quot;5&quot; /&gt;
添加一个&lt;code&gt;密钥&lt;/code&gt;类型，变量名称为&lt;code&gt;MY_TOTP_SECRET&lt;/code&gt;的变量，值为你自定义的密码。
&lt;img src=&quot;/article/Tech/20260708/6.png&quot; alt=&quot;6&quot; /&gt;
至此独属于你的GitHub文件加速代理站就部署好了。&lt;/p&gt;
</content:encoded></item><item><title>Cloudflare Workers部署NodeWarden</title><link>https://blog.ninebytes.cc.cd/posts/tech12-cloudflare-workers-nodewarden/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech12-cloudflare-workers-nodewarden/</guid><description>兼容Bitwarden客户端的个人专属自建密码管理服务端</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;什么是NodeWarden？&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;第三方Bitwarden兼容服务端，仅服务端，无独立客户端，直接用Bitwarden官方客户端连接；&lt;/li&gt;
&lt;li&gt;基于Cloudflare Workers+D1+R2，无服务器Serverless架构，主打零成本、免运维、全球边缘加速；&lt;/li&gt;
&lt;li&gt;定位：仅限个人单用户，不支持企业 / 团队组织功能；&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Bitwarden与NodeWarden对比&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能项&lt;/th&gt;
&lt;th&gt;Bitwarden（官方）&lt;/th&gt;
&lt;th&gt;NodeWarden（第三方）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web网页密码库&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 兼容原版Web Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;全量密码同步&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 完美兼容官方客户端同步&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文件附件存储&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 基于Cloudflare R2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Send文件/文本分享&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 完整支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;导入导出（JSON/CSV）&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 兼容Bitwarden格式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多用户/家庭/组织&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ 仅个人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;密码健康报告、泄露检测&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;应急访问、高级2FA&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ 部分缺失&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;密钥管理、企业级权限&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;批量操作、审计日志&lt;/td&gt;
&lt;td&gt;付费版&lt;/td&gt;
&lt;td&gt;增强版支持&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;Fork仓库&lt;/h1&gt;
&lt;p&gt;首先打开Github Fork &lt;a href=&quot;https://github.com/shuaiplus/nodewarden&quot;&gt;shuaiplus/nodewarden&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;创建Workers&lt;/h1&gt;
&lt;p&gt;然后打开你的CloudFlare Workers和Pages，创建应用程序。&lt;br /&gt;
选择&lt;code&gt;Continue with GitHub&lt;/code&gt;，选择到你刚刚Fork的nodewarden仓库。
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/ad7f3c575c6dcfb2cef8a62c39075bf4.png&quot; alt=&quot;1&quot; /&gt;
默认使用R2对象存储，点击部署即可。&lt;br /&gt;
若你的CF账号没有绑卡，可以将&lt;code&gt;npx wrangler deploy&lt;/code&gt;改为&lt;code&gt;npm run deploy:kv&lt;/code&gt;使用KV代替。
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/036b43b89c1dd0d64874b7e7b7e69c85.png&quot; alt=&quot;2&quot; /&gt;
然后点击域-添加域名
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/5743465cdb005107ff8352c7c2506d40.png&quot; alt=&quot;3&quot; /&gt;
然后输入子域名，添加即可（没有域名的也可以直接点击Worker URL访问）。
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/1e22812284c0de464e475fda200e1605.png&quot; alt=&quot;4&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;添加JWT密钥&lt;/h1&gt;
&lt;p&gt;然后打开你刚刚添加的子域名，复制下方自动生成的32位密钥。
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/256e8e66057d13d777de7f2e20e7b2f4.png&quot; alt=&quot;5&quot; /&gt;
在Workers设置-变量和机密中，点击添加
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/56530bd15003c4f9f2ddab0a39a08d1a.png&quot; alt=&quot;6&quot; /&gt;
&lt;code&gt;类型&lt;/code&gt;选择&lt;code&gt;密钥&lt;/code&gt;，&lt;code&gt;变量名称&lt;/code&gt;为&lt;code&gt;JWT_SECRET&lt;/code&gt;，值为你刚刚复制的32位随机密钥。
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/1de4e60f214709c490b49b5a85f78bd5.png&quot; alt=&quot;7&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/d27b640615a694b8543b0a34eae59682.png&quot; alt=&quot;8&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;注册管理员账户&lt;/h1&gt;
&lt;p&gt;密钥添加完成后，回到你的子域名链接内，使用F5刷新页面，注册账户，第一个注册的账户为管理员账户。
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/bc100af58415480c862df47fe3e7f266.png&quot; alt=&quot;9&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Success🎇&lt;/h1&gt;
&lt;p&gt;账户注册完成后，登录即可。&lt;br /&gt;
手机客户端直接选择自托管，填入你的子域名链接即可登录。
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/05/17/0f87d6504a6d304d4e1859066b703c72.png&quot; alt=&quot;10&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>泉城济南，泉甲天下</title><link>https://blog.ninebytes.cc.cd/posts/life7-%E5%B1%B1%E4%B8%9C%E6%B3%89%E5%9F%8E%E6%B5%8E%E5%8D%97/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/life7-%E5%B1%B1%E4%B8%9C%E6%B3%89%E5%9F%8E%E6%B5%8E%E5%8D%97/</guid><description>一城山色半城湖</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/article/Life/20260404/IMG_20260404_130444.jpg&quot; alt=&quot;IMG_20260404_130444&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260404_131506.jpg&quot; alt=&quot;IMG_20260404_131506&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260404_161334.jpg&quot; alt=&quot;IMG_20260404_161334&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260404_175906.jpg&quot; alt=&quot;IMG_20260404_175906&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260404_181516.jpg&quot; alt=&quot;IMG_20260404_181516&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260404_212939.jpg&quot; alt=&quot;IMG_20260404_212939&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260404_213633.jpg&quot; alt=&quot;IMG_20260404_213633&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_085340.jpg&quot; alt=&quot;IMG_20260405_085340&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_085432.jpg&quot; alt=&quot;IMG_20260405_085432&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_085912.jpg&quot; alt=&quot;IMG_20260405_085912&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_090515.jpg&quot; alt=&quot;IMG_20260405_090515&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_090801.jpg&quot; alt=&quot;IMG_20260405_090801&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_093326.jpg&quot; alt=&quot;IMG_20260405_093326&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_095505.jpg&quot; alt=&quot;IMG_20260405_095505&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_100414.jpg&quot; alt=&quot;IMG_20260405_100414&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_100535.jpg&quot; alt=&quot;IMG_20260405_100535&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_100544.jpg&quot; alt=&quot;IMG_20260405_100544&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_100645.jpg&quot; alt=&quot;IMG_20260405_100645&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_101726.jpg&quot; alt=&quot;IMG_20260405_101726&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_102334.jpg&quot; alt=&quot;IMG_20260405_102334&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_102813.jpg&quot; alt=&quot;IMG_20260405_102813&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_103217.jpg&quot; alt=&quot;IMG_20260405_103217&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_105356.jpg&quot; alt=&quot;IMG_20260405_105356&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_110430.jpg&quot; alt=&quot;IMG_20260405_110430&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_110515.jpg&quot; alt=&quot;IMG_20260405_110515&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_111213.jpg&quot; alt=&quot;IMG_20260405_111213&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_112047.jpg&quot; alt=&quot;IMG_20260405_112047&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_113642.jpg&quot; alt=&quot;IMG_20260405_113642&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_113738.jpg&quot; alt=&quot;IMG_20260405_113738&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_114028.jpg&quot; alt=&quot;IMG_20260405_114028&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_114124.jpg&quot; alt=&quot;IMG_20260405_114124&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_114859.jpg&quot; alt=&quot;IMG_20260405_114859&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_131939.jpg&quot; alt=&quot;IMG_20260405_131939&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_133944.jpg&quot; alt=&quot;IMG_20260405_133944&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_134001.jpg&quot; alt=&quot;IMG_20260405_134001&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_134028.jpg&quot; alt=&quot;IMG_20260405_134028&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_134603.jpg&quot; alt=&quot;IMG_20260405_134603&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_134722.jpg&quot; alt=&quot;IMG_20260405_134722&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_135026.jpg&quot; alt=&quot;IMG_20260405_135026&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_135825.jpg&quot; alt=&quot;IMG_20260405_135825&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_135920.jpg&quot; alt=&quot;IMG_20260405_135920&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_140712.jpg&quot; alt=&quot;IMG_20260405_140712&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_140825.jpg&quot; alt=&quot;IMG_20260405_140825&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_141030.jpg&quot; alt=&quot;IMG_20260405_141030&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_142558.jpg&quot; alt=&quot;IMG_20260405_142558&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_145422.jpg&quot; alt=&quot;IMG_20260405_145422&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_150311.jpg&quot; alt=&quot;IMG_20260405_150311&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_151040.jpg&quot; alt=&quot;IMG_20260405_151040&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_152635.jpg&quot; alt=&quot;IMG_20260405_152635&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_153315.jpg&quot; alt=&quot;IMG_20260405_153315&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_153337.jpg&quot; alt=&quot;IMG_20260405_153337&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_153951.jpg&quot; alt=&quot;IMG_20260405_153951&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_154001.jpg&quot; alt=&quot;IMG_20260405_154001&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_154231.jpg&quot; alt=&quot;IMG_20260405_154231&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_160453.jpg&quot; alt=&quot;IMG_20260405_160453&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_160842.jpg&quot; alt=&quot;IMG_20260405_160842&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_211013.jpg&quot; alt=&quot;IMG_20260405_211013&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_211234.jpg&quot; alt=&quot;IMG_20260405_211234&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260405_213846.jpg&quot; alt=&quot;IMG_20260405_213846&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_105240.jpg&quot; alt=&quot;IMG_20260406_105240&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_105503.jpg&quot; alt=&quot;IMG_20260406_105503&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_105821.jpg&quot; alt=&quot;IMG_20260406_105821&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_110226.jpg&quot; alt=&quot;IMG_20260406_110226&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_110524.jpg&quot; alt=&quot;IMG_20260406_110524&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_110643.jpg&quot; alt=&quot;IMG_20260406_110643&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_110929.jpg&quot; alt=&quot;IMG_20260406_110929&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_111728.jpg&quot; alt=&quot;IMG_20260406_111728&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_111855.jpg&quot; alt=&quot;IMG_20260406_111855&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_112640.jpg&quot; alt=&quot;IMG_20260406_112640&quot; /&gt;
&lt;img src=&quot;/article/Life/20260404/IMG_20260406_124251.jpg&quot; alt=&quot;IMG_20260406_124251&quot; /&gt;
出了济南谁还让你免费坐地铁？
&lt;img src=&quot;/article/Life/20260404/Screenshot_2026-04-07-00-08-18-327_com.chinasofti.shanghaihuateng.jnmetroapp.jpg&quot; alt=&quot;Screenshot_2026-04-07-00-08-18-327_com.chinasofti.shanghaihuateng.jnmetroapp&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Rocky Linux OpenClaw部署</title><link>https://blog.ninebytes.cc.cd/posts/tech11-rocky-linux-openclaw%E9%83%A8%E7%BD%B2/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech11-rocky-linux-openclaw%E9%83%A8%E7%BD%B2/</guid><description>能执行任务的开源AI代理</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;部署环境使用Rocky Linux 9.4。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提示：
&lt;ul&gt;
&lt;li&gt;示例代码仅供参考，需依据实际运行环境与路径做出相应修改！&lt;/li&gt;
&lt;li&gt;文中代码与链接可能因时间推移或不可抗力失效，请结合实际环境运行调试！&lt;/li&gt;
&lt;li&gt;如需转载或借鉴，请注明出处并附上本文博客链接！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先更新软件包：&lt;code&gt;sudo dnf update -y&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ sudo dnf update -y
Rocky Linux 9 - BaseOS                                                                     1.6 MB/s | 4.1 kB     00:00    
Rocky Linux 9 - AppStream                                                                  1.7 MB/s | 4.5 kB     00:00    
Dependencies resolved.
Nothing to do.
Complete!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于OpenClaw依赖于Node.js，所以我们先来安装Node.js。&lt;br /&gt;
下载并执行NVM v0.40.3的安装脚本：&lt;code&gt;curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash&lt;/code&gt;&lt;br /&gt;
若github拉取慢或访问不了，可以使用我转载的install_v0.40.3.sh文件：&lt;code&gt;curl -o- https://blog.ninebytes.top/nvm-sh/install_v0.40.3.sh | bash&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16631  100 16631    0     0    758      0  0:00:21  0:00:21 --:--:--  3637
=&amp;gt; Downloading nvm as script to &apos;/home/ninebytes/.nvm&apos;

=&amp;gt; Appending nvm source string to /home/ninebytes/.bashrc
=&amp;gt; Appending bash_completion source string to /home/ninebytes/.bashrc
=&amp;gt; Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR=&quot;$HOME/.nvm&quot;
[ -s &quot;$NVM_DIR/nvm.sh&quot; ] &amp;amp;&amp;amp; \. &quot;$NVM_DIR/nvm.sh&quot;  # This loads nvm
[ -s &quot;$NVM_DIR/bash_completion&quot; ] &amp;amp;&amp;amp; \. &quot;$NVM_DIR/bash_completion&quot;  # This loads nvm bash_completion
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后临时加载NVM到当前终端会话中，让你能立即使用NVM命令则无需重启终端：&lt;code&gt;\. &quot;$HOME/.nvm/nvm.sh&quot;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@server ~]$ \. &quot;$HOME/.nvm/nvm.sh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;提示：若想永久生效，需把这句命令添加到Shell配置文件中：&lt;code&gt;echo &apos;\. &quot;$HOME/.nvm/nvm.sh&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下载编译并安装Node.js 24.x最新版，同时会配套安装对应的NPM：&lt;code&gt;nvm install 24&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ nvm install 24
Downloading and installing node v24.14.0...
Downloading https://nodejs.org/dist/v24.14.0/node-v24.14.0-linux-x64.tar.xz...
#################################################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v24.14.0 (npm v11.9.0)
Creating default alias: default -&amp;gt; 24 (-&amp;gt; v24.14.0)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用：&lt;code&gt;nvm ls&lt;/code&gt;列出通过NVM安装的所有Node.js版本，验证是否安装成功。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ nvm ls
-&amp;gt;     v24.14.0
default -&amp;gt; 24 (-&amp;gt; v24.14.0)
iojs -&amp;gt; N/A (default)
unstable -&amp;gt; N/A (default)
node -&amp;gt; stable (-&amp;gt; v24.14.0) (default)
stable -&amp;gt; 24.14 (-&amp;gt; v24.14.0) (default)
lts/* -&amp;gt; lts/krypton (-&amp;gt; v24.14.0)
lts/argon -&amp;gt; v4.9.1 (-&amp;gt; N/A)
lts/boron -&amp;gt; v6.17.1 (-&amp;gt; N/A)
lts/carbon -&amp;gt; v8.17.0 (-&amp;gt; N/A)
lts/dubnium -&amp;gt; v10.24.1 (-&amp;gt; N/A)
lts/erbium -&amp;gt; v12.22.12 (-&amp;gt; N/A)
lts/fermium -&amp;gt; v14.21.3 (-&amp;gt; N/A)
lts/gallium -&amp;gt; v16.20.2 (-&amp;gt; N/A)
lts/hydrogen -&amp;gt; v18.20.8 (-&amp;gt; N/A)
lts/iron -&amp;gt; v20.20.1 (-&amp;gt; N/A)
lts/jod -&amp;gt; v22.22.1 (-&amp;gt; N/A)
lts/krypton -&amp;gt; v24.14.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后来安装Git，OpenClaw不是必须依赖Git，但强烈建议安装：&lt;code&gt;sudo dnf install -y git&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ sudo dnf install -y git
······
Complete!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证Git：&lt;code&gt;git --version&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ git --version
git version 2.43.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装OpenClaw：&lt;code&gt;npm i -g openclaw --registry=https://registry.npmmirror.com --verbose&lt;/code&gt;&lt;br /&gt;
指定从阿里NPM仓库下载OpenClaw，并输出每一步的详细日志，若不想输出日志，去掉&lt;code&gt;--verbose&lt;/code&gt;即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ npm i -g openclaw --registry=https://registry.npmmirror.com --verbose
npm verbose cli /home/ninebytes/.nvm/versions/node/v24.14.0/bin/node /home/ninebytes/.nvm/versions/node/v24.14.0/bin/npm
npm info using npm@11.9.0
npm info using node@v24.14.0
npm verbose title npm i openclaw
npm verbose argv &quot;i&quot; &quot;--global&quot; &quot;openclaw&quot; &quot;--registry&quot; &quot;https://registry.npmmirror.com&quot; &quot;--loglevel&quot; &quot;verbose&quot;
npm verbose logfile logs-max:10 dir:/home/ninebytes/.npm/_logs/2026-03-21T04_09_46_213Z-
npm verbose logfile /home/ninebytes/.npm/_logs/2026-03-21T04_09_46_213Z-debug-0.log
npm http fetch GET 200 https://registry.npmmirror.com/openclaw 329ms (cache miss)
npm http fetch GET 200 https://registry.npmmirror.com/@agentclientprotocol%2fsdk 213ms (cache miss)
npm http fetch GET 200 https://registry.npmmirror.com/@grammyjs%2frunner 249ms (cache miss)
npm info run protobufjs@7.5.4 postinstall { code: 0, signal: null }

---省略1000多行输出日志---

added 539 packages in 2m

89 packages are looking for funding
  run `npm fund` for details
npm verbose cwd /home/ninebytes
npm verbose os Linux 5.14.0-427.13.1.el9_4.x86_64
npm verbose node v24.14.0
npm verbose npm  v11.9.0
npm verbose exit 0
npm info ok
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用&lt;code&gt;openclaw --version&lt;/code&gt;验证OpenClaw是否安装成功。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ openclaw --version
OpenClaw 2026.3.13 (61d171a)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后使用&lt;code&gt;openclaw onboard&lt;/code&gt;开始配置OpenClaw。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ openclaw onboard

🦞 OpenClaw 2026.3.13 (61d171a) — I don&apos;t judge, but your missing API keys are absolutely judging you.

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
                  🦞 OPENCLAW 🦞                    
 
┌  OpenClaw onboarding
│
◇  Security ─────────────────────────────────────────────────────────────────────────────────╮
│                                                                                            │
│  Security warning — please read.                                                           │
│                                                                                            │
│  OpenClaw is a hobby project and still in beta. Expect sharp edges.                        │
│  By default, OpenClaw is a personal agent: one trusted operator boundary.                  │
│  This bot can read files and run actions if tools are enabled.                             │
│  A bad prompt can trick it into doing unsafe things.                                       │
│                                                                                            │
│  OpenClaw is not a hostile multi-tenant boundary by default.                               │
│  If multiple users can message one tool-enabled agent, they share that delegated tool      │
│  authority.                                                                                │
│                                                                                            │
│  If you’re not comfortable with security hardening and access control, don’t run           │
│  OpenClaw.                                                                                 │
│  Ask someone experienced to help before enabling tools or exposing it to the internet.     │
│                                                                                            │
│  Recommended baseline:                                                                     │
│  - Pairing/allowlists + mention gating.                                                    │
│  - Multi-user/shared inbox: split trust boundaries (separate gateway/credentials, ideally  │
│    separate OS users/hosts).                                                               │
│  - Sandbox + least-privilege tools.                                                        │
│  - Shared inboxes: isolate DM sessions (`session.dmScope: per-channel-peer`) and keep      │
│    tool access minimal.                                                                    │
│  - Keep secrets out of the agent’s reachable filesystem.                                   │
│  - Use the strongest available model for any bot with tools or untrusted inboxes.          │
│                                                                                            │
│  Run regularly:                                                                            │
│  openclaw security audit --deep                                                            │
│  openclaw security audit --fix                                                             │
│                                                                                            │
│  Must read: https://docs.openclaw.ai/gateway/security                                      │
│                                                                                            │
├────────────────────────────────────────────────────────────────────────────────────────────╯
│
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步是确认知晓OpenClaw是个人优先的AI助手，它有读写文件、执行命令等权限；多用户使用需额外做安全锁定。选Yes才能进入下一步配置。使用左右方向键选择Yes即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue?
│  ○ Yes / ● No
└
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;QuickStart：快速完成基础配置，后续可以用 openclaw configure 命令精细调整模型、权限等细节，适合快速上手。&lt;/li&gt;
&lt;li&gt;Manual：手动配置，需要一步步填写所有参数，适合有经验的用户或需要定制化部署的场景。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以我们直接选择QuickStart即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Onboarding mode
│  ● QuickStart (Configure details later via openclaw configure.)
│  ○ Manual
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步是让你选择要对接的大模型服务商，如果你现在还没有准备好API Key或本地模型环境，直接选Skip for now先跳过，后续再用&lt;code&gt;openclaw configure&lt;/code&gt;来配置。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Model/auth provider
│  ● OpenAI (Codex OAuth + API key)
│  ○ Anthropic
│  ○ Chutes
│  ○ MiniMax
│  ○ Moonshot AI (Kimi K2.5)
│  ○ Google
│  ○ xAI (Grok)
│  ○ Mistral AI
│  ○ Volcano Engine
│  ○ BytePlus
│  ○ OpenRouter
│  ○ Kilo Gateway
│  ○ Qwen
│  ○ Z.AI
│  ○ Qianfan
│  ○ Alibaba Cloud Model Studio
│  ○ Copilot
│  ○ Vercel AI Gateway
│  ○ OpenCode
│  ○ Xiaomi
│  ○ Synthetic
│  ○ Together AI
│  ○ Hugging Face
│  ○ Venice AI
│  ○ LiteLLM
│  ○ Cloudflare AI Gateway
│  ○ Custom Provider
│  ○ Ollama
│  ○ SGLang
│  ○ vLLM
│  ○ Skip for now
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我选择的是智谱AI，这里选择CN即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Z.AI auth method
│  ● Coding-Plan-Global (GLM Coding Plan Global (api.z.ai))
│  ○ Coding-Plan-CN
│  ○ Global
│  ○ CN
│  ○ Back
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我这里选择Paste API key now。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paste API key now：直接粘贴你的智谱 API Key，OpenClaw 会明文存储在配置文件中，操作简单、开箱即用，但配置文件权限要做好，避免泄露密钥。&lt;/li&gt;
&lt;li&gt;Use external secret provider：用外部密钥管理工具（如Vault、1Password等）来存储API Key，更安全但配置复杂。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;◆  How do you want to provide this API key?
│  ● Paste API key now (Stores the key directly in OpenClaw config)
│  ○ Use external secret provider
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这里直接粘贴API KEY即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Enter Z.AI API key
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步是选择具体的智谱大模型。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Default model
│  ○ Keep current (zai/glm-5)
│  ○ Enter model manually
│  ○ zai/glm-4.5
│  ○ zai/glm-4.5-air
│  ○ zai/glm-4.5-flash
│  ○ zai/glm-4.5v
│  ○ zai/glm-4.6
│  ○ zai/glm-4.6v
│  ○ zai/glm-4.7
│  ● zai/glm-4.7-flash (GLM-4.7 Flash · ctx 200k · reasoning)
│  ○ zai/glm-4.7-flashx
│  ○ zai/glm-5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步是让你选择要对接的聊天渠道（比如Telegram、飞书等），如果你暂时不想配置机器人，或者想先在本地或网页端使用OpenClaw，直接选择最后的&lt;code&gt;Skip for now&lt;/code&gt;跳过即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Select channel (QuickStart)
│  ● Telegram (Bot API) (recommended · newcomer-friendly)
│  ○ WhatsApp (QR link)
│  ○ Discord (Bot API)
│  ○ IRC (Server + Nick)
│  ○ Google Chat (Chat API)
│  ○ Slack (Socket Mode)
│  ○ Signal (signal-cli)
│  ○ iMessage (imsg)
│  ○ LINE (Messaging API)
│  ○ Feishu/Lark (飞书)
│  ○ Nostr (NIP-04 DMs)
│  ○ Microsoft Teams (Bot Framework)
│  ○ Mattermost (plugin)
│  ○ Nextcloud Talk (self-hosted)
│  ○ Matrix (plugin)
│  ○ BlueBubbles (macOS app)
│  ○ Zalo (Bot API)
│  ○ Zalo (Personal Account)
│  ○ Synology Chat (Webhook)
│  ○ Tlon (Urbit)
│  ○ Skip for now
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步是配置联网搜索能力，如果你暂时不需要让OpenClaw实时查资料，或者还没有对应搜索服务的API Key，直接选&lt;code&gt;Skip for now&lt;/code&gt;跳过即可，不影响核心AI对话功能。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Search provider
│  ○ Brave Search
│  ○ Gemini (Google Search)
│  ○ Grok (xAI)
│  ○ Kimi (Moonshot)
│  ○ Perplexity Search
│  ● Skip for now (Configure later with openclaw configure --section web)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步是配置OpenClaw的核心技能（比如文件操作、代码执行、系统管理等），选择Yes可以开启基础能力，让OpenClaw真正具备 “动手能力”，而不只是单纯对话。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◇  Configure skills now? (recommended)
│  ○ Yes / ● No
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步是让你安装各类第三方技能的依赖，这些技能大多是小众场景（比如1password、博客监控、喜马拉雅等），对核心AI对话或代码能力没有影响。直接选&lt;code&gt;Skip for now&lt;/code&gt;跳过即可。&lt;br /&gt;
使用上下方向键将光标放到&lt;code&gt;Skip for now&lt;/code&gt;上，按下空格选中，此时前面的白方框会变黑，然后按下回车键即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Install missing skill dependencies
│  ◻ Skip for now (Continue without installing dependencies)
│  ◻ 🔐 1password
│  ◻ 📰 blogwatcher
│  ◻ 🫐 blucli
│  ◻ 📸 camsnap
│  ◻ 🧩 clawhub
│  ◻ 🛌 eightctl
│  ◻ ✨ gemini
│  ◻ 🧲 gifgrep
│  ◻ 🐙 github
│  ◻ 🎮 gog
│  ◻ 📍 goplaces
│  ◻ 📧 himalaya
│  ◻ 📦 mcporter
│  ◻ 🍌 nano-banana-pro
│  ◻ 📄 nano-pdf
│  ◻ 💎 obsidian
│  ◻ 🎤 openai-whisper
│  ◻ 💡 openhue
│  ◻ 🧿 oracle
│  ◻ 🛵 ordercli
│  ◻ 🔊 sag
│  ◻ 🌊 songsee
│  ◻ 🔊 sonoscli
│  ◻ 🧾 summarize
│  ◻ 🎬 video-frames
│  ◻ 📱 wacli
│  ◻ 🐦 xurl
└
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否为goplaces技能设置Google Places API Key，goplaces是用于地点查询、POI检索的技能，和核心的AI对话或代码场景无关。选择&lt;code&gt;no&lt;/code&gt;即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Set GOOGLE_PLACES_API_KEY for goplaces?
│  ● Yes / ○ No
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否为nano-banana-pro技能设置Gemini API Key，选择&lt;code&gt;no&lt;/code&gt;即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Set GEMINI_API_KEY for nano-banana-pro?
│  ○ Yes / ● No
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否为notion技能设置Notion API Key，该技能用于和Notion笔记工具联动。选择&lt;code&gt;no&lt;/code&gt;即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Set NOTION_API_KEY for notion?
│  ○ Yes / ● No
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否为openai-image-gen技能设置OpenAI API Key，该技能用于调用DALL-E生成图片。选择&lt;code&gt;no&lt;/code&gt;即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Set OPENAI_API_KEY for openai-image-gen?
│  ○ Yes / ● No
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否为 openai-whisper-api技能设置 OpenAI API Key，该技能用于语音转文字。选择&lt;code&gt;no&lt;/code&gt;即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Set OPENAI_API_KEY for openai-whisper-api?
│  ○ Yes / ● No
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是否为sag技能设置ElevenLabs API Key，该技能用于语音合成。选择&lt;code&gt;no&lt;/code&gt;即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◆  Set ELEVENLABS_API_KEY for sag?
│  ○ Yes / ● No
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步是配置Hooks（自动化钩子），用于在执行agent命令时触发自动化操作：比如保存会话上下文、记录命令等，属于进阶自动化功能。选择&lt;code&gt;no&lt;/code&gt;即可。&lt;br /&gt;
使用上下方向键将光标放到&lt;code&gt;Skip for now&lt;/code&gt;上，按下空格选中，此时前面的白方框会变黑，然后按下回车键即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◇  Hooks ──────────────────────────────────────────────────────────────────╮
│                                                                          │
│  Hooks let you automate actions when agent commands are issued.          │
│  Example: Save session context to memory when you issue /new or /reset.  │
│                                                                          │
│  Learn more: https://docs.openclaw.ai/automation/hooks                   │
│                                                                          │
├──────────────────────────────────────────────────────────────────────────╯
│
◆  Enable hooks? 
│  ◻ Skip for now
│  ◻ 🚀 boot-md
│  ◻ 📎 bootstrap-extra-files
│  ◻ 📝 command-logger
│  ◻ 💾 session-memory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;出现以下输出日志时代表OpenClaw配置成功。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;◇  Enable hooks?
│  Skip for now
Config overwrite: /home/ninebytes/.openclaw/openclaw.json (sha256 a05765ad00e004990ef3a699668f5e8ea987a44bef8af8ebc8e7e639467a5c8b -&amp;gt; da553f0fc78821a0f5aab941c5272f9cc91b16722e6bc7daa82f8fb301d83982, backup=/home/ninebytes/.openclaw/openclaw.json.bak)
│
◇  Systemd ───────────────────────────────────────────────────────────────────────────────╮
│                                                                                         │
│  Systemd user services are unavailable. Skipping lingering checks and service install.  │
│                                                                                         │
├─────────────────────────────────────────────────────────────────────────────────────────╯
│
◇  
Health check failed: gateway closed (1006 abnormal closure (no close frame)): no close reason
  Gateway target: ws://127.0.0.1:18789
  Source: local loopback
  Config: /home/ninebytes/.openclaw/openclaw.json
  Bind: loopback
│
◇  Health check help ────────────────────────────────╮
│                                                    │
│  Docs:                                             │
│  https://docs.openclaw.ai/gateway/health           │
│  https://docs.openclaw.ai/gateway/troubleshooting  │
│                                                    │
├────────────────────────────────────────────────────╯
│
◇  Optional apps ────────────────────────╮
│                                        │
│  Add nodes for extra features:         │
│  - macOS app (system + notifications)  │
│  - iOS app (camera/canvas)             │
│  - Android app (camera/canvas)         │
│                                        │
├────────────────────────────────────────╯
│
◇  Control UI ───────────────────────────────────────────────────────────────────────────────╮
│                                                                                            │
│  Web UI: http://127.0.0.1:18789/                                                           │
│  Web UI (with token):                                                                      │
│  http://127.0.0.1:18789/#token=************            │
│  Gateway WS: ws://127.0.0.1:18789                                                          │
│  Gateway: not detected (gateway closed (1006 abnormal closure (no close frame)): no close  │
│  reason)                                                                                   │
│  Docs: https://docs.openclaw.ai/web/control-ui                                             │
│                                                                                            │
├────────────────────────────────────────────────────────────────────────────────────────────╯
│
◇  Workspace backup ────────────────────────────────────────╮
│                                                           │
│  Back up your agent workspace.                            │
│  Docs: https://docs.openclaw.ai/concepts/agent-workspace  │
│                                                           │
├───────────────────────────────────────────────────────────╯
│
◇  Security ──────────────────────────────────────────────────────╮
│                                                                 │
│  Running agents on your computer is risky — harden your setup:  │
│  https://docs.openclaw.ai/security                              │
│                                                                 │
├─────────────────────────────────────────────────────────────────╯
│
◇  Shell completion ────────────────────────────────────────────────────────╮
│                                                                           │
│  Shell completion installed. Restart your shell or run: source ~/.bashrc  │
│                                                                           │
├───────────────────────────────────────────────────────────────────────────╯
│
◇  Dashboard ready ────────────────────────────────────────────────────────────────╮
│                                                                                  │
│  Dashboard link (with token):                                                    │
│  http://127.0.0.1:18789/#token=************  │
│  Copy/paste this URL in a browser on this machine to control OpenClaw.           │
│  No GUI detected. Open from your computer:                                       │
│  ssh -N -L 18789:127.0.0.1:18789 ninebytes@&amp;lt;host&amp;gt;                                │
│  Then open:                                                                      │
│  http://localhost:18789/                                                         │
│  http://localhost:18789/#token=************  │
│  Docs:                                                                           │
│  https://docs.openclaw.ai/gateway/remote                                         │
│  https://docs.openclaw.ai/web/control-ui                                         │
│                                                                                  │
├──────────────────────────────────────────────────────────────────────────────────╯
│
◇  Web search ───────────────────────────────────────╮
│                                                    │
│  Web search was skipped. You can enable it later:  │
│    openclaw configure --section web                │
│                                                    │
│  Docs: https://docs.openclaw.ai/tools/web          │
│                                                    │
├────────────────────────────────────────────────────╯
│
◇  What now ─────────────────────────────────────────────────────────────╮
│                                                                        │
│  What now: https://openclaw.ai/showcase (&quot;What People Are Building&quot;).  │
│                                                                        │
├────────────────────────────────────────────────────────────────────────╯
│
└  Onboarding complete. Use the dashboard link above to control OpenClaw.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于使用的是虚拟机部署，还需要用SSH隧道打通虚拟机和宿主机，实现宿主机浏览器访问OpenClaw Web UI。
&lt;code&gt;ssh -N -L 127.0.0.1:18789:127.0.0.1:18789 虚拟机用户名@虚拟机IP&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-N：只建立隧道，不登录&lt;/li&gt;
&lt;li&gt;-L：本地端口转发&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：打通后仍需要保持PowerShell窗口运行！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Windows PowerShell
版权所有（C） Microsoft Corporation。保留所有权利。

安装最新的 PowerShell，了解新功能和改进！https://aka.ms/PSWindows

PS C:\Users\NineBytes&amp;gt; ssh -N -L 18789:127.0.0.1:18789 ninebytes@192.168.201.11
ninebytes@192.168.201.11&apos;s password:
| （光标会持续闪烁）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SSL隧道打通后，然后访问刚刚输出日志给出来的链接：&lt;code&gt;http://127.0.0.1:18789/#token=******&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实际操作时token会正常显示，我为了防止token泄露替换为了星号。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;若忘记你的API KEY，可以去你的大模型供应商后台获取或者使用：&lt;code&gt;cat ~/.openclaw/agents/main/agent/auth-profiles.json&lt;/code&gt;命令查看。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ninebytes@localhost ~]$ cat ~/.openclaw/agents/main/agent/auth-profiles.json
{
  &quot;version&quot;: 1,
  &quot;profiles&quot;: {
    &quot;zai:default&quot;: {
      &quot;type&quot;: &quot;api_key&quot;,
      &quot;provider&quot;: &quot;zai&quot;,
      &quot;key&quot;: &quot;af********************************LB&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/21/20675784ed7266a749f77e0e02cb7dfb.png&quot; alt=&quot;Snipaste 2026 03 21 17 38 44&quot; /&gt;
至此部署完成，可以开始配置专属于你的OpenClaw了！&lt;/p&gt;
</content:encoded></item><item><title>好久不见</title><link>https://blog.ninebytes.cc.cd/posts/life6-counter-strike/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/life6-counter-strike/</guid><description>还是以前那个味道</description><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/71a96f46fe7432ec41214cbdf3d599d4.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 15.46.12.28&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/46f1962f61c64b16841547880c6e71d8.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 15.46.34.42&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/c364aee748fd44bafe1c02d2f98d4599.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 15.47.12.98&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/50512ce621305d38967c7a47a15eebdb.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 15.53.27.93&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/c23b237a98dd966a552dc35863dc16de.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 15.54.19.33&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/1e8ea2a1cce03e1fa8edc3e1da3d348c.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 15.55.58.27&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/b7aae45fb5650249c9867d902fb508b3.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 16.00.29.77&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/9eb115beeb0825ec30d4c3bdff48dcf3.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 16.00.58.79&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/bf56ddbd89a562480bf97c3d1b3e82f9.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 16.02.29.56&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2026/03/14/366fdcd05fc98872f25691ec55bc09a0.png&quot; alt=&quot;Counter strike Global Offensive Screenshot 2026.03.05 16.10.09.43&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>山西忻州五台山风景区</title><link>https://blog.ninebytes.cc.cd/posts/life5-%E5%B1%B1%E8%A5%BF%E5%BF%BB%E5%B7%9E%E4%BA%94%E5%8F%B0%E5%B1%B1%E9%A3%8E%E6%99%AF%E5%8C%BA/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/life5-%E5%B1%B1%E8%A5%BF%E5%BF%BB%E5%B7%9E%E4%BA%94%E5%8F%B0%E5%B1%B1%E9%A3%8E%E6%99%AF%E5%8C%BA/</guid><description>山西 · 忻州</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/cb7300e957419fea1fa4b37ddcfac854.jpg&quot; alt=&quot;IMG 20251002 185354&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/d9ae2276917162f14bf268807d165a83.jpg&quot; alt=&quot;IMG 20251003 100254&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/2dd2844d998f8bcb858f71f5fb2e2692.jpg&quot; alt=&quot;IMG 20251003 102535&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/e45acd9f0df09c100ff0f558fd8b751a.jpg&quot; alt=&quot;IMG 20251003 102946&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/bc4616c6bdb504c912e1b3fd10e18949.jpg&quot; alt=&quot;IMG 20251003 103733&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/d713f2df4856ddab513f5e9b46c546bd.jpg&quot; alt=&quot;IMG 20251003 111135&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/338667ac768514d8a7b16b046c26bcc2.jpg&quot; alt=&quot;IMG 20251003 153009&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/c0a5532071eca191fa4caf4b6c5dcc06.jpg&quot; alt=&quot;IMG 20251003 154845&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/955d133b218f95d908d139c105205e31.jpg&quot; alt=&quot;IMG 20251003 160149&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/52b961541bf4f0941af30843ff745cf9.jpg&quot; alt=&quot;IMG 20251003 160435&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/c6a1daf17638ab73853955e95d2a7dde.jpg&quot; alt=&quot;IMG 20251003 163237&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/b72f519ac6b1ae07a2fd6215f019c182.jpg&quot; alt=&quot;IMG 20251003 172042&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/057862957c4d5e3dab17e86fee37d580.jpg&quot; alt=&quot;IMG 20251003 172939&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/18c0aaadc8bb72d6f0ac018f9fb3c153.jpg&quot; alt=&quot;IMG 20251003 173122&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/f1b2ecab2d10eb238375986cdcd33f38.jpg&quot; alt=&quot;IMG 20251003 173215&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/73f905d344bcb2d3eaed371ab6f19f53.jpg&quot; alt=&quot;IMG 20251003 173515&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/b89139a94c9935a403dbbe2d8342a226.jpg&quot; alt=&quot;IMG 20251003 173924&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/93be23915c7d89710ec1dbb03404b577.jpg&quot; alt=&quot;IMG 20251003 174110&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/11/c6f157e0bc894097965335d281c6cd4d.jpg&quot; alt=&quot;IMG 20251003 174241&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/10/12/a61a1d60f4fc16a0a45bee4d722c6a87.jpg&quot; alt=&quot;IMG 20251004 081216&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>37天速通C1</title><link>https://blog.ninebytes.cc.cd/posts/life4-37%E5%A4%A9%E9%80%9F%E9%80%9Ac1/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/life4-37%E5%A4%A9%E9%80%9F%E9%80%9Ac1/</guid><description>收快递又花20...</description><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2025/09/01/8e9ba8bf6e19038c133b19e5a098dfc0.png&quot; alt=&quot;Screenshot 2025 09 01 14 23 00 023 com.tmri.app.main.edit&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>博客接入Umami Cloud统计</title><link>https://blog.ninebytes.cc.cd/posts/tech10-%E5%8D%9A%E5%AE%A2%E6%8E%A5%E5%85%A5umami-cloud%E7%BB%9F%E8%AE%A1/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech10-%E5%8D%9A%E5%AE%A2%E6%8E%A5%E5%85%A5umami-cloud%E7%BB%9F%E8%AE%A1/</guid><description>高效、易读、可视化站点统计</description><pubDate>Sun, 03 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Umami介绍：&lt;/strong&gt;&lt;br /&gt;
Umami是一款轻量级、隐私优先的开源网站分析工具，可作为Google Analytics的替代品。它以隐私保护为核心设计，不追踪个人数据（无 IP 记录、无 Cookie），天然符合GDPR/CCPA等隐私法规要求。整个跟踪脚本仅 2KB 大小，比Google Analytics小了40倍，却提供了最关键的网站流量分析功能，包括页面浏览量、独立访客、设备类型和来源等核心指标。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本教程仅使用Umami Cloud，不适用于Umami自搭建。Umami自搭建请&lt;a href=&quot;https://www.bing.com/hp?ensearch=1&amp;amp;mkt=zh-CN&quot;&gt;自行搜索&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;效果展示：&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/3f5fb3ca4094a46f9d7a2f4707f5702b.png&quot; alt=&quot;Snipaste 2025 08 03 21 49 54&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;注册Umami账号&lt;/h1&gt;
&lt;p&gt;首先点击&lt;a href=&quot;https://umami.is/&quot;&gt;https://umami.is/&lt;/a&gt;去注册Umami Cloud账号。&lt;br /&gt;
点击右上角&lt;code&gt;Sign up&lt;/code&gt;注册Umami Cloud账号。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/42584b45ff6528980ffe26c150168db8.png&quot; alt=&quot;Snipaste 2025 08 03 21 54 55&quot; /&gt;
填写你的用户名、邮箱地址及密码。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/ed16bb9d6a4bf4ecb953101699773a31.png&quot; alt=&quot;Snipaste 2025 08 03 21 57 20&quot; /&gt;
然后去邮箱里查看有没有激活邮件，点击&lt;code&gt;Login&lt;/code&gt;进行登录。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/0456069dccad192a6ecfc69303f7c5a0.png&quot; alt=&quot;Snipaste 2025 08 03 22 01 02&quot; /&gt;
再次填写邮箱地址及密码进行登录。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/aba9a1d3f65c59767345a31dae0bbb05.png&quot; alt=&quot;Snipaste 2025 08 03 22 01 19&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置Umami&lt;/h1&gt;
&lt;p&gt;填写邮箱验证码。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/651ebfe466d5ce3a4d89f29c59bdb1a4.png&quot; alt=&quot;Snipaste 2025 08 03 22 02 29&quot; /&gt;
选择数据存放区域，United States或European Union均可。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/350ad09dbdd77b4837ceec5c04ae054d.png&quot; alt=&quot;Snipaste 2025 08 03 22 02 38&quot; /&gt;
随便填写即可。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/6604568c7b7cd4271078ca20733ab7c3.png&quot; alt=&quot;Snipaste 2025 08 03 22 02 57&quot; /&gt;
这里填写你的名称及要监听的域名。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/3565c5c7f2c63dcd601ec50f8725cee7.png&quot; alt=&quot;Snipaste 2025 08 03 22 03 20&quot; /&gt;
将Umami提供的跟踪代码添加到你网站的head中即可。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/8ba0bc81cd50ba7d93c5862d09b8bcd5.png&quot; alt=&quot;Snipaste 2025 08 03 22 03 35&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/46f0bdaf9bedc4495ad9554046566f67.png&quot; alt=&quot;Snipaste 2025 08 03 22 16 27&quot; /&gt;
Finish！&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/14f1d14e74d84e4f3fafa86a22fb1739.png&quot; alt=&quot;Snipaste 2025 08 03 22 03 45&quot; /&gt;
然后就成功来到了Umami挡泥板。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/4529e8ba4e33beddf8e1c3e1536ca11c.png&quot; alt=&quot;Snipaste 2025 08 03 22 19 08&quot; /&gt;
点击&lt;code&gt;View&lt;/code&gt;即可查看到你的网站统计信息啦！&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/3f5fb3ca4094a46f9d7a2f4707f5702b.png&quot; alt=&quot;Snipaste 2025 08 03 21 49 54&quot; /&gt;
还可以在网站设置中打开&lt;code&gt;Share URL&lt;/code&gt;。&lt;br /&gt;
复制URL放置在需要的位置即可。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/db263e28728fec05d54b4c2e1ed9b38e.png&quot; alt=&quot;Snipaste 2025 08 03 22 04 31&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Umami免费版局限性&lt;/h1&gt;
&lt;p&gt;Umami Cloud免费版计划限制添加3个站点，每月10W事件数，数据仅保留6个月。感觉不够用的话也可以自建。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/08/03/d683f577c93c4420255750dda531b5eb.png&quot; alt=&quot;Snipaste 2025 08 03 22 23 01&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>又爆金币力</title><link>https://blog.ninebytes.cc.cd/posts/life3-%E7%BB%AD%E8%B4%B9%E5%9F%9F%E5%90%8D/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/life3-%E7%BB%AD%E8%B4%B9%E5%9F%9F%E5%90%8D/</guid><description>域名快到期了，又续费了域名...</description><pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;去年暑假购买的1年域名，7月底过期。&lt;br /&gt;
本来不想续费的，想换用dpdns的免费域名，但无奈这个域名捆绑了好多服务。&lt;br /&gt;
就只能再续费1年了，花费$4.88刀勒。😭&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/07/24/21bcb86b13231a732a7cb3e9bf42381e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>ZeroSSL申请公网IP SSL证书及部署</title><link>https://blog.ninebytes.cc.cd/posts/tech9-zerossl%E7%94%B3%E8%AF%B7%E5%85%AC%E7%BD%91ip-ssl%E8%AF%81%E4%B9%A6%E5%8F%8A%E9%83%A8%E7%BD%B2/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech9-zerossl%E7%94%B3%E8%AF%B7%E5%85%AC%E7%BD%91ip-ssl%E8%AF%81%E4%B9%A6%E5%8F%8A%E9%83%A8%E7%BD%B2/</guid><description>提升数据安全性</description><pubDate>Sat, 19 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;我有一台国内的Debian12云服务器，我只拿它运行Alist。&lt;br /&gt;
因为我的域名是在NameSilo购买的，无法直接进行域名备案，只能申请公网IP证书。&lt;br /&gt;
ZeroSSL有免费的90Day公网IP证书，本文章使用ZeroSSL进行公网IP证书的申请及部署。&lt;br /&gt;
（&lt;s&gt;其实我也懒得备案，流程太麻烦了&lt;/s&gt;）&lt;/p&gt;
&lt;h1&gt;注册ZeroSSL&lt;/h1&gt;
&lt;p&gt;点击&lt;a href=&quot;https://app.zerossl.com/signup&quot;&gt;这里&lt;/a&gt;首先进行注册ZeroSSL，需要&lt;code&gt;魔法&lt;/code&gt;环境。&lt;/p&gt;
&lt;h1&gt;安装Nginx&lt;/h1&gt;
&lt;p&gt;更新软件包：&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;/code&gt;&lt;br /&gt;
安装Nginx：&lt;code&gt;sudo apt install nginx -y&lt;/code&gt;&lt;br /&gt;
安装完成后创建存放验证文件目录：&lt;code&gt;sudo mkdir -p /var/www/html/.well-known/pki-validation/&lt;/code&gt;&lt;br /&gt;
.well-known执行755：&lt;code&gt;sudo chmod -R 755 /var/www/html/.well-known/&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;开放安全组规则&lt;/h1&gt;
&lt;p&gt;去安全组规则中开放80端口，证书部署完成后再删除80端口规则即可。&lt;/p&gt;
&lt;h1&gt;申请新证书&lt;/h1&gt;
&lt;p&gt;点击New Certificate申请新证书，在文本框内输入服务器公网IP地址，然后就一直Next Step即可。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/ed74210b7c0fa3db0065b3591ea3ce18.png&quot; alt=&quot;9 1&quot; /&gt;
来到验证界面，选择&lt;code&gt;HTTP验证&lt;/code&gt;。然后点击&lt;code&gt;Download Auth File&lt;/code&gt;下载验证文件，将验证文件上传至刚刚创建的目录内。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/56d4a5fbd3234dea093f421d83994906.png&quot; alt=&quot;9 2&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;编写Nginx配置文件&lt;/h1&gt;
&lt;p&gt;编写zerossl.conf文件：&lt;code&gt;sudo vim /etc/nginx/zerossl.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name 公网IP地址;    
    root /var/www/html;
    location /.well-known/pki-validation/ {
        allow all;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后重启Nginx：&lt;code&gt;sudo systemctl restart nginx&lt;/code&gt;&lt;br /&gt;
测试Nginx：&lt;code&gt;sudo nginx -t&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ninebytes@hcss-ecs-fc21:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;下载证书&lt;/h1&gt;
&lt;p&gt;操作没有问题的话，验证通过后，ZeroSSL会颁发证书。选择默认的Certificate即可。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/46c21a360b4ab5e1ee30332e521b365a.png&quot; alt=&quot;9 3&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;部署证书&lt;/h1&gt;
&lt;p&gt;查看公网IP.zip压缩包结构：&lt;br /&gt;
我们需要的是服务器证书和私钥文件，即：&lt;code&gt;certificate.crt&lt;/code&gt;和&lt;code&gt;private.key&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ninebytes@hcss-ecs-fc21:~$ unzip -l 公网IP.zip 
Archive:  公网IP.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     2269  2025-04-19 04:24   certificate.crt
     2431  2025-04-19 04:24   ca_bundle.crt
     1702  2025-04-19 04:24   private.key
---------                     -------
     6402                     3 files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首先解压压缩包：&lt;code&gt;unzip 公网IP.zip&lt;/code&gt;&lt;br /&gt;
创建证书存放目录：&lt;code&gt;sudo mkdir /opt/alist/date/certs/&lt;/code&gt;&lt;br /&gt;
移动服务器证书和私钥文件到证书存放目录：&lt;code&gt;sudo mv certificate.crt private.key /opt/alist/data/certs/&lt;/code&gt;&lt;br /&gt;
开放读取权限：&lt;code&gt;sudo chmod 644 /opt/alist/data/certs/*&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;编写Alist配置文件&lt;/h1&gt;
&lt;p&gt;编写Alist配置文件：&lt;code&gt;sudo vim /opt/alist/data/config.json&lt;/code&gt;&lt;br /&gt;
注意要根据Alist实际安装目录来。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &quot;scheme&quot;: {
    &quot;address&quot;: &quot;0.0.0.0&quot;,
    &quot;http_port&quot;: -1, #关闭HTTP监听
    &quot;https_port&quot;: 62772, #设置HTTPS监听端口
    &quot;force_https&quot;: false, #关闭强制跳转HTTPS
    &quot;cert_file&quot;: &quot;/opt/alist/data/certs/certificate.crt&quot;, #服务器证书存放绝对路径
    &quot;key_file&quot;: &quot;/opt/alist/data/certs/private.key&quot;, #私钥文件存放绝对路径
    &quot;unix_file&quot;: &quot;&quot;,
    &quot;unix_file_perm&quot;: &quot;&quot;
  },
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启Alist服务：&lt;code&gt;sudo systemctl restart alist&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;验证SSL&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/2892944f20b3bc9c482af34bcd3a6219.png&quot; alt=&quot;9 4&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Debian Linux Ansible</title><link>https://blog.ninebytes.cc.cd/posts/tech8-debian-linux-ansible/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech8-debian-linux-ansible/</guid><description>自动化配置管理和轻量级运维工具</description><pubDate>Fri, 21 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Ansible简介&lt;/h1&gt;
&lt;p&gt;Ansible是一款开源的​自动化工具，由RedHat开发并维护，基于Python语言实现。它专注于简化 ​IT 基础设施的配置管理、应用部署和​任务自动化，遵循“基础设施即代码（IaC）”理念，通过声明式的语法实现高效运维。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心特性：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;无客户端架构：通过 SSH（Linux）或 WinRM（Windows）直接管理节点，无需在目标机器上安装额外客户端，并且被管理节点会将结果返回至管理节点。&lt;/li&gt;
&lt;li&gt;​YAML 语法：使用易读的YAML文件（Playbook）定义自动化任务，降低学习成本。&lt;/li&gt;
&lt;li&gt;​幂等性（Idempotent）​：任务重复执行不会改变系统最终状态，避免意外错误。&lt;/li&gt;
&lt;li&gt;​模块化设计：提供上千个内置模块（如 copy, service, template），支持自定义扩展。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;核心模块：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inventory​：定义被管理的主机列表及分组，又被称为“资源池”或“资产”。&lt;/li&gt;
&lt;li&gt;​Ad-Hoc：快速执行单条命令（如 ansible all -m ping 测试连通性）。&lt;/li&gt;
&lt;li&gt;​Playbook：YAML格式的自动化流程脚本，描述任务集和配置策略。&lt;/li&gt;
&lt;li&gt;​Role​：可复用的任务集合，实现逻辑分层与代码复用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⚠️&lt;strong&gt;注意：&lt;/strong&gt;&lt;br /&gt;
无论是Ad-Hoc或PlayBook所执行的某些功能不是由某些命令执行的，而是由一个个已经封装好的模块去执行的。比如复制功能的COPY模块；实现Ping功能的PING模块；执行Shell脚本的SHELL模块等等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;先决条件：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;管理节点&lt;/th&gt;
&lt;th&gt;被管理节点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenSSH&lt;/td&gt;
&lt;td&gt;OpenSSH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python Version &amp;gt;=2.6&lt;/td&gt;
&lt;td&gt;Python Version &amp;gt;=2.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ansible&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;安装EPEL仓库&lt;/h1&gt;
&lt;p&gt;使用&lt;code&gt;wget&lt;/code&gt;命令下载EPEL的rpm包：&lt;code&gt;wget https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# wget https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm
--2025-03-21 19:54:45--  https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 123.182.95.105, 106.8.159.240, 106.8.159.237, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|123.182.95.105|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18952 (19K) [application/x-rpm]
Saving to: ‘epel-release-latest-9.noarch.rpm’

epel-release-latest-9.noarch.r 100%[===================================================&amp;gt;]  18.51K  --.-KB/s    in 0s      

2025-03-21 19:54:45 (61.7 MB/s) - ‘epel-release-latest-9.noarch.rpm’ saved [18952/18952]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后使用&lt;code&gt;dnf&lt;/code&gt;命令安装下载好后的rpm包：&lt;code&gt;dnf install ./epel-release-latest-9.noarch.rpm&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# dnf install ./epel-release-latest-9.noarch.rpm
Last metadata expiration check: 0:04:28 ago on Fri 21 Mar 2025 07:50:43 PM CST.
Dependencies resolved.
===========================================================================================================================
 Package                        Architecture             Version                      Repository                      Size
===========================================================================================================================
Installing:
 epel-release                   noarch                   9-9.el9                      @commandline                    19 k

Transaction Summary
===========================================================================================================================
Install  1 Package

Total size: 19 k
Installed size: 26 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                   1/1 
  Installing       : epel-release-9-9.el9.noarch                                                                       1/1 
  Running scriptlet: epel-release-9-9.el9.noarch                                                                       1/1 
Many EPEL packages require the CodeReady Builder (CRB) repository.
It is recommended that you run /usr/bin/crb enable to enable the CRB repository.

  Verifying        : epel-release-9-9.el9.noarch                                                                       1/1 

Installed:
  epel-release-9-9.el9.noarch                                                                                              

Complete!

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后将EPEL仓库源替换为阿里EPEL源：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sed -i.bak \
    -e &apos;s|^#baseurl=|baseurl=|g&apos; \
    -e &apos;s|^metalink|#metalink|g&apos; \
    -e &apos;s|https://download.example/pub/epel|https://mirrors.aliyun.com/epel|g&apos; \
    /etc/yum.repos.d/epel*.repo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果在替换EPEL源时报错可以尝试强制重装EPEL rpm包。&lt;br /&gt;
&lt;strong&gt;报错信息：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# sed -e &apos;s|^#baseurl=|baseurl=|g&apos; \
         -e &apos;s|^metalink|#metalink|g&apos; \
         -e &apos;s|https://download.example/pub/epel|https://mirrors.aliyun.com/epel|g&apos; \
         -i /etc/yum.repos.d/epel*.repo
sed: can&apos;t read /etc/yum.repos.d/epel*.repo: No such file or directory
# 已成功安装EPEL但EPEL文件丢失；
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;强制重装EPEL rpm包：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# dnf reinstall ./epel-release-latest-9.noarch.rpm
Last metadata expiration check: 0:10:53 ago on Fri 21 Mar 2025 07:50:43 PM CST.
Dependencies resolved.
===========================================================================================================================
 Package                        Architecture             Version                      Repository                      Size
===========================================================================================================================
Reinstalling:
 epel-release                   noarch                   9-9.el9                      @commandline                    19 k

Transaction Summary
===========================================================================================================================

Total size: 19 k
Installed size: 26 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                   1/1 
  Reinstalling     : epel-release-9-9.el9.noarch                                                                       1/2 
  Running scriptlet: epel-release-9-9.el9.noarch                                                                       1/2 
  Cleanup          : epel-release-9-9.el9.noarch                                                                       2/2 
  Running scriptlet: epel-release-9-9.el9.noarch                                                                       2/2 
  Verifying        : epel-release-9-9.el9.noarch                                                                       1/2 
  Verifying        : epel-release-9-9.el9.noarch                                                                       2/2 

Reinstalled:
  epel-release-9-9.el9.noarch                                                                                              

Complete!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证阿里云EPEL源：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# grep &quot;mirrors.aliyun.com&quot; /etc/yum.repos.d/epel*.repo
/etc/yum.repos.d/epel-testing.repo:baseurl=https://mirrors.aliyun.com/epel/testing/9/Everything/$basearch/
/etc/yum.repos.d/epel-testing.repo:baseurl=https://mirrors.aliyun.com/epel/testing/9/Everything/$basearch/debug/
/etc/yum.repos.d/epel-testing.repo:baseurl=https://mirrors.aliyun.com/epel/testing/9/Everything/source/tree/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认EPEL文件已生成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ls /etc/yum.repos.d/epel*.repo
/etc/yum.repos.d/epel-cisco-openh264.repo  /etc/yum.repos.d/epel.repo  /etc/yum.repos.d/epel-testing.repo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;清理旧缓存：dnf clean all&lt;br /&gt;
生成新缓存：dnf makecache&lt;br /&gt;
测试仓库可用性：dnf update&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# dnf clean all &amp;amp;&amp;amp; dnf makecache &amp;amp;&amp;amp; dnf update
17 files removed
Error: Cannot find a valid baseurl for repo: epel-cisco-openh264
Rocky Linux 9 - BaseOS                                                                      29 MB/s | 2.2 MB     00:00    
Rocky Linux 9 - AppStream                                                                   38 MB/s | 7.9 MB     00:00    
Ignoring repositories: epel-cisco-openh264
Metadata cache created.
Error: Cannot find a valid baseurl for repo: epel-cisco-openh264
Ignoring repositories: epel-cisco-openh264
Last metadata expiration check: 0:00:05 ago on Fri 21 Mar 2025 08:25:55 PM CST.
Dependencies resolved.
Nothing to do.
Complete!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到上面的输出中有2条有关epel-cisco-openh264的报错信息。&lt;br /&gt;
该仓库用于提供​Cisco的OpenH264编解码器​（主要用于WebRTC视频通话等场景），但阿里云可能未同步此仓库，导致其baseurl配置失效。&lt;br /&gt;
虽然不会影响后续Ansible的安装，但也可以禁用epel-cisco-openh264仓库：&lt;br /&gt;
&lt;code&gt;sed -i &apos;s/enabled=1/enabled=0/g&apos; /etc/yum.repos.d/epel-cisco-openh264.repo&lt;/code&gt;。&lt;br /&gt;
清理缓存并生成新缓存：&lt;br /&gt;
&lt;code&gt;rm -rf /var/cache/dnf &amp;amp;&amp;amp; dnf clean all &amp;amp;&amp;amp; sudo dnf makecache&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;安装Ansible&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;dnf安装：&lt;/strong&gt;
使用&lt;code&gt;dnf install ansible-core&lt;/code&gt;命令安装Ansible。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# dnf install ansible-core
Last metadata expiration check: 0:00:28 ago on Fri 21 Mar 2025 08:30:39 PM CST.
Dependencies resolved.
===========================================================================================================================
 Package                             Architecture          Version                          Repository                Size
===========================================================================================================================
Installing:
 ansible-core                        x86_64                1:2.14.14-1.el9                  AppStream                2.2 M
Installing dependencies:
 git-core                            x86_64                2.43.0-1.el9                     AppStream                4.4 M
 python3-cffi                        x86_64                1.14.5-5.el9                     baseos                   241 k
 python3-cryptography                x86_64                36.0.1-4.el9                     baseos                   1.2 M
 python3-packaging                   noarch                20.9-5.el9                       AppStream                 69 k
 python3-ply                         noarch                3.11-14.el9.0.1                  baseos                   103 k
 python3-pycparser                   noarch                2.20-6.el9                       baseos                   124 k
 python3-pyparsing                   noarch                2.4.7-9.el9                      baseos                   150 k
 python3-resolvelib                  noarch                0.5.4-5.el9                      AppStream                 29 k
 sshpass                             x86_64                1.09-4.el9                       AppStream                 27 k

Transaction Summary
===========================================================================================================================
Install  10 Packages

Total size: 8.4 M
Installed size: 38 M
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                   1/1 
  Installing       : git-core-2.43.0-1.el9.x86_64                                                                     1/10 
  Installing       : sshpass-1.09-4.el9.x86_64                                                                        2/10 
  Installing       : python3-resolvelib-0.5.4-5.el9.noarch                                                            3/10 
  Installing       : python3-ply-3.11-14.el9.0.1.noarch                                                               4/10 
  Installing       : python3-pycparser-2.20-6.el9.noarch                                                              5/10 
  Installing       : python3-cffi-1.14.5-5.el9.x86_64                                                                 6/10 
  Installing       : python3-cryptography-36.0.1-4.el9.x86_64                                                         7/10 
  Installing       : python3-pyparsing-2.4.7-9.el9.noarch                                                             8/10 
  Installing       : python3-packaging-20.9-5.el9.noarch                                                              9/10 
  Installing       : ansible-core-1:2.14.14-1.el9.x86_64                                                             10/10 
  Running scriptlet: ansible-core-1:2.14.14-1.el9.x86_64                                                             10/10 
  Verifying        : python3-pyparsing-2.4.7-9.el9.noarch                                                             1/10 
  Verifying        : python3-cryptography-36.0.1-4.el9.x86_64                                                         2/10 
  Verifying        : python3-cffi-1.14.5-5.el9.x86_64                                                                 3/10 
  Verifying        : python3-ply-3.11-14.el9.0.1.noarch                                                               4/10 
  Verifying        : python3-pycparser-2.20-6.el9.noarch                                                              5/10 
  Verifying        : python3-packaging-20.9-5.el9.noarch                                                              6/10 
  Verifying        : python3-resolvelib-0.5.4-5.el9.noarch                                                            7/10 
  Verifying        : sshpass-1.09-4.el9.x86_64                                                                        8/10 
  Verifying        : git-core-2.43.0-1.el9.x86_64                                                                     9/10 
  Verifying        : ansible-core-1:2.14.14-1.el9.x86_64                                                             10/10 

Installed:
  ansible-core-1:2.14.14-1.el9.x86_64        git-core-2.43.0-1.el9.x86_64           python3-cffi-1.14.5-5.el9.x86_64       
  python3-cryptography-36.0.1-4.el9.x86_64   python3-packaging-20.9-5.el9.noarch    python3-ply-3.11-14.el9.0.1.noarch     
  python3-pycparser-2.20-6.el9.noarch        python3-pyparsing-2.4.7-9.el9.noarch   python3-resolvelib-0.5.4-5.el9.noarch  
  sshpass-1.09-4.el9.x86_64                 

Complete!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible --version
ansible [core 2.14.14]
  # Ansible配置文件位置，特殊情况下才会修改；
  config file = /etc/ansible/ansible.cfg
  # 配置模块位置[root用户路径；其他用户路径]；
  configured module search path = [&apos;/root/.ansible/plugins/modules&apos;, &apos;/usr/share/ansible/plugins/modules&apos;]
  # Ansible python模块位置；
  ansible python module location = /usr/lib/python3.9/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  # Ansible使用的Python版本；
  python version = 3.9.18 (main, Jan 24 2024, 00:00:00) [GCC 11.4.1 20231218 (Red Hat 11.4.1-3)] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;pip安装：&lt;/strong&gt;&lt;br /&gt;
安装Python3和pip：&lt;code&gt;dnf install python3 python3-pip&lt;/code&gt;。&lt;br /&gt;
pip安装ansible&lt;code&gt;pip3 install ansible&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;建立信任关系&lt;/h1&gt;
&lt;p&gt;Ansible使用的是SSH协议控制被管理节点的，就需要把管理节点的公钥给到被管理节点。&lt;br /&gt;
&lt;strong&gt;创建密钥对：&lt;/strong&gt;&lt;br /&gt;
管理节点创建密钥对：&lt;code&gt;ssh-keygen -t rsa&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:3s7c0wCEO/h2Tt3bsU28/jeqo6biqUEwzbbH0WQFMDk root@server
The key&apos;s randomart image is:
+---[RSA 3072]----+
|     oo+oo       |
|  o  E= . .      |
| o + ..o o       |
|  + o o o .      |
|   o o .S. o . . |
|  . .  .o.o o ..o|
|   .   ..+.  o +=|
|    ...  =.o. o++|
|   .oo..o.=.+oo.=|
+----[SHA256]-----+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证密钥对：&lt;code&gt;ls ~/.ssh&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ls ~/.ssh
id_rsa  id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;传输公钥至被管理节点：&lt;/strong&gt;
使用命令：&lt;code&gt;ssh-copy-id root@192.168.201.12&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请将&quot;root@192.168.201.12&quot;替换成你当前所在环境的用户名及主机地址；&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ssh-copy-id root@192.168.201.12
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &quot;/root/.ssh/id_rsa.pub&quot;
The authenticity of host &apos;192.168.201.12 (192.168.201.12)&apos; can&apos;t be established.
ED25519 key fingerprint is SHA256:2HrA0fsMIcuhKDEX/TOeNb7DcuMG4nNZlSLJ5fS4LdE.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.201.12&apos;s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   &quot;ssh &apos;root@192.168.201.12&apos;&quot;
and check to make sure that only the key(s) you wanted were added.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试是否可以免密SSH登录：&lt;code&gt;ssh root@192.168.201.12&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ssh root@192.168.201.12
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Fri Mar 21 19:37:00 2025 from 192.168.201.1
[root@slave1 ~]# exit
logout
Connection to 192.168.201.12 closed.
```shell
另一台被管理节点也是同样传输公钥。  
使用命令：`ssh-copy-id root@192.168.201.13`。  
```shell
[root@server ~]# ssh-copy-id root@192.168.201.13
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &quot;/root/.ssh/id_rsa.pub&quot;
The authenticity of host &apos;192.168.201.13 (192.168.201.13)&apos; can&apos;t be established.
ED25519 key fingerprint is SHA256:2HrA0fsMIcuhKDEX/TOeNb7DcuMG4nNZlSLJ5fS4LdE.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:1: 192.168.201.12
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.201.13&apos;s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   &quot;ssh &apos;root@192.168.201.13&apos;&quot;
and check to make sure that only the key(s) you wanted were added.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Ansible资产&lt;/h1&gt;
&lt;p&gt;Ansible资产分为：静态资产和动态资产。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;静态资产：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;定义：静态资产是一个​手动编写​​的文本文件（默认为/etc/ansible/hosts），支持INI格式或YAML格式，其中包含固定的主机列表和分组信息。&lt;/p&gt;
&lt;p&gt;特点​：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;手动维护​​：需要管理员手动编辑文件来添加、删除或修改主机。&lt;/li&gt;
&lt;li&gt;​简单直接​​：适用于主机数量较少且变化不频繁的环境。&lt;/li&gt;
&lt;li&gt;​支持分组和变量​​：可以在文件中定义主机组，并为组或主机设置变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;小型或静态环境（如实验室、测试集群）；&lt;/li&gt;
&lt;li&gt;需要手动控制主机列表的情况；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;动态资产：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;定义：动态资产通过​​外部脚本或API​​实时获取主机信息，适用于 ​云环境或 ​自动伸缩场景。&lt;/p&gt;
&lt;p&gt;特点​​：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;​自动更新​​：主机信息从外部系统（如云平台、CMDB）动态获取；&lt;/li&gt;
&lt;li&gt;​减少人工维护​​：适合大规模、频繁变动的环境；&lt;/li&gt;
&lt;li&gt;支持过滤和变量​​：可以根据标签、区域等条件动态分组；&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;资产编写语法&lt;/h1&gt;
&lt;p&gt;[1]未分组的主机：&lt;br /&gt;
这些没有具体归属的组，默认会被分配到&lt;code&gt;ALL&lt;/code&gt;组。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;192.168.10.1
10.10.10.11
red.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[2]分组的主机：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[webservers]
192.168.20.1
10.20.10.11
green.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[3]连续的主机：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 192.168.30.1~192.168.30.15;
192.168.30.[1:15]
# www1.example.com~www9.example.com;
www[1:9].example.com 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[4]注释掉的主机：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 192.168.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如何使用自定义资产？&lt;br /&gt;
通过-i参数指定自定义资产的相对路径或绝对路径即可。&lt;br /&gt;
&lt;code&gt;ansible all -i /etc/ansible/inventory.ini ...&lt;/code&gt;&lt;br /&gt;
如何验证自定义资产？&lt;br /&gt;
&lt;code&gt;ansible -i inventory.ini test1_servers --list-hosts&lt;/code&gt;&lt;br /&gt;
列出inventory.ini文件中test1_servers分组的主机；&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini test1_servers --list-hosts
  hosts (3):
    192.168.201.12
    192.168.201.13
    192.168.60.11
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;资产选择器&lt;/h1&gt;
&lt;p&gt;有时候我们只想对资产文件中的某一部分资产进行操作，而不是全部资产服务器。这时就可以使用Ansible资产选择器&lt;code&gt;PATTERN&lt;/code&gt;。&lt;br /&gt;
基本语法格式：&lt;code&gt;ansible PATTERN -i inventory -m module -a argument&lt;/code&gt;。&lt;br /&gt;
其中，&lt;code&gt;PATTERN&lt;/code&gt;可以是资产文件中的存在的一台主机[主机名或IP]或一个组名；&lt;br /&gt;
&lt;code&gt;-i&lt;/code&gt;：指定资产文件；&lt;br /&gt;
&lt;code&gt;-m&lt;/code&gt;：指定使用的模块；&lt;br /&gt;
&lt;code&gt;-a&lt;/code&gt;：关于使用的模块传递的参数；&lt;br /&gt;
[1]选择单台服务器：&lt;code&gt;ansible -i /etc/ansible/inventory.ini 192.168.201.12 --list-hosts&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini 192.168.201.12 --list-hosts
  hosts (1):
    192.168.201.12
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以将IP替换为主机名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini test1.example.com --list-hosts
  hosts (1):
    test1.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[2]选择多台主机使用&quot;,&quot;间隔：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini 192.168.201.12,192.168.201.13 --list-hosts
  hosts (2):
    192.168.201.12
    192.168.201.13
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[3]选择一个组：&lt;br /&gt;
192.168.60.11同时属于test1_servers和test2_servers组，但是Ansible会自动去重，并不会对重复的主机执行2次操作。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini all-servers --list-hosts
  hosts (5):
    192.168.201.12
    192.168.201.13
    192.168.60.11
    192.168.100.11
    192.168.100.12
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[4]使用*匹配：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini 192.168.50.* --list-hosts
  hosts (10):
    192.168.50.1
    192.168.50.2
    192.168.50.3
    192.168.50.4
    192.168.50.5
    192.168.50.6
    192.168.50.7
    192.168.50.8
    192.168.50.9
    192.168.50.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[5]使用逻辑匹配：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;列出test1_servers和test2_servers两个组的并集，并自动去重。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini &apos;test1_servers:test2_servers&apos; --list-hosts
  hosts (5):
    192.168.201.12
    192.168.201.13
    192.168.60.11
    192.168.100.11
    192.168.100.12
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;列出test1_servers和test2_servers两个组的交集，即两组共有的主机。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini &apos;test1_servers:&amp;amp;test2_servers&apos; --list-hosts
  hosts (1):
    192.168.60.11
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;列出在test1_servers中，不在test2中，及去除两组共有的主机后的主机的集合。&lt;br /&gt;
需要注意的是命令有先后顺序之分。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini &apos;test1_servers:!test2_servers&apos; --list-hosts
  hosts (2):
    192.168.201.12
    192.168.201.13
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例图：&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/e43718f304a5ff221de02eed6149ec80.png&quot; alt=&quot;8 1&quot; /&gt;
4. 列出在test2_servers中，不在test1中，及去除两组共有的主机后的主机的集合。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible -i /etc/ansible/inventory.ini &apos;test2_servers:!test1_servers&apos; --list-hosts
  hosts (2):
    192.168.100.11
    192.168.100.12
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例图：&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/027262da3efd37d950a9a65e82f753b5.png&quot; alt=&quot;8 2&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;AD-Hoc&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;1.什么是AD-Hoc？&lt;/strong&gt;&lt;br /&gt;
AD-Hoc类似于在命令行内输入Shell命令，可以快速执行一些测试或执行一些临时命令。AD-Hoc和Ansible Playbook类似Shell命令和Shell脚本的区别。&lt;br /&gt;
如果执行命令需要增加某些判断逻辑或循环，亦或者是经常要使用的命令。这种情况下不适合使用AD-Hoc，适合使用Playbook。&lt;/p&gt;
&lt;p&gt;基本语法格式：&lt;code&gt;ansible PATTERN [-i inventory] -m module -a argument&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.Ansible模块类型：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;核心模块：由Ansible官方团队提供维护的；&lt;/li&gt;
&lt;li&gt;附加模块：由各个社区提供。例如OpenStack、Docker社区等；&lt;/li&gt;
&lt;li&gt;自定义模块：当核心模块和附加模块无法满足要求时，用户可以自定义模块；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;默认情况下，在安装Ansible 的时候， 核⼼模块和附加模块都已经安装⽽⽆需⽤户⼲预。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.联机帮助：&lt;/strong&gt;&lt;br /&gt;
Ansible 的核⼼模块和附加模块，数量是数以千计的。这样庞⼤的模块数量，对于任何⼀个接触Ansible的⼈来说都不可能将其完全记住和掌握使⽤。因此能够顺利使⽤Ansible的帮助⽂档，对我们来说是很有必要的。Ansible 的帮助⽂档，由它本身提供的命令ansible-doc实现。&lt;/p&gt;
&lt;p&gt;常用帮助参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;统计当前系统中已安装的Ansible模块总数：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[root@server ansible]# ansible-doc -l | wc -l
8394
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你只有几十个模块的话，那说明你安装的是core版的Ansible。只有核心模块也足够基础学习和使用了，附加模块非必需但实用。如果想要安装完整版Ansible，请使用pip安装。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查询某个模块的使用方法：&lt;code&gt;ansible-doc [-s] [*模块名]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;-s：可选，查看简化文档；&lt;br /&gt;
模块名：必选，模块名称；&lt;br /&gt;
&lt;strong&gt;使用方法文档太长，不做展示。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Ansible常用模块&lt;/h1&gt;
&lt;h2&gt;command &amp;amp; shell&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;command模块作用：&lt;/strong&gt;&lt;br /&gt;
在目标节点上 ​​直接执行命令​​，​​不通过 shell 解析​​（如变量替换、管道等）。&lt;br /&gt;
command模块是AD-Hoc的默认模块，在执行AD-Hoc时，若不指定模块，则默认使用command模块。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;shell模块作用：&lt;/strong&gt;&lt;br /&gt;
在目标节点上 ​​通过shell环境执行命令​​，支持所有shell功能（管道、重定向等）。&lt;/p&gt;
&lt;p&gt;现在新建一个&lt;code&gt;inventory2.ini&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[test1_servers]
192.168.201.12

[test2_servers]
192.168.201.13
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行命令：&lt;code&gt;ansible all -i /etc/ansible/inventory2.ini -a &quot;echo &apos;hello&apos;&quot;&lt;/code&gt;。&lt;br /&gt;
这条命令并没有指定模块，默认使用的是command模块。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible all -i /etc/ansible/inventory2.ini -a &quot;echo &apos;hello&apos;&quot;
192.168.201.13 | CHANGED | rc=0 &amp;gt;&amp;gt;
hello
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
hello
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在再指定shell模块执行相同的命令：&lt;code&gt;ansible all -i /etc/ansible/inventory2.ini -m shell -a &quot;echo &apos;hello&apos;&quot;&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible all -i /etc/ansible/inventory2.ini -m shell -a &quot;echo &apos;hello&apos;&quot;
192.168.201.13 | CHANGED | rc=0 &amp;gt;&amp;gt;
hello
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
hello
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到输出结果均是相同的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;command和shell模块区别：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;commend模块无法执行shell内置命令及特性；&lt;/li&gt;
&lt;li&gt;shell模块可以执行shell内置命令和特性。例如管道符等；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;commend &amp;amp; shell Example：&lt;/strong&gt;&lt;br /&gt;
使用shell模块+管道符过滤出e字母：&lt;br /&gt;
&lt;code&gt;ansible all -i /etc/ansible/inventory2.ini -m shell -a &quot;echo &apos;hello&apos; | grep -o &apos;e&apos;&quot;&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible all -i /etc/ansible/inventory2.ini -m shell -a &quot;echo &apos;hello&apos; | grep -o &apos;e&apos;&quot;
192.168.201.13 | CHANGED | rc=0 &amp;gt;&amp;gt;
e
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不指定模块，使用默认commend模块执行相同命令：&lt;br /&gt;
可以看到输出结果，因为commend模块无法使用管道符，无法过滤出&quot;e&quot;字母，直接将echo后的参数整个输出了出来。&lt;br /&gt;
&lt;code&gt;ansible all -i /etc/ansible/inventory2.ini -a &quot;echo &apos;hello&apos; | grep -o &apos;e&apos;&quot;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible all -i /etc/ansible/inventory2.ini -a &quot;echo &apos;hello&apos; | grep -o &apos;e&apos;&quot;
192.168.201.13 | CHANGED | rc=0 &amp;gt;&amp;gt;
hello | grep -o e
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
hello | grep -o e
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;script&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
该模块会将脚本​​复制到被管理节点后执行​​（类似scp+ssh组合），但执行.py脚本目标节点必须配有Python环境。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example：&lt;/strong&gt;&lt;br /&gt;
首先创建一个.sh脚本，在root用户目录下创建一个lookme.txt文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# vi tsa1.sh
[root@server ~]# cat tsa1.sh 
touch /root/lookme.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在先对一个组进行操作：&lt;br /&gt;
&lt;code&gt;ansible test1_servers -i /etc/ansible/inventory2.ini -m script -a &quot;/root/tsa1.sh&quot;&lt;/code&gt;&lt;br /&gt;
-a选项内加上你要复制的脚本的绝对路径。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m script -a &quot;/root/tsa1.sh&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;changed&quot;: true, #已进行改变；
    &quot;rc&quot;: 0, #返回值为0；
    &quot;stderr&quot;: &quot;Shared connection to 192.168.201.12 closed.\r\n&quot;,
    &quot;stderr_lines&quot;: [
        &quot;Shared connection to 192.168.201.12 closed.&quot;
    ],
    &quot;stdout&quot;: &quot;&quot;,
    &quot;stdout_lines&quot;: []
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以看到在被管理节点/root目录下有新创建的lookme.txt文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls /root&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
anaconda-ks.cfg
lookme.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;copy&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
将管理节点上的文件或目录​​复制到各被管理节点​​的指定路径，支持设置权限、属主等属性。&lt;br /&gt;
&lt;strong&gt;常用参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;src：源文件路径（管理节点文件/目录）；&lt;/li&gt;
&lt;li&gt;dest：目标路径（被管理节点文件/目录）；&lt;/li&gt;
&lt;li&gt;backup：若被管理节点​​的源文件有变动，则在覆盖前备份原文件（yes/no）；&lt;/li&gt;
&lt;li&gt;owner：设置新拷贝文件属主；&lt;/li&gt;
&lt;li&gt;group：设置新拷贝文件属组；&lt;/li&gt;
&lt;li&gt;mode：设置新拷贝文件权限（八进制或符号模式）；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;src &amp;amp; dest Example：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;复制管理节点/root/tsb1.txt到被管理节点/root目录中：&lt;br /&gt;
&lt;code&gt;ansible test1_servers -i /etc/ansible/inventory2.ini -m copy -a &quot;src=./tsb1.txt dest=/root/tsb1.txt&quot;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m copy -a &quot;src=./tsb1.txt dest=/root/tsb1.txt&quot;
192.168.201.12 | CHANGED =&amp;gt; {
#返回结果的被控节点地址 | 状态：改变；
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot; #使用的python解释器；
    },
    &quot;changed&quot;: true, #已进行改变；
    &quot;checksum&quot;: &quot;ebb92ca6d631204c2333dd9513e3c137ac13395d&quot;, #源文件的SHA1校验值；
    &quot;dest&quot;: &quot;/root/tsb1.txt&quot;, #目标文件地址；
    &quot;gid&quot;: 0, #属组ID；
    &quot;group&quot;: &quot;root&quot;, #所属组；
    &quot;md5sum&quot;: &quot;4e1825cbf34d727cfad6a838d9939704&quot;, #目标文件MD5校验值；
    &quot;mode&quot;: &quot;0644&quot;, #文件权限；
    &quot;owner&quot;: &quot;root&quot;, #属主；
    &quot;secontext&quot;: &quot;system_u:object_r:admin_home_t:s0&quot;,
    &quot;size&quot;: 6, #文件大小；
    &quot;src&quot;: &quot;/root/.ansible/tmp/ansible-tmp-1744555001.9337418-7441-110356214628896/source&quot;, #临时脚本文件地址；
    &quot;state&quot;: &quot;file&quot;,
    &quot;uid&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以看到在被管理节点/root目录下有新创建的tsb1.txt文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls /root&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
anaconda-ks.cfg
lookme.txt
tsb1.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;backup Example：&lt;/strong&gt;&lt;br /&gt;
我们刚才从管理节点复制了tsb1.txt到被管理节点上，这份文件并没有进行变动。&lt;br /&gt;
现在我们将backup参数设置为yes看看效果。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m copy -a &quot;src=./tsb1.txt dest=/root/tsb1.txt backup=yes&quot;
192.168.201.12 | SUCCESS =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: false,
    &quot;checksum&quot;: &quot;ebb92ca6d631204c2333dd9513e3c137ac13395d&quot;,
    &quot;dest&quot;: &quot;/root/tsb1.txt&quot;,
    &quot;gid&quot;: 0,
    &quot;group&quot;: &quot;root&quot;,
    &quot;mode&quot;: &quot;0644&quot;,
    &quot;owner&quot;: &quot;root&quot;,
    &quot;path&quot;: &quot;/root/tsb1.txt&quot;,
    &quot;secontext&quot;: &quot;system_u:object_r:admin_home_t:s0&quot;,
    &quot;size&quot;: 6,
    &quot;state&quot;: &quot;file&quot;,
    &quot;uid&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到changed参数是false的。&lt;br /&gt;
若是现有的md5值与将要复制的文件的md5值一致的话，那么Ansible并不会进行任何操作，只会反馈记录给你，并不会进行覆盖文件和备份源文件的操作。&lt;br /&gt;
现在我们将被管理节点的tsb1.txt追加一点字符，让其进行改变：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@slave1 ~]# echo &quot;0413&quot; &amp;gt;&amp;gt; tsb1.txt
[root@slave1 ~]# cat tsb1.txt 
2025
0413
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在再次执行命令：&lt;br /&gt;
可以看到changed参数已经变为true。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m copy -a &quot;src=./tsb1.txt dest=/root/tsb1.txt backup=yes&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;backup_file&quot;: &quot;/root/tsb1.txt.5644.2025-04-13@23:05:42~&quot;,
    &quot;changed&quot;: true,
    &quot;checksum&quot;: &quot;ebb92ca6d631204c2333dd9513e3c137ac13395d&quot;,
    &quot;dest&quot;: &quot;/root/tsb1.txt&quot;,
    &quot;gid&quot;: 0,
    &quot;group&quot;: &quot;root&quot;,
    &quot;md5sum&quot;: &quot;4e1825cbf34d727cfad6a838d9939704&quot;,
    &quot;mode&quot;: &quot;0644&quot;,
    &quot;owner&quot;: &quot;root&quot;,
    &quot;secontext&quot;: &quot;system_u:object_r:admin_home_t:s0&quot;,
    &quot;size&quot;: 6,
    &quot;src&quot;: &quot;/root/.ansible/tmp/ansible-tmp-1744556732.4213805-7558-258084477085640/source&quot;,
    &quot;state&quot;: &quot;file&quot;,
    &quot;uid&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证：&lt;br /&gt;
Ansible备份文件为&lt;code&gt;tsb1.txt.5644.2025-04-13@23:05:42~&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls /root&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
anaconda-ks.cfg
lookme.txt
tsb1.txt
tsb1.txt.5644.2025-04-13@23:05:42~

-----

[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;cat /root/tsb1*&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
2025 #未经追加变动的文件

2025 #经过追加变动的文件
0413
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;owner &amp;amp; group Example：&lt;/strong&gt;&lt;br /&gt;
将tsb1.txt文件设置所属用户为ninebytes，所属用户组为ninebytes。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置的所属用户或用户组须在目标主机上存在。否则使用&lt;code&gt;useradd -m -s /bin/bash -G [usergroup] [username]&lt;/code&gt;创建。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m copy -a &quot;src=./tsb1.txt dest=/root/tsb1.txt owner=ninebytes group=ninebytes&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;checksum&quot;: &quot;ebb92ca6d631204c2333dd9513e3c137ac13395d&quot;,
    &quot;dest&quot;: &quot;/root/tsb1.txt&quot;,
    &quot;gid&quot;: 1000,
    &quot;group&quot;: &quot;ninebytes&quot;,
    &quot;mode&quot;: &quot;0644&quot;,
    &quot;owner&quot;: &quot;ninebytes&quot;,
    &quot;path&quot;: &quot;/root/tsb1.txt&quot;,
    &quot;secontext&quot;: &quot;system_u:object_r:admin_home_t:s0&quot;,
    &quot;size&quot;: 6,
    &quot;state&quot;: &quot;file&quot;,
    &quot;uid&quot;: 1000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证：&lt;br /&gt;
可以看到tsb1.txt文件所属用户及所属用户组已经为ninebytes。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls -l /root&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
total 12
-rw-------. 1 root      root      1197 Mar 20 18:13 anaconda-ks.cfg
-rw-r--r--. 1 root      root         0 Apr 13 21:01 lookme.txt
-rw-r--r--. 1 ninebytes ninebytes    6 Apr 13 23:05 tsb1.txt
-rw-r--r--. 1 root      root        10 Apr 13 23:01 tsb1.txt.5644.2025-04-13@23:05:42~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;mode Example：&lt;/strong&gt;
将tsb1权限设置为755：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m copy -a &quot;src=./tsb1.txt dest=/root/tsb1.txt mode=0755&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;checksum&quot;: &quot;ebb92ca6d631204c2333dd9513e3c137ac13395d&quot;,
    &quot;dest&quot;: &quot;/root/tsb1.txt&quot;,
    &quot;gid&quot;: 1000,
    &quot;group&quot;: &quot;ninebytes&quot;,
    &quot;mode&quot;: &quot;0755&quot;,
    &quot;owner&quot;: &quot;ninebytes&quot;,
    &quot;path&quot;: &quot;/root/tsb1.txt&quot;,
    &quot;secontext&quot;: &quot;system_u:object_r:admin_home_t:s0&quot;,
    &quot;size&quot;: 6,
    &quot;state&quot;: &quot;file&quot;,
    &quot;uid&quot;: 1000
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到mode参数已经变为了0755，但是所属用户及用户组依然是ninebytes。&lt;br /&gt;
现在我们将tsb1.txt文件删除，再次复制一份tsb1.txt文件，并将权限设置为755：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m copy -a &quot;src=./tsb1.txt dest=/root/tsb1.txt mode=0755&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;checksum&quot;: &quot;ebb92ca6d631204c2333dd9513e3c137ac13395d&quot;,
    &quot;dest&quot;: &quot;/root/tsb1.txt&quot;,
    &quot;gid&quot;: 0,
    &quot;group&quot;: &quot;root&quot;,
    &quot;md5sum&quot;: &quot;4e1825cbf34d727cfad6a838d9939704&quot;,
    &quot;mode&quot;: &quot;0755&quot;,
    &quot;owner&quot;: &quot;root&quot;,
    &quot;secontext&quot;: &quot;system_u:object_r:admin_home_t:s0&quot;,
    &quot;size&quot;: 6,
    &quot;src&quot;: &quot;/root/.ansible/tmp/ansible-tmp-1744558397.1363587-7717-16903293464467/source&quot;,
    &quot;state&quot;: &quot;file&quot;,
    &quot;uid&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到由于我们并没有指定文件的所属用户及用户组，所以默认归属于root用户。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;yum_repsitory&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
用于管理​​YUM/DNF软件仓库​​的模块，适用于​​RHEL/CentOS/Fedora​​等基于RPM的系统。它可以添加、修改或删除YUM仓库配置，确保目标主机能够从指定源安装软件包。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name：仓库名称，必选的参数；&lt;/li&gt;
&lt;li&gt;description：仓库描述，可选；&lt;/li&gt;
&lt;li&gt;baseurl：仓库地址，必须的参数。支持http://、ftp://、file://；&lt;/li&gt;
&lt;li&gt;file：自定义保存到被控节点的.repo文件名。不含.repo，默认name参数的值；&lt;/li&gt;
&lt;li&gt;enable：是否启用仓库；&lt;/li&gt;
&lt;li&gt;gpgcheck：是否开启GPG检查，没有默认值，一般依靠/etc/yum.conf文件中的配置；&lt;/li&gt;
&lt;li&gt;gpgkey：GPG公钥URL。前提为gpgcheck=yes；&lt;/li&gt;
&lt;li&gt;state：present(添加/更新)或absent(删除)；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example：&lt;/strong&gt;&lt;br /&gt;
添加EPEL源：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m yum_repository -a &quot;name=epel baseurl=&apos;https://download.fedoraproject.org/pub/epel/ $releasever/$basearch/&apos; description=&apos;FEDORA EPEL&apos;&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true, #changed值为true，改变成功；
    &quot;repo&quot;: &quot;epel&quot;,
    &quot;state&quot;: &quot;present&quot; #state值为present(添加/更新)；
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls /etc/yum.repos.d/ &amp;amp;&amp;amp; cat /etc/yum.repos.d/epel.repo&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
epel.repo
rocky.repo
rocky.repo.bak
[epel]
baseurl = https://download.fedoraproject.org/pub/epel/ //
name = FEDORA EPEL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除EPEL源：&lt;br /&gt;
删除EPEL源不需要添加EPEL源时的那么多参数，只需要指定name参数和state参数即可。name参数不需要指定文件后缀名。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m yum_repository -a &quot;name=epel state=absent&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true, #changed值为true，改变成功；
    &quot;repo&quot;: &quot;epel&quot;,
    &quot;state&quot;: &quot;absent&quot; #state值为absent(删除)；
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory -m shell -a &quot;ls /etc/yum.repos.d/&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
rocky.repo
rocky.repo.bak
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要注意的是state absent只能删除由Ansible管理过的repo文件，不能删除现有的或其它的.repo文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m yum_repository -a &quot;name=rocky state=absent&quot;
192.168.201.12 | SUCCESS =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: false, #changed值为flase，改变失败；
    &quot;repo&quot;: &quot;rocky&quot;,
    &quot;state&quot;: &quot;absent&quot; #虽然state值为absent，但changed依然为flase，文件没有被删除;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;虽然返回的state值为absent，但/etc/yum.repos.d目录下还是有rocky.repo文件，并没有进行更改/删除。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory -m shell -a &quot;ls /etc/yum.repos.d/&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
rocky.repo
rocky.repo.bak
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;yum&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
Ansible的yum模块用于在​RHEL/CentOS/Fedora​​等基于RPM的被管理机器上管理软件包。它是对yum包管理器的封装，支持安装、升级、卸载等操作。&lt;/p&gt;
&lt;p&gt;⭐需要注意的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ansible yum模块​​直接使用被管理节点（目标节点）的yum源​​，而不是通过管理节点下载后再传输；&lt;/li&gt;
&lt;li&gt;yum模块的所有命令（安装、卸载、更新等）​​在被管理节点上直接运行​​，通过管理节点SSH远程执行。管理节点仅发送指令，不参与实际包下载或传输；&lt;/li&gt;
&lt;li&gt;管理节点使用yum模块前必须配置被管理节点上正确的yum仓库（例如Base、EPEL等），否则会因找不到包而失败。可通过enablerepo或disablerepo参数临时调整仓库；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;常用参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name：指定包名，支持列表或单个包，多个软件包以英文软件包间隔；&lt;/li&gt;
&lt;li&gt;state：包的状态：
&lt;ul&gt;
&lt;li&gt;present：安装，默认选择；&lt;/li&gt;
&lt;li&gt;latest：升级到最新版；&lt;/li&gt;
&lt;li&gt;absent：卸载；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;enablerepo：临时启用指定仓库；&lt;/li&gt;
&lt;li&gt;disablerepo：临时禁用仓库；&lt;/li&gt;
&lt;li&gt;exclude：排除特定包；&lt;/li&gt;
&lt;li&gt;update_cache：yes。更新缓存，相当于yum makecache；&lt;/li&gt;
&lt;li&gt;disable_gpg_check：yes。跳过GPG签名验证；&lt;/li&gt;
&lt;li&gt;allow_downgrade：yes。允许降级包版本；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example：&lt;/strong&gt;&lt;br /&gt;
安装nginx包。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m yum -a &quot;name=nginx state=present&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true, #changed值为true，改变成功；
    &quot;msg&quot;: &quot;&quot;,
    &quot;rc&quot;: 0,
    &quot;results&quot;: [ #做出的结果；
        &quot;Installed: rocky-logos-httpd-90.15-2.el9.noarch&quot;,
        &quot;Installed: nginx-core-2:1.20.1-20.el9.0.1.x86_64&quot;,
        &quot;Installed: nginx-2:1.20.1-20.el9.0.1.x86_64&quot;,
        &quot;Installed: nginx-filesystem-2:1.20.1-20.el9.0.1.noarch&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;卸载nginx包。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m yum -a &quot;name=nginx state=absent&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true, #changed值为true，改变成功；
    &quot;msg&quot;: &quot;&quot;,
    &quot;rc&quot;: 0,
    &quot;results&quot;: [ #做出的结果；
        &quot;Removed: nginx-2:1.20.1-20.el9.0.1.x86_64&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装Development tools软件包组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ansible test1_servers -i /etc/ansible/inventory2.ini -m yum -a &quot;name=&apos;@Development tools&apos; state=present&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;⭐需要注意的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Development tools是一个​​软件包组，并不是单个的软件包；&lt;/li&gt;
&lt;li&gt;&quot;@&quot;符号用于标识软件包组而不是单个软件包。它的作用类似于“分类标签”，用来批量安装一组功能相关的软件包。&lt;/li&gt;
&lt;li&gt;直接使用yum install @Development tools会报错，必须将组名用引号包裹。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m yum -a &quot;name=&apos;@Development tools&apos; state=present&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;msg&quot;: &quot;&quot;,
    &quot;rc&quot;: 0,
    &quot;results&quot;: [
        &quot;Group development installed.&quot;,
        &quot;Installed: java-1.8.0-openjdk-headless-1:1.8.0.442.b06-2.el9.x86_64&quot;,
        &quot;Installed: valgrind-devel-1:3.23.0-4.el9.x86_64&quot;,
        &quot;Installed: valgrind-1:3.23.0-4.el9.x86_64&quot;,

        ---此处省略一堆包名---

        &quot;Installed: nss-softokn-3.101.0-10.el9_5.x86_64&quot;,
        &quot;Installed: nss-3.101.0-10.el9_5.x86_64&quot;,
        &quot;Installed: pulseaudio-libs-15.0-2.el9.x86_64&quot;,
        &quot;Removed: rpm-plugin-audit-4.16.1.3-29.el9.x86_64&quot;,
        &quot;Removed: rpm-plugin-selinux-4.16.1.3-29.el9.x86_64&quot;,
        &quot;Removed: rpm-plugin-systemd-inhibit-4.16.1.3-29.el9.x86_64&quot;,

        ---此处省略一堆包名---

        &quot;Removed: rpm-4.16.1.3-29.el9.x86_64&quot;,
        &quot;Removed: rpm-build-libs-4.16.1.3-29.el9.x86_64&quot;,
        &quot;Removed: rpm-libs-4.16.1.3-29.el9.x86_64&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;systemd&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
systemd模块用于管理系统服务，支持服务的启动、停止、重启、启用开机自启等操作。它是管理Linux系统服务的核心模块。&lt;/p&gt;
&lt;p&gt;⚠️注意：&lt;br /&gt;
systemd在​​CentOS7和RHEL7​​及更高版本中才成为默认的初始化系统。CentOS 6及更早版本​​使用传统的为​​sysvinit​​或upstart，部分发行版使用，例如Ubuntu 14.04。&lt;br /&gt;
Ansible systemd模块底层调用systemctl命令。CentOS6没有systemctl​​，因此systemd模块无法正常工作。&lt;br /&gt;
解决办法：&lt;br /&gt;
使用service模块：Ansible提供了​​service模块​​，兼容sysvinit和upstart，适用于CentOS6。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name：服务名称，.service可省；&lt;/li&gt;
&lt;li&gt;state：
&lt;ul&gt;
&lt;li&gt;started：启动；&lt;/li&gt;
&lt;li&gt;stopped：停止；&lt;/li&gt;
&lt;li&gt;restarted：重启；&lt;/li&gt;
&lt;li&gt;reloaded：重载配置；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;enabled：是否开机自启；&lt;/li&gt;
&lt;li&gt;daemon_reload：是否先执行systemctl demon-reload，重新载入systemd，扫描新的或有变动的服务单元；&lt;/li&gt;
&lt;li&gt;masked：是否禁止服务启动（强制禁用）；&lt;/li&gt;
&lt;li&gt;scope：控制服务作用域：
&lt;ul&gt;
&lt;li&gt;system：系统级；&lt;/li&gt;
&lt;li&gt;user：用户级；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;no_block：非阻塞模式（不等待操作完成）；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;重新加载systemd：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m systemd -a &quot;daemon_reload=yes&quot;
192.168.201.12 | SUCCESS =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: false,
    &quot;name&quot;: null,
    &quot;status&quot;: {}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动nginx服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m systemd -a &quot;name=nginx state=started&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;name&quot;: &quot;nginx&quot;,
    &quot;state&quot;: &quot;started&quot;,
    &quot;status&quot;: {
        &quot;AccessSELinuxContext&quot;: &quot;system_u:object_r:httpd_unit_file_t:s0&quot;,
        &quot;ActiveEnterTimestampMonotonic&quot;: &quot;0&quot;,
        &quot;ActiveExitTimestampMonotonic&quot;: &quot;0&quot;,


        &quot;WatchdogSignal&quot;: &quot;6&quot;,
        &quot;WatchdogTimestampMonotonic&quot;: &quot;0&quot;,
        &quot;WatchdogUSec&quot;: &quot;infinity&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;为什么​status输出这么长：&lt;/strong&gt;&lt;br /&gt;
systemd会记录服务的​​所有可能属性​​（包括默认值），即使某些字段未被显式配置。Ansible也会直接返回原始数据，便于调试和高级用例。&lt;/p&gt;
&lt;p&gt;停止nginx服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ansible test1_servers -i /etc/ansible/inventory2.ini -m systemd -a &quot;name=nginx state=stopped&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启nginx服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ansible test1_servers -i /etc/ansible/inventory2.ini -m systemd -a &quot;name=nginx state=restarted&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新加载nginx服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ansible test1_servers -i /etc/ansible/inventory2.ini -m systemd -a &quot;name=nginx state=reloaded&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将nginx服务设置为开机自启：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m systemd -a &quot;name=nginx enabled=yes&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;enabled&quot;: true,
    &quot;name&quot;: &quot;nginx&quot;,
    &quot;status&quot;: {
        &quot;AccessSELinuxContext&quot;: &quot;system_u:object_r:httpd_unit_file_t:s0&quot;,
        &quot;ActiveEnterTimestamp&quot;: &quot;Wed 2025-04-16 21:40:42 CST&quot;,
        &quot;ActiveEnterTimestampMonotonic&quot;: &quot;108010991815&quot;,

        ---此处省略一堆返回值---

        &quot;WatchdogSignal&quot;: &quot;6&quot;,
        &quot;WatchdogTimestampMonotonic&quot;: &quot;0&quot;,
        &quot;WatchdogUSec&quot;: &quot;0&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;group&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
group模块用于管理系统上的用户组。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name：组名称，必选项；&lt;/li&gt;
&lt;li&gt;system：是否为系统组，yes/no，默认no；&lt;/li&gt;
&lt;li&gt;state：状态，present创建，absent删除，默认为present；&lt;/li&gt;
&lt;li&gt;gid：指定创建用户组的GID；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example：&lt;/strong&gt;&lt;br /&gt;
test1_servers组内所有主机创建ninebytes_admin用户组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m group -a &quot;name=ninebytes_admin&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true, #changed值为true，改变成功；
    &quot;gid&quot;: 1001, #创建的ninebytes_admin用户组GID为1001；
    &quot;name&quot;: &quot;ninebytes_admin&quot;, #名称为ninebytes_admin；
    &quot;state&quot;: &quot;present&quot;, #状态为创建用户组；
    &quot;system&quot;: false #system=false，非系统组；
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;去到slave1查看是否创建成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@slave1 ~]# grep &quot;ninebytes_admin&quot; /etc/group
ninebytes_admin:x:1001:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;test1_servers组内所有主机删除ninebytes_admin用户组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m group -a &quot;state=absent name=ninebytes_admin&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;name&quot;: &quot;ninebytes_admin&quot;,
    &quot;state&quot;: &quot;absent&quot; #状态为删除用户组；
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;user&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
user模块用于管理系统上的用户账户。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name：用户名，必选项；&lt;/li&gt;
&lt;li&gt;state：状态，present创建，absent删除，默认为present；&lt;/li&gt;
&lt;li&gt;uid：用户UID；&lt;/li&gt;
&lt;li&gt;system：是否为系统用户；&lt;/li&gt;
&lt;li&gt;state：状态，present创建，absent删除，默认为present；&lt;/li&gt;
&lt;li&gt;group：设置用户主组；&lt;/li&gt;
&lt;li&gt;groups：设置用户的附加组，默认会把用户从其他已加入的组中删除；&lt;/li&gt;
&lt;li&gt;append：和groups配合时，设置为yes则不会将用户从其他已加入的组中删除；&lt;/li&gt;
&lt;li&gt;shell：指定用户登录时使用的shell程序或修改现有用户的默认shell，它决定了用户登录系统后使用的命令行环境；&lt;/li&gt;
&lt;li&gt;password：设置用户密码，由于会直接存入shadow，所以只接受加密值，默认不设置密码；&lt;/li&gt;
&lt;li&gt;update_password：设置的密码不同于原密码，则会更新密码；&lt;/li&gt;
&lt;li&gt;home：设置用户家目录；&lt;/li&gt;
&lt;li&gt;comment：用户描述信息；&lt;/li&gt;
&lt;li&gt;create_home：创建用户时是否创建家目录。默认创建，不创建则设置为no；&lt;/li&gt;
&lt;li&gt;remove：是否删除与用户关联的目录，例如家目录和邮箱目录，只有当state=absent时生效。删除设置为yes，默认no 不删除；&lt;/li&gt;
&lt;li&gt;generate_ssh_key：为用户生成ssh密钥。不会覆盖现有的ssh密钥；&lt;/li&gt;
&lt;li&gt;expires：设置用户账户过期时间，自动化管理用户账户的生命周期，直接跟上unix时间戳即可使用；&lt;/li&gt;
&lt;li&gt;ssh_key_bits：设置用户ssh密钥加密位数；&lt;/li&gt;
&lt;li&gt;ssh_key_type：设置用户秘钥加密类型，默认rsa，具体类型取决于被控节点；&lt;/li&gt;
&lt;li&gt;ssh_key_file：可以实现ssh密钥改名，或变更存放ssh密钥位置，默认为.ssh/id_rsa；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example：&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;【1】&lt;/strong&gt;：test1_servers组内所有主机创建用户testuser，设置为系统用户，登录密码为123456，加入testgroup1用户组。&lt;br /&gt;
由于user模块password参数只会接受加密值，所以在写AD-Hoc命令之前，要先生成一个加密的密码哈希，然后将这个密码哈希传递给一个变量，在此我使用的是py3加密的SHA512。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# PASS_HASH=$(python3 -c &apos;import crypt; print(crypt.crypt(&quot;123456&quot;, crypt.mksalt(crypt.METHOD_SHA512)))&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看变量$PASS_HASH值：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# echo &quot;$PASS_HASH&quot;
$6$9dz45qAaPAU8tuYx$h7WVmhXFjanf72Z6pvISpl3MnrJgSSqnnHON/5J5Msy7QtEsPmP021P.D8kKIBVQaNbvCGt9nduTeuPFgVTmT.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就可以编写AD-Hoc命令，将$PASS_HASH变量传递给password参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m user -a &quot;name=testuser system=yes password=$PASS_HASH group=testgroup1&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;append&quot;: false,
    &quot;changed&quot;: true,
    &quot;comment&quot;: &quot;&quot;,
    &quot;group&quot;: 1001,
    &quot;home&quot;: &quot;/home/testuser&quot;,
    &quot;move_home&quot;: false,
    &quot;name&quot;: &quot;testuser&quot;,
    &quot;password&quot;: &quot;NOT_LOGGING_PASSWORD&quot;,
    &quot;shell&quot;: &quot;/bin/bash&quot;,
    &quot;state&quot;: &quot;present&quot;,
    &quot;uid&quot;: 984
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到password返回的值为NOT_LOGGING_PASSWORD。&lt;br /&gt;
这是由于安全保护机制，Ansible会主动屏蔽密码字段的输出，防止敏感信息泄露到日志或终端中，实际上密码已经成功配置，可以检查被控节点的/etc/shadow。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;grep testuser /etc/shadow&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
testuser:$6$9dz45qAaPAU8tuYx$h7WVmhXFjanf72Z6pvISpl3MnrJgSSqnnHON/5J5Msy7QtEsPmP021P.D8kKIBVQaNbvCGt9nduTeuPFgVTmT.:20240::::::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用宿主机PowerShell SSH连接，密码123456：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PS C:\Users\NineBytes&amp;gt; ssh testuser@192.168.201.12
testuser@192.168.201.12&apos;s password:
Last login: Sun Jun  1 16:19:50 2025 from 192.168.201.1
[testuser@slave1 ~]$ exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【2】&lt;/strong&gt;：test1_servers组内所有主机删除testuser用户。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m user -a &quot;name=testuser state=absent remove=yes&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;force&quot;: false,
    &quot;name&quot;: &quot;testuser&quot;,
    &quot;remove&quot;: false,
    &quot;state&quot;: &quot;absent&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面来看一种可能会遇到的报错情况：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m user -a &quot;name=testuser state=absent remove=yes&quot;
192.168.201.12 | FAILED! =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: false,
    &quot;msg&quot;: &quot;userdel: /var/spool/mail/testuser not owned by testuser, not removing\n&quot;,
    &quot;name&quot;: &quot;testuser&quot;,
    &quot;rc&quot;: 12 #错误代码rc=12表示用户删除操作部分失败，主要是因为附属文件清理不成功；
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;Error&amp;gt;为什么会遇到&quot;userdel: /var/spool/mail/testuser not owned by testuser, not removing\n&quot;报错？&amp;lt;/Error&amp;gt;
这个错误是因为Ansible在尝试删除用户testuser时，遇到了/var/spool/mail/testuser邮件文件的所有权问题。&lt;br /&gt;
系统检测到/var/spool/mail/testuser文件的所有者不是testuser，因此拒绝删除，这是Ansible一种安全机制，防止误删不属于该用户的文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;方法1：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先先手动删除邮件文件再删除用户：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;rm -f /var/spool/mail/testuser&quot;
ansible test1_servers -i /etc/ansible/inventory2.ini -m user -a &quot;name=testuser state=absent remove=yes&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;方法2：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;强制删除，不推荐，确定安全后再使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ansible test1_servers -i /etc/ansible/inventory2.ini -m user -a &quot;name=testuser state=absent force=yes remove=yes&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m user -a &quot;name=testuser state=absent force=yes remove=yes&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;force&quot;: true,
    &quot;name&quot;: &quot;testuser&quot;,
    &quot;remove&quot;: true,
    &quot;state&quot;: &quot;absent&quot;,
    &quot;stderr&quot;: &quot;userdel: testuser mail spool (/var/spool/mail/testuser) not found\n&quot;,
    &quot;stderr_lines&quot;: [
        &quot;userdel: testuser mail spool (/var/spool/mail/testuser) not found&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;邮件目录的作用&lt;/strong&gt;：&lt;br /&gt;
大多数Linux发行版（如CentOS、RHEL、Ubuntu等）在创建用户时，会自动在/var/spool/mail/下生成一个与用户名同名的邮件文件。&lt;br /&gt;
即使你没有主动使用邮件功能，系统或某些服务（如cron）可能会通过邮件通知用户。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cron 作业的输出：&lt;br /&gt;
如果用户的cron任务有输出（标准输出或错误输出），系统会尝试将这些输出发送到用户的邮件文件（/var/spool/mail/用户名）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;系统通知：&lt;br /&gt;
某些守护进程（如systemd或审计日志）可能会通过邮件向用户发送告警或日志。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;【3】&lt;/strong&gt;：test1_servers组内所有主机创建用户testuser2，并为其创建秘钥对，秘钥类型为ecdsa。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m user -a &quot;name=testuser2 generate_ssh_key=yes ssh_key_type=ecdsa ssh_key_bits=256&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;append&quot;: false,
    &quot;changed&quot;: true,
    &quot;comment&quot;: &quot;&quot;,
    &quot;group&quot;: 1002,
    &quot;home&quot;: &quot;/home/testuser2&quot;,
    &quot;move_home&quot;: false,
    &quot;name&quot;: &quot;testuser2&quot;,
    &quot;shell&quot;: &quot;/bin/bash&quot;,
    &quot;ssh_fingerprint&quot;: &quot;256 SHA256:RAwX2jXbFRdo7N3h01Tk4uD/bHX0POoTLZA9g2yS41I ansible-generated on slave1 (ECDSA)&quot;,
    &quot;ssh_key_file&quot;: &quot;/home/testuser2/.ssh/id_ecdsa&quot;,
    &quot;ssh_public_key&quot;: &quot;ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLbGGD76qswvaVUG6bga7ivtaF2YIUGuPPMVLP7U1fCPyueTM5hiwy87ieRO0SAQV5uvIZt2ep87QyP6dHghSd8= ansible-generated on slave1&quot;,
    &quot;state&quot;: &quot;present&quot;,
    &quot;uid&quot;: 1001
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看密钥对是否创建成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls /home/testuser2/.ssh&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
id_ecdsa
id_ecdsa.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【4】&lt;/strong&gt;：test1_servers组内所有主机创建用户testuser3，设置登录密码为123456，加入用户组ninebytes_admin，且不影响用户原本加入的用户组，设置过期时间戳为1748822400，创建用户家目录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m user -a &quot;name=testuser3 password=$PASS_HASH groups=ninebytes_admin append=yes expires=1748822400 create_home=yes&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;comment&quot;: &quot;&quot;,
    &quot;create_home&quot;: true,
    &quot;group&quot;: 1004,
    &quot;groups&quot;: &quot;ninebytes_admin&quot;,
    &quot;home&quot;: &quot;/home/testuser3&quot;,
    &quot;name&quot;: &quot;testuser3&quot;,
    &quot;password&quot;: &quot;NOT_LOGGING_PASSWORD&quot;,
    &quot;shell&quot;: &quot;/bin/bash&quot;,
    &quot;state&quot;: &quot;present&quot;,
    &quot;system&quot;: false,
    &quot;uid&quot;: 1001
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看testuser3用户账户和密码过期信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;chage -l testuser3&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
Last password change                                    : Jun 01, 2025
# 密码最后修改日期（用户创建时生成）;
Password expires                                        : never
#密码永不过期（默认）;
Password inactive                                       : never
#密码过期后无宽限期（默认）;
Account expires                                         : Jun 02, 2025
#账户将在 2025-06-02 自动失效;
Minimum number of days between password change          : 0
#允许立即修改密码（默认）;
Maximum number of days between password change          : 99999
#密码有效期极长（相当于never）;
Number of days of warning before password expires       : 7
#密码到期前 7 天警告（因密码永不过期未启用）;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;如何计算时间戳？&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# date -d &quot;2025-06-02 08:00:00 +0800&quot; +%s
1748822400
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-d &quot;2025-06-02 08:00:00 +0800&quot;&lt;br /&gt;
指定北京时间的日期和时间（+0800表示东八区）。&lt;/li&gt;
&lt;li&gt;+%s&lt;br /&gt;
输出Unix时间戳（自1970-01-01 00:00:00 UTC起的秒数）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;时间戳反向验证日期：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# date -d @1748822400 &apos;+%Y-%m-%d %H:%M:%S %z&apos;
2025-06-02 08:00:00 +0800
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;file&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
file模块是Ansible中用于管理文件和目录的核心模块之一，它可以创建文件、目录、符号链接，设置权限和属性，以及删除文件系统对象。&lt;br /&gt;
file和copy模块不同的是，file可以直接在被控主机上创建或删除文件/文件夹，但copy模块仅仅是将管理节点上的文件/文件夹复制到被控主机上。&lt;/p&gt;
&lt;p&gt;file模块的作用包括但不限于以下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建空文件&lt;/li&gt;
&lt;li&gt;创建目录（包括多级目录）&lt;/li&gt;
&lt;li&gt;创建符号链接（软链接）&lt;/li&gt;
&lt;li&gt;修改文件/目录的权限、所有者、组等属性&lt;/li&gt;
&lt;li&gt;删除文件、目录或链接&lt;/li&gt;
&lt;li&gt;修改文件/目录的SElinux上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;常用参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;path：文件/目录的路径，为必选项；&lt;/li&gt;
&lt;li&gt;state：状态：
&lt;ul&gt;
&lt;li&gt;file(默认)：常用于检查文件是否存在，存在则返回文件信息，不存在则不会被创建；&lt;/li&gt;
&lt;li&gt;directory：如果目录不存在，则创建目录；&lt;/li&gt;
&lt;li&gt;link：创建软链接；&lt;/li&gt;
&lt;li&gt;hard：创建硬链接；&lt;/li&gt;
&lt;li&gt;touch：若文件不存在，则会创建一个新文件，存在则仅更新其最后修改时间；&lt;/li&gt;
&lt;li&gt;absent：删除目录、文件或取消链接文件；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;mode：设置权限模式，八进制或符号表示：mode：0644或mode：u=rw,g=r,o=r；&lt;/li&gt;
&lt;li&gt;owner：设置文件所有者；&lt;/li&gt;
&lt;li&gt;group：设置文件所属组；&lt;/li&gt;
&lt;li&gt;recurse：递归设置目录下文件的属性，仅对目录有效；&lt;/li&gt;
&lt;li&gt;src：软/硬链接的源文件的路径，当state=link或state=hard时使用；&lt;/li&gt;
&lt;li&gt;dest：软/硬链接文件的路径，当state=link或state=hard时使用；&lt;/li&gt;
&lt;li&gt;force：强制创建链接（会覆盖现有文件）；&lt;/li&gt;
&lt;li&gt;follow：是否跟踪符号链接；&lt;/li&gt;
&lt;li&gt;seuser/serole/setype/selevel：SELinux相关属性；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example：&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;【1】&lt;/strong&gt;：test1_servers组内所有主机在/tmp下创建test.conf文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m file -a &quot;path=/tmp/test.conf state=touch&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;dest&quot;: &quot;/tmp/test.conf&quot;,
    &quot;gid&quot;: 0,
    &quot;group&quot;: &quot;root&quot;,
    &quot;mode&quot;: &quot;0644&quot;,
    &quot;owner&quot;: &quot;root&quot;,
    &quot;secontext&quot;: &quot;unconfined_u:object_r:user_tmp_t:s0&quot;,
    &quot;size&quot;: 0,
    &quot;state&quot;: &quot;file&quot;,
    &quot;uid&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【2】&lt;/strong&gt;：改变/tmp/test.conf文件所有者为nobody，权限改为644。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m file -a &quot;path=/tmp/test.conf owner=nobody group=nobody mode=0644&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;gid&quot;: 65534,
    &quot;group&quot;: &quot;nobody&quot;,
    &quot;mode&quot;: &quot;0644&quot;,
    &quot;owner&quot;: &quot;nobody&quot;,
    &quot;path&quot;: &quot;/tmp/test.conf&quot;,
    &quot;secontext&quot;: &quot;unconfined_u:object_r:user_tmp_t:s0&quot;,
    &quot;size&quot;: 0,
    &quot;state&quot;: &quot;file&quot;,
    &quot;uid&quot;: 65534 #nobody用户的UID；
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【3】&lt;/strong&gt;：为/tmp/test.conf创建软链接。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m file -a &quot;src=/tmp/test.conf dest=/tmp/test.link.conf state=link&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;dest&quot;: &quot;/tmp/test.link.conf&quot;, #软链接文件路径；
    &quot;gid&quot;: 0,
    &quot;group&quot;: &quot;root&quot;,
    &quot;mode&quot;: &quot;0777&quot;,
    &quot;owner&quot;: &quot;root&quot;,
    &quot;secontext&quot;: &quot;unconfined_u:object_r:user_tmp_t:s0&quot;,
    &quot;size&quot;: 14,
    &quot;src&quot;: &quot;/tmp/test.conf&quot;, #软链接源文件路径；
    &quot;state&quot;: &quot;link&quot;, #状态为软/硬链接；
    &quot;uid&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证软链接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls -l /tmp&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
total 0
drwx------. 2 root   root   56 Jun  2 15:19 ansible_ansible.legacy.command_payload_el631vwh
drwxr-xr-x. 2 root   root   19 Apr 16 20:25 hsperfdata_root
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-bluetooth.service-gKgP3G
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-chronyd.service-YDHbNy
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-dbus-broker.service-i5eBCf
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-kdump.service-Tl8A1S
drwx------. 3 root   root   17 Apr 16 21:40 systemd-private-084dc7114c6f43279ad87767c4f39c44-nginx.service-h6tWUO
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-systemd-logind.service-Nd78xF
-rw-r--r--. 1 nobody nobody  0 Jun  2 00:38 test.conf #软链接源文件；
lrwxrwxrwx. 1 root   root   14 Jun  2 15:15 test.link.conf -&amp;gt; /tmp/test.conf #test.link.conf软链接文件指向/tmp/test.conf；
drwx------. 2 root   root    6 Apr 16 17:06 vmware-root_869-3988752892
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【4】&lt;/strong&gt;：在/tmp下创建目录testdir。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m file -a &quot;path=/tmp/testdir state=directory&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;gid&quot;: 0,
    &quot;group&quot;: &quot;root&quot;,
    &quot;mode&quot;: &quot;0755&quot;,
    &quot;owner&quot;: &quot;root&quot;,
    &quot;path&quot;: &quot;/tmp/testdir&quot;,
    &quot;secontext&quot;: &quot;unconfined_u:object_r:user_tmp_t:s0&quot;,
    &quot;size&quot;: 6,
    &quot;state&quot;: &quot;directory&quot;,
    &quot;uid&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证目录testdir：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls -l /tmp&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
total 0
drwx------. 2 root   root   56 Jun  2 15:33 ansible_ansible.legacy.command_payload_kyjyun2s
drwxr-xr-x. 2 root   root   19 Apr 16 20:25 hsperfdata_root
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-bluetooth.service-gKgP3G
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-chronyd.service-YDHbNy
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-dbus-broker.service-i5eBCf
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-kdump.service-Tl8A1S
drwx------. 3 root   root   17 Apr 16 21:40 systemd-private-084dc7114c6f43279ad87767c4f39c44-nginx.service-h6tWUO
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-systemd-logind.service-Nd78xF
-rw-r--r--. 1 nobody nobody  0 Jun  2 00:38 test.conf
drwxr-xr-x. 2 root   root    6 Jun  2 15:32 testdir
lrwxrwxrwx. 1 root   root   14 Jun  2 15:15 test.link.conf -&amp;gt; /tmp/test.conf
drwx------. 2 root   root    6 Apr 16 17:06 vmware-root_869-3988752892
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【5】&lt;/strong&gt;：取消/tmp/test.link.conf对/tmp/test.conf的软链接。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m file -a &quot;path=/tmp/test.link.conf state=absent&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;path&quot;: &quot;/tmp/test.link.conf&quot;,
    &quot;state&quot;: &quot;absent&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证取消软链接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls -l /tmp&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
total 0
drwx------. 2 root   root   56 Jun  2 15:37 ansible_ansible.legacy.command_payload_q7j058e5
drwxr-xr-x. 2 root   root   19 Apr 16 20:25 hsperfdata_root
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-bluetooth.service-gKgP3G
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-chronyd.service-YDHbNy
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-dbus-broker.service-i5eBCf
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-kdump.service-Tl8A1S
drwx------. 3 root   root   17 Apr 16 21:40 systemd-private-084dc7114c6f43279ad87767c4f39c44-nginx.service-h6tWUO
drwx------. 3 root   root   17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-systemd-logind.service-Nd78xF
-rw-r--r--. 1 nobody nobody  0 Jun  2 00:38 test.conf
drwxr-xr-x. 2 root   root    6 Jun  2 15:32 testdir
drwx------. 2 root   root    6 Apr 16 17:06 vmware-root_869-3988752892
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【6】&lt;/strong&gt;：删除/tmp/test.conf。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m file -a &quot;path=/tmp/test.conf state=absent&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;path&quot;: &quot;/tmp/test.conf&quot;,
    &quot;state&quot;: &quot;absent&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证删除/tmp/test.conf：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls -l /tmp&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
total 0
drwx------. 2 root root 56 Jun  2 15:39 ansible_ansible.legacy.command_payload_i5xivqxc
drwxr-xr-x. 2 root root 19 Apr 16 20:25 hsperfdata_root
drwx------. 3 root root 17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-bluetooth.service-gKgP3G
drwx------. 3 root root 17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-chronyd.service-YDHbNy
drwx------. 3 root root 17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-dbus-broker.service-i5eBCf
drwx------. 3 root root 17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-kdump.service-Tl8A1S
drwx------. 3 root root 17 Apr 16 21:40 systemd-private-084dc7114c6f43279ad87767c4f39c44-nginx.service-h6tWUO
drwx------. 3 root root 17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-systemd-logind.service-Nd78xF
drwxr-xr-x. 2 root root  6 Jun  2 15:32 testdir
drwx------. 2 root root  6 Apr 16 17:06 vmware-root_869-3988752892
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【7】&lt;/strong&gt;：为/etc/yum.repos.d创建硬链接到/tmp/rocky.hard.repo。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m file -a &quot;src=/etc/yum.repos.d/rocky.repo dest=/tmp/rocky.hard.repo state=hard&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;dest&quot;: &quot;/tmp/rocky.hard.repo&quot;,
    &quot;gid&quot;: 0,
    &quot;group&quot;: &quot;root&quot;,
    &quot;mode&quot;: &quot;0644&quot;,
    &quot;owner&quot;: &quot;root&quot;,
    &quot;secontext&quot;: &quot;system_u:object_r:system_conf_t:s0&quot;,
    &quot;size&quot;: 406,
    &quot;src&quot;: &quot;/etc/yum.repos.d/rocky.repo&quot;,
    &quot;state&quot;: &quot;hard&quot;,
    &quot;uid&quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证硬链接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;ls -l /tmp&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
total 4
drwx------. 2 root root  56 Jun  2 15:57 ansible_ansible.legacy.command_payload_dqbgpf63
drwxr-xr-x. 2 root root  19 Apr 16 20:25 hsperfdata_root
-rw-r--r--. 2 root root 406 Apr 15 20:49 rocky.hard.repo
drwx------. 3 root root  17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-bluetooth.service-gKgP3G
drwx------. 3 root root  17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-chronyd.service-YDHbNy
drwx------. 3 root root  17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-dbus-broker.service-i5eBCf
drwx------. 3 root root  17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-kdump.service-Tl8A1S
drwx------. 3 root root  17 Apr 16 21:40 systemd-private-084dc7114c6f43279ad87767c4f39c44-nginx.service-h6tWUO
drwx------. 3 root root  17 Mar 22 12:25 systemd-private-084dc7114c6f43279ad87767c4f39c44-systemd-logind.service-Nd78xF
drwxr-xr-x. 2 root root   6 Jun  2 15:32 testdir
drwx------. 2 root root   6 Apr 16 17:06 vmware-root_869-3988752892
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;cron&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;作用：&lt;/strong&gt;&lt;br /&gt;
cron模块用于管理被控端计划任务，等同于linux中的计划任务。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注意：使用Ansible创建的计划任务不能使用本地&lt;code&gt;crontab -e&lt;/code&gt;编辑，否则Ansible将无法再次操作此计划任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;主要原因：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;文件位置不同：
&lt;ul&gt;
&lt;li&gt;Ansible默认将cron任务写入/var/spool/cron/目录下的用户专用文件（如 var/spool/cron/root）；&lt;/li&gt;
&lt;li&gt;crontab -e会将这些内容复制到临时文件编辑，但源文件仍由Ansible管理；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;格式差异：
&lt;ul&gt;
&lt;li&gt;Ansible会自动添加注释标记（如#Ansible: Job名）；&lt;/li&gt;
&lt;li&gt;手动编辑可能会破坏这些标记，导致Ansible无法正确识别和管理这些任务；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;同步问题：
&lt;ul&gt;
&lt;li&gt;手动修改后，下次Ansible运行时可能会覆盖您的更改（因为 Ansible 只认它自己管理的任务）;&lt;/li&gt;
&lt;li&gt;Ansible 使用&quot;声明式&quot;配置，会强制将系统状态变为playbook中定义的状态;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;权限问题：
&lt;ul&gt;
&lt;li&gt;Ansible通常以root或特定用户身份运行;&lt;/li&gt;
&lt;li&gt;如果您以不同用户身份运行crontab -e，可能看不到Ansible创建的任务;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;常用参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name：指定一个作业名字，必选项；&lt;/li&gt;
&lt;li&gt;job：指定要执行的内容，通常是脚本或一段内容；&lt;/li&gt;
&lt;li&gt;state：指定job状态，present创建，absent删除，默认为present；&lt;/li&gt;
&lt;li&gt;user：设置作业的用户，默认为当前用户；&lt;/li&gt;
&lt;li&gt;minute：指定分钟（0-59，*：每分钟，*/2：每两分钟，默认为*）；&lt;/li&gt;
&lt;li&gt;hour：指定小时（0-23，*：每分钟，*/2：每两分钟，默认为*）；&lt;/li&gt;
&lt;li&gt;day：指定天数（1-31，*，：每天，*/2：每两天，默认为*）；&lt;/li&gt;
&lt;li&gt;weekday：指定星期（0-6，周日为0，默认为*，即每星期；或者输入英文单词也可以：Sunday-Saturday）；&lt;/li&gt;
&lt;li&gt;month：月（1-12，*：每月，*/2：每两月，默认为*）；&lt;/li&gt;
&lt;li&gt;special_time：预设时间(如@daily, @weekly等)；&lt;/li&gt;
&lt;li&gt;disabled：是否禁用该作业，默认no；&lt;/li&gt;
&lt;li&gt;backup：是否备份修改前的crontab，默认no；&lt;/li&gt;
&lt;li&gt;env：设置环境变量；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example：&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;【1】&lt;/strong&gt;：为root用户创建test job作业，每天8点运行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m cron -a &quot;name=&apos;test job&apos; minute=0 hour=8 job=&apos;ls / -alh &amp;gt; /dev/null&apos; user=root&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;envs&quot;: [],
    &quot;jobs&quot;: [
        &quot;test job&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;列出当前用户的cron任务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;crontab -l&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
#Ansible: test job
0 8 * * * ls / -alh &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用sudo crontab -u username -l查看其他用户的cron任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;【2】&lt;/strong&gt;：为root用户创建complex test job作业，每工作日(周一到周五)上午9点到下午5点每小时运行一次。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m cron -a &quot;name=&apos;complex test job&apos; minute=0 hour=&quot;9-17&quot; weekday=&quot;1-5&quot; job=&apos;ls / -alh &amp;gt; /dev/null&apos; user=root&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;envs&quot;: [],
    &quot;jobs&quot;: [
        &quot;test job&quot;,
        &quot;complex test job&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【3】&lt;/strong&gt;：删除test job任务。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m cron -a &quot;name=&apos;test job&apos; state=absent&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;envs&quot;: [],
    &quot;jobs&quot;: [
        &quot;complex test job&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证是否删除test job任务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;crontab -l&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
#Ansible: complex test job
0 9-17 * * 1-5 ls / -alh &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;【4】&lt;/strong&gt;：禁用complex test job而非删除。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m cron -a &quot;name=&apos;complex test job&apos; job=&apos;ls / -alh &amp;gt; /dev/null&apos; disabled=yes&quot;
192.168.201.12 | CHANGED =&amp;gt; {
    &quot;ansible_facts&quot;: {
        &quot;discovered_interpreter_python&quot;: &quot;/usr/bin/python3&quot;
    },
    &quot;changed&quot;: true,
    &quot;envs&quot;: [],
    &quot;jobs&quot;: [
        &quot;complex test job&quot;
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;注意：禁用作业需要同时提供name及job字段；&lt;br /&gt;
否则会报错：You must specify &apos;job&apos; to install a new cron job or variable；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ansible的幂等性原则：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ansible遵循幂等性（Idempotency），即无论执行多少次，结果都应该一致。&lt;br /&gt;
- name只是任务的标识符（用于人类可读的描述），而job才是任务的实际内容。&lt;br /&gt;
- 如果仅凭name禁用任务，Ansible无法确保它修改的是正确的任务（因为name可能重复或不唯一）。&lt;br /&gt;
- job是唯一能精确匹配目标任务的字段，避免误操作。&lt;br /&gt;
2. cron的底层机制：&lt;/p&gt;
&lt;p&gt;Linux crontab本身并不存储name，Ansible是通过在crontab中添加注释来标记任务归属的。&lt;br /&gt;
&lt;code&gt;shell     #Ansible: Backup Database     0 3 * * * /opt/backup.sh     &lt;/code&gt;
- 禁用任务实际上是在原任务前添加#注释（但保留#Ansible标记）：
&lt;code&gt;shell         #Ansible: Backup Database         #0 3 * * * /opt/backup.sh         &lt;/code&gt;
- 如果仅提供name，Ansible无法确定要注释哪一行命令（因为可能有多个任务共享相同的name）；&lt;/p&gt;
&lt;p&gt;验证complex test job作业是否禁用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[root@server ~]# ansible test1_servers -i /etc/ansible/inventory2.ini -m shell -a &quot;crontab -l&quot;
192.168.201.12 | CHANGED | rc=0 &amp;gt;&amp;gt;
#Ansible: complex test job
#* * * * * ls / -alh &amp;gt; /dev/null
[root@server ~]# 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;debug&lt;/h2&gt;
&lt;h1&gt;本文章无期限停止更新···&lt;/h1&gt;
</content:encoded></item><item><title>Debian12 SSH安全配置</title><link>https://blog.ninebytes.cc.cd/posts/tech7-debian12-ssh%E5%AE%89%E5%85%A8%E9%85%8D%E7%BD%AE/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech7-debian12-ssh%E5%AE%89%E5%85%A8%E9%85%8D%E7%BD%AE/</guid><description>让我的SSH旋转</description><pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;修改SSH端口号&lt;/h1&gt;
&lt;p&gt;在Linux中，默认的SSH端口号为22，由于这是人尽皆知的，容易被入侵者扫描。&lt;br /&gt;
通过修改SSH的配置文件实现修改端口号：&lt;code&gt;sudo vim /etc/ssh/sshd_config&lt;/code&gt;&lt;br /&gt;
端口号定义范围最大不能超过65535；也不要占用常用的端口；例如20、21等。也可以自己自定义一个高位端口号。&lt;br /&gt;
使用&lt;code&gt;sudo systemctl restart sshd &amp;amp;&amp;amp; systemctl status sshd&lt;/code&gt;命令重启ssh服务并查看状态。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ninebytes@ninebytes:~$ sudo systemctl restart sshd &amp;amp;&amp;amp; systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; preset: enabled)
     Active: active (running) since Sat 2025-03-17 00:07:58 CST; 39ms ago
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 1521 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 1522 (sshd)
      Tasks: 1 (limit: 4611)
     Memory: 1.4M
        CPU: 116ms
     CGroup: /system.slice/ssh.service
             └─1522 &quot;sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者使用：&lt;code&gt;sudo ss -tulnp | grep sshd&lt;/code&gt;查看端口占用情况。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ninebytes@ninebytes:~$ sudo ss -tulnp | grep sshd
tcp   LISTEN 0      128          0.0.0.0:52221      0.0.0.0:*    users:((&quot;sshd&quot;,pid=3375,fd=3))
tcp   LISTEN 0      128             [::]:52221         [::]:*    users:((&quot;sshd&quot;,pid=3375,fd=4))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有时候旧的SSH进程并没有正确退出，导致22端口依旧被占用，仍然能使用22端口进行SSH连接。&lt;br /&gt;
使用&lt;code&gt;sudo killall sshd &amp;amp;&amp;amp; sudo systemctl start ssh&lt;/code&gt;终止所有的ssh进程， 并重新启动ssh进程。&lt;br /&gt;
若提示&quot;killall command not found&quot;，则没有安装psmisc软件包，killall命令属于psmisc软件包。&lt;br /&gt;
使用&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install psmisc&lt;/code&gt;安装psmisc软件包。&lt;br /&gt;
再次尝试使用22端口进行SSH连接，则连接超时。&lt;/p&gt;
&lt;h1&gt;禁止Root用户SSH登录&lt;/h1&gt;
&lt;p&gt;禁止Root用户SSH登录可以直接防御暴力破解。Root用户是Linux系统的默认超级用户，攻击者会优先尝试此账户。&lt;br /&gt;
通过修改SSH的配置文件实现禁止Root用户登录：&lt;code&gt;sudo vim /etc/ssh/sshd_config&lt;/code&gt;。&lt;br /&gt;
Debian12默认将root用户登录方式设置为了秘钥认证，将&lt;code&gt;PermitRootLogin prohibit-password&lt;/code&gt;修改为&lt;code&gt;PermitRootLogin no&lt;/code&gt;。&lt;br /&gt;
最后重启ssh服务&lt;code&gt;sudo systemctl restart sshd&lt;/code&gt;即可。&lt;/p&gt;
&lt;h1&gt;设置SSH最大连接数&lt;/h1&gt;
&lt;p&gt;通过修改SSH的配置文件实现设置SSH最大连接数：&lt;code&gt;sudo vim /etc/ssh/sshd_config&lt;/code&gt;&lt;br /&gt;
找到&lt;code&gt;MaxSessions&lt;/code&gt;并取消注释，更改MaxSessions到一个你认为比较合适的数值即可。&lt;br /&gt;
最后重启ssh服务&lt;code&gt;sudo systemctl restart sshd&lt;/code&gt;。&lt;/p&gt;
&lt;h1&gt;设置SSH最大认证尝试次数&lt;/h1&gt;
&lt;p&gt;通过修改SSH的配置文件实现设置SSH最大连接数：&lt;code&gt;sudo vim /etc/ssh/sshd_config&lt;/code&gt;&lt;br /&gt;
找到&lt;code&gt;MaxAuthTries&lt;/code&gt;并取消注释，更改MaxAuthTries到一个你认为比较合适的数值即可。&lt;br /&gt;
最后重启ssh服务&lt;code&gt;sudo systemctl restart sshd&lt;/code&gt;。&lt;/p&gt;
&lt;h1&gt;设置SSH连接超时时间&lt;/h1&gt;
&lt;p&gt;通过修改SSH的配置文件实现设置SSH连接超时时间：&lt;code&gt;sudo vim /etc/ssh/sshd_config&lt;/code&gt;。&lt;br /&gt;
&lt;strong&gt;ClientAliveInterval：&lt;/strong&gt;&lt;br /&gt;
SSH服务器会每隔N秒向SSH客户端发送一个空心跳包，用于检测客户端是否仍在线。&lt;br /&gt;
&lt;strong&gt;ClientAliveCountMax：&lt;/strong&gt;&lt;br /&gt;
SSH服务器在连续N次未收到SSH客户端对心跳包的响应后，会主动断开SSH连接。&lt;br /&gt;
&lt;strong&gt;举例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# SSH服务器每隔60秒向SSH客户端发送一个空心跳包；
ClientAliveInterval 60
# SSH服务器连续3次未收到SSH客户端对心跳包的响应后，会主动断开SSH连接;
ClientAliveCountMax 3

# 总超时时间即为60*3=180秒=3分钟;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后重启ssh服务&lt;code&gt;sudo systemctl restart sshd&lt;/code&gt;。&lt;/p&gt;
&lt;h1&gt;创建普通用户并赋予sudo权限&lt;/h1&gt;
&lt;p&gt;创建一个用户&lt;code&gt;testuser&lt;/code&gt;并赋予sudo权限：&lt;code&gt;sudo adduser testuser&lt;/code&gt;。&lt;br /&gt;
&lt;strong&gt;将testuser用户加入sudo用户组：&lt;/strong&gt;&lt;br /&gt;
使用命令&lt;code&gt;sudo usermod -aG sudo testuser&lt;/code&gt;。&lt;br /&gt;
&lt;strong&gt;验证sudo权限：&lt;/strong&gt;&lt;br /&gt;
使用命令：&lt;code&gt;sudo -l -U testuser&lt;/code&gt;验证testuser用户是否被赋予sudo权限，在输出命令中可以看到是否可以以sudo权限运行所有命令：(ALL : ALL) ALL。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ninebytes@ninebytes:~$ sudo -l -U testuser
Matching Defaults entries for testuser on ninebytes:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User testuser may run the following commands on ninebytes:
    (ALL : ALL) ALL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者使用命令：&lt;code&gt;groups testuser&lt;/code&gt;查看testuser用户的所属用户组。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ninebytes@ninebytes:~$ groups testuser
testuser : testuser sudo users
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;删除不需要的sudo权限用户&lt;/h1&gt;
&lt;p&gt;使用命令：&lt;code&gt;sudo deluser --remove-home testuser&lt;/code&gt;删除testuser用户及其主目录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ninebytes@ninebytes:~$ sudo deluser --remove-home testuser
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = &quot;en_US:en&quot;,
        LC_ALL = (unset),
        LANG = &quot;en_US.UTF-8&quot;
    are supported and installed on your system.
perl: warning: Falling back to the standard locale (&quot;C&quot;).
Looking for files to backup/remove ...
Removing files ...
Removing crontab ...
Removing user `testuser&apos; ...
Done.
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Windows DeepSeek本地部署</title><link>https://blog.ninebytes.cc.cd/posts/tech6-deepseek%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech6-deepseek%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2/</guid><description>将DeepSeek部署在本地，保护数据隐私</description><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;为什么要本地部署？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据仅在本地处理，不会上传云端。&lt;/li&gt;
&lt;li&gt;不受某些神秘的限制。&lt;/li&gt;
&lt;li&gt;更快地响应输出。&lt;/li&gt;
&lt;li&gt;不依赖互联网连接，可以无网络使用。&lt;/li&gt;
&lt;li&gt;可以根据具体需求对模型进行微调和优化，以适应特定的应用场景。&lt;/li&gt;
&lt;li&gt;可以快速响应和解决技术问题，减少对外部支持的依赖。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::warning
即使是本地部署也不可以搞瑟瑟哦
:::&lt;/p&gt;
&lt;h1&gt;Ollama安装&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;什么是Ollama？&lt;/strong&gt;&lt;br /&gt;
Ollama 是一个用于在本地运行大型语言模型（LLMs）的工具。它允许用户在个人计算机上部署和运行各种开源语言模型，如 LLaMA、Mistral 等。Ollama 提供了一个简单的命令行界面，使得用户能够轻松地下载、管理和与这些模型进行交互。&lt;br /&gt;
首先打开&lt;a href=&quot;https://ollama.com/&quot;&gt;Ollma官网&lt;/a&gt;，下载跟你系统对应的Ollma版本。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/4b143af2a4fa05c042451955bb40f569.png&quot; alt=&quot;6 1&quot; /&gt;
下载好后点击&lt;code&gt;Install&lt;/code&gt;安装即可。&lt;br /&gt;
下载慢的话可以点击&lt;a href=&quot;https://pan.huang1111.cn/s/k24KWuB&quot;&gt;这里&lt;/a&gt;使用我的huang1111网盘进行下载。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/72f44861722d171ad5feeab95307980f.png&quot; alt=&quot;6 2&quot; /&gt;
打开命令提示符或PowerShell均可，输入&lt;code&gt;ollama&lt;/code&gt;，如果出现我这样的信息，就证明Ollama成功安装了。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/ef6acb99412476ea3cc810ab527c5aa1.png&quot; alt=&quot;6 3&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;寻找合适版本&lt;/h1&gt;
&lt;p&gt;再次打开&lt;a href=&quot;https://ollama.com/&quot;&gt;Ollma官网&lt;/a&gt;，在搜索框内输入&lt;code&gt;deepseek&lt;/code&gt;，点击&lt;code&gt;deepseek-r1&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/2280bbc73050ad6aa36e900e36d57aa0.png&quot; alt=&quot;6 4&quot; /&gt;
这里提供了多个蒸馏过的R1模型，根据自己电脑配置进行选择。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tips：1.5b核显也可以运行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/12e54d06043fe3199fb54d679f4687cb.png&quot; alt=&quot;6 5&quot; /&gt;
下面是各个版本的运行命令：&lt;br /&gt;
1.5b：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ollama run deepseek-r1:1.5b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;7b：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ollama run deepseek-r1:7b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;8b：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ollama run deepseek-r1:8b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;14b：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ollama run deepseek-r1:14b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;32b：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ollama run deepseek-r1:32b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;70b：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ollama run deepseek-r1:70b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;671b：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ollama run deepseek-r1:671b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我的显卡是4060L，有8GB的显存，运行8b模型即可。&lt;br /&gt;
将命令复制后，打开命令提示符或PowerShell，然后将命令粘贴进去然后回车即可。耐心等待下载完成。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/d45ffb01ece150f7e7d6265714dd7be2.png&quot; alt=&quot;6 6&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;运行DeepSeek&lt;/h1&gt;
&lt;p&gt;下载完成后，命令行内输入&lt;code&gt;ollama list&lt;/code&gt;查看已经下载好的模型。&lt;br /&gt;
使用&lt;code&gt;ollama run model_name&lt;/code&gt;运行对应的模型。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/0505dc71695d9448f2612030a5624030.png&quot; alt=&quot;6 7&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;安装ChatBox&lt;/h1&gt;
&lt;p&gt;访问&lt;a href=&quot;https://chatboxai.app/&quot;&gt;ChatBox官网&lt;/a&gt;，点击&lt;code&gt;免费下载（for Windows）&lt;/code&gt;下载ChatBox，然后安装。&lt;br /&gt;
下载慢的话可以点击&lt;a href=&quot;https://pan.huang1111.cn/s/K9ODKhY&quot;&gt;这里&lt;/a&gt;使用我的huang1111网盘进行下载。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/f180ee7d4c2633bf52426cfbead7160b.png&quot; alt=&quot;6 11&quot; /&gt;
安装完成后打开ChatBox，第1次打开会让你选择并配置AI模型提供方。点击&lt;code&gt;使用我自己的API KEY或本地模型&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/6ada809adbd3d9801c5c4e34f20695ad.png&quot; alt=&quot;6 12&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置ChatBox&lt;/h1&gt;
&lt;p&gt;点击&lt;code&gt;Ollama API&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/c1f47c98104330a4241361c335a583f9.png&quot; alt=&quot;6 13&quot; /&gt;
选择本地DeepSeek模型。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/b69b8258e10a0cc6ce534ab752518a63.png&quot; alt=&quot;6 14&quot; /&gt;
点击保存。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/f7db55b0c71a10ea270f64239dd932c7.png&quot; alt=&quot;6 15&quot; /&gt;
即可开始使用图形化界面。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/cf8b483330146307d80dab0abc09e737.png&quot; alt=&quot;6 16&quot; /&gt;
&amp;lt;Success&amp;gt;恭喜你部署成功啦！&amp;lt;/Success&amp;gt;&lt;/p&gt;
&lt;h1&gt;使用Web UI&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;由于需要Magic环境，我并没有Magic，所以没有配图，只有文本。&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用Google Chrome安装&lt;a href=&quot;https://chromewebstore.google.com/detail/page-assist-%E6%9C%AC%E5%9C%B0-ai-%E6%A8%A1%E5%9E%8B%E7%9A%84-web/jfgfiigpkhlkbnfnbobbkinehhfdhndo&quot;&gt;Page Assist&lt;/a&gt;插件后，启动Ollama服务。&lt;/li&gt;
&lt;li&gt;在Google Chrome内使用快捷键&amp;lt;Kbd&amp;gt;Ctrl&amp;lt;/Kbd&amp;gt; + &amp;lt;Kbd&amp;gt;Shift&amp;lt;/Kbd&amp;gt; + &amp;lt;Kbd&amp;gt;L&amp;lt;/Kbd&amp;gt;即可呼出Page Assist页面。&lt;/li&gt;
&lt;li&gt;首次打开需要简单配置一下：在右上角设置-RAG Setting中选择为你下载的DeepSeek模型，然后回到对话窗口，即可在WebUI中玩耍了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;卸载模型&lt;/h1&gt;
&lt;p&gt;使用命令&lt;code&gt;ollama rm model_name&lt;/code&gt;来卸载模型。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/6ee23cb49807af2ff0d89a3a966a4018.png&quot; alt=&quot;6 10&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;最后&lt;/h1&gt;
&lt;p&gt;运行8b模型前后时的显存占用图。
&amp;lt;Diff r=&quot;https://s1.imagehub.cc/images/2025/04/28/c300b94c70ae901c1e97600747e8a65c.png&quot; l=&quot;https://s1.imagehub.cc/images/2025/04/28/1062bd0d805501a72dd53dfc264a84aa.png&quot;&amp;gt;&amp;lt;/Diff&amp;gt;
运行14b模型前后时的显存占用图。
&amp;lt;Diff r=&quot;https://s1.imagehub.cc/images/2025/04/28/c300b94c70ae901c1e97600747e8a65c.png&quot; l=&quot;https://s1.imagehub.cc/images/2025/04/28/802f847e374f937caac27e7cba514625.png&quot;&amp;gt;&amp;lt;/Diff&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tips：如果下载到最后特别慢的话，可以&amp;lt;Kbd&amp;gt;Ctrl&amp;lt;/Kbd&amp;gt; + &amp;lt;Kbd&amp;gt;C&amp;lt;/Kbd&amp;gt;停止后，再次执行该运行命令。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>重装系统之胎教级教程</title><link>https://blog.ninebytes.cc.cd/posts/tech5-%E9%87%8D%E8%A3%85%E7%B3%BB%E7%BB%9F%E4%B9%8B%E8%83%8E%E6%95%99%E7%BA%A7%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech5-%E9%87%8D%E8%A3%85%E7%B3%BB%E7%BB%9F%E4%B9%8B%E8%83%8E%E6%95%99%E7%BA%A7%E6%95%99%E7%A8%8B/</guid><description>学不会的适人握持</description><pubDate>Sun, 19 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近家里的台式电脑系统崩了，进不去系统，只能进BIOS。照着这个机会正好写一个重装系统之胎教级的教程。&lt;/p&gt;
&lt;h1&gt;准备工作&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;1个容量大于16GB的U盘&lt;/li&gt;
&lt;li&gt;PE环境制作软件&lt;/li&gt;
&lt;li&gt;系统镜像&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;下载微PE&lt;/h1&gt;
&lt;p&gt;制作PE环境的软件有很多，就不一一列举了，我这里使用的是微PE。&lt;br /&gt;
首先打开&lt;a href=&quot;https://www.wepe.com.cn/&quot;&gt;微PE官网&lt;/a&gt;，点击右上角的&lt;code&gt;下载&lt;/code&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/8102258f7ad03eb616410dfb106ce639.png&quot; alt=&quot;5 1&quot; /&gt;
如果你要装的机器是近几年较新的机器，例如英特尔酷睿13、14代，或者是AMD锐龙R5、R7、R9等系列，那就选择下载微PE工具箱新版。&lt;br /&gt;
如果你的机器是已经淘汰下来的机器，例如英特尔酷睿2代、3代等，那就选择下载微PE工具箱旧版本。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/455a3ded726bb06bb5e5eb5efe89916a.png&quot; alt=&quot;5 2&quot; /&gt;
这里会提示捐赠，可以点击&lt;code&gt;先不捐赠&lt;/code&gt;。如果你有一定的经济实力，请扫码捐赠，毕竟维护不易。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/f01ab01d7eb084994d901a320fb47c6b.png&quot; alt=&quot;5 3&quot; /&gt;
这时候会让你选择下载64位还是32位，自行去搜索你的CPU架构是32位还是64位。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tips：最近几年出的CPU均是64位的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/fe7bc97de92b5efd1978da04559511d5.png&quot; alt=&quot;5 4&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;制作系统U盘&lt;/h1&gt;
&lt;p&gt;:::caution
制作系统U盘会格式化U盘，U盘内的所有数据都将丢失，请做好数据备份！
:::
:::caution
制作系统U盘会格式化U盘，U盘内的所有数据都将丢失，请做好数据备份！
:::
:::caution
制作系统U盘会格式化U盘，U盘内的所有数据都将丢失，请做好数据备份！
:::&lt;/p&gt;
&lt;p&gt;下载好后，将U盘插入电脑USB接口。&lt;br /&gt;
打开微PE，点击右下角的USB接口图标，安装PE到U盘。不要点击中间的&quot;立即安装进系统&quot;，这样会把PE环境安装到你现在操作的电脑上。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/3513ef34848c04cb33884fab9c80ee4b.png&quot; alt=&quot;5 5&quot; /&gt;
如果你电脑上只插着1个U盘，那微PE就会正确识别到它。&lt;br /&gt;
如果你电脑上有插着多个U盘，在&lt;code&gt;待写入U盘&lt;/code&gt;中，请选择正确的U盘。&lt;br /&gt;
其他配置默认就行，你也可以在&lt;code&gt;U盘卷标&lt;/code&gt;内填写一个好辨识的名字。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/e39dd8c7a70985c856a3cd79422155c7.png&quot; alt=&quot;5 6&quot; /&gt;
在你点下&lt;code&gt;开始制作&lt;/code&gt;按钮之前，你还有机会检查你的U盘内是否还有重要数据。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/92d7157429d4504f66387b22ea3e33f6.png&quot; alt=&quot;5 7&quot; /&gt;
等待制作完成。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/8151501af8e67c10950440a3b787b82d.png&quot; alt=&quot;5 8&quot; /&gt;
系统U盘制作完成。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/aa47469d6faa90969dc4d737548c168b.png&quot; alt=&quot;5 9&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;下载系统镜像&lt;/h1&gt;
&lt;p&gt;我这里访问的是&lt;a href=&quot;https://hellowindows.cn/&quot;&gt;HelloWindows&lt;/a&gt;，其他好用的镜像站推荐I Tell You，&lt;a href=&quot;https://msdn.itellyou.cn/&quot;&gt;旧站&lt;/a&gt;最新只有Windows10 1909，&lt;a href=&quot;https://next.itellyou.cn/Original/Index&quot;&gt;新站&lt;/a&gt;有最新的Windows11 24H2，不过需要花1分钟时间注册。&lt;br /&gt;
选择好你想要安装的系统镜像后，点击&lt;code&gt;ed2K&lt;/code&gt;下载或&lt;code&gt;BT&lt;/code&gt;下载均可，此时会将下载链接复制到剪贴板内。还需要搭配下载器才能食用。&lt;br /&gt;
下载器推荐比特彗星，如果比特彗星下载慢的话，可以尝试吸血雷。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/2ddcbe189d2afb5a2be11a7ef8ce9e7e.png&quot; alt=&quot;5 10&quot; /&gt;
比特彗星下载太慢了，所以用的吸血雷。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/2c3625beef94f435e70c31146d4461b5.png&quot; alt=&quot;5 11&quot; /&gt;
镜像下载完成后，复制到U盘内，弹出U盘即可。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tips：注意不要复制镜像文件到EFI分区内&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;进入PE环境&lt;/h1&gt;
&lt;p&gt;将系统U盘插入要重装系统的电脑，最好插在主机背板后，哪个USB接口速率最快插哪个。&lt;br /&gt;
&lt;s&gt;（懒得爬到背板后面去插了...）&lt;/s&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/3f1424ad57e37c7e58099651e4bd734b.jpg&quot; alt=&quot;5 12&quot; /&gt;
在开机之前你还要确认主板BIOS快捷键是哪个，自行Bing搜索。&lt;br /&gt;
插好后按下开机键，然后狂按BIOS快捷键，进入BIOS界面，在&lt;code&gt;启动&lt;/code&gt;界面设置第1启动项为系统U盘。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/1848f17ff53da10e8663196d6ffabae3.jpg&quot; alt=&quot;5 13&quot; /&gt;
选择到正确的U盘型号。选择好后，按下&lt;code&gt;F10&lt;/code&gt;保存并退出，电脑会自动重启。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/b365a7fafe82d104f99258250932aa21.jpg&quot; alt=&quot;5 14&quot; /&gt;
如果你的设置没有问题的话，就会进入PE系统界面。&lt;/p&gt;
&lt;h1&gt;硬盘分区&lt;/h1&gt;
&lt;p&gt;然后打开桌面上的DiskGenius。&lt;br /&gt;
选择你要安装系统的硬盘。点击&lt;code&gt;删除所有分区&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/136e8f8b0050f0f15413df63b1b23e1f.jpg&quot; alt=&quot;5 15&quot; /&gt;
点击&lt;code&gt;是&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/50ca48c47b7968ed18ac2b2fb198ee7a.jpg&quot; alt=&quot;5 16&quot; /&gt;
随后点击左上角的&lt;code&gt;保存更改&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/28bdd10907c71f11d53007bfae104b57.jpg&quot; alt=&quot;5 17&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;系统安装&lt;/h1&gt;
&lt;p&gt;分区完成后，在系统U盘内找到你复制的镜像文件，并双击打开它。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/516f1fa4a4caeff11871725ce5a52a9d.jpg&quot; alt=&quot;5 18&quot; /&gt;
然后找到&lt;code&gt;setup.exe&lt;/code&gt;程序，双击运行。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/b087eaf9a993c2306ee66c58e712926d.jpg&quot; alt=&quot;5 19&quot; /&gt;
选项默认，点击&lt;code&gt;下一页&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/5847143a4c9318d7533404288f7babd3.jpg&quot; alt=&quot;5 20&quot; /&gt;
点击&lt;code&gt;现在安装&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/732e4d487f89b635561c672ba856b6d8.jpg&quot; alt=&quot;5 21&quot; /&gt;
选择你想安装的操作系统类型。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/d8ee0dd94484743d74a5569bd9437fe2.jpg&quot; alt=&quot;5 22&quot; /&gt;
同意许可条款。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/0b26647cf439daaefd6607cb235887a2.jpg&quot; alt=&quot;5 23&quot; /&gt;
选择&lt;code&gt;自定义&lt;/code&gt;安装类型。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/ce44bbe93932b5728fbadbe2014006b9.jpg&quot; alt=&quot;5 24&quot; /&gt;
首先确认这是不是你的硬盘大小，然后再单击选择到&lt;code&gt;未分配的空间&lt;/code&gt;，然后点击&lt;code&gt;下一页&lt;/code&gt;即可。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/6349fda1570afe694c69fac7c62d8326.jpg&quot; alt=&quot;5 25&quot; /&gt;
等待安装完成。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/930fcd003822cbc141388b01c3ffcd7c.jpg&quot; alt=&quot;5 26&quot; /&gt;
安装完成之后，会有10秒的等待时间，等待重启即可。&lt;br /&gt;
⚠️提示：在重启电脑黑屏的时候，请快速将U盘从电脑USB插口上拔除，以免再次进入BIOS界面。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/65fed22c03232ea7c5c8f6ae318d5e7b.jpg&quot; alt=&quot;5 27&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置系统&lt;/h1&gt;
&lt;p&gt;等待电脑重启完成后，会进入配置系统界面，配置系统很简单，只要你认识中文就会配置。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/53d23298cd59c162a1b7c5bf874ddae1.jpg&quot; alt=&quot;5 28&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;系统重装完成&lt;/h1&gt;
&lt;p&gt;系统重装完成。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/a5267ee3c3ad9f452a4b5a24adc655fe.jpg&quot; alt=&quot;5 29&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::tip
不要忘了下载驱动哦 ~
:::&lt;/p&gt;
</content:encoded></item><item><title>Rocky Linux 9.4 VMware安装教程</title><link>https://blog.ninebytes.cc.cd/posts/tech4-rocky-linux-94-vmware%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech4-rocky-linux-94-vmware%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/</guid><description>仅限amdx86/64CPU架构</description><pubDate>Sun, 03 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;1. 下载镜像&lt;/h1&gt;
&lt;p&gt;首先下载Rocky Linux 9.4的镜像，可以去&lt;a href=&quot;https://rockylinux.org/zh-CN&quot;&gt;Rocky Linux官网&lt;/a&gt;或者阿里、网易等镜像站下载。&lt;br /&gt;
注意架构不要选择错了。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/ff84b91741de87db800953e0177dc51d.png&quot; alt=&quot;4 1&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;2. 创建新的虚拟机&lt;/h1&gt;
&lt;p&gt;打开VMware Workstation Pro 17，创建新的虚拟机。&lt;br /&gt;
类型选择&lt;code&gt;典型&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/790c65fd8bc1b77b002680a11e96cf35.png&quot; alt=&quot;4 2&quot; /&gt;
选择&lt;code&gt;稍后安装操作系统&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/b3973f3524444d6af8b1ba2cd672b47e.png&quot; alt=&quot;4 3&quot; /&gt;
客户机操作系统选择&lt;code&gt;Linux&lt;/code&gt;，版本选择&lt;code&gt;其他 Linux 5.x 内核 64位&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/4cf52482491d809fce6630004f94227a.png&quot; alt=&quot;4 4&quot; /&gt;
填写虚拟机名称及选择虚拟机安装位置。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/57cbc6a36abc2bad5d437129ade71e7d.png&quot; alt=&quot;4 5&quot; /&gt;
最大磁盘大小建议&lt;code&gt;50G+&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/75647d37853938b16217eb6f57f6a78c.png&quot; alt=&quot;4 6&quot; /&gt;
点击&lt;code&gt;自定义硬件&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/ef6bd37aa3b224b8f3c633bee2481a9f.png&quot; alt=&quot;4 7&quot; /&gt;
内存设置&lt;code&gt;4096MB&lt;/code&gt;，根据你的实体机的硬件配置适量增减。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/17c3104cdce43908e4225c7c3dac7d06.png&quot; alt=&quot;4 8&quot; /&gt;
处理器数量设置&lt;code&gt;1&lt;/code&gt;，每个处理器内核数量设置为&lt;code&gt;8&lt;/code&gt;，适量减少也可以。&lt;br /&gt;
如果有虚拟化需求就勾选&lt;code&gt;虚拟化引擎&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/8998ddf539af5976a076d7d69ea15ae6.png&quot; alt=&quot;4 9&quot; /&gt;
CD/DVD 点击&lt;code&gt;浏览&lt;/code&gt;选择到你的Rocky Linux9.4镜像。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/c3b3be119e917fabcb986928384aac6c.png&quot; alt=&quot;4 10&quot; /&gt;
网络适配器模式按需选择，不了解的自行bing。&lt;br /&gt;
全部设置完成后点击&lt;code&gt;关闭&lt;/code&gt;，再点击&lt;code&gt;完成&lt;/code&gt;即可。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/35b3082704e3475cefb6bb0e379f4e6e.png&quot; alt=&quot;4 11&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;3. 安装虚拟机&lt;/h1&gt;
&lt;p&gt;点击&lt;code&gt;开启此虚拟机&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/7942ac919fa4507570dd6cab96e2286c.png&quot; alt=&quot;4 12&quot; /&gt;
用上下方向键选择到&lt;code&gt;Install Rocky Linux 9.4&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/f4f90717981d6fd522ef4a0df3d2b891.png&quot; alt=&quot;4 13&quot; /&gt;
稍加等待，然后选择系统语言，点击继续。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/7ec44e6998232fe50ad544ba5865b3fc.png&quot; alt=&quot;4 14&quot; /&gt;
带有黄色感叹号的选项是必须进行配置的。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/efefa15e690f70ac32b0baa12dc5b157.png&quot; alt=&quot;4 15&quot; /&gt;
首先来配置安装位置，点击&lt;code&gt;SYSTEM&lt;/code&gt;下方的&lt;code&gt;Installation Destination&lt;/code&gt;。&lt;br /&gt;
点击选择到这个80GiB的磁盘，然后点击&lt;code&gt;Done&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/60848fceef946943edcce22753f70455.png&quot; alt=&quot;4 16&quot; /&gt;
然后配置Root密码。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/d97c1c24b3707f43e03be135e91477db.png&quot; alt=&quot;4 17&quot; /&gt;
设置完密码后，勾选&lt;code&gt;Allow root SSH login with password&lt;/code&gt;,允许root用户使用密码进行SSH登录。&lt;br /&gt;
当你使用的密码是弱密码时，需要点击2次&lt;code&gt;Done&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/6e1891f57241949f9e47af0322588f9a.png&quot; alt=&quot;4 18&quot; /&gt;
同时也可以点击&lt;code&gt;User Creation&lt;/code&gt;创建一个普通用户，键入你的用户名及密码。&lt;br /&gt;
&lt;code&gt;Make this user administrator&lt;/code&gt;：设置此用户为管理员。&lt;br /&gt;
&lt;code&gt;Require a password to use this accout&lt;/code&gt;：需要密码才能使用这个账户。&lt;br /&gt;
点击&lt;code&gt;Done&lt;/code&gt;保存配置。&lt;br /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/a809f84ade73b30e3601c03503f49e68.png&quot; alt=&quot;4 19&quot; /&gt;
然后点击&lt;code&gt;Software Selection&lt;/code&gt;，选择软件版本。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/d3824137a7fc0a1e63ff44e21ca416d3.png&quot; alt=&quot;4 20&quot; /&gt;
我选择的是&lt;code&gt;Minimal Install&lt;/code&gt;最小安装，只有命令行界面。
想要带有GUI界面的选择第1个&lt;code&gt;Server with GUI&lt;/code&gt;,选择完成后点击&lt;code&gt;Done&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/31620ea0f4fe923cf798ba56eb1cce79.png&quot; alt=&quot;4 21&quot; /&gt;
然后就可以点击&lt;code&gt;Begin Installation&lt;/code&gt;开始安装Rocky Linux 9.4了。
耐心等待安装。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/7af462a79952fda97769e0f384d7ad11.png&quot; alt=&quot;4 22&quot; /&gt;
安装完成后点击&lt;code&gt;Reboot System&lt;/code&gt;。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/0ff948ca8e076f41fb8eec95ecc4fdca.png&quot; alt=&quot;4 23&quot; /&gt;
然后就可以开始你的操作了。
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/28/da610dd50eb16a57fce0fac12b6676b7.png&quot; alt=&quot;4 24&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>笔记本新机验机保姆级教程</title><link>https://blog.ninebytes.cc.cd/posts/tech3-%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%96%B0%E6%9C%BA%E9%AA%8C%E6%9C%BA%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech3-%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%96%B0%E6%9C%BA%E9%AA%8C%E6%9C%BA%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/</guid><description>怎么验机？我不到啊</description><pubDate>Sat, 24 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;1.开箱前言&lt;/h1&gt;
&lt;p&gt;新机收到后最好当着快递员面拆箱检查，如果你跟我一样，快递员扔下快递就跑路了，那你拿回家拆箱检查并全程手机录像也是可以的。&lt;br /&gt;
快递拿到家后，拆箱前请保持全程录像，这将是你新机出问题后跟客服对峙最有力的证据。录像的时候最好是一个人录像一个人拆，这样方便很多，要不当杨过真的很难受。&lt;/p&gt;
&lt;h1&gt;2.外观检查&lt;/h1&gt;
&lt;p&gt;首先要检查的就是外包装完整性，检查外包装有没有破损，外包装破损的话一般问题不大。主要看的是内包装，内包装破损的话那就可以联系快递员退换货了。&lt;br /&gt;
如果包装没有问题的话，那就该检查机器配置是否和你购买的机器配置一致。&lt;br /&gt;
注意：机器配置单必须和你购买的一模一样，少一个字母多一个字母都不行，比如是买的13650HX，实际到手却是13650H。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c9ca10d9c307b7e957e9f0.jpg&quot; alt=&quot;&quot; /&gt;
机器配置单确认无误后，拆开包装，检查产品说明书、联保凭证、保修卡以及电源适配器等配件是否齐全。&lt;/p&gt;
&lt;h1&gt;3.机器外观检查&lt;/h1&gt;
&lt;p&gt;保证没有问题后我们就可以拿出机器，检查机器的ABCD面是否有指纹、污渍、划痕、是否平整等。&lt;br /&gt;
然后掀起屏幕，检查触摸板以及开关电源键是否有指纹，各类接口有没有插拔痕迹，螺丝等有没有拧动痕迹等。&lt;/p&gt;
&lt;h1&gt;4.机器开机检查&lt;/h1&gt;
&lt;p&gt;以上均没有问题后就可以插电源开机了，只插电源线和键鼠即可，不要插网线！！！有些品牌机型有运输模式，不插电源线是无法开机的，这项特性也可以成为你的验机手段。&lt;br /&gt;
第一次开机慢是正常情况，开机后然后根据提示走就可以，直至提示你联网的时候，这时候先不要联网！！！无论是插网线还是连WIFI，只要联网均视为激活，绝大部分电脑激活后是无法无问题退换货的。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c8bb89d9c307b7e9f6d1fd.png&quot; alt=&quot;&quot; /&gt;
这时候按下Shift+F10键，无反应就按下Shift+Fn+F10键，在命令提示符窗口内输入&lt;code&gt;OOBE\BYPASSNRO&lt;/code&gt;，注意这里是反斜杠。输入完成后回车，等待电脑重启完成。&lt;br /&gt;
输命令的时候如果输不上去需要你点击一下命令提示符窗口，并不是键盘坏了。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c8bc6cd9c307b7e9f7ba13.png&quot; alt=&quot;&quot; /&gt;
重启完成后，点击这里的&lt;code&gt;我没有Internet连接&lt;/code&gt;。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c8bd4bd9c307b7e9f8ce20.png&quot; alt=&quot;&quot; /&gt;
然后点击&lt;code&gt;继续执行受限设置&lt;/code&gt;，然后就根据提示来就可以。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c8bdc1d9c307b7e9f95a95.png&quot; alt=&quot;&quot; /&gt;
然后你可能会发现桌面空空如也，具体设置等验机完成后根据我这篇文章来设置：&lt;a href=&quot;https://blog.ninebytes.top/blog/windows11%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE&quot;&gt;Windows11到手基础配置&lt;/a&gt;。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c8beb8d9c307b7e9fa8501.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;5.图吧工具箱检查&lt;/h1&gt;
&lt;p&gt;推荐使用&lt;a href=&quot;https://www.tbtool.cn/&quot;&gt;图吧工具箱&lt;/a&gt;进行验机，简单快捷。你可以使用另一台电脑提前下载好后复制至U盘内进行安装，或者是连接手机进行传输，但是不要直接联网下载。&lt;br /&gt;
图吧工具箱的安装过程比较简单，不再叙述。&lt;br /&gt;
安装完成后，点击左侧栏的&quot;硬件信息&quot;，查看机器实际配置是否和你所购买的完全一致。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c8c047d9c307b7e9fcf5bf.png&quot; alt=&quot;&quot; /&gt;
然后点击左侧栏的&quot;磁盘工具&quot;，再双击打开&quot;DiskInfo&quot;，查看硬盘累计读写及累计通电时间。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c8c239d9c307b7e90349fa.png&quot; alt=&quot;&quot; /&gt;
如果你的机器红框内的数值跟我的差不多，那恭喜你已经下车下了一半了。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c8c427d9c307b7e9075c73.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;6.烤鸡压力测试&lt;/h1&gt;
&lt;p&gt;烤鸡可以测试机器的稳定性，一般烤15分钟即可。&lt;br /&gt;
烤鸡前请确保你已经正确插入了电源线，并确保运行模式不是&quot;省电模式&quot;。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c953f5d9c307b7e9b64697.png&quot; alt=&quot;&quot; /&gt;
还要开启&quot;独显直连&quot;，各家开启方式不同，自行搜索。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c95499d9c307b7e9b6c992.png&quot; alt=&quot;&quot; /&gt;
然后再去控制面板内检查是否处于&quot;省电模式&quot;，是的话就更改为高性能模式。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c954b8d9c307b7e9b6e51f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;6.1 FurMark&lt;/h2&gt;
&lt;p&gt;点击左侧栏中的&quot;显卡工具&quot;，双击运行&quot;一键烤显卡&quot;，将会以1280*720分辨率运行FurMark。运行15分钟即可。运行期间电脑有些卡顿是正常现象。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c952d6d9c307b7e9b543c1.png&quot; alt=&quot;&quot; /&gt;
开始FurMark烤鸡。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c9550cd9c307b7e9b72d68.png&quot; alt=&quot;&quot; /&gt;
15分钟FurMark压力测试通过，紫色横线分别是运行时间、帧率(最小帧率、最大帧率、平均帧率)，紫色方框内是GPU温度(最低温度、最高温度)。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c95a75d9c307b7e9bc27d0.png&quot; alt=&quot;&quot; /&gt;
烤鸡的时候还可以打开AIDA64查看具体温度器数值，点击左侧&quot;主板工具&quot;，然后双击打开AIDA64。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c95b31d9c307b7e9bd268c.png&quot; alt=&quot;&quot; /&gt;
然后在左侧栏的&quot;计算机-传感器&quot;中查看。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c95b84d9c307b7e9bd772e.png&quot; alt=&quot;&quot; /&gt;
CPU、GPU温度在60-80+度都是正常温度，如果你的电脑烤鸡时温度飙升到90多甚至破百，那就需要联系客服了，新机一般来说都是在60-90区间内上下浮动。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c95bb9d9c307b7e9bda8d4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;6.2 AIDA64烤鸡&lt;/h2&gt;
&lt;p&gt;打开AIDA64后，点击这个折线图标，打开AIDA64系统稳定性测试。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c96074d9c307b7e9c1ed8b.png&quot; alt=&quot;&quot; /&gt;
最常用到的有3个，分别是：&lt;br /&gt;
Stress CPU：满载整数运算测试，模拟日常使用场景，浏览网页、office、聊天、视频等。&lt;br /&gt;
Stress FPU：满载浮点运算测试，模拟生产或大型游戏使用场景，图形、视频渲染、特效、大型3A游戏等。&lt;br /&gt;
Stress GPU：满载显卡压力测试，对显卡频率、使用量、显存等进行测试。&lt;br /&gt;
使用AIDA64烤鸡时单烤FPU、双烤CPU、FPU和三烤CPU、FPU、GPU即可。测试时间15分钟，15分钟内不死机、蓝屏、报错、不撞温度墙就可以判断为通过。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c960d3d9c307b7e9c24ea4.png&quot; alt=&quot;&quot; /&gt;
首先勾选你要测试的项目，然后点击左下角的&lt;code&gt;start&lt;/code&gt;即可开始。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c963f3d9c307b7e9c5497d.png&quot; alt=&quot;&quot; /&gt;
15分钟后暂停测试查看结果。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c96a66d9c307b7e9ceb408.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;7.硬盘性能测试&lt;/h1&gt;
&lt;p&gt;图吧工具箱左侧栏中选择&quot;磁盘工具&quot;，双击打开&quot;AS SSD BenchMark&quot;。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c96e58d9c307b7e9d581af.png&quot; alt=&quot;&quot; /&gt;
点击左下方start开始，等待测试完成。测试数据越大时间越久。&lt;br /&gt;
首先选择测试硬盘型号，一般默认就是正确的。然后选择测试数据大小，越大越能反应硬盘的真实缓外速度。
&lt;img src=&quot;https://pic.imgdb.cn/item/66c9d5ced9c307b7e96ac611.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows11隐藏桌面“了解此图片”图标</title><link>https://blog.ninebytes.cc.cd/posts/tech2-windows11%E9%9A%90%E8%97%8F%E6%A1%8C%E9%9D%A2%E4%BA%86%E8%A7%A3%E6%AD%A4%E5%9B%BE%E7%89%87%E5%9B%BE%E6%A0%87/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech2-windows11%E9%9A%90%E8%97%8F%E6%A1%8C%E9%9D%A2%E4%BA%86%E8%A7%A3%E6%AD%A4%E5%9B%BE%E7%89%87%E5%9B%BE%E6%A0%87/</guid><description>So Microsoft F**k You</description><pubDate>Thu, 22 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;当你把锁屏界面更改为&quot;Windows聚焦&quot;时，在你的桌面可能会出现一个&quot;了解此图片&quot;图标。
&lt;img src=&quot;https://pic.imgdb.cn/item/66befd0ed9c307b7e95f1941.png&quot; alt=&quot;&quot; /&gt;
和其他图标不同的是，你不能删除、剪切、复制、粘贴或将其移动到其他文件夹中，致使强迫症患者放弃了Windows聚焦功能（比如我）。
&lt;img src=&quot;https://pic.imgdb.cn/item/66befdd0d9c307b7e95fc4c2.png&quot; alt=&quot;&quot; /&gt;
解决办法也很简单，首先打开注册表编辑器，Win+R输入&lt;code&gt;regedit&lt;/code&gt;。&lt;br /&gt;
:::caution
修改注册表有风险，修改错误可能会导致系统不稳定或崩溃，请提前备份注册表并在专业人士指导下操作！
:::
:::caution
修改注册表有风险，修改错误可能会导致系统不稳定或崩溃，请提前备份注册表并在专业人士指导下操作！
:::
:::caution
修改注册表有风险，修改错误可能会导致系统不稳定或崩溃，请提前备份注册表并在专业人士指导下操作！
:::
&lt;img src=&quot;https://pic.imgdb.cn/item/66befe3bd9c307b7e9602d9a.png&quot; alt=&quot;&quot; /&gt;
然后在上边的地址栏内粘贴。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/66beff19d9c307b7e960f3ff.png&quot; alt=&quot;&quot; /&gt;
然后在空白处右键，选择新建&lt;code&gt;DWORD（32位）值&lt;/code&gt;。
&lt;img src=&quot;https://pic.imgdb.cn/item/66beff2ad9c307b7e9610272.png&quot; alt=&quot;&quot; /&gt;
并将这个新值命名为&lt;code&gt;{2cc5ca98-6485-489a-920e-b3e88a6ccce3}&lt;/code&gt;。
&lt;img src=&quot;https://pic.imgdb.cn/item/66beff89d9c307b7e9614e8d.png&quot; alt=&quot;&quot; /&gt;
命名完成后，右键这个新值，点击&quot;修改&quot;。
&lt;img src=&quot;https://pic.imgdb.cn/item/66beffc8d9c307b7e9618289.png&quot; alt=&quot;&quot; /&gt;
将这个新值的数据修改为十六进制的&lt;code&gt;1&lt;/code&gt;，然后点击确定即可。
&lt;img src=&quot;https://pic.imgdb.cn/item/66bf0009d9c307b7e961b5b9.png&quot; alt=&quot;&quot; /&gt;
然后回到桌面，右键刷新即可隐藏&quot;了解此图片&quot;图标。
&lt;img src=&quot;https://pic.imgdb.cn/item/66bf005ed9c307b7e961fdde.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;想恢复&quot;了解此图片&quot;图标？&lt;/strong&gt;&lt;br /&gt;
如果想恢复显示&quot;了解此图片&quot;图标，可以右键你刚刚创建的值，点击&quot;删除&quot;即可。
&lt;img src=&quot;https://pic.imgdb.cn/item/66bf00c9d9c307b7e9625dd3.png&quot; alt=&quot;&quot; /&gt;
点击&quot;是&quot;，然后回到桌面再次刷新即可。
&lt;img src=&quot;https://pic.imgdb.cn/item/66bf00d3d9c307b7e9626623.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>石家庄抱犊寨之旅</title><link>https://blog.ninebytes.cc.cd/posts/life2-%E7%9F%B3%E5%AE%B6%E5%BA%84%E6%8A%B1%E7%8A%8A%E5%AF%A8%E4%B9%8B%E6%97%85/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/life2-%E7%9F%B3%E5%AE%B6%E5%BA%84%E6%8A%B1%E7%8A%8A%E5%AF%A8%E4%B9%8B%E6%97%85/</guid><description>河北 · 石家庄</description><pubDate>Sat, 10 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/777713e1d0e64129075789c7a9c604af.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/fde2c63a0dec8335d7cf00c2c72344cf.jpg&quot; alt=&quot;2&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/5f854a4d9c5e1120d96d32d5a07b79dd.jpg&quot; alt=&quot;3&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/e8ed22cb1af32b80249809ce6c92f631.jpg&quot; alt=&quot;4&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/810e24b2bb25a2e0596e1c07d1b46ec8.jpg&quot; alt=&quot;5&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/3db19ca3cf49db9ccb90ff2d6e2d9137.jpg&quot; alt=&quot;6&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/277a40bf1b76dec757039d73b532ccc8.jpg&quot; alt=&quot;7&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Steam正确安装指北</title><link>https://blog.ninebytes.cc.cd/posts/tech1-steam%E6%AD%A3%E7%A1%AE%E5%AE%89%E8%A3%85%E6%8C%87%E5%8C%97/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/tech1-steam%E6%AD%A3%E7%A1%AE%E5%AE%89%E8%A3%85%E6%8C%87%E5%8C%97/</guid><description>Steam正确食用方法</description><pubDate>Sat, 20 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;：
本文讲述steam的正确安装方式及账号注册，面向对象是刚刚接触电脑的小白&lt;/p&gt;
&lt;h1&gt;1.steam简介&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/6698c08cd9c307b7e969f90b.jpg&quot; alt=&quot;&quot; /&gt;
Steam是Valve公司在推出的电子游戏数字发行平台，最初于2003年首次发布时是作为提供自动更新功能的客户端，后发展成为第三方游戏发行商的发行平台，并成为全球最大的综合性数字发行平台之一。玩家可以在该平台购买、下载、讨论、上传和分享游戏和软件。&lt;br /&gt;
来源：&lt;a href=&quot;https://baike.baidu.com/item/Steam/10092959&quot;&gt;百度百科-Steam&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;2.steam安装包下载&lt;/h1&gt;
&lt;p&gt;首先打开你的浏览器（这一步应该会吧..）&lt;br /&gt;
在浏览器主页搜索栏中输入&lt;code&gt;steam&lt;/code&gt;，然后点击右侧的搜索图标或者按下回车键（即键盘上的&lt;code&gt;Enter&lt;/code&gt;键）
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c252d9c307b7e96c0de8.png&quot; alt=&quot;&quot; /&gt;
搜索结果中的第1个就是官方网站，在红色箭头的位置点击即可进入网站，请认准官方域名&lt;code&gt;https://store.steampowered.com&lt;/code&gt;
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c342d9c307b7e96d31a8.png&quot; alt=&quot;&quot; /&gt;
如果你使用百度进行搜索的话，需要认准带有&lt;code&gt;官方&lt;/code&gt;字样的网站
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c55fd9c307b7e96fcd5a.png&quot; alt=&quot;&quot; /&gt;
然后点击右侧的&lt;code&gt;安装Steam&lt;/code&gt;
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c428d9c307b7e96e3643.png&quot; alt=&quot;&quot; /&gt;
打不开属于正常现象，毕竟steam服务器没有在大陆，访问速度肯定会受限
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c5bcd9c307b7e970304f.png&quot; alt=&quot;&quot; /&gt;
然后点击那个大大的&lt;code&gt;安装STEAM&lt;/code&gt;
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c638d9c307b7e970b9ea.png&quot; alt=&quot;&quot; /&gt;
下载好后，Microsoft Edge浏览器会在右上角弹出一个下载窗口，点击&lt;code&gt;打开文件&lt;/code&gt;即可&lt;br /&gt;
Chrome浏览器，也就是谷歌浏览器可能会在下方弹出下载窗口&lt;br /&gt;
无论你用哪个主流浏览器(除了IE)在下载管理中都能找到你下载的文件，多点点就找到了
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c689d9c307b7e971151f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;3.安装steam&lt;/h1&gt;
&lt;p&gt;打开steam安装包后，可能会弹出一个这样的窗口，点击&quot;是&quot;就可以&lt;br /&gt;
这个窗口有的人有有的人没有，看个人电脑设置&lt;br /&gt;
这里放心点&quot;是&quot;就完了&lt;br /&gt;
（就好像某些网站提示你不安全，你不还是照样点&quot;继续访问&quot;了吗）
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c786d9c307b7e9724893.png&quot; alt=&quot;&quot; /&gt;
在这里点击&quot;下一步&quot;
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c800d9c307b7e972d777.png&quot; alt=&quot;&quot; /&gt;
在这里选择你喜欢的语言，然后点击下一步即可
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c836d9c307b7e9731491.png&quot; alt=&quot;&quot; /&gt;
在这里点击安装即可，如果你是小白，就乖乖下一步就好
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c88ad9c307b7e973a05a.png&quot; alt=&quot;&quot; /&gt;
安装完成，安装速度还是很快的
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c9dfd9c307b7e9752a26.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;4.运行steam&lt;/h1&gt;
&lt;p&gt;打开steam后，等待steam更新完成
&lt;img src=&quot;https://pic.imgdb.cn/item/6698ca00d9c307b7e9754b5c.png&quot; alt=&quot;&quot; /&gt;
更新完成后，就来到了登录界面&lt;br /&gt;
如果你有steam账号的话，输入账号密码点击登录即可
&lt;img src=&quot;https://pic.imgdb.cn/item/6698cabbd9c307b7e9761950.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;5.注册steam账号&lt;/h1&gt;
&lt;p&gt;如果你没有steam账号的话，就再次打开steam官网，请认准官方域名&lt;code&gt;https://store.steampowered.com&lt;/code&gt;&lt;br /&gt;
然后往下滑，也就是滑两三下的事
&lt;img src=&quot;https://pic.imgdb.cn/item/6698cbe0d9c307b7e9791a52.png&quot; alt=&quot;&quot; /&gt;
然后找到&lt;code&gt;注册&lt;/code&gt;，点它
&lt;img src=&quot;https://pic.imgdb.cn/item/6698cc05d9c307b7e9794299.png&quot; alt=&quot;&quot; /&gt;
然后输入2遍你的电子邮箱地址，勾选&quot;我已年满13岁&quot;，然后再次点击&lt;code&gt;人机身份验证&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不知道电子邮箱地址？&lt;/strong&gt;&lt;br /&gt;
可以使用&lt;code&gt;QQ邮箱&lt;/code&gt;进行注册：QQ号+qq.com就是你的QQ邮箱地址了&lt;br /&gt;
比如说你的QQ号是&lt;code&gt;111222333&lt;/code&gt;，那你的QQ邮箱地址就是&lt;code&gt;111222333@qq.com&lt;/code&gt;&lt;br /&gt;
当然也可以使用其他邮箱注册，例如网易163、网易126、微软outlook或微软hotmail等等
&lt;img src=&quot;https://pic.imgdb.cn/item/6698cc91d9c307b7e979f74d.png&quot; alt=&quot;&quot; /&gt;
然后完成验证码
&lt;img src=&quot;https://pic.imgdb.cn/item/6698cef9d9c307b7e97cc777.png&quot; alt=&quot;&quot; /&gt;
通过人机身份验证后，点击下方的&quot;继续&quot;
&lt;img src=&quot;https://pic.imgdb.cn/item/6698cf80d9c307b7e97d6245.png&quot; alt=&quot;&quot; /&gt;
steam这时候就已经将验证邮件发送到了你刚刚输入的邮箱中
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d16bd9c307b7e97f89f9.png&quot; alt=&quot;&quot; /&gt;
然后打开你的邮箱，点击&lt;code&gt;验证我的电子邮件地址&lt;/code&gt;&lt;br /&gt;
如果你使用的是QQ邮箱，那就打开你的QQ&lt;br /&gt;
&lt;strong&gt;没有找到steam的验证邮件？&lt;/strong&gt;&lt;br /&gt;
1.检查电子邮件地址是否输入正确&lt;br /&gt;
2.在&quot;垃圾邮件&quot;中找找有没有&lt;br /&gt;
3.重新再来一遍&lt;br /&gt;
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d198d9c307b7e97fb95b.png&quot; alt=&quot;&quot; /&gt;
然后就会跳转到另一个网页，显示&quot;电子邮件已验证&quot;即可返回到刚刚的网页
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d1c4d9c307b7e97fef36.png&quot; alt=&quot;&quot; /&gt;
然后输入你想要的账户名称，steam需要检测你输入的账户名称是否可用&lt;br /&gt;
然后再输入2遍密码，需要符合steam密码要求，最后点击&quot;完成&quot;即可
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d2dad9c307b7e9813f63.png&quot; alt=&quot;&quot; /&gt;
等待steam创建完成
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d34bd9c307b7e981c462.png&quot; alt=&quot;&quot; /&gt;
然后在右上角就会显示你刚刚输入的账户名
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d363d9c307b7e981dfe3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;6.登录steam账号&lt;/h1&gt;
&lt;p&gt;输入你的账户名称和密码，然后点击&quot;登录&quot;
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d56bd9c307b7e9846181.png&quot; alt=&quot;&quot; /&gt;
耐心等待一会儿，像这样就是登录成功了
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d58ed9c307b7e9849515.png&quot; alt=&quot;&quot; /&gt;
尽情体验steam游戏吧
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d5acd9c307b7e984c3a9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;7.常见问题&lt;/h1&gt;
&lt;h2&gt;7.1 为什么打开steam后报致命错误&lt;/h2&gt;
&lt;p&gt;你的报错是不是这样？如果是的话，那就是你把steam安装在了一个含有中文名的文件夹内
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d603d9c307b7e9854de8.png&quot; alt=&quot;&quot; /&gt;
需要注意的是，安装路径不能含有中文，就比如这样
&lt;img src=&quot;https://pic.imgdb.cn/item/6698c90dd9c307b7e9743123.png&quot; alt=&quot;&quot; /&gt;
&lt;strong&gt;解决办法&lt;/strong&gt;：
卸载steam后重新安装，需要注意的是，电脑卸载软件并不是像手机一样长按图标点击卸载，而是需要使用控制面板卸载或者使用设置进行卸载&lt;br /&gt;
当然你把steam图标拖进回收站也是卸载不了的，你删除的仅仅是steam的桌面图标而已
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d8d4d9c307b7e988e2e1.png&quot; alt=&quot;&quot; /&gt;
首先打开控制面板
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d6ebd9c307b7e9868e60.png&quot; alt=&quot;&quot; /&gt;
点击&quot;卸载程序&quot;
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d703d9c307b7e986acbe.png&quot; alt=&quot;&quot; /&gt;
找到steam并右键，点击&quot;卸载&quot;即可&lt;br /&gt;
然后就跟着卸载向导走就可以卸载
&lt;img src=&quot;https://pic.imgdb.cn/item/6698d720d9c307b7e986cb45.png&quot; alt=&quot;&quot; /&gt;
卸载完成以后重新安装steam到一个没有中文的文件夹即可，小白就乖乖一直点击下一步&lt;/p&gt;
&lt;h2&gt;7.2 我在注册时一直过不去验证码&lt;/h2&gt;
&lt;p&gt;如果你点击的图片都是符合验证码的要求的话，那可能就是你的网络延迟太大
&lt;strong&gt;解决办法&lt;/strong&gt;：
1.过一段时间重试&lt;br /&gt;
2.刷新网页重新来&lt;br /&gt;
3.使用某些特殊方法注册&lt;br /&gt;
4.去某宝或者某多买一个现成的账号&lt;/p&gt;
&lt;h2&gt;7.3 steam可以扫码登录吗&lt;/h2&gt;
&lt;p&gt;现在的steam已经支持扫码登录了，无需输入账号密码，但仅限使用steam手机端进行扫码，不支持wx、qq等等扫码登录&lt;br /&gt;
如果你下载的所谓的&quot;steam&quot;支持wx、qq扫码登录，那恭喜你，你下载的是盗版的&lt;/p&gt;
&lt;h2&gt;7.4 steam怎么开会员&lt;/h2&gt;
&lt;p&gt;steam并没有会员或者VIP这类概念，里面的游戏都是买断制的，当然还有一些免费游戏是可以直接添加到你的库中进行游玩的。&lt;br /&gt;
当你买了某一款游戏后，你可以在你的库中下载游玩&lt;br /&gt;
如果你的所谓的&quot;steam&quot;可以开通会员或者VIP这类的，那就赶紧卸载跑路吧，你下载的是盗版的&lt;br /&gt;
这类盗版steam买的游戏都是共享账号，也就是你和别人共用这1个账号，有可能你正在激情对枪，别人就顶你的号了。当然你的存档别人也可以修改的，这类盗版steam害了许多刚入坑的小白。&lt;/p&gt;
</content:encoded></item><item><title>青岛之旅</title><link>https://blog.ninebytes.cc.cd/posts/life1-%E9%9D%92%E5%B2%9B%E4%B9%8B%E6%97%85/</link><guid isPermaLink="true">https://blog.ninebytes.cc.cd/posts/life1-%E9%9D%92%E5%B2%9B%E4%B9%8B%E6%97%85/</guid><description>山东 · 青岛</description><pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/aefaa220b11a042c3e96d99f3f6b11a8.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/1528a98b5280c05e5448179d273df8ad.jpg&quot; alt=&quot;2&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/8fc8d170bae063252b5e329f0625f8ba.jpg&quot; alt=&quot;3&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/330d55e1ff62cf539e52bb899d9b719a.jpg&quot; alt=&quot;4&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/a6bca5f8970d29656724223d8e388644.jpg&quot; alt=&quot;5&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/1a9bf7ab5994a7c85b1121de8653dbdd.jpg&quot; alt=&quot;6&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/a2e05389f9a97bdba0ebb23aa658dfc3.jpg&quot; alt=&quot;7&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/92e67e9ba890796e9619cf04a9892de4.jpg&quot; alt=&quot;8&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/c0450be9710cdc67ebb22a5a999b0fe3.jpg&quot; alt=&quot;9&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/b272e9613187e7e0442bfb53bc17711c.jpg&quot; alt=&quot;10&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/d19614c96301e757ac4cdea8392b95ec.jpg&quot; alt=&quot;11&quot; /&gt;
&lt;img src=&quot;https://s1.imagehub.cc/images/2025/04/26/3c276020ff6fcb5b65f0730e9ee54f34.jpg&quot; alt=&quot;12&quot; /&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>