<?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>CLI 環境工具 on Tarragon</title><link>https://tarrragon.github.io/blog/linux/tools/cli/</link><description>Recent content in CLI 環境工具 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 02 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/linux/tools/cli/index.xml" rel="self" type="application/rss+xml"/><item><title>現代 CLI 替代工具：grep、find、cat 之外的選擇</title><link>https://tarrragon.github.io/blog/linux/tools/cli/modern-cli-replacements/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/modern-cli-replacements/</guid><description>&lt;p>Linux 的預設指令（&lt;code>grep&lt;/code>、&lt;code>find&lt;/code>、&lt;code>cat&lt;/code>、&lt;code>ls&lt;/code>）能用，但它們是幾十年前為當時的環境設計的。過去十年出現一批用現代語言（多為 Rust）重寫的替代品，在同樣的工作上更快、預設行為更貼近日常開發、輸出更好讀。認識這些替代品的價值不在「預設的錯了」，而在你能在對的情境用更省力的工具——尤其是每天重複幾十次的搜尋與瀏覽。&lt;/p>
&lt;p>這篇按「你原本用什麼」對照現代替代品，講清楚每個替代品解掉原工具的什麼痛點、什麼情境值得換、以及換了要注意的地方。核心的搜尋三件套（&lt;code>ripgrep&lt;/code> / &lt;code>fd&lt;/code> / &lt;code>fzf&lt;/code>）值得優先掌握，其餘按需採用。&lt;/p>
&lt;h2 id="搜尋文字內容grep--ripgreprg">搜尋文字內容：grep → ripgrep（rg）&lt;/h2>
&lt;p>&lt;code>ripgrep&lt;/code>（指令是 &lt;code>rg&lt;/code>）是 &lt;code>grep&lt;/code> 的現代替代品，最大差別在它預設就做了開發者幾乎每次都要的事：遞迴搜尋當前目錄、尊重 &lt;code>.gitignore&lt;/code>（不會翻進 &lt;code>node_modules&lt;/code>、&lt;code>.git&lt;/code>、build 產物）、自動跳過二進位檔、輸出帶顏色與行號。用 &lt;code>grep&lt;/code> 搜整個專案常要寫 &lt;code>grep -rn --exclude-dir=node_modules pattern .&lt;/code>，用 &lt;code>rg pattern&lt;/code> 一句就到位且更快（Rust 實作 + 平行搜尋）。&lt;/p>
&lt;p>什麼情境值得換：在專案目錄裡找程式碼、找字串出現在哪些檔案——這是 &lt;code>rg&lt;/code> 最省力的地方。什麼時候還是用 &lt;code>grep&lt;/code>：處理 pipe 進來的串流（&lt;code>command | grep x&lt;/code>）兩者差不多；寫要在任何機器都能跑的腳本時 &lt;code>grep&lt;/code> 是保證存在的（&lt;code>rg&lt;/code> 要另外裝）。注意點：&lt;code>rg&lt;/code> 預設跳過 &lt;code>.gitignore&lt;/code> 忽略的檔，要搜被忽略的檔案得加 &lt;code>-u&lt;/code>（或 &lt;code>-uu&lt;/code> 連隱藏檔一起）。&lt;/p>
&lt;h2 id="找檔案find--fd">找檔案：find → fd&lt;/h2>
&lt;p>&lt;code>fd&lt;/code> 是 &lt;code>find&lt;/code> 的現代替代品，把 &lt;code>find&lt;/code> 那套冗長語法換成直覺的用法。&lt;code>find . -name '*.md' -type f&lt;/code> 用 &lt;code>fd&lt;/code> 是 &lt;code>fd -e md&lt;/code>；&lt;code>fd pattern&lt;/code> 直接對檔名做模糊比對，一樣預設遞迴、尊重 &lt;code>.gitignore&lt;/code>、跳過隱藏檔、輸出帶色。速度也快得多。&lt;/p>
&lt;p>什麼情境值得換：日常找檔案（「這個 config 檔在哪」「有哪些 .test.ts」）。什麼時候還是用 &lt;code>find&lt;/code>：&lt;code>find&lt;/code> 的 &lt;code>-exec&lt;/code>、複雜的時間 / 權限 / 大小條件組合仍然更全面，寫可攜腳本時 &lt;code>find&lt;/code> 保證存在。注意點：&lt;code>fd&lt;/code> 的正則 / glob 預設是 smart case（有大寫才區分大小寫），跟 &lt;code>find&lt;/code> 的精確比對行為不同。&lt;/p>
&lt;h2 id="互動式模糊搜尋fzf不是替代是加一層">互動式模糊搜尋：fzf（不是替代，是加一層）&lt;/h2>
&lt;p>&lt;code>fzf&lt;/code> 不替代任何工具，它是一層&lt;strong>互動式模糊選擇器&lt;/strong>，把「一堆候選 → 你挑一個」這件事變得極快。它從 stdin 吃候選清單、開一個可即時模糊過濾的介面、把你選的印到 stdout，所以能跟任何產生清單的指令組合：&lt;code>fd -e md | fzf&lt;/code> 挑一個 markdown 檔、&lt;code>git branch | fzf&lt;/code> 挑分支、&lt;code>rg --files | fzf&lt;/code> 挑檔案開。&lt;/p>
&lt;p>最高價值的兩個內建整合：&lt;code>Ctrl+R&lt;/code> 覆寫 shell 的歷史搜尋（模糊搜尋整個命令歷史，比預設的反向搜尋強太多）、&lt;code>Ctrl+T&lt;/code> 把檔案路徑插進當前命令列。這兩個 key binding &lt;strong>不是裝完自動生效的&lt;/strong>，要在 shell 設定裡啟用——新版 &lt;code>fzf&lt;/code> 直接在 &lt;code>.zshrc&lt;/code> / &lt;code>.bashrc&lt;/code> 加一行 &lt;code>eval &amp;quot;$(fzf --zsh)&amp;quot;&lt;/code>（bash 用 &lt;code>--bash&lt;/code>）；舊版則 source 套件附的整合檔（Arch 在 &lt;code>/usr/share/fzf/key-bindings.zsh&lt;/code> 與 &lt;code>completion.zsh&lt;/code>，路徑隨發行版不同）。沒加這行，&lt;code>Ctrl+R&lt;/code> 不會有反應。&lt;code>fd&lt;/code> 跟 &lt;code>rg&lt;/code> 可以當 &lt;code>fzf&lt;/code> 的預設來源，三者是一組。&lt;/p>
&lt;h2 id="看檔案內容cat--bat">看檔案內容：cat → bat&lt;/h2>
&lt;p>&lt;code>bat&lt;/code> 是 &lt;code>cat&lt;/code> 加上語法高亮、行號、Git 修改標記、自動分頁。看程式碼 / 設定檔時比 &lt;code>cat&lt;/code> 好讀很多。&lt;code>bat file.py&lt;/code> 直接帶高亮顯示。&lt;/p>
&lt;p>什麼情境值得換：人在終端機讀檔案內容。什麼時候還是用 &lt;code>cat&lt;/code>：把檔案內容 pipe 給其他程式、或在腳本裡——這時要純內容，用 &lt;code>cat&lt;/code>（&lt;code>bat&lt;/code> 在偵測到輸出不是終端機時會自動退化成類 &lt;code>cat&lt;/code> 行為，但明確用 &lt;code>cat&lt;/code> 更穩）。注意點：&lt;code>bat&lt;/code> 預設會分頁（走 &lt;code>less&lt;/code>），在腳本 / pipe 情境要加 &lt;code>--paging=never&lt;/code> 或 &lt;code>-pp&lt;/code>。&lt;/p>
&lt;h2 id="列目錄ls--eza">列目錄：ls → eza&lt;/h2>
&lt;p>&lt;code>eza&lt;/code>（&lt;code>exa&lt;/code> 的維護接棒者）是 &lt;code>ls&lt;/code> 的現代替代品，預設輸出帶顏色與圖示、更好的欄位對齊、內建 Git 狀態欄、&lt;code>--tree&lt;/code> 直接畫樹狀。&lt;code>eza -la --git&lt;/code> 一眼看到權限、大小、修改時間、Git 狀態。&lt;/p>
&lt;p>什麼情境值得換：人在終端機瀏覽目錄。什麼時候還是用 &lt;code>ls&lt;/code>：腳本裡解析輸出用 &lt;code>ls&lt;/code> 更穩定（現代替代品的欄位格式可能隨版本變），可攜腳本 &lt;code>ls&lt;/code> 保證存在。&lt;/p></description><content:encoded><![CDATA[<p>Linux 的預設指令（<code>grep</code>、<code>find</code>、<code>cat</code>、<code>ls</code>）能用，但它們是幾十年前為當時的環境設計的。過去十年出現一批用現代語言（多為 Rust）重寫的替代品，在同樣的工作上更快、預設行為更貼近日常開發、輸出更好讀。認識這些替代品的價值不在「預設的錯了」，而在你能在對的情境用更省力的工具——尤其是每天重複幾十次的搜尋與瀏覽。</p>
<p>這篇按「你原本用什麼」對照現代替代品，講清楚每個替代品解掉原工具的什麼痛點、什麼情境值得換、以及換了要注意的地方。核心的搜尋三件套（<code>ripgrep</code> / <code>fd</code> / <code>fzf</code>）值得優先掌握，其餘按需採用。</p>
<h2 id="搜尋文字內容grep--ripgreprg">搜尋文字內容：grep → ripgrep（rg）</h2>
<p><code>ripgrep</code>（指令是 <code>rg</code>）是 <code>grep</code> 的現代替代品，最大差別在它預設就做了開發者幾乎每次都要的事：遞迴搜尋當前目錄、尊重 <code>.gitignore</code>（不會翻進 <code>node_modules</code>、<code>.git</code>、build 產物）、自動跳過二進位檔、輸出帶顏色與行號。用 <code>grep</code> 搜整個專案常要寫 <code>grep -rn --exclude-dir=node_modules pattern .</code>，用 <code>rg pattern</code> 一句就到位且更快（Rust 實作 + 平行搜尋）。</p>
<p>什麼情境值得換：在專案目錄裡找程式碼、找字串出現在哪些檔案——這是 <code>rg</code> 最省力的地方。什麼時候還是用 <code>grep</code>：處理 pipe 進來的串流（<code>command | grep x</code>）兩者差不多；寫要在任何機器都能跑的腳本時 <code>grep</code> 是保證存在的（<code>rg</code> 要另外裝）。注意點：<code>rg</code> 預設跳過 <code>.gitignore</code> 忽略的檔，要搜被忽略的檔案得加 <code>-u</code>（或 <code>-uu</code> 連隱藏檔一起）。</p>
<h2 id="找檔案find--fd">找檔案：find → fd</h2>
<p><code>fd</code> 是 <code>find</code> 的現代替代品，把 <code>find</code> 那套冗長語法換成直覺的用法。<code>find . -name '*.md' -type f</code> 用 <code>fd</code> 是 <code>fd -e md</code>；<code>fd pattern</code> 直接對檔名做模糊比對，一樣預設遞迴、尊重 <code>.gitignore</code>、跳過隱藏檔、輸出帶色。速度也快得多。</p>
<p>什麼情境值得換：日常找檔案（「這個 config 檔在哪」「有哪些 .test.ts」）。什麼時候還是用 <code>find</code>：<code>find</code> 的 <code>-exec</code>、複雜的時間 / 權限 / 大小條件組合仍然更全面，寫可攜腳本時 <code>find</code> 保證存在。注意點：<code>fd</code> 的正則 / glob 預設是 smart case（有大寫才區分大小寫），跟 <code>find</code> 的精確比對行為不同。</p>
<h2 id="互動式模糊搜尋fzf不是替代是加一層">互動式模糊搜尋：fzf（不是替代，是加一層）</h2>
<p><code>fzf</code> 不替代任何工具，它是一層<strong>互動式模糊選擇器</strong>，把「一堆候選 → 你挑一個」這件事變得極快。它從 stdin 吃候選清單、開一個可即時模糊過濾的介面、把你選的印到 stdout，所以能跟任何產生清單的指令組合：<code>fd -e md | fzf</code> 挑一個 markdown 檔、<code>git branch | fzf</code> 挑分支、<code>rg --files | fzf</code> 挑檔案開。</p>
<p>最高價值的兩個內建整合：<code>Ctrl+R</code> 覆寫 shell 的歷史搜尋（模糊搜尋整個命令歷史，比預設的反向搜尋強太多）、<code>Ctrl+T</code> 把檔案路徑插進當前命令列。這兩個 key binding <strong>不是裝完自動生效的</strong>，要在 shell 設定裡啟用——新版 <code>fzf</code> 直接在 <code>.zshrc</code> / <code>.bashrc</code> 加一行 <code>eval &quot;$(fzf --zsh)&quot;</code>（bash 用 <code>--bash</code>）；舊版則 source 套件附的整合檔（Arch 在 <code>/usr/share/fzf/key-bindings.zsh</code> 與 <code>completion.zsh</code>，路徑隨發行版不同）。沒加這行，<code>Ctrl+R</code> 不會有反應。<code>fd</code> 跟 <code>rg</code> 可以當 <code>fzf</code> 的預設來源，三者是一組。</p>
<h2 id="看檔案內容cat--bat">看檔案內容：cat → bat</h2>
<p><code>bat</code> 是 <code>cat</code> 加上語法高亮、行號、Git 修改標記、自動分頁。看程式碼 / 設定檔時比 <code>cat</code> 好讀很多。<code>bat file.py</code> 直接帶高亮顯示。</p>
<p>什麼情境值得換：人在終端機讀檔案內容。什麼時候還是用 <code>cat</code>：把檔案內容 pipe 給其他程式、或在腳本裡——這時要純內容，用 <code>cat</code>（<code>bat</code> 在偵測到輸出不是終端機時會自動退化成類 <code>cat</code> 行為，但明確用 <code>cat</code> 更穩）。注意點：<code>bat</code> 預設會分頁（走 <code>less</code>），在腳本 / pipe 情境要加 <code>--paging=never</code> 或 <code>-pp</code>。</p>
<h2 id="列目錄ls--eza">列目錄：ls → eza</h2>
<p><code>eza</code>（<code>exa</code> 的維護接棒者）是 <code>ls</code> 的現代替代品，預設輸出帶顏色與圖示、更好的欄位對齊、內建 Git 狀態欄、<code>--tree</code> 直接畫樹狀。<code>eza -la --git</code> 一眼看到權限、大小、修改時間、Git 狀態。</p>
<p>什麼情境值得換：人在終端機瀏覽目錄。什麼時候還是用 <code>ls</code>：腳本裡解析輸出用 <code>ls</code> 更穩定（現代替代品的欄位格式可能隨版本變），可攜腳本 <code>ls</code> 保證存在。</p>
<h2 id="其他常見替代">其他常見替代</h2>
<p>按需採用，痛點對上了再裝：</p>
<table>
  <thead>
      <tr>
          <th>原工具</th>
          <th>替代品</th>
          <th>解的痛點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>cd</code></td>
          <td><code>zoxide</code></td>
          <td>記住常去的目錄，<code>z proj</code> 跳到最常用的（需 <code>eval &quot;$(zoxide init zsh)&quot;</code> 進 shell 才攔截 <code>z</code>）</td>
      </tr>
      <tr>
          <td><code>ps</code></td>
          <td><code>procs</code></td>
          <td>帶色、預設欄位更實用、支援樹狀與關鍵字過濾</td>
      </tr>
      <tr>
          <td><code>du</code></td>
          <td><code>ncdu</code> / <code>dust</code></td>
          <td>找誰佔空間：<code>ncdu</code> 互動逐層鑽 + 就地刪，<code>dust</code> 一次性樹狀視覺（見下）</td>
      </tr>
      <tr>
          <td><code>df</code></td>
          <td><code>duf</code></td>
          <td>表格化、帶色、好讀的磁碟用量</td>
      </tr>
      <tr>
          <td><code>top</code></td>
          <td><code>htop</code> / <code>btop</code></td>
          <td>互動式監控：<code>htop</code> 輕量近乎必備，<code>btop</code> 更完整的全螢幕儀表（見下）</td>
      </tr>
      <tr>
          <td><code>git diff</code></td>
          <td><code>delta</code> / <code>difftastic</code></td>
          <td>diff pager：<code>delta</code> 語法高亮 + 並排，<code>difftastic</code> 語法感知（比 AST 不比行；執行檔是 <code>difft</code>）</td>
      </tr>
      <tr>
          <td><code>man</code></td>
          <td><code>tldr</code></td>
          <td>只給常用範例，不用讀完整 man page</td>
      </tr>
      <tr>
          <td><code>sed</code>（簡單替換）</td>
          <td><code>sd</code></td>
          <td>直覺的 <code>sd 舊 新</code>，不用記 <code>sed</code> 的跳脫規則</td>
      </tr>
  </tbody>
</table>
<p>有兩個替代品的那幾格，差別不是「新舊」而是不同的使用模型，值得分清楚：</p>
<ul>
<li><strong><code>du</code> 的 <code>ncdu</code> vs <code>dust</code></strong>：兩者解的動作不同。<code>ncdu</code> 是互動式的——它掃一次目錄，開一個能逐層往下鑽、當場按鍵刪檔的介面，是「磁碟滿了、要找出並清掉大檔」這個任務的正典（清空間邊找邊刪）。<code>dust</code> 是一次性的——跑完印一張樹狀 + 長條的靜態報告，適合「快速看一眼誰佔空間」而不打算就地刪。要清理用 <code>ncdu</code>，要瞄一眼用 <code>dust</code>。</li>
<li><strong><code>top</code> 的 <code>htop</code> vs <code>btop</code></strong>：<code>htop</code> 是輕量、幾乎每台機器都該有的安全預設——彩色、可捲動、能直接對 process 送訊號，資源佔用極低，SSH 進一台陌生機器臨時看負載首選它。<code>btop</code> 是更完整的全螢幕儀表（CPU / 記憶體 / 網路 / 磁碟的圖形化面板），好看資訊多，但相對重、依賴多；當常駐監控台用很讚，臨時排查用 <code>htop</code> 更快到位。TUI 監控工具的完整比較見 <a href="../tui-monitoring-tools/">TUI 監控工具</a>。</li>
</ul>
<h2 id="採用策略與注意事項">採用策略與注意事項</h2>
<p><strong>優先順序</strong>：搜尋三件套（<code>rg</code> / <code>fd</code> / <code>fzf</code>）投報率最高，每天用幾十次、學習成本低，先裝這三個。<code>bat</code> / <code>eza</code> 是體驗提升，其餘按痛點採用。</p>
<p><strong>跨機器 / CI 的腳本別依賴它們</strong>：要在別台機器或 CI 跑的腳本，用保證存在的 <code>grep</code> / <code>find</code> / <code>cat</code>，因為現代替代品不一定裝了。專案內部、已宣告了 dev 依賴的腳本（devcontainer、Makefile）另當別論——那裡明確裝了 <code>rg</code> / <code>fd</code>，用它們（甚至還因為 <code>rg</code> 尊重 <code>.gitignore</code> 的語意才選它）很合理。分界是「這段腳本會在沒裝這些工具的環境跑嗎」，不是「腳本一律不能用」。</p>
<p><strong>安裝</strong>：多數在各發行版套件庫直接有。Arch：<code>pacman -S ripgrep fd fzf bat eza zoxide</code>，按需再加 <code>procs ncdu htop git-delta</code>（<code>delta</code> 的套件名是 <code>git-delta</code>）。Debian / Ubuntu 有兩個要注意的改名坑——<code>fd</code> 的執行檔在 apt 上叫 <code>fdfind</code>、<code>bat</code> 叫 <code>batcat</code>（都是為了避免跟既有套件撞名），要自己 alias 回 <code>fd</code> / <code>bat</code>；<code>eza</code> 較舊的 apt 源可能還沒有，用 cargo 或官方 repo 裝。macOS 用 <code>brew install ripgrep fd fzf bat eza zoxide</code>。裝好後它們該進你的 <a href="/blog/linux/dotfile/08-sync-bootstrap/bootstrap-script-packages/" data-link-title="Bootstrap Script 與套件清單管理" data-link-desc="寫 dotfile 的 install script、或整理「這台機器裝了什麼」的套件清單時回來讀">dotfile 套件清單</a>，新機器 bootstrap 時一次裝齊。</p>
<h2 id="相關">相關</h2>
<ul>
<li>這篇是「日常指令替代」；全螢幕 TUI 工具（監控、Git、檔案瀏覽、資料庫）見 <a href="../">CLI 環境工具</a> 的其他文章。</li>
<li>為什麼把工具當成「有取捨的選項」而非唯一答案，見 <a href="../">工具選單總覽</a>。</li>
<li>這些工具進 dotfile 套件清單、一鍵安裝的做法，見 <a href="/blog/linux/dotfile/08-sync-bootstrap/bootstrap-script-packages/" data-link-title="Bootstrap Script 與套件清單管理" data-link-desc="寫 dotfile 的 install script、或整理「這台機器裝了什麼」的套件清單時回來讀">模組八：Bootstrap script 與套件清單</a>。</li>
</ul>
]]></content:encoded></item><item><title>終端機訊息佇列客戶端：Kafka 的 kaskade/yozefu/ktea 與 Redis 的 iredis</title><link>https://tarrragon.github.io/blog/linux/tools/cli/message-queue-tui-clients/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/message-queue-tui-clients/</guid><description>&lt;p>終端機訊息佇列客戶端把 broker 的 topic、partition、consumer group 與訊息內容做成可導航的文字介面，讓遠端只有終端機時也能瀏覽訊息流、消費單一 topic、看消費進度，取代把連線資訊餵給桌面工具（Kafka 的 Conduktor、Redis 的 RedisInsight）的需求。它跟 broker 自帶的純指令工具（&lt;code>kafka-topics.sh&lt;/code>、&lt;code>rabbitmqctl&lt;/code>、&lt;code>redis-cli&lt;/code>）互補：指令工具適合腳本與一次性查詢，TUI 適合「邊看 topic 清單邊翻訊息內容」這種互動探索。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的訊息佇列客戶端分類。broker 端的純指令操作與 vendor 選型見 &lt;a href="https://tarrragon.github.io/blog/backend/03-message-queue/vendors/kafka/" data-link-title="Apache Kafka" data-link-desc="Distributed event streaming platform、log-based 模型">Kafka&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/03-message-queue/vendors/redis-streams/" data-link-title="Redis Streams" data-link-desc="Redis 生態內的 streams、append-only log &amp;#43; consumer group">Redis Streams&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/03-message-queue/vendors/rabbitmq/" data-link-title="RabbitMQ" data-link-desc="Classic message broker、AMQP routing 為主">RabbitMQ&lt;/a> 服務頁。&lt;/p>
&lt;h2 id="跟-sql-客戶端最大的不同多半綁單一-broker-協議">跟 SQL 客戶端最大的不同：多半綁單一 broker 協議&lt;/h2>
&lt;p>訊息佇列 TUI 幾乎都綁定單一 broker 協議，這是選型要先認清的一點，也跟 SQL 客戶端剛好相反。&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">SQL 客戶端&lt;/a> 一個工具靠 adapter 連 Postgres、MySQL、SQLite 多種資料庫；訊息佇列這邊，Kafka 的 TUI 說的是 Kafka protocol、不認 AMQP，RabbitMQ 的 TUI 走 management API、也不讀 Kafka topic。能同時連多種 broker 的工具是少數例外（見後文 queuepeek）。&lt;/p>
&lt;p>所以選型順序是先定 broker、再挑該 broker 生態的工具。實機盤點下來，Kafka 的 TUI 生態最成熟（多個活躍專案、安裝管道齊全），Redis 有強的增強型 REPL，RabbitMQ 與跨 broker 工具仍在早期。&lt;/p>
&lt;h2 id="兩種範式全螢幕-tui-與增強型-repl">兩種範式：全螢幕 TUI 與增強型 REPL&lt;/h2>
&lt;p>訊息佇列客戶端沿用跟 SQL 客戶端同一組範式區分。全螢幕 TUI（&lt;code>kaskade&lt;/code> / &lt;code>yozefu&lt;/code> / &lt;code>ktea&lt;/code>）把 topic 清單、訊息內容、consumer 狀態排進多個面板，鍵盤導航瀏覽；增強型 REPL（&lt;code>iredis&lt;/code>）仍是一行行打指令，但加上補全、語法高亮與型別感知輸出，是原生 client 的升級版。&lt;/p>
&lt;p>選哪種看工作型態：要在多個 topic 間翻訊息、看 partition 與 consumer group 全貌，用全螢幕 TUI；要快速接上跑幾條指令、或塞進腳本，用增強型 REPL。&lt;/p>
&lt;h2 id="kafka-全螢幕-tuikaskadeyozefuktea">Kafka 全螢幕 TUI：kaskade、yozefu、ktea&lt;/h2>
&lt;p>Kafka 有三個定位不同的全螢幕 TUI，互動模型與連線設定各異。&lt;/p>
&lt;p>&lt;code>kaskade&lt;/code>（Python、Textual 寫，實測 4.0.7）分 admin 與 consumer 兩個子命令，連線參數走 &lt;code>-b&lt;/code>。&lt;code>kaskade admin -b localhost:9092&lt;/code> 進管理模式，實測連上 broker 後渲染出 topics 面板，欄位是 name、partitions、replicas、in sync、groups、members、records，一頁看完叢集的 topic 全貌。&lt;code>kaskade consumer -b localhost:9092 -t orders --from-beginning&lt;/code> 進消費模式翻單一 topic 的訊息，&lt;code>-v json&lt;/code> 與 &lt;code>-v registry&lt;/code> 切 payload 解碼方式，後者配 &lt;code>--registry url=http://localhost:8081&lt;/code> 接 Schema Registry。SSL / SASL 不走 &lt;code>-b&lt;/code>，要用 &lt;code>--config security.protocol=SSL&lt;/code> 逐項帶或 &lt;code>--config-file kafka.properties&lt;/code> 餵設定檔。&lt;/p>
&lt;p>&lt;code>yozefu&lt;/code>（Rust 寫、binary 名是 &lt;code>yozf&lt;/code>，MAIF 維護）主打跨 topic 的搜尋查詢，把找特定 record 當成核心場景。它的查詢語言是 SQL 風的，預設 &lt;code>initial_query&lt;/code> 是 &lt;code>from end - 10&lt;/code>（從尾端往回取 10 筆），search filter 還能用 WebAssembly 自訂（&lt;code>create-filter&lt;/code> / &lt;code>import-filter&lt;/code> 子命令）。連線走 config 模型而非純 flag：&lt;code>yozf config&lt;/code> 會印出設定（檔案在 &lt;code>~/Library/Application Support/io.maif.yozefu/config.json&lt;/code>），每個 cluster 在裡面定義 &lt;code>bootstrap.servers&lt;/code>、&lt;code>security.protocol&lt;/code> 與 schema registry，再用 &lt;code>yozf -c &amp;lt;cluster&amp;gt; -t &amp;lt;topics&amp;gt;&lt;/code> 指定要連哪個。&lt;/p></description><content:encoded><![CDATA[<p>終端機訊息佇列客戶端把 broker 的 topic、partition、consumer group 與訊息內容做成可導航的文字介面，讓遠端只有終端機時也能瀏覽訊息流、消費單一 topic、看消費進度，取代把連線資訊餵給桌面工具（Kafka 的 Conduktor、Redis 的 RedisInsight）的需求。它跟 broker 自帶的純指令工具（<code>kafka-topics.sh</code>、<code>rabbitmqctl</code>、<code>redis-cli</code>）互補：指令工具適合腳本與一次性查詢，TUI 適合「邊看 topic 清單邊翻訊息內容」這種互動探索。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的訊息佇列客戶端分類。broker 端的純指令操作與 vendor 選型見 <a href="/blog/backend/03-message-queue/vendors/kafka/" data-link-title="Apache Kafka" data-link-desc="Distributed event streaming platform、log-based 模型">Kafka</a>、<a href="/blog/backend/03-message-queue/vendors/redis-streams/" data-link-title="Redis Streams" data-link-desc="Redis 生態內的 streams、append-only log &#43; consumer group">Redis Streams</a>、<a href="/blog/backend/03-message-queue/vendors/rabbitmq/" data-link-title="RabbitMQ" data-link-desc="Classic message broker、AMQP routing 為主">RabbitMQ</a> 服務頁。</p>
<h2 id="跟-sql-客戶端最大的不同多半綁單一-broker-協議">跟 SQL 客戶端最大的不同：多半綁單一 broker 協議</h2>
<p>訊息佇列 TUI 幾乎都綁定單一 broker 協議，這是選型要先認清的一點，也跟 SQL 客戶端剛好相反。<a href="/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">SQL 客戶端</a> 一個工具靠 adapter 連 Postgres、MySQL、SQLite 多種資料庫；訊息佇列這邊，Kafka 的 TUI 說的是 Kafka protocol、不認 AMQP，RabbitMQ 的 TUI 走 management API、也不讀 Kafka topic。能同時連多種 broker 的工具是少數例外（見後文 queuepeek）。</p>
<p>所以選型順序是先定 broker、再挑該 broker 生態的工具。實機盤點下來，Kafka 的 TUI 生態最成熟（多個活躍專案、安裝管道齊全），Redis 有強的增強型 REPL，RabbitMQ 與跨 broker 工具仍在早期。</p>
<h2 id="兩種範式全螢幕-tui-與增強型-repl">兩種範式：全螢幕 TUI 與增強型 REPL</h2>
<p>訊息佇列客戶端沿用跟 SQL 客戶端同一組範式區分。全螢幕 TUI（<code>kaskade</code> / <code>yozefu</code> / <code>ktea</code>）把 topic 清單、訊息內容、consumer 狀態排進多個面板，鍵盤導航瀏覽；增強型 REPL（<code>iredis</code>）仍是一行行打指令，但加上補全、語法高亮與型別感知輸出，是原生 client 的升級版。</p>
<p>選哪種看工作型態：要在多個 topic 間翻訊息、看 partition 與 consumer group 全貌，用全螢幕 TUI；要快速接上跑幾條指令、或塞進腳本，用增強型 REPL。</p>
<h2 id="kafka-全螢幕-tuikaskadeyozefuktea">Kafka 全螢幕 TUI：kaskade、yozefu、ktea</h2>
<p>Kafka 有三個定位不同的全螢幕 TUI，互動模型與連線設定各異。</p>
<p><code>kaskade</code>（Python、Textual 寫，實測 4.0.7）分 admin 與 consumer 兩個子命令，連線參數走 <code>-b</code>。<code>kaskade admin -b localhost:9092</code> 進管理模式，實測連上 broker 後渲染出 topics 面板，欄位是 name、partitions、replicas、in sync、groups、members、records，一頁看完叢集的 topic 全貌。<code>kaskade consumer -b localhost:9092 -t orders --from-beginning</code> 進消費模式翻單一 topic 的訊息，<code>-v json</code> 與 <code>-v registry</code> 切 payload 解碼方式，後者配 <code>--registry url=http://localhost:8081</code> 接 Schema Registry。SSL / SASL 不走 <code>-b</code>，要用 <code>--config security.protocol=SSL</code> 逐項帶或 <code>--config-file kafka.properties</code> 餵設定檔。</p>
<p><code>yozefu</code>（Rust 寫、binary 名是 <code>yozf</code>，MAIF 維護）主打跨 topic 的搜尋查詢，把找特定 record 當成核心場景。它的查詢語言是 SQL 風的，預設 <code>initial_query</code> 是 <code>from end - 10</code>（從尾端往回取 10 筆），search filter 還能用 WebAssembly 自訂（<code>create-filter</code> / <code>import-filter</code> 子命令）。連線走 config 模型而非純 flag：<code>yozf config</code> 會印出設定（檔案在 <code>~/Library/Application Support/io.maif.yozefu/config.json</code>），每個 cluster 在裡面定義 <code>bootstrap.servers</code>、<code>security.protocol</code> 與 schema registry，再用 <code>yozf -c &lt;cluster&gt; -t &lt;topics&gt;</code> 指定要連哪個。</p>
<p><code>ktea</code>（Go 寫，Homebrew 0.8.0）同樣是 config-based，cluster 連線設定走首次啟動的互動流程而非命令列旗標。啟動旗標有 <code>-debug</code> 與 <code>-plain-fonts</code>，後者在終端機沒裝 NerdFonts、圖示顯示成亂碼時關掉圖示。本機裝起來、啟動旗標確認過，cluster 連線與深層瀏覽走互動設定流程、未逐步驗證。</p>
<p>判讀：要一頁看完 topic / consumer group 狀態、或邊看邊消費，選 <code>kaskade</code>；要在大量 topic 裡用查詢撈特定 record，選 <code>yozefu</code> 的搜尋模型；<code>ktea</code> 是另一個 Go 單 binary 選擇、偏好互動式設定 cluster 的可評估。</p>
<h2 id="增強型-repliredisredis-與-redis-streams">增強型 REPL：iredis（Redis 與 Redis Streams）</h2>
<p><code>iredis</code>（Python 寫，實測 1.16.1）是 <code>redis-cli</code> 的增強版，補上指令補全、語法高亮與型別感知輸出，手感仍是 REPL。它跟 dbcli 家族的 <code>pgcli</code> / <code>litecli</code> 同一類定位。實測非互動可跑，把指令用管線餵進去就回結果：<code>echo &quot;DBSIZE&quot; | iredis -h localhost -p 6390</code>，適合塞腳本。</p>
<p>它對 Redis Streams（<a href="/blog/backend/03-message-queue/vendors/redis-streams/" data-link-title="Redis Streams" data-link-desc="Redis 生態內的 streams、append-only log &#43; consumer group">03 的 vendor 之一</a>）的檢視特別省事。<code>peek &lt;key&gt;</code> 會先看型別再自動取值，string 顯示 strlen 與內容、stream 走 <code>XINFO</code>；實測對一個 stream 跑 <code>XINFO STREAM</code> 直接回 length、last-generated-id 等欄位，不必先 <code>TYPE</code> 再決定下哪個讀取指令。它是通用 Redis client、不是 stream 專用工具，但 Redis Streams 的 consumer group 操作（<code>XPENDING</code>、<code>XCLAIM</code>、<code>XINFO GROUPS</code>）都在這套指令補全範圍內。</p>
<h2 id="rabbitmq-與跨-broker生態仍在早期">RabbitMQ 與跨 broker：生態仍在早期</h2>
<p>RabbitMQ 與「一個工具連多種 broker」這兩塊目前缺乏可直接安裝驗證的成熟工具，列出供參考、本機未實機驗證。</p>
<blockquote>
<p>RabbitMQ 的 TUI 候選有 <code>rabbitui</code>（走 RabbitMQ management API）與 <code>rabbithole</code>（帶 exchange / binding 的 topology browser、支援 Protobuf 解碼）。兩者都不在 Homebrew 與 crates.io 的發佈管道，本機未安裝驗證。在缺 TUI 的情況下，RabbitMQ 的互動瀏覽仍以內建的 Management UI（web，預設 15672 埠）為主，純終端機則回到 <code>rabbitmqctl</code> 與 <code>rabbitmqadmin</code>。</p></blockquote>
<blockquote>
<p>跨 broker 的 <code>queuepeek</code>（Rust 寫，宣稱同時連 RabbitMQ、Kafka、MQTT）對應 SQL 類裡 <code>usql</code> 的「一個工具連多種後端」定位。本機 <code>cargo install queuepeek</code> 在編譯 <code>rdkafka-sys</code>（綁定原生 librdkafka）階段失敗、未能驗證。</p></blockquote>
<h2 id="gotcha實測">gotcha（實測）</h2>
<ul>
<li><code>yozefu</code> 預設帶一個名為 <code>localhost</code> 的 cluster、指向 <code>localhost:9092</code>。連非預設 port（例如本機測試的 9093）要先 <code>yozf configure</code> 改掉 <code>bootstrap.servers</code>，直接用 flag 覆寫不會生效。</li>
<li><code>kaskade</code> 的 <code>-b</code> 只接 bootstrap server；SSL / SASL 等安全設定一律走 <code>--config key=value</code> 或 <code>--config-file</code>，混在 <code>-b</code> 裡會被當成 broker 位址。</li>
<li><code>ktea</code> 的 <code>-plain-fonts</code>：終端機沒裝 NerdFonts 時圖示會顯示成亂碼方塊，加這個旗標關掉圖示就恢復可讀。</li>
</ul>
<h2 id="同類其他選擇">同類其他選擇</h2>
<p>Redis 的全螢幕 TUI（如 <code>redis-tui</code>）與其他 Kafka TUI（如 <code>kafka-tui</code>）未在本輪實機驗證、列出供參考。Kafka TUI 這塊專案數量較多，挑選時以發佈管道（Homebrew / pip / crates.io 直接可裝）與維護活躍度篩選，不追求窮舉。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>broker 端純指令工具與 vendor 選型：<a href="/blog/backend/03-message-queue/vendors/kafka/" data-link-title="Apache Kafka" data-link-desc="Distributed event streaming platform、log-based 模型">Kafka</a>、<a href="/blog/backend/03-message-queue/vendors/redis-streams/" data-link-title="Redis Streams" data-link-desc="Redis 生態內的 streams、append-only log &#43; consumer group">Redis Streams</a>、<a href="/blog/backend/03-message-queue/vendors/rabbitmq/" data-link-title="RabbitMQ" data-link-desc="Classic message broker、AMQP routing 為主">RabbitMQ</a> 服務頁。</li>
<li>同範式的資料庫客戶端對照：<a href="/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">終端機 SQL 客戶端</a>。</li>
<li>把客戶端擺進可持久化的多工器 pane：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>訊息佇列客戶端在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>tmux 基礎：遠端 session 持久化與基本操作</title><link>https://tarrragon.github.io/blog/linux/tools/cli/tmux-persistence-and-basics/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/tmux-persistence-and-basics/</guid><description>&lt;p>tmux 是終端機多工器，核心責任是把終端機 session 的生命週期與連線本身脫鉤，並在單一連線裡分割出多個工作區。在遠端 SSH 開發下，它解決最痛的一個問題：連線斷了，伺服器上跑的東西不會跟著消失。把工作放進 tmux，連線中斷後 session 仍在伺服器上運作，重連 attach 回去就接續原狀。&lt;/p>
&lt;p>遠端伺服器優先選 tmux 的理由是可用性。它幾乎是事實標準，多數 Linux 發行版的套件庫都有、很多伺服器甚至預裝。&lt;code>zellij&lt;/code> 功能新、畫面提示友善，但通常要自行安裝；在不能隨意裝套件的機器上，tmux 處處可用就是決定性優勢。兩者的取捨在最後一節展開。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的多工器分類，聚焦 tmux 在遠端情境的實際操作。&lt;/p>
&lt;h2 id="持久化工作流detach-與-reattach">持久化工作流：detach 與 reattach&lt;/h2>
&lt;p>tmux 對遠端最重要的能力是 session 持久化：session 跑在伺服器上，跟當前這條 SSH 連線無關，所以主動離開或被動斷線後它都還在。這條工作流由四個指令構成。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>動作&lt;/th>
 &lt;th>指令&lt;/th>
 &lt;th>說明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>開新具名 session&lt;/td>
 &lt;td>&lt;code>tmux new -s work&lt;/code>&lt;/td>
 &lt;td>用名字開，之後好辨識&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>主動離開&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按 &lt;code>d&lt;/code>&lt;/td>
 &lt;td>detach，session 留在背景繼續跑&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>列出現有 session&lt;/td>
 &lt;td>&lt;code>tmux ls&lt;/code>&lt;/td>
 &lt;td>看伺服器上有哪些 session&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>接回&lt;/td>
 &lt;td>&lt;code>tmux attach -t work&lt;/code>&lt;/td>
 &lt;td>reattach，回到離開時的狀態（可簡寫 &lt;code>tmux a -t work&lt;/code>）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵在於被動斷線與主動 detach 的結果相同：手機從 Wi-Fi 切到行動網路、SSH 連線逾時、筆電闔上，這些情況下 tmux session 都留在伺服器上，重連後 &lt;code>tmux a&lt;/code> 就接回去。判讀訊號很單純：任何超過幾秒、不想因斷線重來的工作（build、資料遷移、&lt;code>tail -f&lt;/code> 追 log、跑測試），開始前先進 tmux。&lt;/p>
&lt;h2 id="prefix-keytmux-操作的入口">prefix key：tmux 操作的入口&lt;/h2>
&lt;p>tmux 的所有指令都以 prefix key 起手，預設是 &lt;code>Ctrl-b&lt;/code>。操作方式是按下 &lt;code>Ctrl-b&lt;/code> 放開、再按功能鍵，而不是同時按住。理解這個「兩段式」是上手 tmux 的第一道門檻；若按住不放或間隔太久而沒反應，多半是兩段式沒按對，重來一次即可。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>操作&lt;/th>
 &lt;th>按鍵&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>開新 window&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按 &lt;code>c&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>切換上一個 / 下一個 window&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按 &lt;code>p&lt;/code> / &lt;code>n&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>跳到第 N 個 window&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按數字&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>垂直分割（左右兩個 pane）&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按 &lt;code>%&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>水平分割（上下兩個 pane）&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按 &lt;code>&amp;quot;&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>在 pane 間移動&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按方向鍵&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>關閉當前 pane&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按 &lt;code>x&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>單一 pane 全螢幕放大 / 還原&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按 &lt;code>z&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>進 copy mode（往回捲歷史）&lt;/td>
 &lt;td>&lt;code>prefix&lt;/code> 後按 &lt;code>[&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>window 與 pane 是兩個層級：window 是整頁工作區（類似分頁），pane 是一個 window 內切出的子區塊。遠端開發常見的佈局是一個 window 切成數個 pane，一個跑編輯器、一個跑 &lt;code>tail -f&lt;/code>、一個留著敲指令。捲動歷史要先進 copy mode（&lt;code>prefix&lt;/code> 後按 &lt;code>[&lt;/code>），用方向鍵或 &lt;code>PageUp&lt;/code> 往回看，按 &lt;code>q&lt;/code> 離開 — 這是初學最容易卡住的點，因為進了 tmux 後終端機原本的捲動行為改由 tmux 接管。&lt;/p>
&lt;h2 id="遠端與手機的調校">遠端與手機的調校&lt;/h2>
&lt;p>tmux 預設設定對手機與慢速連線不夠順，幾項調整能明顯改善體感，全部寫在 &lt;code>~/.tmux.conf&lt;/code>。&lt;/p>
&lt;p>prefix key &lt;code>Ctrl-b&lt;/code> 在手機虛擬鍵盤上難按，常見的調整是改綁成 &lt;code>Ctrl-a&lt;/code>（更靠近鍵盤左側）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1"># ~/.tmux.conf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">unbind C-b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="nb">set&lt;/span> -g prefix C-a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="nb">bind&lt;/span> C-a send-prefix&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>滑鼠支援讓觸控裝置能直接點選 pane 與捲動，在手機與平板特別有用：&lt;/p></description><content:encoded><![CDATA[<p>tmux 是終端機多工器，核心責任是把終端機 session 的生命週期與連線本身脫鉤，並在單一連線裡分割出多個工作區。在遠端 SSH 開發下，它解決最痛的一個問題：連線斷了，伺服器上跑的東西不會跟著消失。把工作放進 tmux，連線中斷後 session 仍在伺服器上運作，重連 attach 回去就接續原狀。</p>
<p>遠端伺服器優先選 tmux 的理由是可用性。它幾乎是事實標準，多數 Linux 發行版的套件庫都有、很多伺服器甚至預裝。<code>zellij</code> 功能新、畫面提示友善，但通常要自行安裝；在不能隨意裝套件的機器上，tmux 處處可用就是決定性優勢。兩者的取捨在最後一節展開。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的多工器分類，聚焦 tmux 在遠端情境的實際操作。</p>
<h2 id="持久化工作流detach-與-reattach">持久化工作流：detach 與 reattach</h2>
<p>tmux 對遠端最重要的能力是 session 持久化：session 跑在伺服器上，跟當前這條 SSH 連線無關，所以主動離開或被動斷線後它都還在。這條工作流由四個指令構成。</p>
<table>
  <thead>
      <tr>
          <th>動作</th>
          <th>指令</th>
          <th>說明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>開新具名 session</td>
          <td><code>tmux new -s work</code></td>
          <td>用名字開，之後好辨識</td>
      </tr>
      <tr>
          <td>主動離開</td>
          <td><code>prefix</code> 後按 <code>d</code></td>
          <td>detach，session 留在背景繼續跑</td>
      </tr>
      <tr>
          <td>列出現有 session</td>
          <td><code>tmux ls</code></td>
          <td>看伺服器上有哪些 session</td>
      </tr>
      <tr>
          <td>接回</td>
          <td><code>tmux attach -t work</code></td>
          <td>reattach，回到離開時的狀態（可簡寫 <code>tmux a -t work</code>）</td>
      </tr>
  </tbody>
</table>
<p>關鍵在於被動斷線與主動 detach 的結果相同：手機從 Wi-Fi 切到行動網路、SSH 連線逾時、筆電闔上，這些情況下 tmux session 都留在伺服器上，重連後 <code>tmux a</code> 就接回去。判讀訊號很單純：任何超過幾秒、不想因斷線重來的工作（build、資料遷移、<code>tail -f</code> 追 log、跑測試），開始前先進 tmux。</p>
<h2 id="prefix-keytmux-操作的入口">prefix key：tmux 操作的入口</h2>
<p>tmux 的所有指令都以 prefix key 起手，預設是 <code>Ctrl-b</code>。操作方式是按下 <code>Ctrl-b</code> 放開、再按功能鍵，而不是同時按住。理解這個「兩段式」是上手 tmux 的第一道門檻；若按住不放或間隔太久而沒反應，多半是兩段式沒按對，重來一次即可。</p>
<table>
  <thead>
      <tr>
          <th>操作</th>
          <th>按鍵</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>開新 window</td>
          <td><code>prefix</code> 後按 <code>c</code></td>
      </tr>
      <tr>
          <td>切換上一個 / 下一個 window</td>
          <td><code>prefix</code> 後按 <code>p</code> / <code>n</code></td>
      </tr>
      <tr>
          <td>跳到第 N 個 window</td>
          <td><code>prefix</code> 後按數字</td>
      </tr>
      <tr>
          <td>垂直分割（左右兩個 pane）</td>
          <td><code>prefix</code> 後按 <code>%</code></td>
      </tr>
      <tr>
          <td>水平分割（上下兩個 pane）</td>
          <td><code>prefix</code> 後按 <code>&quot;</code></td>
      </tr>
      <tr>
          <td>在 pane 間移動</td>
          <td><code>prefix</code> 後按方向鍵</td>
      </tr>
      <tr>
          <td>關閉當前 pane</td>
          <td><code>prefix</code> 後按 <code>x</code></td>
      </tr>
      <tr>
          <td>單一 pane 全螢幕放大 / 還原</td>
          <td><code>prefix</code> 後按 <code>z</code></td>
      </tr>
      <tr>
          <td>進 copy mode（往回捲歷史）</td>
          <td><code>prefix</code> 後按 <code>[</code></td>
      </tr>
  </tbody>
</table>
<p>window 與 pane 是兩個層級：window 是整頁工作區（類似分頁），pane 是一個 window 內切出的子區塊。遠端開發常見的佈局是一個 window 切成數個 pane，一個跑編輯器、一個跑 <code>tail -f</code>、一個留著敲指令。捲動歷史要先進 copy mode（<code>prefix</code> 後按 <code>[</code>），用方向鍵或 <code>PageUp</code> 往回看，按 <code>q</code> 離開 — 這是初學最容易卡住的點，因為進了 tmux 後終端機原本的捲動行為改由 tmux 接管。</p>
<h2 id="遠端與手機的調校">遠端與手機的調校</h2>
<p>tmux 預設設定對手機與慢速連線不夠順，幾項調整能明顯改善體感，全部寫在 <code>~/.tmux.conf</code>。</p>
<p>prefix key <code>Ctrl-b</code> 在手機虛擬鍵盤上難按，常見的調整是改綁成 <code>Ctrl-a</code>（更靠近鍵盤左側）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># ~/.tmux.conf</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">unbind C-b
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="nb">set</span> -g prefix C-a
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="nb">bind</span> C-a send-prefix</span></span></code></pre></div><p>滑鼠支援讓觸控裝置能直接點選 pane 與捲動，在手機與平板特別有用：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># ~/.tmux.conf</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">set</span> -g mouse on</span></span></code></pre></div><p>頻寬層面，tmux 本身傳輸的是純文字、量很低，斷線重連的成本也小。真正吃頻寬的是跑在 tmux 裡的全螢幕 TUI（例如 <code>btop</code>）的高頻重畫 — 這要調的是那個工具自己的刷新率，而非 tmux。改完設定檔後，在既有 session 內用 <code>prefix</code> 後按 <code>:</code> 輸入 <code>source-file ~/.tmux.conf</code> 重新載入。</p>
<h2 id="tmux-與-zellij-的選型對照">tmux 與 zellij 的選型對照</h2>
<p>tmux 與 zellij 解決同一類問題，session 持久化是兩者共有的基本能力（zellij 甚至內建 resurrection），真正的選擇依據是可用性與上手成本。</p>
<table>
  <thead>
      <tr>
          <th>面向</th>
          <th>tmux</th>
          <th>zellij</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>預設可用性</td>
          <td>多數伺服器預裝或套件庫直接有</td>
          <td>通常需要自行安裝</td>
      </tr>
      <tr>
          <td>上手成本</td>
          <td>需記快捷鍵</td>
          <td>畫面有提示列，操作邊看邊學</td>
      </tr>
      <tr>
          <td>session 持久化</td>
          <td>有（detach / reattach）</td>
          <td>有，另內建 resurrection（結束後重建）</td>
      </tr>
      <tr>
          <td>設定生態</td>
          <td>成熟、範例與設定檔分享多</td>
          <td>內建 layout、設定較直覺</td>
      </tr>
      <tr>
          <td>資源佔用</td>
          <td>低</td>
          <td>略高但仍輕量（差在閒置記憶體、與傳輸頻寬無關）</td>
      </tr>
  </tbody>
</table>
<p>選型分界很清楚：受限或陌生的伺服器、要求處處可用，選 tmux；自己掌控的機器、想要友善的上手體驗與內建 layout，選 zellij。對 prefix 快捷鍵還不熟的人，這條分界仍成立：在別人的伺服器上工作優先學 tmux，因為無法保證對方裝了 zellij，可用性約束高於上手體驗；zellij 的友善體驗留給自己能掌控安裝的機器。兩者的指令心智模型相近（都靠一個 prefix/modifier 起手），學會一個再換另一個成本不高。zellij 路線的實際操作在本資料夾另有兩篇：pane 的 CLI 操作見 <a href="/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">Zellij 多終端機操作指南</a>、瀏覽器遠端連線見 <a href="/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">Zellij Web Client 外網連線教學</a>。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>在多工器的 pane 裡擺即時監控：見 <a href="/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具</a>。</li>
<li>zellij 的進階用法：<a href="/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">Zellij 多終端機操作指南</a> 與 <a href="/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">Zellij Web Client 外網連線教學</a>。</li>
<li>多工器在三類遠端工具中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校</title><link>https://tarrragon.github.io/blog/linux/tools/cli/tui-monitoring-tools/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/tui-monitoring-tools/</guid><description>&lt;p>TUI 監控工具負責把系統或叢集的即時狀態畫成全螢幕互動介面：即時呈現負載變化，並用鍵盤直接排序、過濾、送訊號，取代反覆敲 &lt;code>ps&lt;/code>、&lt;code>df&lt;/code>、&lt;code>free&lt;/code> 再自行拼湊。在遠端 SSH 情境下，它的關鍵變數是刷新率與頻寬的取捨，因為全螢幕介面每次刷新都會重送整片畫面。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的 TUI 工具脈絡，聚焦系統監控這一支在遠端的實際使用與調校。git 線圖工具（&lt;code>tig&lt;/code> / &lt;code>lazygit&lt;/code> / &lt;code>gitui&lt;/code>）雖然也是 TUI，但屬版控子題，獨立成 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">遠端 CLI 開發的 git 線圖工具選型&lt;/a>。&lt;/p>
&lt;h2 id="htop進程層的標準">htop：進程層的標準&lt;/h2>
&lt;p>htop 把進程清單畫成帶 CPU 與記憶體長條的全螢幕視圖，責任是即時看進程並直接操作。它用底部的功能鍵列引導操作，不必背指令。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>按鍵&lt;/th>
 &lt;th>作用&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>F3&lt;/code>&lt;/td>
 &lt;td>搜尋進程&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F4&lt;/code>&lt;/td>
 &lt;td>過濾（只顯示符合的進程）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F5&lt;/code>&lt;/td>
 &lt;td>樹狀檢視（看父子關係）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F6&lt;/code>&lt;/td>
 &lt;td>選排序欄位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F9&lt;/code>&lt;/td>
 &lt;td>送訊號（殺進程）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F10&lt;/code>&lt;/td>
 &lt;td>離開&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>遠端使用的關鍵是刷新延遲。htop 用 &lt;code>-d&lt;/code> 設定刷新間隔，單位是十分之一秒，所以 &lt;code>htop -d 30&lt;/code> 是每 3 秒刷新一次。慢速連線下把延遲調大換取畫面不卡、按鍵不延遲，可從 5 秒（&lt;code>htop -d 50&lt;/code>）起步，順了再往下調。這個 5 秒是經驗起點、不是測得的閾值，實際依連線 RTT 與終端尺寸調整（後面 btop 與判讀段沿用此基準）。&lt;/p>
&lt;h2 id="btop多資源儀表板">btop：多資源儀表板&lt;/h2>
&lt;p>btop 把 CPU、記憶體、網路、磁碟畫在同一畫面，並帶歷史曲線與滑鼠操作，責任是一眼總覽多個資源維度的趨勢。相較 htop 偏進程清單，btop 偏向整機儀表板。&lt;/p>
&lt;p>刷新率是 btop 在遠端最該調的設定。它的刷新間隔由 &lt;code>update_ms&lt;/code> 控制（預設 2000 毫秒），把間隔調短會讓全螢幕重畫更頻繁、在慢速連線吃掉頻寬。調整方式是按 &lt;code>Esc&lt;/code> 開 Options 選單改 &lt;code>update_ms&lt;/code>，或直接編輯設定檔 &lt;code>~/.config/btop/btop.conf&lt;/code> 的 &lt;code>update_ms&lt;/code> 值。判讀分界與 htop 相同：連線品質好可用較密的刷新換即時性，品質差就把間隔拉長，慢速連線可從 &lt;code>update_ms 5000&lt;/code>（5 秒）起步。&lt;/p>
&lt;h2 id="k9skubernetes-叢集導航">k9s：Kubernetes 叢集導航&lt;/h2>
&lt;p>k9s 把 &lt;code>kubectl&lt;/code> 的查詢與操作做成全螢幕導航介面，責任是讓叢集管理不必逐條敲 &lt;code>kubectl&lt;/code> 指令。它用冒號指令切換資源視圖，游標選中資源後用快捷鍵操作。&lt;/p>
&lt;blockquote>
&lt;p>安裝與 &lt;code>--refresh&lt;/code> 旗標已實機驗證；以下 &lt;code>:pods&lt;/code> 等叢集操作需連到 k8s cluster，依官方用法、本機未實機驗證。&lt;/p>&lt;/blockquote>
&lt;p>常見操作是輸入 &lt;code>:pods&lt;/code> 看 pod 清單、&lt;code>:svc&lt;/code> 看 service，游標停在某個 pod 上按 &lt;code>l&lt;/code> 看 log、&lt;code>d&lt;/code> 看 describe、&lt;code>s&lt;/code> 進 container shell。對遠端管理叢集的情境，它把「查狀態到進去除錯」的流程收進同一畫面，省去反覆切換指令的負擔。k9s 同樣是全螢幕 TUI、會定期輪詢叢集狀態，慢速連線下導航延遲明顯時，可在啟動時用 &lt;code>--refresh&lt;/code> 把輪詢間隔（秒）調長。&lt;/p>
&lt;h2 id="其他常用-tui-監控">其他常用 TUI 監控&lt;/h2>
&lt;p>不同資源維度有各自的專用 TUI，責任聚焦在單一面向。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>監控對象&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>ncdu&lt;/code> / &lt;code>gdu&lt;/code>&lt;/td>
 &lt;td>磁碟空間&lt;/td>
 &lt;td>掃描目錄並用長條顯示各目錄佔多少空間&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>ctop&lt;/code>&lt;/td>
 &lt;td>容器&lt;/td>
 &lt;td>即時看各 container 的資源佔用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>dive&lt;/code>&lt;/td>
 &lt;td>映像層&lt;/td>
 &lt;td>逐層分析 Docker image 的大小組成&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>這些工具的共同特性是各管一個維度：磁碟爆了用 &lt;code>ncdu&lt;/code> 找出是哪一包、容器資源異常用 &lt;code>ctop&lt;/code> 定位、要拆解 image 肥在哪用 &lt;code>dive&lt;/code>。遠端排查時依問題維度挑對應工具，比開一個大而全的儀表板更直接。&lt;/p>
&lt;p>Docker 相關的兩個工具值得多記一筆。&lt;code>dive&lt;/code> 除了 TUI，還有非互動的 &lt;code>--ci&lt;/code> 模式：&lt;code>dive &amp;lt;image&amp;gt; --ci&lt;/code> 會輸出 image 的 efficiency 與 wasted space，並依門檻判定 pass/fail，適合塞進 CI pipeline 擋住臃腫 image。&lt;code>ctop&lt;/code> 的單一容器細節視圖（游標選中按 &lt;code>Enter&lt;/code>）會把環境變數明文列出，含資料庫密碼這類敏感值，共享畫面或側錄時要留意。&lt;/p></description><content:encoded><![CDATA[<p>TUI 監控工具負責把系統或叢集的即時狀態畫成全螢幕互動介面：即時呈現負載變化，並用鍵盤直接排序、過濾、送訊號，取代反覆敲 <code>ps</code>、<code>df</code>、<code>free</code> 再自行拼湊。在遠端 SSH 情境下，它的關鍵變數是刷新率與頻寬的取捨，因為全螢幕介面每次刷新都會重送整片畫面。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的 TUI 工具脈絡，聚焦系統監控這一支在遠端的實際使用與調校。git 線圖工具（<code>tig</code> / <code>lazygit</code> / <code>gitui</code>）雖然也是 TUI，但屬版控子題，獨立成 <a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">遠端 CLI 開發的 git 線圖工具選型</a>。</p>
<h2 id="htop進程層的標準">htop：進程層的標準</h2>
<p>htop 把進程清單畫成帶 CPU 與記憶體長條的全螢幕視圖，責任是即時看進程並直接操作。它用底部的功能鍵列引導操作，不必背指令。</p>
<table>
  <thead>
      <tr>
          <th>按鍵</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>F3</code></td>
          <td>搜尋進程</td>
      </tr>
      <tr>
          <td><code>F4</code></td>
          <td>過濾（只顯示符合的進程）</td>
      </tr>
      <tr>
          <td><code>F5</code></td>
          <td>樹狀檢視（看父子關係）</td>
      </tr>
      <tr>
          <td><code>F6</code></td>
          <td>選排序欄位</td>
      </tr>
      <tr>
          <td><code>F9</code></td>
          <td>送訊號（殺進程）</td>
      </tr>
      <tr>
          <td><code>F10</code></td>
          <td>離開</td>
      </tr>
  </tbody>
</table>
<p>遠端使用的關鍵是刷新延遲。htop 用 <code>-d</code> 設定刷新間隔，單位是十分之一秒，所以 <code>htop -d 30</code> 是每 3 秒刷新一次。慢速連線下把延遲調大換取畫面不卡、按鍵不延遲，可從 5 秒（<code>htop -d 50</code>）起步，順了再往下調。這個 5 秒是經驗起點、不是測得的閾值，實際依連線 RTT 與終端尺寸調整（後面 btop 與判讀段沿用此基準）。</p>
<h2 id="btop多資源儀表板">btop：多資源儀表板</h2>
<p>btop 把 CPU、記憶體、網路、磁碟畫在同一畫面，並帶歷史曲線與滑鼠操作，責任是一眼總覽多個資源維度的趨勢。相較 htop 偏進程清單，btop 偏向整機儀表板。</p>
<p>刷新率是 btop 在遠端最該調的設定。它的刷新間隔由 <code>update_ms</code> 控制（預設 2000 毫秒），把間隔調短會讓全螢幕重畫更頻繁、在慢速連線吃掉頻寬。調整方式是按 <code>Esc</code> 開 Options 選單改 <code>update_ms</code>，或直接編輯設定檔 <code>~/.config/btop/btop.conf</code> 的 <code>update_ms</code> 值。判讀分界與 htop 相同：連線品質好可用較密的刷新換即時性，品質差就把間隔拉長，慢速連線可從 <code>update_ms 5000</code>（5 秒）起步。</p>
<h2 id="k9skubernetes-叢集導航">k9s：Kubernetes 叢集導航</h2>
<p>k9s 把 <code>kubectl</code> 的查詢與操作做成全螢幕導航介面，責任是讓叢集管理不必逐條敲 <code>kubectl</code> 指令。它用冒號指令切換資源視圖，游標選中資源後用快捷鍵操作。</p>
<blockquote>
<p>安裝與 <code>--refresh</code> 旗標已實機驗證；以下 <code>:pods</code> 等叢集操作需連到 k8s cluster，依官方用法、本機未實機驗證。</p></blockquote>
<p>常見操作是輸入 <code>:pods</code> 看 pod 清單、<code>:svc</code> 看 service，游標停在某個 pod 上按 <code>l</code> 看 log、<code>d</code> 看 describe、<code>s</code> 進 container shell。對遠端管理叢集的情境，它把「查狀態到進去除錯」的流程收進同一畫面，省去反覆切換指令的負擔。k9s 同樣是全螢幕 TUI、會定期輪詢叢集狀態，慢速連線下導航延遲明顯時，可在啟動時用 <code>--refresh</code> 把輪詢間隔（秒）調長。</p>
<h2 id="其他常用-tui-監控">其他常用 TUI 監控</h2>
<p>不同資源維度有各自的專用 TUI，責任聚焦在單一面向。</p>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>監控對象</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>ncdu</code> / <code>gdu</code></td>
          <td>磁碟空間</td>
          <td>掃描目錄並用長條顯示各目錄佔多少空間</td>
      </tr>
      <tr>
          <td><code>ctop</code></td>
          <td>容器</td>
          <td>即時看各 container 的資源佔用</td>
      </tr>
      <tr>
          <td><code>dive</code></td>
          <td>映像層</td>
          <td>逐層分析 Docker image 的大小組成</td>
      </tr>
  </tbody>
</table>
<p>這些工具的共同特性是各管一個維度：磁碟爆了用 <code>ncdu</code> 找出是哪一包、容器資源異常用 <code>ctop</code> 定位、要拆解 image 肥在哪用 <code>dive</code>。遠端排查時依問題維度挑對應工具，比開一個大而全的儀表板更直接。</p>
<p>Docker 相關的兩個工具值得多記一筆。<code>dive</code> 除了 TUI，還有非互動的 <code>--ci</code> 模式：<code>dive &lt;image&gt; --ci</code> 會輸出 image 的 efficiency 與 wasted space，並依門檻判定 pass/fail，適合塞進 CI pipeline 擋住臃腫 image。<code>ctop</code> 的單一容器細節視圖（游標選中按 <code>Enter</code>）會把環境變數明文列出，含資料庫密碼這類敏感值，共享畫面或側錄時要留意。</p>
<h2 id="遠端刷新率與頻寬的取捨">遠端刷新率與頻寬的取捨</h2>
<p>全螢幕 TUI 監控的遠端成本核心在於：每次刷新會重送整片字元矩陣，刷新越密、頻寬負擔越重。慢速連線下會看到畫面延遲、按鍵反應慢。對策是把刷新間隔調長（<code>htop -d</code>、btop 的 <code>update_ms</code>），用更新頻率換流暢度。</p>
<p>判讀分界落在刷新率與監控粒度：連線順暢時用 1–2 秒的密集刷新看即時變化；連線吃緊時把間隔拉到 5 秒以上，或當只盯單一指標時改用一次性的文字趨勢（見 <a href="/blog/linux/tools/cli/ascii-charts-in-terminal/" data-link-title="終端機文字圖表：gnuplot、termgraph、plotext 與 sparkline" data-link-desc="把數值畫成終端機文字圖的工具：gnuplot dumb terminal、termgraph 長條圖、plotext 腳本繪圖、sparkline 與 pipeline 即時更新，以及遠端情境下一次性輸出省頻寬的判讀。">終端機文字圖表</a>）而非全螢幕儀表板。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>把監控擺進可持久化的多工器：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>，斷線後 reattach 回去監控還在跑。</li>
<li>一次性的文字趨勢圖（省頻寬的替代）：<a href="/blog/linux/tools/cli/ascii-charts-in-terminal/" data-link-title="終端機文字圖表：gnuplot、termgraph、plotext 與 sparkline" data-link-desc="把數值畫成終端機文字圖的工具：gnuplot dumb terminal、termgraph 長條圖、plotext 腳本繪圖、sparkline 與 pipeline 即時更新，以及遠端情境下一次性輸出省頻寬的判讀。">終端機文字圖表</a>。</li>
<li>監控的是 web 請求而非系統資源：<a href="/blog/linux/tools/cli/web-server-log-monitoring/" data-link-title="終端機看 nginx 請求：GoAccess、ngxtop 與何時該用 pipeline 而非 TUI" data-link-desc="在終端機即時看 nginx／web 伺服器請求的工具：GoAccess 即時儀表板、ngxtop top 風格，含 log 格式對齊的 gotcha；以及「當下排查用 TUI、持續監控用 metrics pipeline」的使用時機分界。">終端機看 nginx 請求</a>（GoAccess / ngxtop）。</li>
<li>TUI 監控在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型</title><link>https://tarrragon.github.io/blog/linux/tools/cli/sql-database-clients/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/sql-database-clients/</guid><description>&lt;p>終端機 SQL 客戶端把資料庫的 schema、表格與查詢結果做成可導航的文字介面，讓遠端只有終端機時也能瀏覽資料、跑查詢、看結果，取代把連線資訊餵給桌面 GUI（DBeaver、TablePlus）的需求。在純 SSH 情境下，它補上「連到遠端 DB 做事」這塊，而且全是文字、低頻寬友善。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的資料庫客戶端分類。工具分兩種範式：全螢幕 TUI 客戶端，與增強型 REPL。&lt;/p>
&lt;h2 id="兩種範式全螢幕-tui-與增強型-repl">兩種範式：全螢幕 TUI 與增強型 REPL&lt;/h2>
&lt;p>全螢幕 TUI（&lt;code>harlequin&lt;/code> / &lt;code>lazysql&lt;/code>）把 schema 樹、查詢編輯器、結果表格排進多個面板，像縮小版的 DBeaver。增強型 REPL（&lt;code>pgcli&lt;/code> / &lt;code>litecli&lt;/code>）仍是一行一行打 SQL，但加上語法高亮、智能補全與表格化輸出，是 &lt;code>psql&lt;/code> / &lt;code>mysql&lt;/code> 原生 client 的升級版。&lt;/p>
&lt;p>選哪種看工作型態：要邊看 schema 邊探索資料，用全螢幕 TUI；要快速接上跑幾條查詢、或塞進腳本，用 REPL。&lt;/p>
&lt;h2 id="全螢幕-tuiide-風與瀏覽器風">全螢幕 TUI：IDE 風與瀏覽器風&lt;/h2>
&lt;p>兩個全螢幕 TUI 的互動模型剛好相反，這是選型最該先分清的一點。&lt;/p>
&lt;p>&lt;code>harlequin&lt;/code> 是 SQL IDE 風：左側 Data Catalog 樹列出 db → schema → table → 欄位（帶型別標記，整數 &lt;code>#&lt;/code>、字串 &lt;code>s&lt;/code>、numeric &lt;code>#.#&lt;/code>），中間是查詢編輯器，寫好 SQL 按 &lt;code>Ctrl+Enter&lt;/code> 執行、結果在下方表格。點表只是把表的限定名稱插進編輯器、輔助組查詢，不會自動顯示資料。它用 Python（Textual）寫，adapter 涵蓋 postgres、mysql、sqlite、duckdb、odbc，預設 adapter 是 duckdb，連別的 DB 用 &lt;code>-a&lt;/code> 指定，例如 &lt;code>harlequin -a postgres &amp;quot;&amp;lt;連線字串&amp;gt;&amp;quot;&lt;/code> 或 &lt;code>harlequin -a sqlite db.sqlite&lt;/code>。&lt;/p>
&lt;p>&lt;code>lazysql&lt;/code> 是瀏覽器風：左側選一個表，右邊直接顯示該表記錄、不必寫 SELECT。上方分頁切 Records / Columns / Constraints / Foreign Keys / Indexes（&lt;code>[&lt;/code> 與 &lt;code>]&lt;/code> 切換）。篩選按 &lt;code>/&lt;/code> 開 WHERE 輸入，帶運算子補全（&lt;code>=&lt;/code>、&lt;code>≠&lt;/code>、&lt;code>&amp;gt;&lt;/code>、&lt;code>between&lt;/code>、&lt;code>ilike&lt;/code>、&lt;code>in&lt;/code>、&lt;code>like&lt;/code>、&lt;code>regexp&lt;/code> 等），只寫條件、不用整句。要跑自訂 SQL 按 &lt;code>Ctrl+E&lt;/code> 開編輯器（vim modal、有 &lt;code>-- INSERT --&lt;/code> 模式）寫完整語句、&lt;code>Ctrl+R&lt;/code> 執行。它用 Go 寫、lazygit 風的鍵盤導航。&lt;/p>
&lt;p>判讀：習慣先寫 query 再看結果的選 &lt;code>harlequin&lt;/code>；習慣點開表瀏覽、偶爾才下複雜 SQL 的選 &lt;code>lazysql&lt;/code>。&lt;/p>
&lt;p>&lt;code>dblab&lt;/code>（Go）與 &lt;code>rainfrog&lt;/code>（Rust）是另外兩個實機驗證過的瀏覽風 TUI。&lt;code>dblab&lt;/code> 走混合型：左側樹（&lt;code>Ctrl+H&lt;/code> 聚焦、&lt;code>j&lt;/code>/&lt;code>k&lt;/code> 移動、&lt;code>Enter&lt;/code> 看表的列）配上方查詢編輯器（&lt;code>Ctrl+E&lt;/code> 執行），瀏覽與寫 query 兩條路都有。它有一個實測 gotcha：編輯器的查詢要 schema 限定（&lt;code>SELECT * FROM public.products&lt;/code> 才行、裸 &lt;code>products&lt;/code> 會報 relation 不存在），因為編輯器連線的 search_path 沒含 public，而樹瀏覽（&lt;code>Enter&lt;/code>）不受這點影響。&lt;code>rainfrog&lt;/code> 專注 Postgres：側欄選表看 rows / columns / constraints / indexes / rls policies，查詢編輯器是 vim modal（&lt;code>i&lt;/code> 進 insert、&lt;code>v&lt;/code> 進 visual），另有 history 與 favorites 分頁。實測它不支援滑鼠操作，面板與分頁一律用 &lt;code>Tab&lt;/code> 切換、其餘靠鍵盤導航。&lt;/p>
&lt;h2 id="增強型-repldbcli-家族">增強型 REPL：dbcli 家族&lt;/h2>
&lt;p>&lt;code>pgcli&lt;/code>（Postgres）、&lt;code>mycli&lt;/code>（MySQL）、&lt;code>litecli&lt;/code>（SQLite）是同一個專案（dbcli）的三個 client，把原生 &lt;code>psql&lt;/code> / &lt;code>mysql&lt;/code> / &lt;code>sqlite3&lt;/code> 補上智能補全（表名、欄位、關鍵字）、語法高亮與對齊的表格化輸出。手感仍是 REPL，但打 SQL 時會即時提示。&lt;/p>
&lt;p>它們也能非互動執行、適合腳本：&lt;code>litecli&lt;/code> 用 &lt;code>-e&lt;/code>（&lt;code>litecli db.sqlite -e &amp;quot;SELECT ...&amp;quot;&lt;/code>），&lt;code>pgcli&lt;/code> 在 stdin 非 TTY 時讀管線（&lt;code>echo &amp;quot;SELECT ...&amp;quot; | pgcli &amp;quot;&amp;lt;連線字串&amp;gt;&amp;quot;&lt;/code>），輸出是對齊的 ASCII 表格。要在腳本裡取一次查詢結果、又想要比 &lt;code>psql -c&lt;/code> 更好的排版時，這條路最直接。&lt;/p></description><content:encoded><![CDATA[<p>終端機 SQL 客戶端把資料庫的 schema、表格與查詢結果做成可導航的文字介面，讓遠端只有終端機時也能瀏覽資料、跑查詢、看結果，取代把連線資訊餵給桌面 GUI（DBeaver、TablePlus）的需求。在純 SSH 情境下，它補上「連到遠端 DB 做事」這塊，而且全是文字、低頻寬友善。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的資料庫客戶端分類。工具分兩種範式：全螢幕 TUI 客戶端，與增強型 REPL。</p>
<h2 id="兩種範式全螢幕-tui-與增強型-repl">兩種範式：全螢幕 TUI 與增強型 REPL</h2>
<p>全螢幕 TUI（<code>harlequin</code> / <code>lazysql</code>）把 schema 樹、查詢編輯器、結果表格排進多個面板，像縮小版的 DBeaver。增強型 REPL（<code>pgcli</code> / <code>litecli</code>）仍是一行一行打 SQL，但加上語法高亮、智能補全與表格化輸出，是 <code>psql</code> / <code>mysql</code> 原生 client 的升級版。</p>
<p>選哪種看工作型態：要邊看 schema 邊探索資料，用全螢幕 TUI；要快速接上跑幾條查詢、或塞進腳本，用 REPL。</p>
<h2 id="全螢幕-tuiide-風與瀏覽器風">全螢幕 TUI：IDE 風與瀏覽器風</h2>
<p>兩個全螢幕 TUI 的互動模型剛好相反，這是選型最該先分清的一點。</p>
<p><code>harlequin</code> 是 SQL IDE 風：左側 Data Catalog 樹列出 db → schema → table → 欄位（帶型別標記，整數 <code>#</code>、字串 <code>s</code>、numeric <code>#.#</code>），中間是查詢編輯器，寫好 SQL 按 <code>Ctrl+Enter</code> 執行、結果在下方表格。點表只是把表的限定名稱插進編輯器、輔助組查詢，不會自動顯示資料。它用 Python（Textual）寫，adapter 涵蓋 postgres、mysql、sqlite、duckdb、odbc，預設 adapter 是 duckdb，連別的 DB 用 <code>-a</code> 指定，例如 <code>harlequin -a postgres &quot;&lt;連線字串&gt;&quot;</code> 或 <code>harlequin -a sqlite db.sqlite</code>。</p>
<p><code>lazysql</code> 是瀏覽器風：左側選一個表，右邊直接顯示該表記錄、不必寫 SELECT。上方分頁切 Records / Columns / Constraints / Foreign Keys / Indexes（<code>[</code> 與 <code>]</code> 切換）。篩選按 <code>/</code> 開 WHERE 輸入，帶運算子補全（<code>=</code>、<code>≠</code>、<code>&gt;</code>、<code>between</code>、<code>ilike</code>、<code>in</code>、<code>like</code>、<code>regexp</code> 等），只寫條件、不用整句。要跑自訂 SQL 按 <code>Ctrl+E</code> 開編輯器（vim modal、有 <code>-- INSERT --</code> 模式）寫完整語句、<code>Ctrl+R</code> 執行。它用 Go 寫、lazygit 風的鍵盤導航。</p>
<p>判讀：習慣先寫 query 再看結果的選 <code>harlequin</code>；習慣點開表瀏覽、偶爾才下複雜 SQL 的選 <code>lazysql</code>。</p>
<p><code>dblab</code>（Go）與 <code>rainfrog</code>（Rust）是另外兩個實機驗證過的瀏覽風 TUI。<code>dblab</code> 走混合型：左側樹（<code>Ctrl+H</code> 聚焦、<code>j</code>/<code>k</code> 移動、<code>Enter</code> 看表的列）配上方查詢編輯器（<code>Ctrl+E</code> 執行），瀏覽與寫 query 兩條路都有。它有一個實測 gotcha：編輯器的查詢要 schema 限定（<code>SELECT * FROM public.products</code> 才行、裸 <code>products</code> 會報 relation 不存在），因為編輯器連線的 search_path 沒含 public，而樹瀏覽（<code>Enter</code>）不受這點影響。<code>rainfrog</code> 專注 Postgres：側欄選表看 rows / columns / constraints / indexes / rls policies，查詢編輯器是 vim modal（<code>i</code> 進 insert、<code>v</code> 進 visual），另有 history 與 favorites 分頁。實測它不支援滑鼠操作，面板與分頁一律用 <code>Tab</code> 切換、其餘靠鍵盤導航。</p>
<h2 id="增強型-repldbcli-家族">增強型 REPL：dbcli 家族</h2>
<p><code>pgcli</code>（Postgres）、<code>mycli</code>（MySQL）、<code>litecli</code>（SQLite）是同一個專案（dbcli）的三個 client，把原生 <code>psql</code> / <code>mysql</code> / <code>sqlite3</code> 補上智能補全（表名、欄位、關鍵字）、語法高亮與對齊的表格化輸出。手感仍是 REPL，但打 SQL 時會即時提示。</p>
<p>它們也能非互動執行、適合腳本：<code>litecli</code> 用 <code>-e</code>（<code>litecli db.sqlite -e &quot;SELECT ...&quot;</code>），<code>pgcli</code> 在 stdin 非 TTY 時讀管線（<code>echo &quot;SELECT ...&quot; | pgcli &quot;&lt;連線字串&gt;&quot;</code>），輸出是對齊的 ASCII 表格。要在腳本裡取一次查詢結果、又想要比 <code>psql -c</code> 更好的排版時，這條路最直接。</p>
<p><code>usql</code> 走另一條路：universal CLI，一個工具用統一介面連 Postgres、MySQL、SQLite 等各種 DB，連線字串以 scheme 區分（<code>postgres://...</code>、<code>sqlite:...</code>），也支援 <code>-c</code> 非互動執行。它不是 TUI，行為像能連多種 DB 的加強版 <code>psql</code>。一台機器要連好幾種不同 DB 時，一個 usql 比每種 DB 各裝一個 client 省事。</p>
<h2 id="遠端連線的一個-gotchassl-模式因-driver-而異">遠端連線的一個 gotcha：SSL 模式因 driver 而異</h2>
<p>同一個 Postgres、同一條連線字串，不同 client 的 SSL 預設不一樣。<code>lazysql</code> 走 Go 的 <code>pq</code> driver、預設要求 SSL，連沒開 SSL 的 DB 會報 <code>pq: SSL is not enabled on the server</code>，要在連線字串加 <code>?sslmode=disable</code>：<code>postgresql://user:pass@host:5432/db?sslmode=disable</code>。<code>pgcli</code> 與 <code>harlequin</code> 走 Python 的 psycopg、預設行為不同，同樣的 DB 不加也能連。遠端連不上、又確定帳密與 port 對的時候，先查的就是 sslmode。</p>
<h2 id="同類其他選擇">同類其他選擇</h2>
<p>同範式還有 <code>gobang</code>（Rust）。它未上 crates.io、Homebrew 也沒有對應 formula，本機未能安裝，列出供參考、未實機驗證。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>把 DB client 擺進可持久化的多工器 pane：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>編譯型工具（<code>lazysql</code> / <code>dblab</code> / <code>rainfrog</code>）搬到遠端的單一 binary 注意事項：<a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">git 線圖工具選型</a>。</li>
<li>SQL 客戶端在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>終端機文字圖表：gnuplot、termgraph、plotext 與 sparkline</title><link>https://tarrragon.github.io/blog/linux/tools/cli/ascii-charts-in-terminal/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/ascii-charts-in-terminal/</guid><description>&lt;p>終端機文字圖表工具是把一串數值畫成終端機裡由字元構成的圖的一類程式，承擔的責任是讓趨勢與分布可視化，而不必把資料拉回本機開試算表。在遠端情境下，它的優勢是一次性輸出、不持續重畫，所以對頻寬最友善 — 跑一次印出結果就結束，不像全螢幕 TUI 會持續佔用連線。&lt;/p>
&lt;p>這類工具與 TUI 監控的分工很清楚：TUI 監控自己去抓系統即時狀態並持續刷新，文字圖表則是餵什麼畫什麼，適合畫已經到手的數值（log 抽出的延遲、監控匯出的指標、一個查詢的結果）。本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的文字圖表分類。&lt;/p>
&lt;h2 id="gnuplot通用繪圖的-ascii-後端">gnuplot：通用繪圖的 ASCII 後端&lt;/h2>
&lt;p>gnuplot 是老牌繪圖工具，設定 &lt;code>set terminal dumb&lt;/code> 就改用 ASCII 字元輸出，責任是把函數或時間序列畫成終端機可讀的折線圖。它不需要圖形環境，在純 SSH 下直接可用。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">gnuplot -e &lt;span class="s2">&amp;#34;set terminal dumb size 80,25; plot sin(x)&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>畫資料檔時把 &lt;code>plot&lt;/code> 指向檔案，例如 &lt;code>plot 'data.dat' using 1:2 with lines&lt;/code>。gnuplot 的適用情境是需要正式座標軸、多條曲線疊圖、或畫數學函數時 — 它的表達力最完整，代價是設定語法較多。&lt;/p>
&lt;h2 id="termgraph分類長條圖">termgraph：分類長條圖&lt;/h2>
&lt;p>termgraph 吃一份「標籤加數值」的資料就畫出橫向長條圖，責任是讓各分類的佔比一眼可比。它用 &lt;code>pip install termgraph&lt;/code> 安裝，適合看「哪一類佔最多」這種分布問題。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="nb">printf&lt;/span> &lt;span class="s2">&amp;#34;Mon 120\nTue 250\nWed 90\n&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> termgraph&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每一行是一個分類與其數值，termgraph 把數值換算成等比例的長條。它的定位是快速看分布，不追求座標軸的精確 — 想看的是相對大小而非絕對讀數時最合適。&lt;/p>
&lt;h2 id="plotext腳本內繪圖">plotext：腳本內繪圖&lt;/h2>
&lt;p>plotext 是 Python 函式庫，讓折線、散點、長條圖直接在腳本裡畫出來，責任是把繪圖接在資料處理流程後面。它用 &lt;code>pip install plotext&lt;/code> 安裝，適合在既有的 Python 資料處理腳本末端加一段視覺化。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">plotext&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">plt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;延遲趨勢&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="n">plt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">show&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>plotext 的優勢是與資料處理同在一個腳本、不必把資料另存再餵給外部工具。處理完數據順手畫一張圖確認形狀，是它最自然的用法。&lt;/p>
&lt;h2 id="sparkline-與-pipeline-即時更新">sparkline 與 pipeline 即時更新&lt;/h2>
&lt;p>sparkline 工具把一串數字壓成一行高低起伏的點陣，責任是用最小的版面塞進一條趨勢。它不畫座標軸，只呈現形狀，適合放進狀態列、log 或窄螢幕。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">spark &lt;span class="m">1&lt;/span> &lt;span class="m">5&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="m">8&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="m">9&lt;/span> &lt;span class="m">4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>需要從 pipeline 即時吃資料時，&lt;code>youplot&lt;/code>（指令名 &lt;code>uplot&lt;/code>）能接管線畫圖，配合 &lt;code>tail -f&lt;/code> 做出滾動更新的監控線：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">tail -f metrics.log &lt;span class="p">|&lt;/span> uplot line&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>sparkline 在窄螢幕（手機、平板遠端）特別有優勢，因為一行不管螢幕多窄都塞得下。低頻率印一條 sparkline 來持續觀察某個指標，比開全螢幕儀表板省頻寬得多。&lt;/p>
&lt;h2 id="遠端使用判讀">遠端使用判讀&lt;/h2>
&lt;p>文字圖表在遠端的核心優勢是輸出模式：一次性印出、不持續重畫，所以不像全螢幕 TUI 那樣持續佔用頻寬。判讀分界落在資料來源與互動需求 — 手上已有數值、只想看形狀，用文字圖表；需要系統即時狀態並隨時操作，用 TUI 監控（見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具&lt;/a>）。&lt;/p>
&lt;p>慢速連線下做持續監控時，「每隔較長間隔印一次 sparkline 或長條圖」比全螢幕儀表板省頻寬：一行 sparkline 的傳輸量是固定的幾十個位元組，全螢幕儀表板則每次重送整片畫面（含 ANSI 色碼常達數 KB），兩者差一到兩個量級。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>需要即時系統狀態而非一次性圖表：&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具&lt;/a>。&lt;/li>
&lt;li>把監控與繪圖擺進可持久化的多工器：&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎&lt;/a>。&lt;/li>
&lt;li>文字圖表在整個遠端工具選型中的位置：&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a>。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>終端機文字圖表工具是把一串數值畫成終端機裡由字元構成的圖的一類程式，承擔的責任是讓趨勢與分布可視化，而不必把資料拉回本機開試算表。在遠端情境下，它的優勢是一次性輸出、不持續重畫，所以對頻寬最友善 — 跑一次印出結果就結束，不像全螢幕 TUI 會持續佔用連線。</p>
<p>這類工具與 TUI 監控的分工很清楚：TUI 監控自己去抓系統即時狀態並持續刷新，文字圖表則是餵什麼畫什麼，適合畫已經到手的數值（log 抽出的延遲、監控匯出的指標、一個查詢的結果）。本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的文字圖表分類。</p>
<h2 id="gnuplot通用繪圖的-ascii-後端">gnuplot：通用繪圖的 ASCII 後端</h2>
<p>gnuplot 是老牌繪圖工具，設定 <code>set terminal dumb</code> 就改用 ASCII 字元輸出，責任是把函數或時間序列畫成終端機可讀的折線圖。它不需要圖形環境，在純 SSH 下直接可用。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">gnuplot -e <span class="s2">&#34;set terminal dumb size 80,25; plot sin(x)&#34;</span></span></span></code></pre></div><p>畫資料檔時把 <code>plot</code> 指向檔案，例如 <code>plot 'data.dat' using 1:2 with lines</code>。gnuplot 的適用情境是需要正式座標軸、多條曲線疊圖、或畫數學函數時 — 它的表達力最完整，代價是設定語法較多。</p>
<h2 id="termgraph分類長條圖">termgraph：分類長條圖</h2>
<p>termgraph 吃一份「標籤加數值」的資料就畫出橫向長條圖，責任是讓各分類的佔比一眼可比。它用 <code>pip install termgraph</code> 安裝，適合看「哪一類佔最多」這種分布問題。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;Mon 120\nTue 250\nWed 90\n&#34;</span> <span class="p">|</span> termgraph</span></span></code></pre></div><p>每一行是一個分類與其數值，termgraph 把數值換算成等比例的長條。它的定位是快速看分布，不追求座標軸的精確 — 想看的是相對大小而非絕對讀數時最合適。</p>
<h2 id="plotext腳本內繪圖">plotext：腳本內繪圖</h2>
<p>plotext 是 Python 函式庫，讓折線、散點、長條圖直接在腳本裡畫出來，責任是把繪圖接在資料處理流程後面。它用 <code>pip install plotext</code> 安裝，適合在既有的 Python 資料處理腳本末端加一段視覺化。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="kn">import</span> <span class="nn">plotext</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">6</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">&#34;延遲趨勢&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span></span></span></code></pre></div><p>plotext 的優勢是與資料處理同在一個腳本、不必把資料另存再餵給外部工具。處理完數據順手畫一張圖確認形狀，是它最自然的用法。</p>
<h2 id="sparkline-與-pipeline-即時更新">sparkline 與 pipeline 即時更新</h2>
<p>sparkline 工具把一串數字壓成一行高低起伏的點陣，責任是用最小的版面塞進一條趨勢。它不畫座標軸，只呈現形狀，適合放進狀態列、log 或窄螢幕。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">spark <span class="m">1</span> <span class="m">5</span> <span class="m">3</span> <span class="m">8</span> <span class="m">2</span> <span class="m">9</span> <span class="m">4</span></span></span></code></pre></div><p>需要從 pipeline 即時吃資料時，<code>youplot</code>（指令名 <code>uplot</code>）能接管線畫圖，配合 <code>tail -f</code> 做出滾動更新的監控線：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">tail -f metrics.log <span class="p">|</span> uplot line</span></span></code></pre></div><p>sparkline 在窄螢幕（手機、平板遠端）特別有優勢，因為一行不管螢幕多窄都塞得下。低頻率印一條 sparkline 來持續觀察某個指標，比開全螢幕儀表板省頻寬得多。</p>
<h2 id="遠端使用判讀">遠端使用判讀</h2>
<p>文字圖表在遠端的核心優勢是輸出模式：一次性印出、不持續重畫，所以不像全螢幕 TUI 那樣持續佔用頻寬。判讀分界落在資料來源與互動需求 — 手上已有數值、只想看形狀，用文字圖表；需要系統即時狀態並隨時操作，用 TUI 監控（見 <a href="/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具</a>）。</p>
<p>慢速連線下做持續監控時，「每隔較長間隔印一次 sparkline 或長條圖」比全螢幕儀表板省頻寬：一行 sparkline 的傳輸量是固定的幾十個位元組，全螢幕儀表板則每次重送整片畫面（含 ANSI 色碼常達數 KB），兩者差一到兩個量級。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>需要即時系統狀態而非一次性圖表：<a href="/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具</a>。</li>
<li>把監控與繪圖擺進可持久化的多工器：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>文字圖表在整個遠端工具選型中的位置：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>終端機看 nginx 請求：GoAccess、ngxtop 與何時該用 pipeline 而非 TUI</title><link>https://tarrragon.github.io/blog/linux/tools/cli/web-server-log-monitoring/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/web-server-log-monitoring/</guid><description>&lt;p>Web 伺服器日誌監控工具把 nginx／Apache 的 access log 解析成終端機可讀的請求統計，讓遠端 SSH 進去的那台機器上，能即時看到現在誰在打、打哪些路徑、回什麼狀態碼、吃多少頻寬。它跟系統監控（&lt;code>btop&lt;/code> 看 CPU／記憶體）的差別在於觀測對象：系統監控看主機資源，這類看的是 HTTP 請求流。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的 TUI 工具脈絡，屬監控的 web 請求子題。但比起工具本身，更該先分清的是「什麼時候用終端機看請求、什麼時候不該」，這放在最後一節。&lt;/p>
&lt;h2 id="goaccess即時請求儀表板">GoAccess：即時請求儀表板&lt;/h2>
&lt;p>&lt;code>GoAccess&lt;/code> 把 access log 解析成全螢幕的即時儀表板，責任是把一份 log 變成可讀的請求分析：狀態碼分布、top 請求路徑、不重複訪客、頻寬、回應時間、訪客的 OS 與瀏覽器。它既能開互動 TUI，也能輸出 HTML／CSV／JSON 報表。&lt;/p>
&lt;p>驗證它解析的正確性可以走非互動模式 — 餵一份 nginx access log、指定格式、輸出報表：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">goaccess access.log --log-format&lt;span class="o">=&lt;/span>COMBINED -o report.html&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>--log-format=COMBINED&lt;/code> 是對應 nginx 標準 combined 格式的預設。實測對一份 13 筆請求的 log，GoAccess 正確分出 9 筆 2xx、4 筆 4xx，並列出 top 路徑（&lt;code>/&lt;/code> 佔多數、&lt;code>/missing&lt;/code> 等 404）、訪客 host、user-agent 與頻寬。互動模式（不加 &lt;code>-o&lt;/code>）則是同一份資料的全螢幕即時版，連線中持續更新。&lt;/p>
&lt;h2 id="ngxtoptop-風格的請求即時表">ngxtop：top 風格的請求即時表&lt;/h2>
&lt;p>&lt;code>ngxtop&lt;/code> 把 access log 做成 &lt;code>top&lt;/code> 風格的即時表，責任是用最精簡的版面看「現在最熱的請求路徑與其狀態碼分布」。它比 GoAccess 輕、聚焦在請求路徑與狀態碼，適合快速掃一眼。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">ngxtop -l access.log --no-follow&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>--no-follow&lt;/code> 處理現有 log 後就退出（預設會持續跟隨新進的 log）。&lt;/p>
&lt;p>這裡有一個實測會撞到的 gotcha：&lt;strong>ngxtop 的 log 格式要跟實際的 nginx log_format 完全對上，否則它靜默回 0 records&lt;/strong>。nginx 官方 image 的預設 log_format 在標準 combined 之後多了一個 &lt;code>&amp;quot;$http_x_forwarded_for&amp;quot;&lt;/code> 欄位，ngxtop 的預設格式不含它，結果就是「跑得起來、但一筆都沒解析到」。對策是用 &lt;code>-f&lt;/code> 餵實際的格式：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">ngxtop -l access.log --no-follow &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="se">&lt;/span> -f &lt;span class="s1">&amp;#39;$remote_addr - $remote_user [$time_local] &amp;#34;$request&amp;#34; $status $body_bytes_sent &amp;#34;$http_referer&amp;#34; &amp;#34;$http_user_agent&amp;#34; &amp;#34;$http_x_forwarded_for&amp;#34;&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>格式對上後，ngxtop 正確處理 13 筆、分出 9 筆 2xx 與 4 筆 4xx，跟 GoAccess 的結果一致。相較之下 GoAccess 的 &lt;code>--log-format=COMBINED&lt;/code> 對尾端多出的欄位較寬容。判讀訊號很明確：ngxtop 顯示 0 records 時，先懷疑的是格式沒對上，而非沒有流量。&lt;/p>
&lt;h2 id="何時用終端機看請求何時不該">何時用終端機看請求、何時不該&lt;/h2>
&lt;p>工具會用之後，真正該分清的是使用時機。監控 nginx 請求依目的走兩條完全不同的路。&lt;/p>
&lt;p>當下排查與 ad-hoc 觀測，用終端機。情境是「伺服器現在很忙，進去看誰在打」「某個 endpoint 的 5xx 突然變多，即時看是哪一條」。這時 GoAccess／ngxtop／&lt;code>tail -f access.log&lt;/code> 直接在那台機器上看當下狀況，是遠端 SSH 除錯的日常，也是這類 TUI 工具的主場。&lt;/p>
&lt;p>持續的生產監控，不用終端機。沒有人 24 小時盯著 GoAccess。生產環境的請求監控走 pipeline：指標面用 nginx 的 &lt;code>stub_status&lt;/code>（基礎）或 VTS 模組／&lt;code>nginx-prometheus-exporter&lt;/code>（細到 per-status、per-upstream 的請求率），由 Prometheus 抓、Grafana 畫儀表板並設告警；日誌面把 access log 送到 Loki／ELK／Datadog 之類做查詢與長期保存。&lt;/p>
&lt;p>分界濃縮成一句：終端機 TUI 答「這台機器現在怎樣」，pipeline 答「趨勢如何、超標叫我」。所以請求一直都有被監控，只是持續監控的那份在 Prometheus 與日誌平台、不在終端機。生產 pipeline 的設計（metrics、dashboard、SLO、告警與 vendor 選型）屬後端觀測性的範圍，見 &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">可觀測性平台&lt;/a>；當排查升級成事故、需要止血與復盤的協作流程時，見 &lt;a href="https://tarrragon.github.io/blog/backend/08-incident-response/" data-link-title="模組八：事故處理與復盤" data-link-desc="用 IR 領域詞彙建問題節點、以服務級案例庫累積事故脈絡，先建概念與案例庫再進實作交接">事故處理與復盤&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>Web 伺服器日誌監控工具把 nginx／Apache 的 access log 解析成終端機可讀的請求統計，讓遠端 SSH 進去的那台機器上，能即時看到現在誰在打、打哪些路徑、回什麼狀態碼、吃多少頻寬。它跟系統監控（<code>btop</code> 看 CPU／記憶體）的差別在於觀測對象：系統監控看主機資源，這類看的是 HTTP 請求流。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的 TUI 工具脈絡，屬監控的 web 請求子題。但比起工具本身，更該先分清的是「什麼時候用終端機看請求、什麼時候不該」，這放在最後一節。</p>
<h2 id="goaccess即時請求儀表板">GoAccess：即時請求儀表板</h2>
<p><code>GoAccess</code> 把 access log 解析成全螢幕的即時儀表板，責任是把一份 log 變成可讀的請求分析：狀態碼分布、top 請求路徑、不重複訪客、頻寬、回應時間、訪客的 OS 與瀏覽器。它既能開互動 TUI，也能輸出 HTML／CSV／JSON 報表。</p>
<p>驗證它解析的正確性可以走非互動模式 — 餵一份 nginx access log、指定格式、輸出報表：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">goaccess access.log --log-format<span class="o">=</span>COMBINED -o report.html</span></span></code></pre></div><p><code>--log-format=COMBINED</code> 是對應 nginx 標準 combined 格式的預設。實測對一份 13 筆請求的 log，GoAccess 正確分出 9 筆 2xx、4 筆 4xx，並列出 top 路徑（<code>/</code> 佔多數、<code>/missing</code> 等 404）、訪客 host、user-agent 與頻寬。互動模式（不加 <code>-o</code>）則是同一份資料的全螢幕即時版，連線中持續更新。</p>
<h2 id="ngxtoptop-風格的請求即時表">ngxtop：top 風格的請求即時表</h2>
<p><code>ngxtop</code> 把 access log 做成 <code>top</code> 風格的即時表，責任是用最精簡的版面看「現在最熱的請求路徑與其狀態碼分布」。它比 GoAccess 輕、聚焦在請求路徑與狀態碼，適合快速掃一眼。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ngxtop -l access.log --no-follow</span></span></code></pre></div><p><code>--no-follow</code> 處理現有 log 後就退出（預設會持續跟隨新進的 log）。</p>
<p>這裡有一個實測會撞到的 gotcha：<strong>ngxtop 的 log 格式要跟實際的 nginx log_format 完全對上，否則它靜默回 0 records</strong>。nginx 官方 image 的預設 log_format 在標準 combined 之後多了一個 <code>&quot;$http_x_forwarded_for&quot;</code> 欄位，ngxtop 的預設格式不含它，結果就是「跑得起來、但一筆都沒解析到」。對策是用 <code>-f</code> 餵實際的格式：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ngxtop -l access.log --no-follow <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -f <span class="s1">&#39;$remote_addr - $remote_user [$time_local] &#34;$request&#34; $status $body_bytes_sent &#34;$http_referer&#34; &#34;$http_user_agent&#34; &#34;$http_x_forwarded_for&#34;&#39;</span></span></span></code></pre></div><p>格式對上後，ngxtop 正確處理 13 筆、分出 9 筆 2xx 與 4 筆 4xx，跟 GoAccess 的結果一致。相較之下 GoAccess 的 <code>--log-format=COMBINED</code> 對尾端多出的欄位較寬容。判讀訊號很明確：ngxtop 顯示 0 records 時，先懷疑的是格式沒對上，而非沒有流量。</p>
<h2 id="何時用終端機看請求何時不該">何時用終端機看請求、何時不該</h2>
<p>工具會用之後，真正該分清的是使用時機。監控 nginx 請求依目的走兩條完全不同的路。</p>
<p>當下排查與 ad-hoc 觀測，用終端機。情境是「伺服器現在很忙，進去看誰在打」「某個 endpoint 的 5xx 突然變多，即時看是哪一條」。這時 GoAccess／ngxtop／<code>tail -f access.log</code> 直接在那台機器上看當下狀況，是遠端 SSH 除錯的日常，也是這類 TUI 工具的主場。</p>
<p>持續的生產監控，不用終端機。沒有人 24 小時盯著 GoAccess。生產環境的請求監控走 pipeline：指標面用 nginx 的 <code>stub_status</code>（基礎）或 VTS 模組／<code>nginx-prometheus-exporter</code>（細到 per-status、per-upstream 的請求率），由 Prometheus 抓、Grafana 畫儀表板並設告警；日誌面把 access log 送到 Loki／ELK／Datadog 之類做查詢與長期保存。</p>
<p>分界濃縮成一句：終端機 TUI 答「這台機器現在怎樣」，pipeline 答「趨勢如何、超標叫我」。所以請求一直都有被監控，只是持續監控的那份在 Prometheus 與日誌平台、不在終端機。生產 pipeline 的設計（metrics、dashboard、SLO、告警與 vendor 選型）屬後端觀測性的範圍，見 <a href="/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">可觀測性平台</a>；當排查升級成事故、需要止血與復盤的協作流程時，見 <a href="/blog/backend/08-incident-response/" data-link-title="模組八：事故處理與復盤" data-link-desc="用 IR 領域詞彙建問題節點、以服務級案例庫累積事故脈絡，先建概念與案例庫再進實作交接">事故處理與復盤</a>。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>系統資源（CPU／記憶體／磁碟）的即時監控：<a href="/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具</a>。</li>
<li>把即時觀測擺進可持久化的多工器 pane：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>這類工具在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器</title><link>https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/</guid><description>&lt;p>終端機圖形化工具，是用純文字字元（ASCII 與 Unicode 製圖字元）在終端機裡畫出可讀介面的一類程式，承擔的責任是讓遠端操作不必依賴桌面圖形環境就能監控系統、判讀資料與管理多個工作流。它們傳輸的全是文字，所以在頻寬低、連線不穩、只有一支手機的情境下，反而比真正的圖形介面更可靠。&lt;/p>
&lt;p>這類工具常被誤解成「把圖片塞進終端機」。那是另一條技術路線（sixel、kitty 影像協定、&lt;code>chafa&lt;/code> 把 PNG 轉成色塊），依賴特定終端機支援、傳輸量大，在低頻寬遠端會卡。本篇談的是另一條路線：用 &lt;code>─│┌┐└┘&lt;/code> 這類製圖字元、用半形與全形方塊堆出長條圖、用 sparkline 點陣畫趨勢線。畫面本質仍是一段文字，任何能顯示文字的終端機都能呈現。&lt;/p>
&lt;h2 id="為什麼遠端操作特別需要這條路線">為什麼遠端操作特別需要這條路線&lt;/h2>
&lt;p>遠端操作的核心限制是頻寬與連線穩定度，而純文字介面正好把這兩個成本壓到最低。一個全螢幕的監控介面，每次刷新送出的是一整片字元矩陣；若改用影像協定，送出的是一張壓縮點陣圖，資料量通常相差一個量級以上（實際視壓縮率而定）。連線中斷時，文字介面只要重連就能重畫，影像協定則可能因終端機狀態錯亂而花屏。&lt;/p>
&lt;p>這條路線也避開了環境依賴。遠端伺服器通常沒有桌面環境，X11 forwarding 設定繁瑣又吃頻寬；手機上的 SSH app（Termius、Blink、JuiceSSH）能穩定顯示的就是文字。把操作介面建立在文字之上，等於把「能不能用」的前提降到「終端機能顯示字」，這是所有遠端通道都滿足的最低標準。&lt;/p>
&lt;h2 id="六類工具的定位">六類工具的定位&lt;/h2>
&lt;p>終端機圖形化工具依本篇關注的責任分六類，各自解決遠端操作的不同問題。這裡聚焦「監控判讀、資料可視化、多工承載、檔案瀏覽、資料庫存取、訊息佇列存取」六種責任；fuzzy finder（&lt;code>fzf&lt;/code>）等其他互動式 TUI 同屬純文字遠端路線、但責任不同，不在本篇的選型框架內。&lt;/p>
&lt;h3 id="tui-監控與儀表板">TUI 監控與儀表板&lt;/h3>
&lt;p>TUI（Text User Interface）監控工具負責把系統即時狀態畫成全螢幕的互動介面，省去反覆敲 &lt;code>ps&lt;/code>、&lt;code>df&lt;/code>、&lt;code>free&lt;/code> 再自行拼湊的步驟，一眼呈現 CPU、記憶體、磁碟、網路的即時變化。它用製圖字元畫出框線與長條，用顏色標出負載高低，並接受鍵盤操作來排序、過濾、殺進程。&lt;/p>
&lt;p>&lt;code>btop&lt;/code> 與 &lt;code>htop&lt;/code> 是系統層的代表：開起來就是一片帶長條圖的進程清單，可以直接選中進程送訊號。&lt;code>k9s&lt;/code> 把這套搬到 Kubernetes，用同樣的全螢幕互動瀏覽 pod、查 log、進 container。&lt;code>lazygit&lt;/code> 把 git 的暫存、commit、分支操作變成可點選的面板。&lt;code>ncdu&lt;/code> 與 &lt;code>gdu&lt;/code> 掃描磁碟並用長條畫出每個目錄佔多少空間，找出爆掉的是哪一包。&lt;/p>
&lt;p>這類工具的共同判讀訊號是：需求落在「即時狀態 + 立刻操作」、而非「事後分析一段歷史資料」時，TUI 監控是對的選擇。它的邊界在於刷新成本 — 全螢幕重畫在慢速連線上會明顯延遲，這點在後面遠端情境會展開。&lt;/p>
&lt;h3 id="ascii-與文字圖表">ASCII 與文字圖表&lt;/h3>
&lt;p>文字圖表工具負責把一串數值畫成終端機裡的圖，讓趨勢與分布可視化，而不必把資料下載回本機開試算表。它接受標準輸入或檔案的數字，輸出長條圖、折線圖或 sparkline，全部由字元構成。&lt;/p>
&lt;p>&lt;code>gnuplot&lt;/code> 是老牌繪圖工具，設定 &lt;code>set terminal dumb&lt;/code> 就會用 ASCII 畫折線圖，適合畫函數或一段時間序列。&lt;code>termgraph&lt;/code> 吃一份「標籤 + 數值」就畫出橫向長條圖，看各分類佔比很直接。&lt;code>plotext&lt;/code> 是 Python 函式庫，在腳本裡直接畫折線與散點，適合接在資料處理流程後面。&lt;code>youplot&lt;/code>（&lt;code>uplot&lt;/code>）能從 pipeline 即時吃資料畫圖，配合 &lt;code>tail -f&lt;/code> 可以做出滾動更新的監控線。sparkline 類工具（如 &lt;code>spark&lt;/code>）把一串數字壓成一行高低起伏的點陣，塞進狀態列或 log 裡都行。&lt;/p>
&lt;p>這類工具的判讀訊號是：手上已經有一串數值（log 抽出來的延遲、監控匯出的指標、一個查詢的結果），想看形狀而非逐筆讀數字。它跟 TUI 監控的差別在於資料來源 — TUI 監控自己去抓系統即時狀態，文字圖表則是餵什麼畫什麼，適合畫自訂指標與歷史資料。&lt;/p>
&lt;h3 id="終端機多工器">終端機多工器&lt;/h3>
&lt;p>終端機多工器負責在單一連線裡管理多個終端機 session，並讓 session 的生命週期脫離連線本身。它把畫面切成多個 pane、用分頁組織工作流，而最關鍵的是：連線斷了，伺服器上的 session 仍在跑，重連後 attach 回去就接續原狀。&lt;/p>
&lt;p>&lt;code>tmux&lt;/code> 是事實標準，幾乎每台伺服器都裝得到，設定檔成熟、資源佔用低。&lt;code>zellij&lt;/code> 是較新的選擇，預設就有畫面提示（floating pane、操作提示列），對不熟快捷鍵的人上手較快，並內建 layout 設定能一鍵開出固定的多 pane 佈局。&lt;/p>
&lt;p>多工器跟前兩類不同，它本身不畫資料圖，而是承載其他工具的容器：在一個 pane 跑 &lt;code>btop&lt;/code>、另一個 pane 跑 &lt;code>tail -f&lt;/code> 接 sparkline、第三個 pane 留著敲指令。對遠端操作來說，它解決的是連線穩定度問題 — 這是手機與低頻寬情境的核心痛點，下一節展開。&lt;/p>
&lt;h3 id="檔案瀏覽與操作">檔案瀏覽與操作&lt;/h3>
&lt;p>檔案管理器負責把目錄結構與檔案內容做成可導航的互動介面，讓遠端只有終端機時也能像 IDE 側邊欄那樣瀏覽、預覽、搬移檔案，取代反覆 &lt;code>ls&lt;/code>、&lt;code>cd&lt;/code>、&lt;code>cat&lt;/code>。&lt;/p>
&lt;p>&lt;code>broot&lt;/code> 用可展開的樹狀檢視呈現目錄層級，配模糊跳轉適合深層結構；&lt;code>yazi&lt;/code> 與 &lt;code>ranger&lt;/code> 走 Miller 欄狀（並列父目錄、當前目錄、預覽窗），邊瀏覽邊看內容。&lt;/p>
&lt;p>這類工具的判讀訊號是：需求落在檔案層級的導覽與操作，而非系統監控或畫圖。選型與依賴注意事項見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/file-manager-tuis/" data-link-title="終端機檔案管理器：broot、yazi、ranger 的遠端瀏覽與選型" data-link-desc="在純文字終端機用 TUI 檔案管理器像 IDE 側邊欄那樣瀏覽目錄、預覽檔案內容：樹狀（broot）與 Miller 欄狀（yazi/ranger）兩種介面範式的差異，以及遠端 SSH 情境下的選型與依賴注意事項。">終端機檔案管理器&lt;/a>。&lt;/p>
&lt;h3 id="資料庫存取">資料庫存取&lt;/h3>
&lt;p>資料庫客戶端負責把 DB 的 schema、表格與查詢結果做成文字介面，讓遠端只有終端機時也能連到資料庫瀏覽資料、跑查詢，取代把連線資訊餵給桌面 GUI（DBeaver、TablePlus）。&lt;/p>
&lt;p>它分兩種範式：全螢幕 TUI（&lt;code>harlequin&lt;/code> 的 SQL IDE 風、&lt;code>lazysql&lt;/code> 的瀏覽器風）把 schema 樹、編輯器、結果表排進面板；增強型 REPL（&lt;code>pgcli&lt;/code> / &lt;code>litecli&lt;/code>）仍是行式打 SQL、但補上語法高亮與智能補全。&lt;/p>
&lt;p>這類工具的判讀訊號是：需求落在連資料庫做事，而非看系統或檔案。選型與連線注意事項見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">終端機 SQL 客戶端&lt;/a>。&lt;/p>
&lt;h3 id="訊息佇列存取">訊息佇列存取&lt;/h3>
&lt;p>訊息佇列客戶端負責把 broker 的 topic、partition、consumer group 與訊息內容做成文字介面，讓遠端只有終端機時也能瀏覽訊息流、消費單一 topic、看消費進度，取代把連線資訊餵給桌面工具（Conduktor、RedisInsight）。它跟資料庫客戶端的關鍵差異是多半綁單一 broker 協議：Kafka 的 TUI 不認 AMQP、一個工具連多種 broker 是少數例外。&lt;/p>
&lt;p>它同樣分兩種範式：全螢幕 TUI（Kafka 的 &lt;code>kaskade&lt;/code> 看叢集與消費、&lt;code>yozefu&lt;/code> 用查詢撈 record）把 topic 清單與訊息排進面板；增強型 REPL（Redis 的 &lt;code>iredis&lt;/code>）行式打指令、補上補全與型別感知。&lt;/p></description><content:encoded><![CDATA[<p>終端機圖形化工具，是用純文字字元（ASCII 與 Unicode 製圖字元）在終端機裡畫出可讀介面的一類程式，承擔的責任是讓遠端操作不必依賴桌面圖形環境就能監控系統、判讀資料與管理多個工作流。它們傳輸的全是文字，所以在頻寬低、連線不穩、只有一支手機的情境下，反而比真正的圖形介面更可靠。</p>
<p>這類工具常被誤解成「把圖片塞進終端機」。那是另一條技術路線（sixel、kitty 影像協定、<code>chafa</code> 把 PNG 轉成色塊），依賴特定終端機支援、傳輸量大，在低頻寬遠端會卡。本篇談的是另一條路線：用 <code>─│┌┐└┘</code> 這類製圖字元、用半形與全形方塊堆出長條圖、用 sparkline 點陣畫趨勢線。畫面本質仍是一段文字，任何能顯示文字的終端機都能呈現。</p>
<h2 id="為什麼遠端操作特別需要這條路線">為什麼遠端操作特別需要這條路線</h2>
<p>遠端操作的核心限制是頻寬與連線穩定度，而純文字介面正好把這兩個成本壓到最低。一個全螢幕的監控介面，每次刷新送出的是一整片字元矩陣；若改用影像協定，送出的是一張壓縮點陣圖，資料量通常相差一個量級以上（實際視壓縮率而定）。連線中斷時，文字介面只要重連就能重畫，影像協定則可能因終端機狀態錯亂而花屏。</p>
<p>這條路線也避開了環境依賴。遠端伺服器通常沒有桌面環境，X11 forwarding 設定繁瑣又吃頻寬；手機上的 SSH app（Termius、Blink、JuiceSSH）能穩定顯示的就是文字。把操作介面建立在文字之上，等於把「能不能用」的前提降到「終端機能顯示字」，這是所有遠端通道都滿足的最低標準。</p>
<h2 id="六類工具的定位">六類工具的定位</h2>
<p>終端機圖形化工具依本篇關注的責任分六類，各自解決遠端操作的不同問題。這裡聚焦「監控判讀、資料可視化、多工承載、檔案瀏覽、資料庫存取、訊息佇列存取」六種責任；fuzzy finder（<code>fzf</code>）等其他互動式 TUI 同屬純文字遠端路線、但責任不同，不在本篇的選型框架內。</p>
<h3 id="tui-監控與儀表板">TUI 監控與儀表板</h3>
<p>TUI（Text User Interface）監控工具負責把系統即時狀態畫成全螢幕的互動介面，省去反覆敲 <code>ps</code>、<code>df</code>、<code>free</code> 再自行拼湊的步驟，一眼呈現 CPU、記憶體、磁碟、網路的即時變化。它用製圖字元畫出框線與長條，用顏色標出負載高低，並接受鍵盤操作來排序、過濾、殺進程。</p>
<p><code>btop</code> 與 <code>htop</code> 是系統層的代表：開起來就是一片帶長條圖的進程清單，可以直接選中進程送訊號。<code>k9s</code> 把這套搬到 Kubernetes，用同樣的全螢幕互動瀏覽 pod、查 log、進 container。<code>lazygit</code> 把 git 的暫存、commit、分支操作變成可點選的面板。<code>ncdu</code> 與 <code>gdu</code> 掃描磁碟並用長條畫出每個目錄佔多少空間，找出爆掉的是哪一包。</p>
<p>這類工具的共同判讀訊號是：需求落在「即時狀態 + 立刻操作」、而非「事後分析一段歷史資料」時，TUI 監控是對的選擇。它的邊界在於刷新成本 — 全螢幕重畫在慢速連線上會明顯延遲，這點在後面遠端情境會展開。</p>
<h3 id="ascii-與文字圖表">ASCII 與文字圖表</h3>
<p>文字圖表工具負責把一串數值畫成終端機裡的圖，讓趨勢與分布可視化，而不必把資料下載回本機開試算表。它接受標準輸入或檔案的數字，輸出長條圖、折線圖或 sparkline，全部由字元構成。</p>
<p><code>gnuplot</code> 是老牌繪圖工具，設定 <code>set terminal dumb</code> 就會用 ASCII 畫折線圖，適合畫函數或一段時間序列。<code>termgraph</code> 吃一份「標籤 + 數值」就畫出橫向長條圖，看各分類佔比很直接。<code>plotext</code> 是 Python 函式庫，在腳本裡直接畫折線與散點，適合接在資料處理流程後面。<code>youplot</code>（<code>uplot</code>）能從 pipeline 即時吃資料畫圖，配合 <code>tail -f</code> 可以做出滾動更新的監控線。sparkline 類工具（如 <code>spark</code>）把一串數字壓成一行高低起伏的點陣，塞進狀態列或 log 裡都行。</p>
<p>這類工具的判讀訊號是：手上已經有一串數值（log 抽出來的延遲、監控匯出的指標、一個查詢的結果），想看形狀而非逐筆讀數字。它跟 TUI 監控的差別在於資料來源 — TUI 監控自己去抓系統即時狀態，文字圖表則是餵什麼畫什麼，適合畫自訂指標與歷史資料。</p>
<h3 id="終端機多工器">終端機多工器</h3>
<p>終端機多工器負責在單一連線裡管理多個終端機 session，並讓 session 的生命週期脫離連線本身。它把畫面切成多個 pane、用分頁組織工作流，而最關鍵的是：連線斷了，伺服器上的 session 仍在跑，重連後 attach 回去就接續原狀。</p>
<p><code>tmux</code> 是事實標準，幾乎每台伺服器都裝得到，設定檔成熟、資源佔用低。<code>zellij</code> 是較新的選擇，預設就有畫面提示（floating pane、操作提示列），對不熟快捷鍵的人上手較快，並內建 layout 設定能一鍵開出固定的多 pane 佈局。</p>
<p>多工器跟前兩類不同，它本身不畫資料圖，而是承載其他工具的容器：在一個 pane 跑 <code>btop</code>、另一個 pane 跑 <code>tail -f</code> 接 sparkline、第三個 pane 留著敲指令。對遠端操作來說，它解決的是連線穩定度問題 — 這是手機與低頻寬情境的核心痛點，下一節展開。</p>
<h3 id="檔案瀏覽與操作">檔案瀏覽與操作</h3>
<p>檔案管理器負責把目錄結構與檔案內容做成可導航的互動介面，讓遠端只有終端機時也能像 IDE 側邊欄那樣瀏覽、預覽、搬移檔案，取代反覆 <code>ls</code>、<code>cd</code>、<code>cat</code>。</p>
<p><code>broot</code> 用可展開的樹狀檢視呈現目錄層級，配模糊跳轉適合深層結構；<code>yazi</code> 與 <code>ranger</code> 走 Miller 欄狀（並列父目錄、當前目錄、預覽窗），邊瀏覽邊看內容。</p>
<p>這類工具的判讀訊號是：需求落在檔案層級的導覽與操作，而非系統監控或畫圖。選型與依賴注意事項見 <a href="/blog/linux/tools/cli/file-manager-tuis/" data-link-title="終端機檔案管理器：broot、yazi、ranger 的遠端瀏覽與選型" data-link-desc="在純文字終端機用 TUI 檔案管理器像 IDE 側邊欄那樣瀏覽目錄、預覽檔案內容：樹狀（broot）與 Miller 欄狀（yazi/ranger）兩種介面範式的差異，以及遠端 SSH 情境下的選型與依賴注意事項。">終端機檔案管理器</a>。</p>
<h3 id="資料庫存取">資料庫存取</h3>
<p>資料庫客戶端負責把 DB 的 schema、表格與查詢結果做成文字介面，讓遠端只有終端機時也能連到資料庫瀏覽資料、跑查詢，取代把連線資訊餵給桌面 GUI（DBeaver、TablePlus）。</p>
<p>它分兩種範式：全螢幕 TUI（<code>harlequin</code> 的 SQL IDE 風、<code>lazysql</code> 的瀏覽器風）把 schema 樹、編輯器、結果表排進面板；增強型 REPL（<code>pgcli</code> / <code>litecli</code>）仍是行式打 SQL、但補上語法高亮與智能補全。</p>
<p>這類工具的判讀訊號是：需求落在連資料庫做事，而非看系統或檔案。選型與連線注意事項見 <a href="/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">終端機 SQL 客戶端</a>。</p>
<h3 id="訊息佇列存取">訊息佇列存取</h3>
<p>訊息佇列客戶端負責把 broker 的 topic、partition、consumer group 與訊息內容做成文字介面，讓遠端只有終端機時也能瀏覽訊息流、消費單一 topic、看消費進度，取代把連線資訊餵給桌面工具（Conduktor、RedisInsight）。它跟資料庫客戶端的關鍵差異是多半綁單一 broker 協議：Kafka 的 TUI 不認 AMQP、一個工具連多種 broker 是少數例外。</p>
<p>它同樣分兩種範式：全螢幕 TUI（Kafka 的 <code>kaskade</code> 看叢集與消費、<code>yozefu</code> 用查詢撈 record）把 topic 清單與訊息排進面板；增強型 REPL（Redis 的 <code>iredis</code>）行式打指令、補上補全與型別感知。</p>
<p>這類工具的判讀訊號是：需求落在連 broker 看訊息與消費狀態，而非連資料庫。選型與實機驗證注意事項見 <a href="/blog/linux/tools/cli/message-queue-tui-clients/" data-link-title="終端機訊息佇列客戶端：Kafka 的 kaskade/yozefu/ktea 與 Redis 的 iredis" data-link-desc="在純文字終端機連 broker、瀏覽 topic、消費訊息、檢視 consumer 狀態的客戶端：Kafka 的全螢幕 TUI（kaskade/yozefu/ktea）、Redis 的增強型 REPL（iredis），以及訊息佇列 TUI 多半綁單一 broker 協議這個跟 SQL 客戶端最大的不同。">終端機訊息佇列客戶端</a>。</p>
<h2 id="三種遠端情境的選型判讀">三種遠端情境的選型判讀</h2>
<p>工具選型要回到實際的連線條件，而不只是比對功能清單。以下對應三種常見的遠端情境，各自的判讀重點與陷阱不同。</p>
<h3 id="ssh-連到-linux-伺服器">SSH 連到 Linux 伺服器</h3>
<p>從本機 SSH 進伺服器，連線通常穩定、頻寬足，瓶頸在於操作要連續、不想每次重連都從頭開始。這個情境的核心配置是「多工器打底 + TUI 監控擺上去」：登入後先 <code>tmux attach</code>（沒有就 <code>tmux new</code>），在固定的 pane 佈局裡跑監控與操作。</p>
<p>這裡的判讀重點是把 session 持久化當成預設習慣，而不是等斷線才後悔。即使連線穩定，把長時間任務（build、資料遷移、<code>tail -f</code> 追 log）放進多工器，就能隨時離開再回來。TUI 監控在這個情境幾乎沒有刷新成本顧慮，<code>btop</code> 開最高刷新率也順，互動功能的排序與殺進程都能放手用。</p>
<p>常見陷阱是把多工器與終端機本身的捲動搞混 — 進了 tmux 後，滑鼠捲動預設是 tmux 在管，要進 copy mode 才能往回看歷史。這是上手期最容易卡住的點，值得一開始就把捲動與複製的快捷鍵設順。</p>
<h3 id="手機或平板遠端">手機或平板遠端</h3>
<p>用手機或平板的 SSH app 連線，限制是螢幕小、虛擬鍵盤難敲組合鍵、連線會隨網路切換而中斷。這個情境最該優先的是多工器的持久化能力：手機從 Wi-Fi 切到行動網路、app 切到背景再回來，連線往往已經斷過一次，沒有多工器就等於每次都重來。</p>
<p>工具選型要往「省版面、少快捷鍵」傾斜。<code>zellij</code> 在這裡比 <code>tmux</code> 友善，因為它把操作提示畫在畫面上，不必硬記組合鍵；但 <code>tmux</code> 若已配好觸控友善的快捷鍵也能勝任。TUI 監控要挑版面能縮的 — <code>htop</code> 在窄螢幕下仍可讀，複雜的多欄儀表板則會被擠到看不清。文字圖表在小螢幕反而有優勢，一行 sparkline 不管螢幕多窄都塞得下。</p>
<p>常見陷阱是組合鍵在虛擬鍵盤上難以輸入。多工器的 prefix key（tmux 預設 <code>Ctrl-b</code>）在手機上很難按，值得改綁成單鍵或螢幕上的快捷按鈕；好的 SSH app 通常提供自訂工具列來補這個缺口。</p>
<h3 id="低頻寬或不穩定連線">低頻寬或不穩定連線</h3>
<p>連線慢或會斷時，限制同時來自頻寬與穩定度，兩者要分開處理。穩定度由多工器解決 — 斷線後 session 還在，這點與情境無關地成立。頻寬則直接決定 TUI 監控能不能用得舒服。</p>
<p>這裡最關鍵的判讀是刷新率與重畫成本的取捨。全螢幕 TUI 每次刷新會重送整片畫面，刷新間隔越短、頻寬負擔越重；把刷新率調快、或工具本身刷新較密時，慢速連線上會看到畫面追不上、按鍵延遲。對策是把刷新間隔調長（多數工具支援，例如 <code>btop</code> 在介面裡可調 <code>update_ms</code>、<code>htop</code> 用 <code>-d</code> 設延遲），用較低的更新頻率換流暢的操作。</p>
<p>判讀的分界是即時性與頻寬的取捨：連線品質好就用全螢幕 TUI 的即時性，品質差就退回低頻率的文字輸出。文字圖表在後者特別划算，因為它是一次性輸出而非持續重畫 — 跑一次 <code>termgraph</code> 印出結果就結束，不佔用持續頻寬；需要持續監控時，「低刷新率的單一數值 + 偶爾印一次 sparkline」往往比全螢幕儀表板更實用。</p>
<h2 id="選型判準與下一步">選型判準與下一步</h2>
<p>把這些工具與三種情境收斂成一條判準鏈：先用多工器解決連線斷續（任何遠端情境都先做這步），再依任務選對應工具 — 即時狀態用 TUI 監控、看歷史數值用文字圖表、找檔案用檔案管理器、連資料庫用 SQL 客戶端、連 broker 看訊息用訊息佇列客戶端，最後依連線品質調整刷新率與版面密度。</p>
<p>這條判準對應的具體工具，在本資料夾逐篇展開安裝、設定與遠端調校的細節：</p>
<ul>
<li>TUI 工具：系統監控（<code>btop</code> / <code>htop</code> / <code>k9s</code>）見 <a href="/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具</a>；web 請求日誌（<code>GoAccess</code> / <code>ngxtop</code>）見 <a href="/blog/linux/tools/cli/web-server-log-monitoring/" data-link-title="終端機看 nginx 請求：GoAccess、ngxtop 與何時該用 pipeline 而非 TUI" data-link-desc="在終端機即時看 nginx／web 伺服器請求的工具：GoAccess 即時儀表板、ngxtop top 風格，含 log 格式對齊的 gotcha；以及「當下排查用 TUI、持續監控用 metrics pipeline」的使用時機分界。">終端機看 nginx 請求</a>；git 線圖（<code>tig</code> / <code>lazygit</code> / <code>gitui</code>）屬版控子題、見 <a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">遠端 CLI 開發的 git 線圖工具選型</a></li>
<li>文字圖表：<a href="/blog/linux/tools/cli/ascii-charts-in-terminal/" data-link-title="終端機文字圖表：gnuplot、termgraph、plotext 與 sparkline" data-link-desc="把數值畫成終端機文字圖的工具：gnuplot dumb terminal、termgraph 長條圖、plotext 腳本繪圖、sparkline 與 pipeline 即時更新，以及遠端情境下一次性輸出省頻寬的判讀。">終端機文字圖表</a>（<code>gnuplot</code> dumb terminal、<code>termgraph</code> 與 <code>plotext</code> 的資料接法、sparkline 接 pipeline）</li>
<li>多工器：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>（持久化與基本操作）；<code>zellij</code> 的 pane 操作見 <a href="/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">Zellij 多終端機操作指南</a>、瀏覽器遠端連線見 <a href="/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">Zellij Web Client 外網連線教學</a></li>
<li>檔案管理：<a href="/blog/linux/tools/cli/file-manager-tuis/" data-link-title="終端機檔案管理器：broot、yazi、ranger 的遠端瀏覽與選型" data-link-desc="在純文字終端機用 TUI 檔案管理器像 IDE 側邊欄那樣瀏覽目錄、預覽檔案內容：樹狀（broot）與 Miller 欄狀（yazi/ranger）兩種介面範式的差異，以及遠端 SSH 情境下的選型與依賴注意事項。">終端機檔案管理器</a>（<code>broot</code> 樹狀、<code>yazi</code> / <code>ranger</code> Miller 欄狀的選型與依賴）</li>
<li>資料庫客戶端：<a href="/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">終端機 SQL 客戶端</a>（<code>harlequin</code> IDE 風、<code>lazysql</code> 瀏覽器風、<code>pgcli</code> / <code>litecli</code> 增強 REPL）</li>
<li>訊息佇列客戶端：<a href="/blog/linux/tools/cli/message-queue-tui-clients/" data-link-title="終端機訊息佇列客戶端：Kafka 的 kaskade/yozefu/ktea 與 Redis 的 iredis" data-link-desc="在純文字終端機連 broker、瀏覽 topic、消費訊息、檢視 consumer 狀態的客戶端：Kafka 的全螢幕 TUI（kaskade/yozefu/ktea）、Redis 的增強型 REPL（iredis），以及訊息佇列 TUI 多半綁單一 broker 協議這個跟 SQL 客戶端最大的不同。">終端機訊息佇列客戶端</a>（Kafka 的 <code>kaskade</code> / <code>yozefu</code> / <code>ktea</code>、Redis 的 <code>iredis</code>、與綁單一 broker 協議的選型差異）</li>
</ul>
<p>每篇單工具文章會聚焦一個工具在遠端情境下的實際配置，而不是重述官方手冊。先有這份總覽建立選型框架，再依當下的連線條件挑對應的工具深入。</p>
]]></content:encoded></item><item><title>終端機檔案管理器：broot、yazi、ranger 的遠端瀏覽與選型</title><link>https://tarrragon.github.io/blog/linux/tools/cli/file-manager-tuis/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/file-manager-tuis/</guid><description>&lt;p>終端機檔案管理器把資料夾結構與檔案內容做成全螢幕互動介面，讓遠端只有終端機時也能像 IDE 側邊欄那樣瀏覽目錄、預覽檔案、搬移與改名，取代反覆 &lt;code>ls&lt;/code>、&lt;code>cd&lt;/code>、&lt;code>cat&lt;/code> 的來回。在純 SSH 情境下，它補上 git 線圖與系統監控之外的另一塊日常需求：檔案層級的導覽與操作。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的檔案瀏覽分類。&lt;/p>
&lt;h2 id="兩種介面範式樹狀與-miller-欄狀">兩種介面範式：樹狀與 Miller 欄狀&lt;/h2>
&lt;p>檔案管理器的版面分兩種範式，直接決定操作手感，也是「我記得的是哪一個」最快的辨認點。&lt;/p>
&lt;p>樹狀（tree）範式像 IDE 的左側邊欄：一棵可展開、收合的目錄樹，深層結構的層級關係一眼看到。&lt;code>broot&lt;/code> 是代表，它的官方定位就是「tree-like view」，配上模糊輸入過濾能直接跳到深層目錄，&lt;code>--max-depth&lt;/code> 還能控制樹要展開幾層。&lt;/p>
&lt;p>Miller 欄狀（Miller columns）範式像 macOS Finder 的欄狀檢視：並列數欄（父目錄、當前目錄、預覽），游標右移進入子目錄、左移回上層，最右欄即時預覽當前檔案內容。&lt;code>yazi&lt;/code> 與 &lt;code>ranger&lt;/code> 走這條，預覽窗大、適合邊瀏覽邊讀內容。&lt;/p>
&lt;p>辨認方式很單純：記得的是「可展開／收合的樹」就是 broot 這類；記得的是「左邊瀏覽、右邊一大塊預覽」就是 yazi／ranger 這類。&lt;/p>
&lt;h2 id="工具對照">工具對照&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>語言&lt;/th>
 &lt;th>介面範式&lt;/th>
 &lt;th>特色&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>broot&lt;/code>&lt;/td>
 &lt;td>Rust&lt;/td>
 &lt;td>可展開樹&lt;/td>
 &lt;td>樹狀 + 模糊跳轉 + 退出時 cd 整合（&lt;code>br&lt;/code>）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>yazi&lt;/code>&lt;/td>
 &lt;td>Rust&lt;/td>
 &lt;td>Miller 欄狀&lt;/td>
 &lt;td>非同步預覽（圖片／程式碼）、反應最快&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>ranger&lt;/code>&lt;/td>
 &lt;td>Python&lt;/td>
 &lt;td>Miller 欄狀&lt;/td>
 &lt;td>老牌、外掛與設定分享生態最大&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>nnn&lt;/code>&lt;/td>
 &lt;td>C&lt;/td>
 &lt;td>細節／預覽&lt;/td>
 &lt;td>極簡超快、資源佔用低&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>lf&lt;/code>&lt;/td>
 &lt;td>Go&lt;/td>
 &lt;td>Miller 欄狀&lt;/td>
 &lt;td>ranger 風、單一 binary&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;code>broot&lt;/code> 把目錄做成可展開的樹，輸入幾個字就模糊過濾並跳轉到符合的路徑，是深層 monorepo 裡找檔最快的範式。它的 &lt;code>br&lt;/code> shell function 讓退出時把工作目錄切到所在位置，等於用它當互動式 &lt;code>cd&lt;/code> — 純 &lt;code>broot&lt;/code> 指令做不到這件事，因為子行程改不了父 shell 的目錄。&lt;code>br&lt;/code> 不會自動就位：首次執行 &lt;code>broot&lt;/code> 會跳出提示問是否安裝（答 &lt;code>Y&lt;/code>，或手動跑 &lt;code>broot --install&lt;/code>），它把函式寫進 shell rc，重新載入 rc 後改用 &lt;code>br&lt;/code> 啟動。如果還沒安裝 &lt;code>br&lt;/code>，在 broot 裡按 &lt;code>Alt + Enter&lt;/code>（&lt;code>:cd&lt;/code>）跳轉會看到 &lt;code>This verb needs broot to be launched as br&lt;/code> 的提示 — 這就是還沒透過 &lt;code>br&lt;/code> 啟動的訊號，裝好 &lt;code>br&lt;/code> 並改用 &lt;code>br&lt;/code> 啟動就能跳轉。&lt;/p>
&lt;p>操作上記幾個鍵就夠：直接打字會即時模糊過濾目錄樹，方向鍵移動游標；目錄上 &lt;code>Enter&lt;/code> 進入該層、&lt;code>Alt + Enter&lt;/code>（verb &lt;code>:cd&lt;/code>）離開 broot 並把 shell 切到該目錄、檔案上 &lt;code>Enter&lt;/code> 用預設程式開啟；&lt;code>Ctrl + q&lt;/code> 離開，&lt;code>Esc&lt;/code> 退回上一層狀態。完整快捷鍵與 verb 清單按 &lt;code>?&lt;/code> 叫出。深層結構需要綜觀層級時，樹狀比欄狀直觀。要注意 broot 是導覽與啟動器、不內建文字編輯：改檔得在檔案上開外部編輯器（叫出 &lt;code>$EDITOR&lt;/code>），它的強項在樹狀導覽與跳轉，不在看內容或改內容。&lt;/p>
&lt;p>&lt;code>yazi&lt;/code> 是 Miller 欄狀的現代實作，Rust 寫、預覽走非同步，大目錄或檔案很多時捲動不卡。它的程式碼預覽&lt;strong>內建語法高亮&lt;/strong>（用內建 highlighter、開箱就有彩色，不必另裝相依，實測程式碼確實彩色渲染）；圖片預覽則看終端機支援度（見最後一節）。要的是「邊瀏覽邊看大塊內容」且在意速度時，yazi 最順。&lt;/p>
&lt;p>&lt;code>ranger&lt;/code> 是 Miller 欄狀的老牌，外掛、設定檔分享與教學資源最多。它的取捨在依賴：ranger 是 Python，遠端機器要有 Python runtime，而且較新的 Python 版本會在啟動時印 deprecation 警告（實測 ranger 1.9.4 配 Python 3.14 會噴 &lt;code>SyntaxWarning: 'return' in a 'finally' block&lt;/code>，功能不受影響但訊息惱人）。預覽渲染同樣靠外部相依：ranger 預設的程式碼預覽是&lt;strong>純文字、無語法高亮&lt;/strong>，要彩色得另裝 &lt;code>highlight&lt;/code>、&lt;code>bat&lt;/code> 或 &lt;code>pygments&lt;/code> 並啟用 previewer（實測沒裝這些時就只有純文字，與 yazi 開箱即有高亮形成對比）。生態與依賴是它的一體兩面。&lt;/p>
&lt;p>&lt;code>nnn&lt;/code>（C）與 &lt;code>lf&lt;/code>（Go）走輕量路線，啟動極快、資源佔用低，適合老舊或資源吃緊的機器；&lt;code>lf&lt;/code> 是單一 binary，搬檔即用。&lt;/p>
&lt;h2 id="遠端情境的選型">遠端情境的選型&lt;/h2>
&lt;p>選型回到「要哪種瀏覽範式」加上「目標機器能裝什麼」兩條軸：&lt;/p>
&lt;ul>
&lt;li>想要 IDE 式可展開樹、常跳深層目錄：選 &lt;code>broot&lt;/code>，樹狀加模糊跳轉在深層結構找檔最快。&lt;/li>
&lt;li>想要欄狀導覽加強預覽（看圖、讀程式碼）、在意速度：選 &lt;code>yazi&lt;/code>。&lt;/li>
&lt;li>已有 ranger 習慣或需要特定外掛：選 &lt;code>ranger&lt;/code>，但先確認遠端有 Python、並接受啟動時的警告訊息。&lt;/li>
&lt;li>受限或老舊機器、要單一 binary 搬過去就用：&lt;code>lf&lt;/code>（Go）或 &lt;code>nnn&lt;/code>（C）。&lt;/li>
&lt;/ul>
&lt;p>安裝依賴是遠端的隱性分界。編譯型工具（broot、yazi、lf、nnn）搬一個 binary 就近可用；&lt;code>ranger&lt;/code> 的 Python 依賴在不給裝套件或 Python 版本尷尬的機器上較麻煩。編譯型的單一 binary 仍要留意 glibc／musl 對得上目標系統，這點與 git 工具相同，見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">git 線圖工具選型&lt;/a> 的單一 binary 注意事項。&lt;/p></description><content:encoded><![CDATA[<p>終端機檔案管理器把資料夾結構與檔案內容做成全螢幕互動介面，讓遠端只有終端機時也能像 IDE 側邊欄那樣瀏覽目錄、預覽檔案、搬移與改名，取代反覆 <code>ls</code>、<code>cd</code>、<code>cat</code> 的來回。在純 SSH 情境下，它補上 git 線圖與系統監控之外的另一塊日常需求：檔案層級的導覽與操作。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的檔案瀏覽分類。</p>
<h2 id="兩種介面範式樹狀與-miller-欄狀">兩種介面範式：樹狀與 Miller 欄狀</h2>
<p>檔案管理器的版面分兩種範式，直接決定操作手感，也是「我記得的是哪一個」最快的辨認點。</p>
<p>樹狀（tree）範式像 IDE 的左側邊欄：一棵可展開、收合的目錄樹，深層結構的層級關係一眼看到。<code>broot</code> 是代表，它的官方定位就是「tree-like view」，配上模糊輸入過濾能直接跳到深層目錄，<code>--max-depth</code> 還能控制樹要展開幾層。</p>
<p>Miller 欄狀（Miller columns）範式像 macOS Finder 的欄狀檢視：並列數欄（父目錄、當前目錄、預覽），游標右移進入子目錄、左移回上層，最右欄即時預覽當前檔案內容。<code>yazi</code> 與 <code>ranger</code> 走這條，預覽窗大、適合邊瀏覽邊讀內容。</p>
<p>辨認方式很單純：記得的是「可展開／收合的樹」就是 broot 這類；記得的是「左邊瀏覽、右邊一大塊預覽」就是 yazi／ranger 這類。</p>
<h2 id="工具對照">工具對照</h2>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>語言</th>
          <th>介面範式</th>
          <th>特色</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>broot</code></td>
          <td>Rust</td>
          <td>可展開樹</td>
          <td>樹狀 + 模糊跳轉 + 退出時 cd 整合（<code>br</code>）</td>
      </tr>
      <tr>
          <td><code>yazi</code></td>
          <td>Rust</td>
          <td>Miller 欄狀</td>
          <td>非同步預覽（圖片／程式碼）、反應最快</td>
      </tr>
      <tr>
          <td><code>ranger</code></td>
          <td>Python</td>
          <td>Miller 欄狀</td>
          <td>老牌、外掛與設定分享生態最大</td>
      </tr>
      <tr>
          <td><code>nnn</code></td>
          <td>C</td>
          <td>細節／預覽</td>
          <td>極簡超快、資源佔用低</td>
      </tr>
      <tr>
          <td><code>lf</code></td>
          <td>Go</td>
          <td>Miller 欄狀</td>
          <td>ranger 風、單一 binary</td>
      </tr>
  </tbody>
</table>
<p><code>broot</code> 把目錄做成可展開的樹，輸入幾個字就模糊過濾並跳轉到符合的路徑，是深層 monorepo 裡找檔最快的範式。它的 <code>br</code> shell function 讓退出時把工作目錄切到所在位置，等於用它當互動式 <code>cd</code> — 純 <code>broot</code> 指令做不到這件事，因為子行程改不了父 shell 的目錄。<code>br</code> 不會自動就位：首次執行 <code>broot</code> 會跳出提示問是否安裝（答 <code>Y</code>，或手動跑 <code>broot --install</code>），它把函式寫進 shell rc，重新載入 rc 後改用 <code>br</code> 啟動。如果還沒安裝 <code>br</code>，在 broot 裡按 <code>Alt + Enter</code>（<code>:cd</code>）跳轉會看到 <code>This verb needs broot to be launched as br</code> 的提示 — 這就是還沒透過 <code>br</code> 啟動的訊號，裝好 <code>br</code> 並改用 <code>br</code> 啟動就能跳轉。</p>
<p>操作上記幾個鍵就夠：直接打字會即時模糊過濾目錄樹，方向鍵移動游標；目錄上 <code>Enter</code> 進入該層、<code>Alt + Enter</code>（verb <code>:cd</code>）離開 broot 並把 shell 切到該目錄、檔案上 <code>Enter</code> 用預設程式開啟；<code>Ctrl + q</code> 離開，<code>Esc</code> 退回上一層狀態。完整快捷鍵與 verb 清單按 <code>?</code> 叫出。深層結構需要綜觀層級時，樹狀比欄狀直觀。要注意 broot 是導覽與啟動器、不內建文字編輯：改檔得在檔案上開外部編輯器（叫出 <code>$EDITOR</code>），它的強項在樹狀導覽與跳轉，不在看內容或改內容。</p>
<p><code>yazi</code> 是 Miller 欄狀的現代實作，Rust 寫、預覽走非同步，大目錄或檔案很多時捲動不卡。它的程式碼預覽<strong>內建語法高亮</strong>（用內建 highlighter、開箱就有彩色，不必另裝相依，實測程式碼確實彩色渲染）；圖片預覽則看終端機支援度（見最後一節）。要的是「邊瀏覽邊看大塊內容」且在意速度時，yazi 最順。</p>
<p><code>ranger</code> 是 Miller 欄狀的老牌，外掛、設定檔分享與教學資源最多。它的取捨在依賴：ranger 是 Python，遠端機器要有 Python runtime，而且較新的 Python 版本會在啟動時印 deprecation 警告（實測 ranger 1.9.4 配 Python 3.14 會噴 <code>SyntaxWarning: 'return' in a 'finally' block</code>，功能不受影響但訊息惱人）。預覽渲染同樣靠外部相依：ranger 預設的程式碼預覽是<strong>純文字、無語法高亮</strong>，要彩色得另裝 <code>highlight</code>、<code>bat</code> 或 <code>pygments</code> 並啟用 previewer（實測沒裝這些時就只有純文字，與 yazi 開箱即有高亮形成對比）。生態與依賴是它的一體兩面。</p>
<p><code>nnn</code>（C）與 <code>lf</code>（Go）走輕量路線，啟動極快、資源佔用低，適合老舊或資源吃緊的機器；<code>lf</code> 是單一 binary，搬檔即用。</p>
<h2 id="遠端情境的選型">遠端情境的選型</h2>
<p>選型回到「要哪種瀏覽範式」加上「目標機器能裝什麼」兩條軸：</p>
<ul>
<li>想要 IDE 式可展開樹、常跳深層目錄：選 <code>broot</code>，樹狀加模糊跳轉在深層結構找檔最快。</li>
<li>想要欄狀導覽加強預覽（看圖、讀程式碼）、在意速度：選 <code>yazi</code>。</li>
<li>已有 ranger 習慣或需要特定外掛：選 <code>ranger</code>，但先確認遠端有 Python、並接受啟動時的警告訊息。</li>
<li>受限或老舊機器、要單一 binary 搬過去就用：<code>lf</code>（Go）或 <code>nnn</code>（C）。</li>
</ul>
<p>安裝依賴是遠端的隱性分界。編譯型工具（broot、yazi、lf、nnn）搬一個 binary 就近可用；<code>ranger</code> 的 Python 依賴在不給裝套件或 Python 版本尷尬的機器上較麻煩。編譯型的單一 binary 仍要留意 glibc／musl 對得上目標系統，這點與 git 工具相同，見 <a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">git 線圖工具選型</a> 的單一 binary 注意事項。</p>
<p>預覽能力有一條邊界要先知道：程式碼與純文字檔的預覽在任何終端機都穩定，但圖片預覽需要終端機支援影像協定（sixel／kitty）。純文字遠端通道下，沒有影像協定時圖片會退回檔名與中繼資訊，這與 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">總覽</a> 對影像協定的取捨一致。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>把檔案管理器擺進可持久化的多工器 pane：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>編譯型工具搬到遠端的單一 binary 注意事項：<a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">git 線圖工具選型</a>。</li>
<li>檔案管理在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強</title><link>https://tarrragon.github.io/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/</guid><description>&lt;p>git 線圖工具，是把 commit 的分支、合併與時間先後關係畫成終端機可讀圖形的一類程式，承擔的責任是讓開發者在沒有桌面圖形環境的遠端機器上，仍能看清楚 repo 的歷史結構並進行版控操作。在純 SSH 連線的開發情境下，它取代了 IDE 內建的 git 圖形面板，而傳輸的全是文字，所以在頻寬低、只有終端機的條件下依然可用。&lt;/p>
&lt;p>最基本的線圖能力內建在 git 本身：&lt;code>git log --oneline --decorate --graph&lt;/code> 就會用 ASCII 畫出分支線。Oh My Zsh 的 git plugin 把它包成 &lt;code>glog&lt;/code>（當前分支）與 &lt;code>gloga&lt;/code>（加 &lt;code>--all&lt;/code> 看全分支）兩個 alias。這條 alias 是任何環境都成立的底線 — 即使在一台陌生、不能安裝任何東西的機器上，&lt;code>git log --graph&lt;/code> 永遠都在。專用工具要解決的，是這條底線之上的兩個缺口：互動瀏覽的流暢度，以及把「看」與「改」整合在同一畫面。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的 TUI 工具脈絡，聚焦 git 線圖這個版控子題（最常被遠端開發者問到）。&lt;/p>
&lt;h2 id="三類工具的職責分工">三類工具的職責分工&lt;/h2>
&lt;p>git 線圖工具依承擔的責任分三類，遠端 CLI 情境下各自適用的條件不同。&lt;/p>
&lt;h3 id="tui-互動式瀏覽與操作">TUI 互動式瀏覽與操作&lt;/h3>
&lt;p>TUI 工具負責把 git 歷史開成全螢幕的互動介面，讓游標在 commit、檔案、分支之間移動，並即時在側欄顯示對應的 diff。它跟單純印一次 log 的差別在於「可導航」— 線圖、diff、blame 在同一個畫面裡用鍵盤切換，不必反覆重打指令。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>語言&lt;/th>
 &lt;th>一句話定位&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>tig&lt;/code>&lt;/td>
 &lt;td>C&lt;/td>
 &lt;td>老牌穩定的唯讀瀏覽器（log/diff/blame）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>lazygit&lt;/code>&lt;/td>
 &lt;td>Go&lt;/td>
 &lt;td>功能最全的操作中樞&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>gitui&lt;/code>&lt;/td>
 &lt;td>Rust&lt;/td>
 &lt;td>精簡高效、大 repo 友善&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>已經在用 &lt;code>tig&lt;/code> 的人，可以把後兩者當成「補上操作能力」而非替換：只想瀏覽就停在 &lt;code>tig&lt;/code>，要用鍵盤完成 stage/commit/rebase 再加 &lt;code>lazygit&lt;/code>，兩者互補。各工具的責任邊界與選型條件在下面逐一展開。&lt;/p>
&lt;p>&lt;code>tig&lt;/code> 的責任邊界在「看」。它把 git 歷史做成可導航的唯讀視圖，線圖呈現清楚、資源佔用極低，適合只想快速翻歷史與看 diff 的情境。它本身不做版控操作，所以心智負擔小、學習成本低。&lt;/p>
&lt;p>&lt;code>lazygit&lt;/code> 把責任從「看」擴到「改」。互動式 rebase、cherry-pick、stash 管理、衝突解決、stage 到 commit 的完整流程都能用鍵盤完成，等於把終端機 git 操作整碗端進一個畫面。它的代價是功能多帶來的學習曲線與稍高的資源佔用。&lt;/p>
&lt;p>&lt;code>gitui&lt;/code> 與 &lt;code>lazygit&lt;/code> 定位相近但取捨相反，刻意保持精簡並換取效能。日常的 stage、commit、branch、stash、blame、log 都涵蓋，但進階流程的覆蓋度不追求面面俱到。它跟 &lt;code>lazygit&lt;/code> 的深入比較放在後面一節。&lt;/p>
&lt;h3 id="純-log-線圖增強走管線零-tui">純 log 線圖增強（走管線、零 TUI）&lt;/h3>
&lt;p>這類工具不開全螢幕介面，而是改善 &lt;code>git log&lt;/code> 一次性輸出的可讀性，責任是讓線圖更清楚、讓 diff 配色更易讀。它走標準輸出與管線，適合接在腳本裡或當成 alias 隨手用。&lt;/p>
&lt;p>&lt;code>git log --graph&lt;/code> 系列（也就是 &lt;code>glog&lt;/code> / &lt;code>gloga&lt;/code>）是這條路線的起點，零安裝、處處可用。&lt;code>git-graph&lt;/code> 是專門產生比內建更清楚的 ASCII 分支線的工具，當內建線圖在複雜合併歷史下變得難讀時，它把分支著色與排版做得更工整。&lt;code>delta&lt;/code> 是 diff 的語法高亮 pager，嚴格說不算線圖工具，但它把 &lt;code>git log -p&lt;/code> 與 &lt;code>git diff&lt;/code> 的輸出做成帶配色、帶行號、可左右並排的版面，常跟前述工具搭配使用 — 後面 lazygit 的 side-by-side diff 就是靠它。&lt;/p>
&lt;p>這類工具的判讀訊號是：需要的是「印一次看一眼」而非持續導航。它對頻寬特別友善，因為是一次性輸出、不像 TUI 會持續重畫畫面。&lt;/p>
&lt;h3 id="桌面-gui遠端通常排除">桌面 GUI（遠端通常排除）&lt;/h3>
&lt;p>&lt;code>gitk&lt;/code>、&lt;code>git-gui&lt;/code>、&lt;code>gitg&lt;/code> 這類桌面圖形工具依賴 X11 或桌面環境，在純終端機的遠端連線下無法直接執行，或需要繁瑣且吃頻寬的 X11 forwarding。這個排除有明確前提：本篇限定「只有終端機、不能在遠端裝 IDE agent」的最小情境。若情境允許 IDE 的 remote 機制（VS Code Remote-SSH、JetBrains Gateway）或可接受 X11 forwarding，桌面 GUI 仍能遠端使用、體驗也不差 — 這條前提放寬時，本篇的結論會跟著變。把 GUI 列在這裡只為說明邊界：它們解決的是「有桌面或 IDE 通道」的需求，與「只有終端機」是不同場景。&lt;/p>
&lt;h2 id="遠端情境為什麼偏好單一-binary">遠端情境為什麼偏好單一 binary&lt;/h2>
&lt;p>遠端開發選型有一個容易被忽略的隱性約束：工具的安裝依賴。Go 與 Rust 寫的工具（&lt;code>lazygit&lt;/code>、&lt;code>gitui&lt;/code>、&lt;code>git-graph&lt;/code>、&lt;code>delta&lt;/code>）通常編譯成單一 binary，相較需要先裝 runtime 的工具，把檔案搬上去就能用，這是它們在 SSH 情境特別受歡迎的原因之一。&lt;/p>
&lt;p>但「單一 binary」要打兩個折扣，照字面 &lt;code>scp&lt;/code> 可能撞牆。其一，binary 自身不含 runtime，不代表沒有執行期依賴：&lt;code>lazygit&lt;/code> 與 &lt;code>gitui&lt;/code> 執行時都會呼叫系統的 &lt;code>git&lt;/code>，遠端機沒裝 git 就跑不動。其二，Rust 工具（&lt;code>gitui&lt;/code> / &lt;code>delta&lt;/code>）預設動態連結 glibc，不是真正的 static；跨發行版或搬進 alpine 容器（用 musl）會出現 &lt;code>GLIBC not found&lt;/code>，這種情境要下載對應的 musl 靜態建置版。判讀的分界是：能用系統套件管理器自由安裝時，依語言寫成什麼影響不大；環境受限時，除了「一個檔案」還要確認目標機有 &lt;code>git&lt;/code>、且 binary 的 libc 對得上目標系統。這也是為什麼 &lt;code>git log --graph&lt;/code> alias 是最後的保命符 — 它連 binary 都不必搬。&lt;/p></description><content:encoded><![CDATA[<p>git 線圖工具，是把 commit 的分支、合併與時間先後關係畫成終端機可讀圖形的一類程式，承擔的責任是讓開發者在沒有桌面圖形環境的遠端機器上，仍能看清楚 repo 的歷史結構並進行版控操作。在純 SSH 連線的開發情境下，它取代了 IDE 內建的 git 圖形面板，而傳輸的全是文字，所以在頻寬低、只有終端機的條件下依然可用。</p>
<p>最基本的線圖能力內建在 git 本身：<code>git log --oneline --decorate --graph</code> 就會用 ASCII 畫出分支線。Oh My Zsh 的 git plugin 把它包成 <code>glog</code>（當前分支）與 <code>gloga</code>（加 <code>--all</code> 看全分支）兩個 alias。這條 alias 是任何環境都成立的底線 — 即使在一台陌生、不能安裝任何東西的機器上，<code>git log --graph</code> 永遠都在。專用工具要解決的，是這條底線之上的兩個缺口：互動瀏覽的流暢度，以及把「看」與「改」整合在同一畫面。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的 TUI 工具脈絡，聚焦 git 線圖這個版控子題（最常被遠端開發者問到）。</p>
<h2 id="三類工具的職責分工">三類工具的職責分工</h2>
<p>git 線圖工具依承擔的責任分三類，遠端 CLI 情境下各自適用的條件不同。</p>
<h3 id="tui-互動式瀏覽與操作">TUI 互動式瀏覽與操作</h3>
<p>TUI 工具負責把 git 歷史開成全螢幕的互動介面，讓游標在 commit、檔案、分支之間移動，並即時在側欄顯示對應的 diff。它跟單純印一次 log 的差別在於「可導航」— 線圖、diff、blame 在同一個畫面裡用鍵盤切換，不必反覆重打指令。</p>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>語言</th>
          <th>一句話定位</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>tig</code></td>
          <td>C</td>
          <td>老牌穩定的唯讀瀏覽器（log/diff/blame）</td>
      </tr>
      <tr>
          <td><code>lazygit</code></td>
          <td>Go</td>
          <td>功能最全的操作中樞</td>
      </tr>
      <tr>
          <td><code>gitui</code></td>
          <td>Rust</td>
          <td>精簡高效、大 repo 友善</td>
      </tr>
  </tbody>
</table>
<p>已經在用 <code>tig</code> 的人，可以把後兩者當成「補上操作能力」而非替換：只想瀏覽就停在 <code>tig</code>，要用鍵盤完成 stage/commit/rebase 再加 <code>lazygit</code>，兩者互補。各工具的責任邊界與選型條件在下面逐一展開。</p>
<p><code>tig</code> 的責任邊界在「看」。它把 git 歷史做成可導航的唯讀視圖，線圖呈現清楚、資源佔用極低，適合只想快速翻歷史與看 diff 的情境。它本身不做版控操作，所以心智負擔小、學習成本低。</p>
<p><code>lazygit</code> 把責任從「看」擴到「改」。互動式 rebase、cherry-pick、stash 管理、衝突解決、stage 到 commit 的完整流程都能用鍵盤完成，等於把終端機 git 操作整碗端進一個畫面。它的代價是功能多帶來的學習曲線與稍高的資源佔用。</p>
<p><code>gitui</code> 與 <code>lazygit</code> 定位相近但取捨相反，刻意保持精簡並換取效能。日常的 stage、commit、branch、stash、blame、log 都涵蓋，但進階流程的覆蓋度不追求面面俱到。它跟 <code>lazygit</code> 的深入比較放在後面一節。</p>
<h3 id="純-log-線圖增強走管線零-tui">純 log 線圖增強（走管線、零 TUI）</h3>
<p>這類工具不開全螢幕介面，而是改善 <code>git log</code> 一次性輸出的可讀性，責任是讓線圖更清楚、讓 diff 配色更易讀。它走標準輸出與管線，適合接在腳本裡或當成 alias 隨手用。</p>
<p><code>git log --graph</code> 系列（也就是 <code>glog</code> / <code>gloga</code>）是這條路線的起點，零安裝、處處可用。<code>git-graph</code> 是專門產生比內建更清楚的 ASCII 分支線的工具，當內建線圖在複雜合併歷史下變得難讀時，它把分支著色與排版做得更工整。<code>delta</code> 是 diff 的語法高亮 pager，嚴格說不算線圖工具，但它把 <code>git log -p</code> 與 <code>git diff</code> 的輸出做成帶配色、帶行號、可左右並排的版面，常跟前述工具搭配使用 — 後面 lazygit 的 side-by-side diff 就是靠它。</p>
<p>這類工具的判讀訊號是：需要的是「印一次看一眼」而非持續導航。它對頻寬特別友善，因為是一次性輸出、不像 TUI 會持續重畫畫面。</p>
<h3 id="桌面-gui遠端通常排除">桌面 GUI（遠端通常排除）</h3>
<p><code>gitk</code>、<code>git-gui</code>、<code>gitg</code> 這類桌面圖形工具依賴 X11 或桌面環境，在純終端機的遠端連線下無法直接執行，或需要繁瑣且吃頻寬的 X11 forwarding。這個排除有明確前提：本篇限定「只有終端機、不能在遠端裝 IDE agent」的最小情境。若情境允許 IDE 的 remote 機制（VS Code Remote-SSH、JetBrains Gateway）或可接受 X11 forwarding，桌面 GUI 仍能遠端使用、體驗也不差 — 這條前提放寬時，本篇的結論會跟著變。把 GUI 列在這裡只為說明邊界：它們解決的是「有桌面或 IDE 通道」的需求，與「只有終端機」是不同場景。</p>
<h2 id="遠端情境為什麼偏好單一-binary">遠端情境為什麼偏好單一 binary</h2>
<p>遠端開發選型有一個容易被忽略的隱性約束：工具的安裝依賴。Go 與 Rust 寫的工具（<code>lazygit</code>、<code>gitui</code>、<code>git-graph</code>、<code>delta</code>）通常編譯成單一 binary，相較需要先裝 runtime 的工具，把檔案搬上去就能用，這是它們在 SSH 情境特別受歡迎的原因之一。</p>
<p>但「單一 binary」要打兩個折扣，照字面 <code>scp</code> 可能撞牆。其一，binary 自身不含 runtime，不代表沒有執行期依賴：<code>lazygit</code> 與 <code>gitui</code> 執行時都會呼叫系統的 <code>git</code>，遠端機沒裝 git 就跑不動。其二，Rust 工具（<code>gitui</code> / <code>delta</code>）預設動態連結 glibc，不是真正的 static；跨發行版或搬進 alpine 容器（用 musl）會出現 <code>GLIBC not found</code>，這種情境要下載對應的 musl 靜態建置版。判讀的分界是：能用系統套件管理器自由安裝時，依語言寫成什麼影響不大；環境受限時，除了「一個檔案」還要確認目標機有 <code>git</code>、且 binary 的 libc 對得上目標系統。這也是為什麼 <code>git log --graph</code> alias 是最後的保命符 — 它連 binary 都不必搬。</p>
<h2 id="lazygit-與-gitui-的定位差異">lazygit 與 gitui 的定位差異</h2>
<p><code>lazygit</code> 與 <code>gitui</code> 表面功能重疊度很高，選擇依據主要落在以下幾個面向，而非單純「誰比較快」。</p>
<h3 id="技術底色效能與資源">技術底色：效能與資源</h3>
<p><code>gitui</code> 用 Rust 做了非同步架構，在 monorepo、歷史很長、或機器資源有限（老舊伺服器、容器內）時反應更跟手，啟動極快、記憶體佔用低。<code>lazygit</code> 的效能日常夠用，但在 diff 或 log 非常大時偶有卡頓、記憶體佔用較高。這是兩者最常被提到的分水嶺，也直接對應遠端機器的強弱。</p>
<h3 id="功能廣度-vs-功能聚焦">功能廣度 vs 功能聚焦</h3>
<p>這是比效能更根本的定位差異。<code>lazygit</code> 賭功能廣度：互動式 rebase、cherry-pick、stash 管理、衝突解決、自訂指令幾乎都包了，目標是讓人完全不打 git 指令。<code>gitui</code> 賭功能聚焦：涵蓋 stage、commit、branch、stash、blame、log 這些日常約八成的操作，進階流程（複雜 rebase）的覆蓋度刻意保留，設計上傾向不做太重的事。</p>
<h3 id="選型決策邏輯">選型決策邏輯</h3>
<p>兩者背後是兩種不同的使用意圖。傾向 <code>lazygit</code> 的，是想用一個工具取代 git CLI、把版控操作整碗端進終端機，願意付稍高的資源代價換廣度與便利。傾向 <code>gitui</code> 的，是想要一個快速的 git 視窗，主要看狀態、看歷史、做基本提交，要求即開即用、進階操作仍回去打 git 指令。一句話收斂：<code>lazygit</code> 押廣度與便利，<code>gitui</code> 押速度與輕量。</p>
<h3 id="生態與社群">生態與社群</h3>
<p><code>lazygit</code> 社群採用度較高、star 數較多、教學與設定檔分享資源豐富，keybinding 與自訂指令的客製空間大。<code>gitui</code> 社群較小但穩定，定位清晰。對需要大量客製或想參考他人設定的情境，<code>lazygit</code> 的生態是實質優勢。長期依賴前也值得瞄一眼維護活躍度（release 節奏決定 bug 修復速度）— 兩者都在活躍維護，但 star 數高不等於修得快，這跟社群熱度是兩件事。</p>
<h2 id="選型判準遠端-cli-情境">選型判準（遠端 CLI 情境）</h2>
<p>把上述收斂成一條判準鏈，對應遠端開發的機器條件：</p>
<ul>
<li>機器資源充足、想要一個工具搞定所有 git 操作：選 <code>lazygit</code>，把它當操作中樞。</li>
<li>遠端機器較弱、repo 很大、或只想快速看狀態做提交：選 <code>gitui</code>，換取即開即用與低資源。粗略 tripwire：repo 歷史上萬筆 / monorepo、機器 RAM 約 1GB 以下、或 <code>lazygit</code> 開大 diff 時明顯卡頓，就往 <code>gitui</code> 靠。</li>
<li>只需要看歷史與 diff、不在工具裡做版控操作：<code>tig</code> 的唯讀定位最輕量。</li>
<li>環境受限、不能安裝：退回 <code>gloga</code>（<code>git log --graph --all</code>），它在任何 git 環境都成立。</li>
</ul>
<p>這四者能共存。常見的搭配是 <code>tig</code> 看歷史 + <code>lazygit</code> 做操作，兩者互補性高；<code>gitui</code> 與 <code>tig</code> 的瀏覽定位略有重疊，同時留兩個的理由較弱。風險與邊界在於學習成本：操作中樞型工具按一個鍵就改動 repo，初期適合先在拋棄式分支或測試 repo 練手，熟悉後再用到開發分支。</p>
<h2 id="lazygit-上手與-side-by-side-diff">lazygit 上手與 side-by-side diff</h2>
<p><code>lazygit</code> 的介面遵循一個固定心法：左側面板選「對什麼東西操作」、右側看「內容」、底部提示列顯示「當前能按什麼」。底部提示列會隨游標位置動態變化，所以操作不必背全部快捷鍵，迷路時按 <code>?</code> 會叫出當前面板的上下文敏感說明。</p>
<p>入門只需記幾個導航鍵：<code>Tab</code> 或數字 <code>1</code>~<code>5</code> 切換左側面板（Status / Files / Branches / Commits / Stash），方向鍵或 <code>hjkl</code> 在面板與清單內移動，<code>Esc</code> 返回上一層，<code>q</code> 離開。線圖在 <code>Commits</code> 面板（按 <code>4</code>），全分支關係在 <code>Branches</code> 面板（按 <code>3</code>）。三個最常用的日常操作：在 <code>Files</code> 面板用空白鍵 stage / unstage、stage 完按 <code>c</code> 輸入訊息提交、在 <code>Commits</code> 面板選 commit 後右側自動顯示 diff（<code>Enter</code> 進入檔案層級）。</p>
<p>預設的 diff 是單欄 unified（增刪行逐行上下排列）呈現。要做到像 IDE 那樣左右並排（side-by-side）對齊，<code>lazygit</code> 本身沒有內建這個視圖，需要外接 pager。pager 是負責把長輸出分頁、上色顯示的程式（git 預設用 <code>less</code>）；這裡讓 <code>lazygit</code> 把 diff 文字交給外部 pager 上色並重排成並排版面，最常見的搭配是 <code>delta</code>。安裝 <code>delta</code> 後，在 <code>lazygit</code> 設定檔（<code>~/Library/Application Support/lazygit/config.yml</code>，或 <code>~/.config/lazygit/config.yml</code>）指定它當 pager 並開啟並排模式：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln">1</span><span class="cl"><span class="nt">git</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">  </span><span class="nt">pagers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w">    </span>- <span class="nt">colorArg</span><span class="p">:</span><span class="w"> </span><span class="l">always</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">      </span><span class="nt">pager</span><span class="p">:</span><span class="w"> </span><span class="l">delta --dark --paging=never --side-by-side</span></span></span></code></pre></div><p><code>--side-by-side</code> 是讓 <code>delta</code> 左右並排的關鍵旗標，<code>--paging=never</code> 讓 <code>delta</code> 只負責上色與排版、捲動分頁仍由 <code>lazygit</code> 處理。<code>git.pagers</code>（list）是現行 lazygit 的設定鍵；舊版的 <code>git.paging.pager</code>（單數）仍可用，新版啟動時會自動 migrate 成上面的形式並改寫設定檔。在窄螢幕（手機、平板遠端）下，並排會把每欄壓得很窄，這種情境改回垂直單欄反而好讀 — side-by-side 的適用條件是螢幕夠寬。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>選型確定後，後續深入的方向：</p>
<ul>
<li>想完全用鍵盤取代 git 指令：深入 <code>lazygit</code> 的互動式 rebase、cherry-pick 與自訂指令流程。</li>
<li>遠端機器資源吃緊：實測 <code>gitui</code> 在大型 repo 的反應，跟 <code>lazygit</code> 同一個 repo 跑一次比較體感。</li>
<li>diff 配色與並排需求延伸到日常 git：把 <code>delta</code> 設成 git 全域 pager（<code>git config --global core.pager delta</code>），讓 <code>git diff</code> 與 <code>git log -p</code> 也吃到同一套配色。</li>
</ul>
<p>git 線圖在整個遠端 CLI 工具選型中的位置，見 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> — 本篇屬其中的版控子題、與系統監控的 TUI 工具脈絡相承。</p>
]]></content:encoded></item><item><title>Zellij Web Client 外網連線教學</title><link>https://tarrragon.github.io/blog/linux/tools/cli/zellij-remote-web-client/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/zellij-remote-web-client/</guid><description>&lt;p>Zellij Web Client 讓他人透過瀏覽器連線到指定的 Zellij session，承擔的責任是把終端機多工環境分享給沒有 SSH 連線的協作者。本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的多工器分類；zellij 的本機 pane 操作見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">Zellij 多終端機操作指南&lt;/a>、tmux 的持久化基礎見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎&lt;/a>。&lt;/p>
&lt;hr>
&lt;h2 id="安裝-zellij">安裝 Zellij&lt;/h2>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1"># macOS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">brew install zellij
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="c1"># Linux（使用安裝腳本）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">bash &amp;lt;&lt;span class="o">(&lt;/span>curl -L zellij.dev/launch&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">&lt;span class="c1"># Windows（需要支援原生 Windows 的版本，詳見 GitHub Releases）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">&lt;span class="c1"># 從 https://github.com/zellij-org/zellij/releases 下載 Windows 版 .zip&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">9&lt;/span>&lt;span class="cl">&lt;span class="c1"># 解壓後將 zellij.exe 加入 PATH&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>確認版本（需 v0.43.0 以上）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">zellij --version&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="事前準備">事前準備&lt;/h2>
&lt;ul>
&lt;li>一個網域名稱（或固定 IP）&lt;/li>
&lt;li>SSL 憑證（對外連線強制要求）&lt;/li>
&lt;li>SSH 連線能力（如需遠端操作主機）→ 參考 &lt;a href="https://tarrragon.github.io/blog/work-log/ssh-key-%E8%A8%AD%E5%AE%9A%E7%AD%86%E8%A8%98macos-/-linux-/-windows/">SSH Key 設定筆記&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="步驟一取得-ssl-憑證">步驟一：取得 SSL 憑證&lt;/h2>
&lt;p>外網連線強制使用 HTTPS，必須提供 SSL 憑證。&lt;/p>
&lt;blockquote>
&lt;p>取得 Let&amp;rsquo;s Encrypt 憑證的 &lt;code>certbot&lt;/code> 指令需真實網域、本機未實機驗證；自簽憑證的 &lt;code>openssl&lt;/code> 指令、以及 zellij web server 啟停與 token 管理已在 localhost 實機驗證。&lt;/p>&lt;/blockquote>
&lt;h3 id="使用-lets-encrypt免費推薦">使用 Let&amp;rsquo;s Encrypt（免費，推薦）&lt;/h3>
&lt;p>需要先安裝 &lt;code>certbot&lt;/code>：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1"># macOS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">brew install certbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="c1"># Ubuntu / Debian&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">sudo apt install certbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">&lt;span class="c1"># Windows（使用 Chocolatey）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">choco install certbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">9&lt;/span>&lt;span class="cl">&lt;span class="c1"># 或使用 win-acme（Windows 原生替代方案）：https://www.win-acme.com/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>申請憑證（將 &lt;code>your-domain.com&lt;/code> 換成實際網域）：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">sudo certbot certonly --standalone -d your-domain.com&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>Windows 上若未使用 WSL，建議改用 &lt;a href="https://www.win-acme.com/">win-acme&lt;/a>，操作更直覺。&lt;/p>&lt;/blockquote>
&lt;p>憑證預設存放在：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl"># macOS / Linux
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">/etc/letsencrypt/live/your-domain.com/fullchain.pem # 憑證
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">/etc/letsencrypt/live/your-domain.com/privkey.pem # 私鑰
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"># Windows（certbot）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">C:\Certbot\live\your-domain.com\fullchain.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">C:\Certbot\live\your-domain.com\privkey.pem&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="使用自簽憑證測試用">使用自簽憑證（測試用）&lt;/h3>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days &lt;span class="m">365&lt;/span> -nodes&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>注意：自簽憑證會讓瀏覽器在連線時顯示安全警告，於測試環境手動選擇繼續即可；正式對外服務改用上面的 Let&amp;rsquo;s Encrypt 憑證。&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="步驟二開放防火牆-port">步驟二：開放防火牆 Port&lt;/h2>
&lt;p>Zellij web server 預設只綁本機 &lt;code>127.0.0.1:8082&lt;/code>，要讓外網連入必須顯式綁到對外位址（見步驟四的 &lt;code>--ip 0.0.0.0&lt;/code>）並開放對應 port。本教學以 port &lt;code>3000&lt;/code> 為例（port 可自選），需對外開放這個 port：&lt;/p></description><content:encoded><![CDATA[<p>Zellij Web Client 讓他人透過瀏覽器連線到指定的 Zellij session，承擔的責任是把終端機多工環境分享給沒有 SSH 連線的協作者。本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的多工器分類；zellij 的本機 pane 操作見 <a href="/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">Zellij 多終端機操作指南</a>、tmux 的持久化基礎見 <a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</p>
<hr>
<h2 id="安裝-zellij">安裝 Zellij</h2>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># macOS</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">brew install zellij
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># Linux（使用安裝腳本）</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">bash &lt;<span class="o">(</span>curl -L zellij.dev/launch<span class="o">)</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"># Windows（需要支援原生 Windows 的版本，詳見 GitHub Releases）</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="c1"># 從 https://github.com/zellij-org/zellij/releases 下載 Windows 版 .zip</span>
</span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="c1"># 解壓後將 zellij.exe 加入 PATH</span></span></span></code></pre></div><p>確認版本（需 v0.43.0 以上）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">zellij --version</span></span></code></pre></div><hr>
<h2 id="事前準備">事前準備</h2>
<ul>
<li>一個網域名稱（或固定 IP）</li>
<li>SSL 憑證（對外連線強制要求）</li>
<li>SSH 連線能力（如需遠端操作主機）→ 參考 <a href="https://tarrragon.github.io/blog/work-log/ssh-key-%E8%A8%AD%E5%AE%9A%E7%AD%86%E8%A8%98macos-/-linux-/-windows/">SSH Key 設定筆記</a></li>
</ul>
<hr>
<h2 id="步驟一取得-ssl-憑證">步驟一：取得 SSL 憑證</h2>
<p>外網連線強制使用 HTTPS，必須提供 SSL 憑證。</p>
<blockquote>
<p>取得 Let&rsquo;s Encrypt 憑證的 <code>certbot</code> 指令需真實網域、本機未實機驗證；自簽憑證的 <code>openssl</code> 指令、以及 zellij web server 啟停與 token 管理已在 localhost 實機驗證。</p></blockquote>
<h3 id="使用-lets-encrypt免費推薦">使用 Let&rsquo;s Encrypt（免費，推薦）</h3>
<p>需要先安裝 <code>certbot</code>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># macOS</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">brew install certbot
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># Ubuntu / Debian</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">sudo apt install certbot
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"># Windows（使用 Chocolatey）</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">choco install certbot
</span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="c1"># 或使用 win-acme（Windows 原生替代方案）：https://www.win-acme.com/</span></span></span></code></pre></div><p>申請憑證（將 <code>your-domain.com</code> 換成實際網域）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">sudo certbot certonly --standalone -d your-domain.com</span></span></code></pre></div><blockquote>
<p>Windows 上若未使用 WSL，建議改用 <a href="https://www.win-acme.com/">win-acme</a>，操作更直覺。</p></blockquote>
<p>憑證預設存放在：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl"># macOS / Linux
</span></span><span class="line"><span class="ln">2</span><span class="cl">/etc/letsencrypt/live/your-domain.com/fullchain.pem   # 憑證
</span></span><span class="line"><span class="ln">3</span><span class="cl">/etc/letsencrypt/live/your-domain.com/privkey.pem      # 私鑰
</span></span><span class="line"><span class="ln">4</span><span class="cl">
</span></span><span class="line"><span class="ln">5</span><span class="cl"># Windows（certbot）
</span></span><span class="line"><span class="ln">6</span><span class="cl">C:\Certbot\live\your-domain.com\fullchain.pem
</span></span><span class="line"><span class="ln">7</span><span class="cl">C:\Certbot\live\your-domain.com\privkey.pem</span></span></code></pre></div><h3 id="使用自簽憑證測試用">使用自簽憑證（測試用）</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days <span class="m">365</span> -nodes</span></span></code></pre></div><blockquote>
<p>注意：自簽憑證會讓瀏覽器在連線時顯示安全警告，於測試環境手動選擇繼續即可；正式對外服務改用上面的 Let&rsquo;s Encrypt 憑證。</p></blockquote>
<hr>
<h2 id="步驟二開放防火牆-port">步驟二：開放防火牆 Port</h2>
<p>Zellij web server 預設只綁本機 <code>127.0.0.1:8082</code>，要讓外網連入必須顯式綁到對外位址（見步驟四的 <code>--ip 0.0.0.0</code>）並開放對應 port。本教學以 port <code>3000</code> 為例（port 可自選），需對外開放這個 port：</p>
<blockquote>
<p>以下防火牆指令（<code>ufw</code> / <code>pf</code> / Windows Defender）依各平台官方用法、環境特定、本機未實機驗證。</p></blockquote>
<h3 id="linuxufw">Linux（ufw）</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">sudo ufw allow 3000/tcp
</span></span><span class="line"><span class="ln">2</span><span class="cl">
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1"># 或指定來源 IP（更安全）</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">sudo ufw allow from 1.2.3.4 to any port <span class="m">3000</span></span></span></code></pre></div><h3 id="macos">macOS</h3>
<p>macOS 內建的防火牆是應用程式層級的，無法直接開放特定 port。通常有兩種做法：</p>
<ol>
<li><strong>系統偏好設定</strong> → 網路 → 防火牆 → 確認沒有擋住 Zellij</li>
<li><strong>使用 <code>pf</code></strong>（進階，通常不需要）：</li>
</ol>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 新增規則到 /etc/pf.conf</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;pass in proto tcp from any to any port 3000&#34;</span> <span class="p">|</span> sudo tee -a /etc/pf.conf
</span></span><span class="line"><span class="ln">3</span><span class="cl">sudo pfctl -f /etc/pf.conf</span></span></code></pre></div><blockquote>
<p>macOS 預設防火牆通常不會擋住主動開啟的服務，多數情況下不需要額外設定。如果是在家用網路，記得在路由器設定 port forwarding。</p></blockquote>
<h3 id="windows">Windows</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="ln">1</span><span class="cl"><span class="c"># 使用 Windows Defender Firewall（以系統管理員執行 PowerShell）</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">New-NetFirewallRule</span> <span class="n">-DisplayName</span> <span class="s2">&#34;Zellij Web&#34;</span> <span class="n">-Direction</span> <span class="n">Inbound</span> <span class="n">-Protocol</span> <span class="n">TCP</span> <span class="n">-LocalPort</span> <span class="mf">3000</span> <span class="n">-Action</span> <span class="n">Allow</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c"># 或限制來源 IP（更安全）</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nb">New-NetFirewallRule</span> <span class="n">-DisplayName</span> <span class="s2">&#34;Zellij Web&#34;</span> <span class="n">-Direction</span> <span class="n">Inbound</span> <span class="n">-Protocol</span> <span class="n">TCP</span> <span class="n">-LocalPort</span> <span class="mf">3000</span> <span class="n">-RemoteAddress</span> <span class="mf">1.2</span><span class="p">.</span><span class="py">3</span><span class="p">.</span><span class="py">4</span> <span class="n">-Action</span> <span class="n">Allow</span></span></span></code></pre></div><blockquote>
<p>Zellij 已支援原生 Windows，直接在 PowerShell 或 Windows Terminal 中執行即可。</p></blockquote>
<p>如果是雲端主機（AWS、GCP、Azure 等），記得同步在後台的安全群組開放 port 3000。</p>
<hr>
<h2 id="步驟三啟動-zellij">步驟三：啟動 Zellij</h2>
<p>先啟動一個 Zellij session：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">zellij</span></span></code></pre></div><hr>
<h2 id="步驟四啟動-web-server">步驟四：啟動 Web Server</h2>
<p>在 Zellij 內，按 <code>Ctrl+o</code> 然後按 <code>s</code> 開啟 share plugin，從 UI 啟動 web server。</p>
<p>或直接用 CLI 啟動並指定憑證：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">zellij web <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  --ip 0.0.0.0 --port <span class="m">3000</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  --cert /etc/letsencrypt/live/your-domain.com/fullchain.pem <span class="se">\
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="se"></span>  --key /etc/letsencrypt/live/your-domain.com/privkey.pem</span></span></code></pre></div><p>背景執行（daemon 模式）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">zellij web -d <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  --ip 0.0.0.0 --port <span class="m">3000</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  --cert /path/to/cert.pem <span class="se">\
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="se"></span>  --key /path/to/key.pem</span></span></code></pre></div><p>停止 web server：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">zellij web --stop</span></span></code></pre></div><p>確認 web server 執行狀態：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">zellij web --status</span></span></code></pre></div><p>Zellij web 預設綁 <code>127.0.0.1:8082</code>、只接受本機連線；對外服務必須用 <code>--ip 0.0.0.0</code> 顯式綁到對外位址、並用 <code>--port</code> 指定埠（本教學用 <code>3000</code>）。改用其他 port 時把 <code>--port</code> 一併調整（例如 <code>--port 8443</code>），防火牆規則也要同步改成該 port。</p>
<hr>
<h2 id="步驟五產生登入-token">步驟五：產生登入 Token</h2>
<p>為了安全，別人連線前需要用 token 登入，<strong>token 只會顯示一次</strong>，請立即複製。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">zellij web --create-token</span></span></code></pre></div><p>或在 share plugin（<code>Ctrl+o</code> + <code>s</code>）裡產生。</p>
<p>將 token 分享給要連線的人。</p>
<hr>
<h2 id="步驟六連線">步驟六：連線</h2>
<p>對方在瀏覽器輸入：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">https://your-domain.com:3000/實際-session-名稱</span></span></code></pre></div><p>首次連線會要求輸入 token，驗證後即可進入 session。若連線後畫面沒有回應，多半是 port 未對外開放，確認防火牆與雲端主機安全群組是否放行該 port。</p>
<hr>
<h2 id="連線後的行為">連線後的行為</h2>
<table>
  <thead>
      <tr>
          <th>情況</th>
          <th>結果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Session 正在執行</td>
          <td>直接 attach 進去</td>
      </tr>
      <tr>
          <td>Session 曾存在但已結束</td>
          <td>Zellij 自動重建（resurrection）</td>
      </tr>
      <tr>
          <td>全新 session 名稱</td>
          <td>建立新的 session</td>
      </tr>
  </tbody>
</table>
<p>多人連線時，每個人都有自己的游標，可以同時操作。</p>
<hr>
<h2 id="安全建議">安全建議</h2>
<ul>
<li>Token 用完後記得撤銷：從 share plugin 或 CLI 管理</li>
<li>盡量限制開放的來源 IP，避免對全網開放</li>
<li>不建議長期開啟 web server，用完就關</li>
<li>撤銷 token 時，所有對應的 session token 也會一併失效</li>
</ul>
<hr>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>zellij 的本機 pane 操作（查看佈局、讀取其他 pane、調整大小）：<a href="/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">Zellij 多終端機操作指南</a>。</li>
<li>不需要瀏覽器、純 SSH 的多工器持久化：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>多工器在整個遠端工具選型中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>Zellij 多終端機操作指南</title><link>https://tarrragon.github.io/blog/linux/tools/cli/zellij-pane/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/zellij-pane/</guid><description>&lt;p>Zellij 是終端機多工器，能在單一畫面分割多個 pane。本文整理透過 zellij CLI 查看佈局、讀取其他 pane 內容、調整 pane 大小的操作方式 — CLI 介面既適合遠端腳本化操作，也適合搭配看不到螢幕的 AI 工具（例如 Claude）在終端機協作。本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的多工器分類；瀏覽器遠端連線見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">Zellij Web Client 外網連線教學&lt;/a>、tmux 的持久化基礎見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎&lt;/a>。&lt;/p>
&lt;h2 id="查看整體佈局">查看整體佈局&lt;/h2>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">zellij action dump-layout&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>會輸出完整的 KDL 格式佈局，包含所有 pane 的大小、位置、指令等資訊。&lt;/p>
&lt;h2 id="讀取其他終端機-pane-的內容">讀取其他終端機 pane 的內容&lt;/h2>
&lt;p>Claude 無法直接看到螢幕，但可以透過以下步驟讀取其他 pane 的輸出：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="c1"># 1. 切換 focus 到目標 pane（focus-next-pane 會依序切換）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl">&lt;span class="c1"># 2. dump 該 pane 的螢幕內容到檔案&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">&lt;span class="c1"># 3. 切回原本的 pane&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">&lt;span class="c1"># 4. 讀取 dump 的檔案&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">zellij action focus-next-pane &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">&lt;span class="se">&lt;/span>zellij action focus-next-pane &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">&lt;span class="se">&lt;/span>zellij action dump-screen /tmp/zellij-pane-output.txt &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">&lt;span class="se">&lt;/span>zellij action focus-previous-pane &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">&lt;span class="se">&lt;/span>zellij action focus-previous-pane&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>dump-screen&lt;/code> 只 dump 當前可見的內容&lt;/li>
&lt;li>&lt;code>dump-screen -f&lt;/code> 會包含完整的 scrollback 歷史&lt;/li>
&lt;li>切換次數取決於目標 pane 的位置，需根據 &lt;code>dump-layout&lt;/code> 的結果判斷&lt;/li>
&lt;/ul>
&lt;h2 id="調整-pane-大小">調整 pane 大小&lt;/h2>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1"># 縮小當前 pane（向左縮）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">zellij action resize decrease right
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="c1"># 放大當前 pane（向右擴）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">zellij action resize increase right
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">&lt;span class="c1"># 每次約改變 ~4-5% 寬度，可用迴圈批次調整&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">&lt;span class="k">for&lt;/span> i in &lt;span class="k">$(&lt;/span>seq &lt;span class="m">1&lt;/span> 3&lt;span class="k">)&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span> zellij action resize decrease right&lt;span class="p">;&lt;/span> &lt;span class="k">done&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每次的步長是經驗值、不是固定比例 — zellij 的 resize 幅度依版本與 pane 當前尺寸而定，迴圈次數需視 &lt;code>dump-layout&lt;/code> 的結果微調。&lt;/p>
&lt;h2 id="使用者的-resize-快捷鍵">使用者的 Resize 快捷鍵&lt;/h2>
&lt;ol>
&lt;li>&lt;code>Ctrl + n&lt;/code> 進入 Resize 模式&lt;/li>
&lt;li>&lt;code>h&lt;/code>/&lt;code>l&lt;/code> 或方向鍵調整大小&lt;/li>
&lt;li>&lt;code>Esc&lt;/code> 退出&lt;/li>
&lt;/ol>
&lt;p>注意：在 Claude 互動式程式內，快捷鍵可能被吃掉，建議讓 Claude 用指令操作。&lt;/p>
&lt;h2 id="注意事項">注意事項&lt;/h2>
&lt;ul>
&lt;li>&lt;code>Ctrl + p&lt;/code> 進入 Pane 模式，其中 &lt;code>r&lt;/code> 用於在右邊新開 pane（調整大小是 &lt;code>Ctrl + n&lt;/code> 的 Resize 模式）&lt;/li>
&lt;li>使用者的典型佈局：左側 Claude（~35%），右側上下兩個終端機&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>把 session 分享給沒有 SSH 連線的協作者（瀏覽器連入）：&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">Zellij Web Client 外網連線教學&lt;/a>。&lt;/li>
&lt;li>純 SSH 的多工器持久化與 tmux 對照：&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎&lt;/a>。&lt;/li>
&lt;li>多工器在遠端工具選型中的定位：&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a>。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>Zellij 是終端機多工器，能在單一畫面分割多個 pane。本文整理透過 zellij CLI 查看佈局、讀取其他 pane 內容、調整 pane 大小的操作方式 — CLI 介面既適合遠端腳本化操作，也適合搭配看不到螢幕的 AI 工具（例如 Claude）在終端機協作。本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的多工器分類；瀏覽器遠端連線見 <a href="/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">Zellij Web Client 外網連線教學</a>、tmux 的持久化基礎見 <a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</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="ln">1</span><span class="cl">zellij action dump-layout</span></span></code></pre></div><p>會輸出完整的 KDL 格式佈局，包含所有 pane 的大小、位置、指令等資訊。</p>
<h2 id="讀取其他終端機-pane-的內容">讀取其他終端機 pane 的內容</h2>
<p>Claude 無法直接看到螢幕，但可以透過以下步驟讀取其他 pane 的輸出：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1"># 1. 切換 focus 到目標 pane（focus-next-pane 會依序切換）</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1"># 2. dump 該 pane 的螢幕內容到檔案</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1"># 3. 切回原本的 pane</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1"># 4. 讀取 dump 的檔案</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">zellij action focus-next-pane <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="se"></span>zellij action focus-next-pane <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="se"></span>zellij action dump-screen /tmp/zellij-pane-output.txt <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="se"></span>zellij action focus-previous-pane <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="se"></span>zellij action focus-previous-pane</span></span></code></pre></div><ul>
<li><code>dump-screen</code> 只 dump 當前可見的內容</li>
<li><code>dump-screen -f</code> 會包含完整的 scrollback 歷史</li>
<li>切換次數取決於目標 pane 的位置，需根據 <code>dump-layout</code> 的結果判斷</li>
</ul>
<h2 id="調整-pane-大小">調整 pane 大小</h2>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 縮小當前 pane（向左縮）</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">zellij action resize decrease right
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># 放大當前 pane（向右擴）</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">zellij action resize increase right
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"># 每次約改變 ~4-5% 寬度，可用迴圈批次調整</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="k">for</span> i in <span class="k">$(</span>seq <span class="m">1</span> 3<span class="k">)</span><span class="p">;</span> <span class="k">do</span> zellij action resize decrease right<span class="p">;</span> <span class="k">done</span></span></span></code></pre></div><p>每次的步長是經驗值、不是固定比例 — zellij 的 resize 幅度依版本與 pane 當前尺寸而定，迴圈次數需視 <code>dump-layout</code> 的結果微調。</p>
<h2 id="使用者的-resize-快捷鍵">使用者的 Resize 快捷鍵</h2>
<ol>
<li><code>Ctrl + n</code> 進入 Resize 模式</li>
<li><code>h</code>/<code>l</code> 或方向鍵調整大小</li>
<li><code>Esc</code> 退出</li>
</ol>
<p>注意：在 Claude 互動式程式內，快捷鍵可能被吃掉，建議讓 Claude 用指令操作。</p>
<h2 id="注意事項">注意事項</h2>
<ul>
<li><code>Ctrl + p</code> 進入 Pane 模式，其中 <code>r</code> 用於在右邊新開 pane（調整大小是 <code>Ctrl + n</code> 的 Resize 模式）</li>
<li>使用者的典型佈局：左側 Claude（~35%），右側上下兩個終端機</li>
</ul>
<hr>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>把 session 分享給沒有 SSH 連線的協作者（瀏覽器連入）：<a href="/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">Zellij Web Client 外網連線教學</a>。</li>
<li>純 SSH 的多工器持久化與 tmux 對照：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>多工器在遠端工具選型中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item></channel></rss>