<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>OSC 3008 on KnightLi的博客</title>
        <link>https://knightli.com/zh-tw/tags/osc-3008/</link>
        <description>Recent content in OSC 3008 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Tue, 23 Jun 2026 16:58:23 +0800</lastBuildDate><atom:link href="https://knightli.com/zh-tw/tags/osc-3008/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>OSC 3008 是什麼：systemd 終端上下文信令和亂碼排障</title>
        <link>https://knightli.com/zh-tw/2026/06/23/osc-3008-systemd-terminal-context-explained/</link>
        <pubDate>Tue, 23 Jun 2026 16:58:23 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/06/23/osc-3008-systemd-terminal-context-explained/</guid>
        <description>&lt;p&gt;OSC 3008，全名是 &lt;code&gt;Hierarchical Context Signalling&lt;/code&gt;，是 UAPI Group 規範中的 UAPI.15。它定義了一組新的終端控制序列，讓程式可以把目前終端裡的「上下文層級」告訴終端模擬器。&lt;/p&gt;
&lt;p&gt;簡單說，它想解決的是一個現代 Linux 終端裡越來越常見的問題：你到底在哪一層？&lt;/p&gt;
&lt;p&gt;比如你可能從本機 SSH 到伺服器，再進入容器，隨後用 &lt;code&gt;run0&lt;/code&gt; 或類似工具提權執行命令。對使用者來說，這是一個連續的終端視窗；但對終端模擬器來說，如果沒有額外信號，它很難準確知道目前輸出來自本機、遠端、容器，還是提權後的命令。&lt;/p&gt;
&lt;p&gt;OSC 3008 就是為這類場景設計的。UAPI 官方規範說明，它允許終端模擬器追蹤螢幕上目前內容的上下文層級。systemd 也已經提供了對應實作，腳本名通常是 &lt;code&gt;80-systemd-osc-context.sh&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;官方規範：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UAPI.15 OSC 3008: Hierarchical Context Signalling：https://uapi-group.org/specifications/specs/osc_context/&lt;/li&gt;
&lt;li&gt;systemd &lt;code&gt;80-systemd-osc-context.sh&lt;/code&gt;：https://github.com/systemd/systemd/blob/main/profile.d/80-systemd-osc-context.sh&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;為什麼需要-osc-3008&#34;&gt;為什麼需要 OSC 3008
&lt;/h2&gt;&lt;p&gt;傳統終端只負責顯示程式輸出，最多透過標題、顏色、提示字元來輔助區分環境。問題是，現代終端會話經常是多層嵌套的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;本機 shell -&amp;gt; SSH 遠端伺服器 -&amp;gt; Docker/Podman/systemd-nspawn 容器 -&amp;gt; run0 提權命令
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果只靠 &lt;code&gt;PS1&lt;/code&gt; 提示字元，很容易遇到幾個問題：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;提示字元只能表示目前 shell，很難完整表達嵌套層級。&lt;/li&gt;
&lt;li&gt;不同 shell、不同發行版、不同使用者配置會互相覆蓋。&lt;/li&gt;
&lt;li&gt;終端模擬器無法可靠知道哪些輸出屬於哪個上下文。&lt;/li&gt;
&lt;li&gt;某些控制序列在不相容終端裡會直接變成亂碼。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;OSC 3008 提供了一種更結構化的方式：由實際進入上下文的程式送出 &lt;code&gt;start&lt;/code&gt; 序列，由退出上下文的程式送出 &lt;code&gt;end&lt;/code&gt; 序列。終端模擬器解析後，就能知道目前輸出屬於哪個上下文節點。&lt;/p&gt;
&lt;h2 id=&#34;它傳遞哪些資訊&#34;&gt;它傳遞哪些資訊
&lt;/h2&gt;&lt;p&gt;OSC 3008 本質上是一組 OSC 轉義序列。規範裡定義了兩類核心命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OSC &amp;#34;3008;start=...&amp;#34; ST
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OSC &amp;#34;3008;end=...&amp;#34; ST
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;start&lt;/code&gt; 表示一個上下文開始、更新或重新成為目前上下文；&lt;code&gt;end&lt;/code&gt; 表示一個上下文結束。&lt;/p&gt;
&lt;p&gt;每個上下文可以帶一些元資料欄位。常見欄位包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;type=&lt;/code&gt;：上下文類型，例如 &lt;code&gt;shell&lt;/code&gt;、&lt;code&gt;command&lt;/code&gt;、&lt;code&gt;remote&lt;/code&gt;、&lt;code&gt;container&lt;/code&gt;、&lt;code&gt;vm&lt;/code&gt;、&lt;code&gt;elevate&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user=&lt;/code&gt;：送出序列的 UNIX 使用者名稱。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hostname=&lt;/code&gt;：主機名稱。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;machineid=&lt;/code&gt;：來自 &lt;code&gt;/etc/machine-id&lt;/code&gt; 的機器 ID。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bootid=&lt;/code&gt;：來自 &lt;code&gt;/proc/sys/kernel/random/boot_id&lt;/code&gt; 的啟動 ID。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pid=&lt;/code&gt;：送出序列的程序 PID。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;comm=&lt;/code&gt;：程序名稱。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cwd=&lt;/code&gt;：目前工作目錄，主要用於 &lt;code&gt;shell&lt;/code&gt; 或 &lt;code&gt;command&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cmdline=&lt;/code&gt;：被互動式呼叫的命令列。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container=&lt;/code&gt;、&lt;code&gt;vm=&lt;/code&gt;：容器或虛擬機名稱。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;targetuser=&lt;/code&gt;、&lt;code&gt;targethost=&lt;/code&gt;：目標使用者或遠端目標主機。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這些欄位不是為了給使用者直接看，而是給終端模擬器解析。支援得好的終端會「吃掉」這些控制序列，並用它們改善介面體驗。&lt;/p&gt;
&lt;h2 id=&#34;能帶來什麼好處&#34;&gt;能帶來什麼好處
&lt;/h2&gt;&lt;p&gt;如果終端模擬器支援 OSC 3008，它可以做不少更聰明的事情。&lt;/p&gt;
&lt;p&gt;第一，標記不同上下文的輸出。比如容器內輸出、提權命令輸出、遠端 SSH 輸出，可以有不同的背景、邊框或提示。&lt;/p&gt;
&lt;p&gt;第二，顯示層級麵包屑。終端可以知道目前大致處於：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;本機 -&amp;gt; 遠端主機 -&amp;gt; 容器 -&amp;gt; root 命令
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這比單靠視窗標題或 &lt;code&gt;PS1&lt;/code&gt; 更穩定。&lt;/p&gt;
&lt;p&gt;第三，輔助視窗標題、標籤頁和右鍵選單。終端可以根據目前上下文更新標籤頁標題，也可以在某段輸出上提供「在同一目錄打開 shell」之類操作。&lt;/p&gt;
&lt;p&gt;第四，減少誤操作。比如目前已經進入生產環境容器並切到 root，終端可以做更醒目的提示，降低在錯誤環境執行危險命令的機率。&lt;/p&gt;
&lt;h2 id=&#34;systemd-是怎麼接入的&#34;&gt;systemd 是怎麼接入的
&lt;/h2&gt;&lt;p&gt;systemd 的實作主要在 &lt;code&gt;80-systemd-osc-context.sh&lt;/code&gt; 裡。這個腳本會透過 profile 機制載入，並在 Bash 互動環境裡設定相關函數和提示字元鉤子。&lt;/p&gt;
&lt;p&gt;常見路徑可能是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/etc/profile.d/80-systemd-osc-context.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/lib/systemd/profile.d/80-systemd-osc-context.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不同發行版的實際位置可能不同。systemd 原始碼中的註解說明，這個檔案會透過 &lt;code&gt;systemd-tmpfiles&lt;/code&gt; 啟用，把它連結到 &lt;code&gt;/etc/profile.d/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;在 Bash 裡，它會使用類似這些函數名：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;__systemd_osc_context_escape
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;__systemd_osc_context_common
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;__systemd_osc_context_precmdline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;同時還會影響 &lt;code&gt;PROMPT_COMMAND&lt;/code&gt; 和 &lt;code&gt;PS0&lt;/code&gt;。其中 &lt;code&gt;PS0&lt;/code&gt; 會在 Bash 讀取命令後、執行命令前展開，這也是為什麼有些不相容終端會在每次執行命令前看到一串很長的 &lt;code&gt;3008;start=...&lt;/code&gt; 文字。&lt;/p&gt;
&lt;h2 id=&#34;為什麼有些終端會顯示亂碼&#34;&gt;為什麼有些終端會顯示亂碼
&lt;/h2&gt;&lt;p&gt;正常情況下，終端模擬器應該把 OSC 3008 當作控制序列解析掉，不直接顯示。&lt;/p&gt;
&lt;p&gt;但如果終端不認識 OSC 3008，或者中間層把控制字元過濾、轉義、打散了，就可能把原始內容顯示出來。常見場景包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;舊版終端模擬器。&lt;/li&gt;
&lt;li&gt;尚未適配 OSC 3008 的 SSH 客戶端。&lt;/li&gt;
&lt;li&gt;Web 堡壘機或瀏覽器終端，例如某些 Apache Guacamole 環境。&lt;/li&gt;
&lt;li&gt;Emacs &lt;code&gt;term.el&lt;/code&gt;、串口終端、&lt;code&gt;minicom&lt;/code&gt; 等對 OSC 支援有限的環境。&lt;/li&gt;
&lt;li&gt;多層轉發後控制序列被中間層破壞。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這時你可能會看到類似下面的內容：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;]3008;start=...;type=command;cwd=...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或者看到包含 &lt;code&gt;machineid=&lt;/code&gt;、&lt;code&gt;bootid=&lt;/code&gt;、&lt;code&gt;pid=&lt;/code&gt;、&lt;code&gt;comm=&lt;/code&gt;、&lt;code&gt;cwd=&lt;/code&gt; 的長字串。它們不是普通程式輸出，而是本來應該由終端處理的上下文信號。&lt;/p&gt;
&lt;h2 id=&#34;怎麼判斷是不是-osc-3008&#34;&gt;怎麼判斷是不是 OSC 3008
&lt;/h2&gt;&lt;p&gt;可以先看三個線索。&lt;/p&gt;
&lt;p&gt;第一，亂碼裡是否有 &lt;code&gt;3008;start=&lt;/code&gt; 或 &lt;code&gt;3008;end=&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;第二，亂碼是否經常出現在命令執行前後，尤其是每次按 Enter 執行命令時都出現。&lt;/p&gt;
&lt;p&gt;第三，目前系統是否載入了 systemd 的 OSC 函數：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;declare&lt;/span&gt; -f __systemd_osc_context_precmdline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果能看到函數定義，說明目前 shell 裡確實載入了相關邏輯。&lt;/p&gt;
&lt;p&gt;還可以檢查 profile 檔案：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l /etc/profile.d/80-systemd-osc-context.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果這個路徑存在，並且你的終端正好不支援 OSC 3008，亂碼大機率就來自這裡。&lt;/p&gt;
&lt;h2 id=&#34;臨時規避辦法&#34;&gt;臨時規避辦法
&lt;/h2&gt;&lt;p&gt;如果只是目前會話看著難受，可以先在 shell 裡把相關函數覆蓋掉，並清空 &lt;code&gt;PS0&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;__systemd_osc_context_precmdline&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; :&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;__systemd_osc_context_common&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; :&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;__systemd_osc_context_escape&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; :&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PS0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果想只在 SSH 會話中自動處理，可以放到 &lt;code&gt;~/.bashrc&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SSH_CLIENT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SSH_TTY&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SSH_CONNECTION&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;declare&lt;/span&gt; -f __systemd_osc_context_precmdline &amp;gt;/dev/null&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        __systemd_osc_context_precmdline&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; :&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        __systemd_osc_context_common&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; :&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        __systemd_osc_context_escape&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; :&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;PS0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這種方式影響範圍比較小，不會動系統級 profile 檔案，也方便隨時刪除。&lt;/p&gt;
&lt;h2 id=&#34;系統級禁用方法&#34;&gt;系統級禁用方法
&lt;/h2&gt;&lt;p&gt;如果你確認這台機器的終端環境普遍不相容 OSC 3008，可以考慮系統級禁用。但這一步要謹慎，因為它會影響所有使用者和所有登入會話。&lt;/p&gt;
&lt;p&gt;systemd 腳本註解裡給出的思路是：移除 &lt;code&gt;/etc/profile.d/80-systemd-osc-context.sh&lt;/code&gt; 符號連結，並 mask 對應的 tmpfiles 片段，避免之後被重新建立。&lt;/p&gt;
&lt;p&gt;可以參考這樣的命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -h /etc/profile.d/80-systemd-osc-context.sh &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -v /etc/profile.d/80-systemd-osc-context.sh &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ln -s /dev/null /etc/tmpfiles.d/20-systemd-osc-context.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意，這比只改 &lt;code&gt;~/.bashrc&lt;/code&gt; 更重。建議先用臨時方案確認問題確實由 OSC 3008 引起，再決定是否做系統級禁用。&lt;/p&gt;
&lt;p&gt;如果只是個人 SSH 客戶端不相容，不建議直接改系統級配置。優先改自己的 &lt;code&gt;~/.bashrc&lt;/code&gt;，或者在 SSH 客戶端裡設定登入後執行清理命令。&lt;/p&gt;
&lt;h2 id=&#34;應該升級終端還是禁用-osc-3008&#34;&gt;應該升級終端還是禁用 OSC 3008
&lt;/h2&gt;&lt;p&gt;如果你使用的是現代終端，並且它已經支援 OSC 3008，最好保留這個能力。它未來可能會讓遠端 shell、容器、虛擬機和提權命令的上下文展示更清楚。&lt;/p&gt;
&lt;p&gt;如果你的實際環境是堡壘機、串口、老舊終端或 Web SSH，而且短期內沒法升級客戶端，那麼遮蔽它更實際。畢竟對大多數維運場景來說，乾淨可讀的終端輸出比上下文增強更重要。&lt;/p&gt;
&lt;p&gt;可以按這個順序處理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;能升級終端模擬器，就先升級。&lt;/li&gt;
&lt;li&gt;不能升級，但只影響自己，就在 &lt;code&gt;~/.bashrc&lt;/code&gt; 或客戶端登入後命令裡遮蔽。&lt;/li&gt;
&lt;li&gt;全機器都受影響，再考慮移除 &lt;code&gt;/etc/profile.d/80-systemd-osc-context.sh&lt;/code&gt; 連結並 mask tmpfiles 片段。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;簡短結論&#34;&gt;簡短結論
&lt;/h2&gt;&lt;p&gt;OSC 3008 不是病毒，也不是普通程式亂輸出。它是 UAPI.15 定義的終端上下文信令，目標是讓終端理解 shell、SSH、容器、虛擬機、提權命令之間的層級關係。&lt;/p&gt;
&lt;p&gt;真正的問題通常出在相容性：支援它的終端會自動解析，不支援的終端就可能把控制序列當成亂碼顯示。&lt;/p&gt;
&lt;p&gt;如果你看到 &lt;code&gt;3008;start=&lt;/code&gt;、&lt;code&gt;machineid=&lt;/code&gt;、&lt;code&gt;bootid=&lt;/code&gt;、&lt;code&gt;cwd=&lt;/code&gt; 之類內容，先判斷是否由 systemd 的 &lt;code&gt;80-systemd-osc-context.sh&lt;/code&gt; 注入。確認後，再按影響範圍選擇臨時遮蔽、個人 &lt;code&gt;.bashrc&lt;/code&gt; 遮蔽，或系統級禁用。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
