Skip to Content
面板終端機

終端機(TERM)

UART 記錄面板一次處理一行;要操作 Linux shell、跑 vim、top 這類全螢幕程式,需要真正的終端機。 TERM 面板就是這個:它把序列埠收到的位元組交給終端機模擬器(libvterm),游標定位、捲動區、alt screen、 256 色與全彩(RGB)都會照遠端的意思畫出來,你打的每個鍵也原樣送回遠端。

來源有兩種:UART(序列埠)與 SSH(連到 Linux 主機,使用 Windows 內建的 OpenSSH 客戶端)。

第一次接 Linux 板子?看 連到 Linux 板子(UART 或 SSH) 的完整步驟。

放一個 TERM 面板

按 F9 把任一象限(視窗版是任一區域)的面板類型選成 term,或用指令 layout @p<N> term。 每個 Tab 最多一個 TERM 面板;已經有一個時,再選 term 會被忽略(指令會回 only one TERM panel per tab)。 F9 只負責放面板,來源與連線不在 F9 設定。

面板最小 24 欄 x 6 列。面板內容區的格數就是遠端看到的終端大小(stty size 會跟著面板縮放而改變)。

連線列

面板框內的第一列是連線列:

[UART v] [COM7 v] [115200 v] [Connect] 序列埠 [SSH v] [demo-board v] [Connect] SSH
  • [UART v]/[SSH v]:來源(只改選擇、不連線)。視窗版點一下展開下拉選單選 UART 或 SSH;終端機版點一下在兩者之間切換。已連線時不能換,先斷線。
  • [COM7 v](UART):連線用的序列埠。還沒選過時顯示 (port)。已連線時不能換,先斷線。 視窗版點一下會展開下拉選單,列出偵測到的所有 COM 埠(附裝置描述);終端機版點一下換成下一個偵測到的 COM 埠(環繞)。
  • [demo-board v](SSH):連線用的主機。還沒選過時顯示 (host)。 視窗版點一下會展開下拉選單,列出 ~/.ssh/config 裡所有的 Host,最後一項是 (manual);終端機版點一下換成下一個 Host(環繞)。 選 (manual) 不改選擇,而是把 term open ssh 填進指令列,讓你接著打 user@host。
  • [115200 v](只有 UART 來源):鮑率。視窗版點一下展開下拉選單,列出常用鮑率 1200 到 921600;目前用的若是清單沒有的鮑率(例如 term open uart COM7 250000),會補進清單並選中。終端機版點一下換成下一個常用鮑率(環繞)。已連線時也能改,立即生效、不會斷線;只有連線或斷線進行中([Wait...])不能改。
  • [+](只有視窗版):新增 SSH 主機或設定序列埠參數,見下一節。
  • [Connect]/[Disconnect]:連線或斷線。沒有選埠(主機)時會提示先選;連線與斷線在背景進行,介面不會卡住:進行中按鈕顯示 [Wait...]、標題顯示 WORKING,這時再按會回「busy」;連線失敗的原因(例如埠被別的面板用著)寫在 Log 的 ERROR 列。

面板太窄時連線列逐欄退場:先退 [+]、再退鮑率、再退來源、再退埠(主機),連線鈕最後才退。連線列只用滑鼠操作;要用鍵盤的話,改用指令:

term open uart COM7 115200 term open ssh demo@192.0.2.10 term close

term open uart <埠> [鮑率] 省略鮑率時用 115200,資料格式固定 8N1、無流量控制。這兩個指令只在終端機版與視窗版有, Batch 沒有。

下拉選單與 [+] 按鈕(視窗版)

點來源、埠(主機)或鮑率欄會在面板上展開下拉選單(外觀與 UART 送出面板的下拉相同),一次看到全部選項,目前的選擇會反白;點選的效果和終端機版的循環相同((manual) 一樣是把 term open ssh 填進指令列)。

選單也能用鍵盤操作:↑/↓、PgUp/PgDn、Home/End 移動,Enter 或空白鍵選定,Esc 或 Tab 收起不選。選單開著時所有按鍵都由選單處理,不會送到遠端,所以已連線時改鮑率不必擔心打到 shell 裡。點選單外的地方也會收起。

