<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Macos on OHTLY Blog</title>
    <link>https://blog.ohtly.com/tags/macos/</link>
    <description>Recent content in Macos on OHTLY Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 24 Jul 2026 00:14:46 +0800</lastBuildDate>
    <atom:link href="https://blog.ohtly.com/tags/macos/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>macOS 终端 SSH 免密码：agent 配置实录</title>
      <link>https://blog.ohtly.com/posts/2026-07-24-macos-ssh-agent-nopass/</link>
      <pubDate>Fri, 24 Jul 2026 00:11:41 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-24-macos-ssh-agent-nopass/</guid>
      <description>&lt;h2 id=&#34;现象&#34;&gt;&#xA;  现象&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%8e%b0%e8%b1%a1&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;打开新的终端窗口，执行 &lt;code&gt;ssh &amp;lt;内网服务器&amp;gt;&lt;/code&gt; 时反复提示：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Enter passphrase for key &amp;#39;~/.ssh/id_rsa&amp;#39;:&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;明明之前在钥匙串中保存了密码，不该每次都输。&lt;/p&gt;&#xA;&lt;h2 id=&#34;排查&#34;&gt;&#xA;  排查&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%8e%92%e6%9f%a5&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;ssh_auth_sock-指向僵尸-socket&#34;&gt;&#xA;  SSH_AUTH_SOCK 指向僵尸 socket&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#ssh_auth_sock-%e6%8c%87%e5%90%91%e5%83%b5%e5%b0%b8-socket&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh-add -l&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Error connecting to agent: Connection refused&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ echo $SSH_AUTH_SOCK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/var/folders/.../agent.45029   ← 指向一个已经死掉的 agent 进程&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt; 环境变量保存着一个已经不存在的 agent 进程的 socket 路径。&lt;/p&gt;&#xA;&lt;h3 id=&#34;多个-ssh-agent-进程同时运行&#34;&gt;&#xA;  多个 ssh-agent 进程同时运行&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%a4%9a%e4%b8%aa-ssh-agent-%e8%bf%9b%e7%a8%8b%e5%90%8c%e6%97%b6%e8%bf%90%e8%a1%8c&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ps aux | grep ssh-agent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;marshal  &lt;span style=&#34;color:#ae81ff&#34;&gt;45030&lt;/span&gt;  ...  ssh-agent -s&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;marshal  &lt;span style=&#34;color:#ae81ff&#34;&gt;45031&lt;/span&gt;  ...  ssh-agent -s&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;marshal  &lt;span style=&#34;color:#ae81ff&#34;&gt;45312&lt;/span&gt;  ...  /usr/bin/ssh-agent -l&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个用户账号下同时跑了 3 个 ssh-agent，不正常。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Electron 项目 macOS 构建配置</title>
      <link>https://blog.ohtly.com/posts/2026-07-13-electron-macos-build/</link>
      <pubDate>Mon, 13 Jul 2026 10:46:12 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-13-electron-macos-build/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Electron 是用 Web 技术构建跨平台桌面应用的主流方案。本文记录从零搭建 Electron 项目并通过 electron-builder 构建 macOS 安装包的过程。无需 Apple Developer 账号，构建出的 &lt;code&gt;.dmg&lt;/code&gt; 可在本机安装运行。&lt;/p&gt;&#xA;&lt;h2 id=&#34;项目结构&#34;&gt;&#xA;  项目结构&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%a1%b9%e7%9b%ae%e7%bb%93%e6%9e%84&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;electron-proto/&#xA;├── package.json&#xA;├── src/&#xA;│   ├── main.js          # 主进程&#xA;│   └── index.html       # 渲染页面&#xA;└── release/             # 构建产物&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;配置&#34;&gt;&#xA;  配置&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%85%8d%e7%bd%ae&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;packagejson&#34;&gt;&#xA;  package.json&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#packagejson&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;electron-proto&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0.0&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;src/main.js&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;electron .&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;build:mac&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;electron-builder --mac&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;devDependencies&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;electron&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^33.0.0&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;electron-builder&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;^25.1.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;build&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;appId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;com.electron.proto&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;productName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ElectronProto&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;directories&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;output&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;release&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;mac&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;category&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;public.app-category.utilities&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;target&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dmg&amp;#34;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;identity&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;identity: null&lt;/code&gt; 是关键——告诉 electron-builder 跳过代码签名，否则没有开发者证书时会构建失败。&lt;/p&gt;</description>
    </item>
    <item>
      <title>macOS 下 Markdown 数学公式正确转 PDF</title>
      <link>https://blog.ohtly.com/posts/2026-07-08-markdown-math-to-pdf/</link>
      <pubDate>Wed, 08 Jul 2026 18:48:00 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-07-08-markdown-math-to-pdf/</guid>
      <description>&lt;h2 id=&#34;问题&#34;&gt;&#xA;  问题&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%97%ae%e9%a2%98&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Markdown 里用 &lt;code&gt;$$&lt;/code&gt; 写好的 LaTeX 数学公式：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-latex&#34; data-lang=&#34;latex&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;$$&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\nabla \cdot \mathbf{E} &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; \frac{\rho}{\varepsilon_&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;$$&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;期望渲染效果：&lt;/p&gt;&#xA;&lt;p&gt;$$&#xA;\nabla \cdot \mathbf{E} = \frac{\rho}{\varepsilon_0}&#xA;$$&lt;/p&gt;&#xA;&lt;p&gt;但转 PDF 时，要么公式显示为原始代码，要么中文字体缺失乱码。本文记录 macOS 下的可行方案。&lt;/p&gt;&#xA;&lt;h2 id=&#34;方案一pandoc--xelatex不推荐&#34;&gt;&#xA;  方案一：Pandoc + XeLaTeX（不推荐）&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%96%b9%e6%a1%88%e4%b8%80pandoc--xelatex%e4%b8%8d%e6%8e%a8%e8%8d%90&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install basictex&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pandoc file.md -o file.pdf --pdf-engine&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;xelatex -V mainfont&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;PingFang SC&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;公式渲染效果没问题，但输出风格偏 TeX 传统——标题字体、表格样式、公式间距都与现代文档有明显差异，不够美观。&lt;/p&gt;&#xA;&lt;h2 id=&#34;推荐方案pandoc--mathjax--puppeteer&#34;&gt;&#xA;  推荐方案：Pandoc + MathJax + Puppeteer&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%8e%a8%e8%8d%90%e6%96%b9%e6%a1%88pandoc--mathjax--puppeteer&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;核心思路：用 Pandoc 生成带 MathJax CDN 的 HTML，再用 Puppeteer（Headless Chrome）渲染出 PDF。输出样式完全由 CSS 控制。&lt;/p&gt;</description>
    </item>
    <item>
      <title>NetBird 子网路由与 Access Policy 配置</title>
      <link>https://blog.ohtly.com/posts/2026-06-23-netbird-route-policy/</link>
      <pubDate>Tue, 23 Jun 2026 18:25:39 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-06-23-netbird-route-policy/</guid>
      <description>&lt;h2 id=&#34;场景&#34;&gt;&#xA;  场景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%9c%ba%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;办公室有大量 VM（host-a、host-b、host-c 等），它们无法或不适合安装 NetBird agent。家里的笔记本需要能直接通过这些机器的 LAN IP 访问（RustDesk、SSH 等），而不能逐个安装 agent。&lt;/p&gt;&#xA;&lt;h2 id=&#34;方案路由-peer&#34;&gt;&#xA;  方案：路由 peer&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e6%96%b9%e6%a1%88%e8%b7%af%e7%94%b1-peer&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;NetBird 的 &lt;strong&gt;Network Route&lt;/strong&gt; 功能允许将整个子网通过一个路由 peer 暴露给 VPN 网络。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;家里笔记本 ── NetBird 隧道 ── gateway(路由 peer) ── 办公室 LAN 192.168.0.0/24&#xA;                                                    ├── host-a      (192.168.0.*)&#xA;                                                    ├── host-c      (192.168.0.*)&#xA;                                                    └── 其他无 agent 节点&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;路由 peer（gateway）对流量做 &lt;strong&gt;Masquerade（NAT）&lt;/strong&gt;，将来自 NetBird 的包源 IP 替换为自己的 LAN IP，这样目标机器的回包就能正确路由回来。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前置条件&#34;&gt;&#xA;  前置条件&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%89%8d%e7%bd%ae%e6%9d%a1%e4%bb%b6&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;路由 peer 需要开启 IP 转发：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;net.ipv4.ip_forward=1&amp;#34;&lt;/span&gt; | sudo tee /etc/sysctl.d/99-netbird-forward.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo sysctl -p /etc/sysctl.d/99-netbird-forward.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;第一步创建-network-route&#34;&gt;&#xA;  第一步：创建 Network Route&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e7%ac%ac%e4%b8%80%e6%ad%a5%e5%88%9b%e5%bb%ba-network-route&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;source .env&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X POST &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://your-management/api/routes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  -H &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Authorization: Token &lt;/span&gt;$NETBIRD_PAT&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  -H &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;description&amp;#34;: &amp;#34;Office LAN&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;network_id&amp;#34;: &amp;#34;office-lan&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;enabled&amp;#34;: true,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;peer&amp;#34;: &amp;#34;&amp;lt;gateway_peer_id&amp;gt;&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;network&amp;#34;: &amp;#34;192.168.0.0/24&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;metric&amp;#34;: 100,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;masquerade&amp;#34;: true,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;#34;groups&amp;#34;: [&amp;#34;&amp;lt;all_group_id&amp;gt;&amp;#34;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  }&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关键参数：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Obsidian vault 放 iCloud 目录影响 AI 操作笔记</title>
      <link>https://blog.ohtly.com/posts/2026-06-18-obsidian-vault-icloud-issue/</link>
      <pubDate>Thu, 18 Jun 2026 11:39:37 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-06-18-obsidian-vault-icloud-issue/</guid>
      <description>&lt;h2 id=&#34;问题&#34;&gt;&#xA;  问题&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e9%97%ae%e9%a2%98&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Obsidian vault 放在 &lt;code&gt;~/Documents/&lt;/code&gt; 目录下。AI 助手（OpenClaw）通过 shell/Obsidian CLI 操作笔记时，&lt;code&gt;cp&lt;/code&gt;、&lt;code&gt;mv&lt;/code&gt;、&lt;code&gt;rm&lt;/code&gt; 随机报 &lt;code&gt;Operation not permitted&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;具体症状：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;0 字节的「幽灵文件」创建后删不掉、读不了&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;xattr&lt;/code&gt;、&lt;code&gt;lsof&lt;/code&gt; 都拒绝访问&lt;/li&gt;&#xA;&lt;li&gt;但 Obsidian 应用本身读写正常&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;原因&#34;&gt;&#xA;  原因&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%8e%9f%e5%9b%a0&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;~/Documents/&lt;/code&gt; 是 macOS iCloud Drive 的默认托管目录。即使没有登录 iCloud 账号，该目录下的文件也受系统级隐匿保护（stub file、ACL 锁）。这种保护只拦截非 GUI 的文件操作——shell 脚本、AI 工具写文件都会中招，但 Obsidian 应用不受影响。&lt;/p&gt;&#xA;&lt;p&gt;vault 挪到 &lt;code&gt;~/workspace/&lt;/code&gt; 后所有问题消失。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决&#34;&gt;&#xA;  解决&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%a7%a3%e5%86%b3&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 关 Obsidian&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 完整复制 vault&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -a ~/Documents/jax-notes ~/workspace/jax-notes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Obsidian 重新打开新位置，确认 LiveSync 同步正常&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 删旧的&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf ~/Documents/jax-notes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;LiveSync（CouchDB 同步）配置在 &lt;code&gt;.obsidian/plugins/&lt;/code&gt; 目录，随 vault 一起搬走，不受影响。&lt;/p&gt;</description>
    </item>
    <item>
      <title>macOS 下用函数快速启动 VS Code SSH Remote</title>
      <link>https://blog.ohtly.com/posts/2026-06-14-rcode/</link>
      <pubDate>Sun, 14 Jun 2026 19:59:37 +0800</pubDate>
      <guid>https://blog.ohtly.com/posts/2026-06-14-rcode/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;&#xA;  背景&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;日常开发免不了频繁通过 VS Code 的 Remote SSH 连接远程服务器。每次都要敲：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;code --remote ssh-remote+some-host /home/user/project&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;路径要记、主机名要打、目录要拼，烦。&lt;/p&gt;&#xA;&lt;p&gt;能不能 &lt;code&gt;rcode my-server&lt;/code&gt; 就完事？&lt;/p&gt;&#xA;&lt;h2 id=&#34;其他方案对比&#34;&gt;&#xA;  其他方案对比&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#%e5%85%b6%e4%bb%96%e6%96%b9%e6%a1%88%e5%af%b9%e6%af%94&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;链接到标题&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;链接到标题&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;先看看除了敲命令，还有哪些方式打开 Remote SSH：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;方案&lt;/th&gt;&#xA;          &lt;th&gt;操作步骤&lt;/th&gt;&#xA;          &lt;th&gt;评价&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;VS Code 命令面板&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;F1&lt;/code&gt; → &amp;ldquo;Remote-SSH: Connect to Host&amp;hellip;&amp;rdquo; → 选主机 → &lt;code&gt;File &amp;gt; Open Folder&lt;/code&gt; → 选目录&lt;/td&gt;&#xA;          &lt;td&gt;点选四五次，慢&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;本地终端 &lt;code&gt;code --remote&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;code --remote ssh-remote+some-host /home/user/project&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;可用，但路径要自己记&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;macOS &lt;code&gt;open&lt;/code&gt; 打开 URL&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;open vscode://vscode-remote/ssh-remote+some-host/home/user/project&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;可脚本化，但路径写死&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Markdown/HTML 中放 VS Code 链接&lt;/td&gt;&#xA;          &lt;td&gt;在文档里写 &lt;code&gt;vscode://vscode-remote/ssh-remote+some-host/home/user/project&lt;/code&gt;，浏览器点击触发&lt;/td&gt;&#xA;          &lt;td&gt;适合文档入口，但仍然路径写死&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;终端别名/函数&lt;/td&gt;&#xA;          &lt;td&gt;本文方案&lt;/td&gt;&#xA;          &lt;td&gt;一行搞定&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;这里容易踩一个坑：&lt;code&gt;code&lt;/code&gt; 是本地 macOS 上的 VS Code CLI，不是远程服务器上的命令。已经 SSH 登录到远程机器后再敲 &lt;code&gt;code .&lt;/code&gt;，通常只会得到 &lt;code&gt;command not found&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
