<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>折腾手记</title><link>https://t.qnt0.com/</link><description>关于 Linux、服务器、工具与 AI 的个人技术笔记。把问题弄明白，把方法留下来。</description><language>zh-CN</language><generator>Hugo</generator><atom:link href="https://t.qnt0.com/index.xml" rel="self" type="application/rss+xml"/><item><title>给 AI 工具留一份可复查的工作记录</title><link>https://t.qnt0.com/notes/ai-work-notes/</link><guid isPermaLink="true">https://t.qnt0.com/notes/ai-work-notes/</guid><pubDate>Thu, 29 Oct 2026 08:00:00 +0800</pubDate><description>用目标、输入、改动和验证四类记录，把 AI 辅助工作整理成可复查的过程。</description><content:encoded><![CDATA[<h2 id="记录要能回答为什么能用">记录要能回答“为什么能用”</h2>
<p>这是一套可自行调整的参考方法，用于写作、代码修改和资料整理，并非某个产品的固定流程。聊天记录可能很长，却不容易说明最后采用了什么结果。单独留一份简短工作记录，可以让下一次接手时迅速找到目标、依据和仍未解决的问题。</p>
<p>开始前先写完成标准。例如“修正移动端导航，三个入口均能打开，窄屏没有横向滚动”，比“帮我优化网站”更容易验收。再列出允许修改的范围和必须保留的内容，防止任务在对话中逐渐扩大。</p>
<h2 id="用一张短模板收拢信息">用一张短模板收拢信息</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">日期与任务：
</span></span><span class="line"><span class="cl">目标与完成标准：
</span></span><span class="line"><span class="cl">输入材料及其来源：
</span></span><span class="line"><span class="cl">工具与可见版本信息：
</span></span><span class="line"><span class="cl">采纳的结果与文件位置：
</span></span><span class="line"><span class="cl">人工核对与实际测试：
</span></span><span class="line"><span class="cl">未确认事项与下一步：
</span></span></code></pre></div><p>输入材料记录到能重新找到即可：文件路径、文档标题、链接和访问日期通常比整段复制更实用。工具名称与版本只填界面确实显示的信息，不清楚就写“未显示”。需要复现的任务，再补充关键指令和影响结果的设置，避免把记忆里的配置当成事实。</p>
<h2 id="把回答和证据分别写清">把回答和证据分别写清</h2>
<p>AI 给出的解释可以先记为“建议”或“待核对”。采纳前打开原始资料，确认链接确实支持这句话，并检查适用版本、前提条件和例外。数值、日期、命令参数尤其适合逐项核验。来源无法找到时，就保留不确定状态，或删去这条结论。</p>
<p>代码任务还应查看实际文件变化。在已使用 Git 的项目里，可以用下面几条只读检查作为记录依据：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git status --short
</span></span><span class="line"><span class="cl">git diff
</span></span><span class="line"><span class="cl">git diff --cached
</span></span></code></pre></div><p><code>status</code> 可帮助识别已修改、已暂存和未跟踪文件，短格式的两列需要结合文档理解，见 <a href="https://git-scm.com/docs/git-status">Git 状态命令说明</a>。普通 <code>diff</code> 查看尚未暂存的变化，<code>--cached</code> 查看已暂存的变化，详见 <a href="https://git-scm.com/docs/git-diff">Git 差异命令说明</a>。新建的未跟踪文件还要打开检查，不能只读差异输出就认为已经覆盖全部改动。</p>
<h2 id="验证结果要写具体">验证结果要写具体</h2>
<p>“看起来正常”很难复查。更有用的写法是“已在窄屏打开首页，三个导航链接均能跳转；尚未测试触屏设备”。写下执行过的检查、观察到的结果和没覆盖的范围，让结论与证据相称。失败也值得保留一句原因，方便下次避开相同前提。</p>
<p>结束时把最终文件、验证结果和剩余事项放在一起。记录中不保存密码、访问令牌、私钥或客户原始数据；引用报错时先做必要脱敏。以后复用旧记录，应重新检查依赖和来源是否仍然适用，别把一次成功当成永久保证。</p>
]]></content:encoded><category>工具与AI</category></item><item><title>SSH 密钥入门：分清身份与主机</title><link>https://t.qnt0.com/notes/ssh-key-basics/</link><guid isPermaLink="true">https://t.qnt0.com/notes/ssh-key-basics/</guid><pubDate>Thu, 29 Oct 2026 07:40:00 +0800</pubDate><description>区分公钥、私钥与主机指纹，并按可核对的步骤理解 SSH 密钥登录。</description><content:encoded><![CDATA[<h2 id="先分清两次身份确认">先分清两次身份确认</h2>
<p>这是一份 SSH 概念参考笔记，不包含任何密钥材料。连接服务器时，有两个不同的问题：客户端要确认“连到的是哪台主机”，服务端要确认“谁在登录这个账号”。前者通常依靠主机密钥与指纹核对，后者可以使用账号的公钥认证。</p>
<p>公钥认证中，私钥留在自己的设备，服务端保存允许登录的公钥。客户端证明自己能够使用对应私钥，服务端再检查该公钥是否被目标账号授权。不能把私钥当作登录资料上传到服务器或粘贴到聊天中。认证流程可查 <a href="https://man.openbsd.org/ssh">OpenSSH 客户端手册</a>。</p>
<h2 id="文件名不是密钥本身">文件名不是密钥本身</h2>
<p>常见的 <code>id_ed25519</code> 是私钥文件名，带 <code>.pub</code> 后缀的同名文件通常是对应公钥；文件名可以自定义。<code>authorized_keys</code> 通常位于服务端目标账号的 <code>.ssh</code> 目录，按行记录获准登录的公钥；<code>known_hosts</code> 通常位于客户端，用于记录认识的主机密钥。两者用途不同，也不应互相替换。</p>
<p>下面只是检查文件权限和公钥指纹的示例，不会生成密钥，也不会连接服务器。先确认自己实际使用的文件名：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ls -ld ~/.ssh
</span></span><span class="line"><span class="cl">ls -l ~/.ssh/id_ed25519.pub
</span></span><span class="line"><span class="cl">ssh-keygen -l -f ~/.ssh/id_ed25519.pub
</span></span></code></pre></div><p><code>ssh-keygen -l -f</code> 展示指定密钥文件的指纹，便于核对身份；指纹不是私钥，也不能用来替代密钥登录。创建密钥时的口令用于保护本地私钥，和服务器账号密码是两回事。口令遗失不能从文件中恢复，相关选项见 <a href="https://man.openbsd.org/ssh-keygen">ssh-keygen 官方手册</a>。</p>
<h2 id="为每把密钥留一条管理记录">为每把密钥留一条管理记录</h2>
<p>可以记录用途、设备、创建日期、公钥指纹和获准登录的账号，避免过几个月后分不清某一条授权属于哪台设备。公钥注释只是便于识别的文字，不是权限控制。私钥备份要使用受保护的存储，换设备后也要检查旧设备是否仍需要授权。</p>
<p>在 Linux 等类 Unix 系统中，常见做法是让 <code>.ssh</code> 仅本人可访问，私钥仅本人可读写；服务端的 <code>authorized_keys</code> 也应防止其他用户写入。服务端还可能检查家目录权限，具体行为与配置有关，参考 <a href="https://man.openbsd.org/sshd">sshd 文件与权限说明</a>。不要照搬这些权限命令到不同平台的权限体系中。</p>
<h2 id="登录失败时按层检查">登录失败时按层检查</h2>
<p>先确认目标账号，再看客户端选用的密钥、对应公钥是否位于该账号的授权文件，以及文件所有者和权限。不要为了排查而直接关闭权限检查。</p>
<p>首次连接应通过可信渠道核对主机指纹；收到主机密钥变化警告时，先确认是否重装或更换主机，不能只删除旧记录继续连接。修改登录配置前保留可用会话，并用新会话确认成功后再结束旧会话，避免把自己锁在外面。</p>
]]></content:encoded><category>Linux与服务器</category></item><item><title>Nginx 站点检查：从配置到页面响应</title><link>https://t.qnt0.com/notes/nginx-site-checks/</link><guid isPermaLink="true">https://t.qnt0.com/notes/nginx-site-checks/</guid><pubDate>Thu, 29 Oct 2026 07:20:00 +0800</pubDate><description>整理配置检查、重载和 HTTP 响应核对的顺序，让站点排查有据可循。</description><content:encoded><![CDATA[<h2 id="先给问题留下一份记录">先给问题留下一份记录</h2>
<p>这是一份站点维护参考笔记，假设 Nginx 已经安装。开始前记下访问地址、发生时间、完整错误提示，以及最近修改过的配置。区分“连不上”“返回错误状态”和“页面内容不对”，后续检查才有方向。下面的 <code>example.com</code> 是占位域名，使用时换成自己管理的域名。</p>
<h2 id="第一步确认版本与配置">第一步：确认版本与配置</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nginx -v
</span></span><span class="line"><span class="cl">sudo nginx -t
</span></span></code></pre></div><p><code>-t</code> 会检查配置语法，并尝试打开配置中引用的文件；报错里的文件名和行号通常是首要线索。若使用了非默认配置，检查和运行时应使用相同的 <code>-c</code> 路径、前缀及相关参数。<code>nginx -T</code> 还会把配置打印出来，可能包含内部地址或敏感字段，分享输出前要自行检查。这些参数以 <a href="https://nginx.org/en/docs/switches.html">Nginx 命令行文档</a> 为准。</p>
<p>先看 <code>server</code> 块是否监听了预期端口，<code>server_name</code> 是否匹配访问域名，再看静态目录的 <code>root</code> 与入口文件。配置检查通过，只说明这一层通过了检查，不能证明域名解析、证书和页面内容都正确。</p>
<h2 id="第二步通过检查后再重载">第二步：通过检查后再重载</h2>
<p>配置有备份、检查成功后，才执行重载。由系统服务管理器启动的实例，可按本机服务管理方式操作；下面是 Nginx 自带的信号方式：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo nginx -s reload
</span></span></code></pre></div><p>重载时主进程会检查并尝试应用新配置，成功后启动新工作进程，让旧进程完成已有请求；无法应用时会继续使用旧配置。操作需要相应权限，并应针对实际运行的实例。流程见 <a href="https://nginx.org/en/docs/beginners_guide.html">Nginx 入门指南</a>。重载后仍要访问页面确认，不能把命令没有输出当作验证完成。</p>
<h2 id="第三步看响应也看内容">第三步：看响应，也看内容</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -I https://example.com/
</span></span><span class="line"><span class="cl">curl -sS -o /dev/null -w <span class="s1">&#39;%{http_code}\n&#39;</span> https://example.com/
</span></span></code></pre></div><p>第一条发送 HEAD 请求，适合查看状态码、内容类型和重定向位置；第二条发起普通 GET 并只输出状态码。<code>-sS</code> 隐藏进度但保留错误提示，参数含义可查 <a href="https://curl.se/docs/manpage.html">curl 官方手册</a>。有些应用对 HEAD 和 GET 的处理不同，所以检查头部后还要在浏览器打开首页、文章与静态资源。</p>
<h2 id="按现象缩小范围">按现象缩小范围</h2>
<p>出现重定向时先核对目标地址与协议；出现 <code>404</code> 时核对请求路径、文件名大小写和发布目录；出现 <code>403</code> 时检查入口文件、目录及读取权限。连接超时则继续检查解析、监听和网络路径，不要只反复改网页文件。</p>
<p>最后查看实际配置指定的访问日志与错误日志，把时间和请求路径对应起来。每次只改一个可验证的问题，保留修改前后结果；日志对外分享前删去访客信息、令牌和内部路径等敏感内容。</p>
]]></content:encoded><category>Linux与服务器</category></item><item><title>Ubuntu 文件权限：先看清，再动手</title><link>https://t.qnt0.com/notes/ubuntu-files-permissions/</link><guid isPermaLink="true">https://t.qnt0.com/notes/ubuntu-files-permissions/</guid><pubDate>Thu, 29 Oct 2026 07:00:00 +0800</pubDate><description>从路径、用户和 rwx 入手，整理修改 Ubuntu 文件权限前的核对步骤。</description><content:encoded><![CDATA[<h2 id="先确认自己在操作什么">先确认自己在操作什么</h2>
<p>这是一份入门参考笔记，适合遇到 <code>Permission denied</code> 时按顺序检查。权限错误不一定需要 <code>sudo</code>；路径写错、文件属于别的用户、父目录无法进入，都值得先排查。以下示例用于自己的练习目录，请先理解命令，再替换路径。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">pwd</span>
</span></span><span class="line"><span class="cl">id
</span></span><span class="line"><span class="cl">ls -ld .
</span></span><span class="line"><span class="cl">ls -l notes.txt
</span></span></code></pre></div><p><code>pwd</code> 显示当前目录，<code>id</code> 查看当前用户及组，<code>ls -l</code> 展示文件权限与所有者。查看目录本身用 <code>ls -ld</code>，否则通常看到的是目录里的内容。这些基础命令可对照 <a href="https://ubuntu.com/server/docs/tutorial/welcome-to-the-terminal/">Ubuntu 终端入门文档</a> 阅读。文件名含空格时要加引号；操作前用绝对路径或再次执行 <code>pwd</code>，能减少认错目录的机会。</p>
<h2 id="读懂三组-rwx">读懂三组 rwx</h2>
<p>例如 <code>-rw-r-----</code>，首位 <code>-</code> 表示普通文件，之后依次是所有者、所属组、其他人的权限。<code>r</code> 是读取，<code>w</code> 是写入，<code>x</code> 对普通文件表示执行。目录的含义有所不同：<code>r</code> 用于列出目录项，<code>x</code> 用于搜索、穿过目录访问路径，<code>w</code> 与目录项的新增、删除有关。目录写权限配合搜索权限，可能允许删除其中没有写权限的文件，别把文件只读当成删除保护。详见 <a href="https://www.gnu.org/s/coreutils/manual/html_node/Mode-Structure.html">GNU 权限结构说明</a>。</p>
<p>数值写法把读、写、执行记为 <code>4</code>、<code>2</code>、<code>1</code>：<code>640</code> 是所有者读写、组只读、其他人无权限；<code>755</code> 是所有者可读写执行，其他人可读和执行。它们是常见例子，并非所有文件都应套用的标准。</p>
<h2 id="只改需要改变的部分">只改需要改变的部分</h2>
<p>在已确认属于自己的练习文件上，可以比较两种写法：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">chmod u+x script.sh
</span></span><span class="line"><span class="cl">chmod <span class="m">640</span> notes.txt
</span></span><span class="line"><span class="cl">ls -l script.sh notes.txt
</span></span></code></pre></div><p>第一条只给所有者增加执行位；第二条明确设置三组普通权限。修改模式用 <code>chmod</code>，修改所有者属于 <code>chown</code> 的职责。符号模式的 <code>u</code>、<code>g</code>、<code>o</code> 对应三类用户，<code>+</code>、<code>-</code>、<code>=</code> 分别表示增加、移除、设置，参考 <a href="https://www.gnu.org/software/coreutils/manual/html_node/Setting-Permissions.html">GNU 设置权限说明</a>。</p>
<h2 id="遇到拒绝访问时的检查顺序">遇到拒绝访问时的检查顺序</h2>
<p>先确认命令针对哪个文件，再看当前用户和所属组，接着检查目标与各级父目录，最后判断需要的是读、写还是执行权限。网页或服务进程还要按它实际运行的用户检查，不能只以登录用户能否读取为准。</p>
<p>不要用 <code>chmod -R 777</code> 当作通用修复：它会扩大整棵目录的访问范围，也会给普通文件增加执行位。若基本权限看起来正确，仍可能涉及 ACL、只读挂载或安全策略；应保留报错、路径和检查结果，继续定位原因。</p>
]]></content:encoded><category>Linux与服务器</category></item></channel></rss>