SSH 來源的主機下拉選單,列出 demo-board、demo-lab 與 (manual)
SSH 主機下拉選單(視窗版)

[+] 排在目標欄與 [Connect] 之間,只在未連線且不忙碌時顯示,面板太窄時第一個退場。終端機版沒有這顆按鈕,請用上面的 term open ... 指令。

SSH:新增主機

來源是 SSH 時,[+] 開「Add SSH host」表單:

Add SSH host 表單,欄位為 Alias、HostName、User、Port、IdentityFile、ProxyJump,底下有 Browse、Cancel、Add 三顆按鈕
Add SSH host 表單
  • 欄位:Alias(清單裡顯示的名字)、HostName、User、Port、IdentityFile(Browse... 開檔案對話框,起始在 ~/.ssh)、ProxyJump。只有 Alias 與 HostName 必填。每個空欄位會以淡色顯示一個範例(例如 HostName 的 192.168.1.10);游標停在空欄位上按 → 就把範例填進去,可以再改;欄位已有內容時 → 只是移動游標。
  • 按 Add 會把一個 Host 區塊附加到 %USERPROFILE%\.ssh\config 的最後面(目錄或檔案不存在就建立)。既有內容一個位元組都不會動;檔案已存在時,會先複製一份同目錄的 config.bak(覆蓋舊的備份)。IdentityFile 寫入時一律加雙引號。
  • 寫入成功後自動選定這台主機並連線,等於按了 [Connect]。連線失敗不會把剛加的主機移除(它是合法設定)。Cancel 什麼都不做。
  • 寫檔失敗或欄位不合法時,表單不關閉,原因顯示在表單裡。這個功能只會新增,不編輯或刪除既有的 Host;要改請直接編輯 config。
Add SSH host 表單,Alias 填了已存在的 demo-board,表單下方紅字顯示 Alias already exists in ~/.ssh/config
別名重複時,原因顯示在表單內,不寫入任何檔案

驗證比「沒有空白」嚴格,是刻意的:

  • 任一欄位含控制字元(包括換行)一律拒絕,避免有人在欄位裡夾帶換行,偷偷多寫出一行設定。
  • Alias 與 User 只收英文字母、數字與 .、_、-(中文等非 ASCII 字元可以);Alias 不得和 config 裡已有的別名重複(不分大小寫)。
  • HostName 同樣的字元集,另外允許 :(IPv6);HostName、User、ProxyJump 都不得以 - 開頭,免得被 ssh 當成命令列選項。
  • Port 要在 1 到 65535。ProxyJump 另外允許 @、:、,、[、]。IdentityFile 不得含雙引號,也不得以 \ 結尾。

User 與 HostName 這麼嚴,是因為 ssh 的 ProxyCommand 會把它們展開進一行命令(%r、%h),夾帶特殊字元可能被當成命令執行(OpenSSH 的 CVE-2023-51385 就是這一類);term open ssh 的目標也出於同一個考量,擋掉以 - 開頭等選項注入。

UART:序列埠設定

來源是 UART 時,[+] 開「UART settings」表單:

UART settings 表單,欄位為 Port、Baud、Data bits、Parity、Stop bits、Flow control,底下有 Cancel 與 Connect 兩顆按鈕
UART settings 表單
  • Port:偵測到的序列埠清單(一個都沒偵測到時,退成可以自己輸入的文字欄)。
  • Baud:常用鮑率清單(1200 到 3000000);目前選擇裡若是清單沒有的自訂鮑率,會補進清單。
  • Data bits:5 到 8。Parity:None、Odd、Even、Mark、Space。Stop bits:1、1.5、2。Flow control:None、RTS/CTS、XON/XOFF。
  • 按 Connect 先檢查再連線:埠名 COM1 到 COM255、鮑率 50 到 4000000、資料位元 5 到 8;1.5 停止位只能配 5 個資料位元,5 個資料位元不能配 2 個停止位(Windows 序列埠驅動的規則)。不合法時表單不關閉,原因顯示在表單裡。

這組資料格式會記在該 Tab 的 config.ini([TabN] 區段的 term_databits、term_parity、term_stopbits、term_flow,下次啟動沿用),連線列上的 [Connect] 也用它。全部是預設值(8N1、無流量控制)時不會寫這四行。term open uart <埠> [鮑率] 指令不帶資料格式,一律 8N1。

SSH 來源

SSH 來源啟動 Windows 內建的 ssh.exe(OpenSSH 客戶端),並把它接在一個真正的終端機(ConPTY)上,所以 vim、top、密碼提示都能用,面板縮放時遠端也會自動收到新的視窗大小,不必自己下 stty。

前置需求

  1. 安裝「OpenSSH 用戶端」選用功能(Windows 10 1809 以上)。到「設定 > 系統 > 選用功能 > 新增功能」找「OpenSSH 用戶端」,或用系統管理員身分開 PowerShell 執行:

    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

    沒裝的時候,面板會直接顯示「OpenSSH Client 選用功能未安裝」與上面兩種安裝方式,term open ssh 也會回找不到。

  2. 金鑰要是 OpenSSH 格式。 ssh.exe 讀不了 PuTTY 的 .ppk 檔,也不支援 PuTTY 的 session 與 Pageant。已有 .ppk 的話,用 puttygen 匯出一次:開啟 .ppk,選單 Conversions > Export OpenSSH key,存成 ~/.ssh/id_ed25519(或你喜歡的名字)。

  3. (選用)~/.ssh/config。 面板的主機清單就是這個檔案裡的 Host:

    Host demo-board HostName 192.0.2.10 User demo IdentityFile ~/.ssh/id_ed25519 Host demo-lab HostName 192.0.2.11 Port 2222

    清單只列明確的名稱:含 *、?、! 的萬用樣式會略過,Include 不會展開。視窗版的下拉選單最多列出 23 個 Host(再加 (manual),共 24 項),終端機版的循環最多 7 個(再加 (manual));超過的都會截斷,循環路徑另在 Log 留一筆警告。其他主機用 (manual) 或 term open ssh 直接打。

連線

選好主機按 [Connect],或用指令:

term open ssh demo-board term open ssh demo@192.0.2.10 term open ssh demo@192.0.2.10:2222

目標可以是主機名稱/IP、user@host、~/.ssh/config 的別名,或 user@host:port。不接受以 - 開頭、含空白或引號的字串(避免被當成 ssh 的選項)。第一次連線的 host key 確認、密碼或金鑰密語,都是 ssh 自己在終端機裡問,直接在面板打字回答就好。設定只記住「選了哪個主機」(存在 config.ini,也會跟著 profile 走),不會自動連線。

斷線與重連

遠端結束 session(例如打 exit)或網路斷掉,ssh.exe 結束後面板保留最後的畫面,並在末尾加一行「已中斷連線,ssh 結束碼 N;按 Connect 重新連線」,連線鈕變回 [Connect]。再按一次就重新連線(會清空畫面)。按 [Disconnect]、term close、關閉面板或結束程式,都會先要求 ssh 結束,約半秒內沒結束就強制終止。

打字

連線之後,焦點在 TERM 面板時所有按鍵都送給遠端,包括 Ctrl+C、Space、方向鍵、Tab、Esc 與可列印字元 (中文等 Unicode 字元以 UTF-8 送出)。有兩個例外:

  • F1~F12 永遠留給程式本身,不會送出。
  • Ctrl+] 是跳脫鍵:按下後這一鍵不送出,下一個按鍵交回程式本身處理(例如接著按 Ctrl+C 才會關閉終端機版)。
  • 終端機版:焦點在 TERM 面板時,即使還沒連線或已經斷線,Ctrl+C 也不會關閉程式(狀態列會提示怎麼離開);要離開請輸入 quit,或先按 F6 把焦點移到別的面板再按 Ctrl+C(連線中也可以按 Ctrl+] 再按 Ctrl+C)。 面板標題列在連線中會顯示 TERM 126×22 Ctrl+] exit,按下 Ctrl+] 後改成 TERM 126×22 Ctrl+] next key to Host。 鍵盤打不出 ](要 AltGr 的配置)時,Ctrl+5 是備援。

另外有一組本機鍵也不會送給遠端(回捲、複製、貼上,見下面兩節):Shift+PgUp、Shift+PgDn、 Ctrl+Shift+C、Ctrl+Shift+V、Shift+Insert。Ctrl+C 仍然是 Ctrl+C(送出 0x03,中斷遠端程式), 不會因為畫面上有選取就變成複製。

把焦點移到別的面板(F6)或開啟任何對話框,直送就會停止。

回捲

遠端輸出捲出畫面頂端的行會留在回捲緩衝,預設保留最近 2000 行(每個 TERM 各一份)。緩衝裡存的是遠端原樣的內容 (字元、顏色、粗體等),所以捲回去看到的樣子和當時一模一樣,全形字也是。

  • 滑鼠滾輪:游標在 TERM 面板上就捲(不必先把焦點移過去),每格滾輪 3 行。
  • Shift+PgUp/Shift+PgDn:往回/往前捲一頁(面板列數減一行,保留一行重疊方便接續閱讀)。連線中、焦點在 TERM 面板時可用。

回捲時面板標題會顯示 [scrollback -N](N 是往回捲了幾行)。回捲中遠端有新的輸出時,畫面停在你正在看的那一段 (和 PuTTY 一樣),tail -f 或開機訊息一直在跑也能慢慢往回看、選取不會被捲走。按任何會送給遠端的鍵(含貼上), 或用 Shift+PgDn/滾輪捲到底,就回到最新畫面。

vim、nano、top 這類全螢幕程式使用另一塊畫面(alt screen),它們的畫面不會進回捲緩衝,執行期間也不能往回捲; 離開之後,原來的 shell 畫面與回捲內容原樣回來。遠端送 clear 之類的清除序列時,已經捲出去的行不受影響 (ESC [ 3 J 這個「連回捲一起清」的序列才會清空緩衝)。重新連線會清空畫面但保留回捲。

要改保留的行數,在 config.ini 的 [Global] 加一行(0 代表關閉回捲,最多 10000;沒改過就不會出現這一行):

[Global] term_scrollback=5000

選取、複製與貼上

  • 選取:在畫面上按住左鍵拖曳(可以跨很多行,也可以跟滾輪搭配:拖曳到一半滾輪往回捲,選取會跟著文字走)。 雙擊選一個「字」:連續的非空白字元,路徑、網址、主機名(含 /、.、:、-)會整段選起來。 單擊只是把焦點移過來,不會留下選取。
  • 複製:放開左鍵就已經複製了(狀態列會顯示複製了幾個位元組)。也可以用 Ctrl+Shift+C 再複製一次。複製的是純文字: 每行去掉尾端空白、全形字只算一個字、行與行之間是換行。
  • 貼上:Ctrl+Shift+V、Shift+Insert,或在畫面上按右鍵。貼上的換行都會變成 Enter;剪貼簿裡的 Esc 等控制字元會被丟棄 (避免一段文字裡藏著跳脫序列)。遠端程式如果開了 bracketed paste(現代的 bash、zsh、vim 都會),貼上的內容會被標記成「貼上」, shell 就不會在貼到一半時就開始執行;沒開的話就照原樣送出。一次最多貼 4096 位元組,超過會整段拒絕並在狀態列說明大小與上限, 不會只貼一半。
  • 終端機版在 Windows Terminal 或 conhost 裡,Ctrl+Shift+V/Shift+Insert 常會被終端機自己攔下,改成一個字一個字打進來(沒有大小上限也沒有 bracketed paste); 右鍵貼上一定走程式自己的路徑,建議用右鍵。
  • 滑鼠選取與複製不需要連線:斷線後仍可以回捲、選取、複製畫面上的內容。

遠端開了滑鼠回報時

vim(set mouse=a)、htop、mc、less --mouse 這類程式會要求「滑鼠回報」,希望自己處理點擊、拖曳與滾輪。照 xterm 的慣例:

  • 遠端沒有開滑鼠回報:拖曳就是本機選取,滾輪是本機回捲,右鍵是貼上。
  • 遠端開了滑鼠回報:左/中/右鍵、拖曳與滾輪都送給遠端程式(座標是你點的那一格);按住 Shift 再操作才是本機動作(選取、回捲、右鍵貼上)。
  • 一個按鍵「按下」時如果是給遠端的,它的放開與中間的拖曳也一定給遠端,不會因為你中途按了 Shift 而讓遠端卡在按住。
  • 把滑鼠拖出面板時,遠端收到的是最靠近的邊緣格,所以 vim 的拖曳選取到邊緣仍能運作。
  • 正在回捲看舊輸出時,你在遠端程式上點擊或滾動,畫面會先回到最新(遠端看到的是最新畫面,座標才對得上);單純移動滑鼠不會把你踢回底部。
  • 遠端開了回報時,右鍵不再貼上(交給遠端程式);要貼上用 Shift+Insert、Ctrl+Shift+V,或按住 Shift 再按右鍵。
  • 終端機版沒有把 Alt 算進滑鼠事件(只有 Shift、Ctrl)。

Session 記錄

要留下一份「這個 session 到底印了什麼」的證據(例如序列埠的開機訊息),用指令開關記錄:

term log on 開始記錄,狀態列顯示檔案路徑 term log off 結束記錄 term log 查詢目前是否在記錄

記錄寫在程式目錄的 logs\term_<來源>_<日期>_<時間>.txt(來源是 COM 埠名或 SSH 目標),UTF-8 並帶 BOM,記事本與 Excel 都能直接打開, 一行一行的純文字。內容取自畫面上的字,所以顏色、游標移動這些跳脫序列不會出現在檔案裡:捲出畫面的行會逐行寫入,結束記錄(或關閉面板、 結束程式)時再把當下畫面寫在最後。重新連線清畫面之前,現有畫面也會先寫進記錄。記錄中面板標題會顯示 [REC]。

注意事項:全螢幕程式(vim、top)運作期間不記錄;用 clear 清掉而從未捲出去的畫面不在記錄裡。 這個開關不會存起來,重開程式一律是關閉;要一直記錄請每次連線後再下 term log on。

色彩

遠端指定的顏色就是你看到的顏色:視窗版全彩呈現;終端機版在支援全彩的主控台(Windows Terminal 等)原樣輸出, 在只有 16 色的舊主控台降成 16 色,並對應到目前主題的色相(亮色是同色相加粗)。遠端沒指定顏色的地方使用主題的 面板底色與文字色。因為遠端可以把底色設成任意 RGB,進出 vim 這類程式時底色可能和面板其他部分不同,這是預期的。

序列埠獨佔

TERM 連線時獨佔那個 COM 埠:同一個埠不能同時開在 UART 記錄面板,反過來也一樣,會得到 port is already open in another panel 之類的明確錯誤。TERM 收到的是原始位元組,不經 UART 記錄面板的行切分, 所以 TERM 連線期間 UART 記錄面板看不到這個埠的內容。斷線後畫面內容保留,可以繼續檢視;裝置被拔掉時狀態變成 OFFLINE,插回後要自己再按 [Connect](不會自動重連)。

序列埠的終端大小

(這一節只適用 UART 來源。SSH 來源的大小會自動同步到遠端。)

序列線沒有「視窗大小」這個通道(PuTTY、Tera Term、minicom、screen 也是這樣),所以遠端的 shell 不知道 TERM 面板有幾欄幾列,vim、top 之類的程式可能排版錯亂。Nexus 不會自己對遠端送任何指令;連線中,面板標題會顯示目前的格數,例如 TERM 126×22(面板太窄時依序省略提示與大小)。請在遠端對齊:

  • 照標題的數字執行 stty rows 22 cols 126(換成你看到的 列 與 欄)。
  • 或執行 eval $(resize)(xterm 套件提供)。
  • 或使用下面這段 bash,它利用 TERM 面板會回應游標位置查詢,自動量出大小:
resize_term() { printf '\0337\033[r\033[999;999H\033[6n\0338'; IFS='[;R' read -rsd R _ r c; stty rows "$r" cols "$c"; }

建議放進 ~/.bashrc,登入時呼叫 resize_term 一次;調整面板大小之後再呼叫一次即可。

目前沒有的功能

SSH 來源目前不支援 .ppk/PuTTY session/Pageant,也不支援 IPv6 位址直接當目標(請改用 ~/.ssh/config 的別名)。