Windows 那邊接 SSH 的是 cmd 或 PowerShell,不是 Linux 的 shell。絕大多數東西照樣能用 —— 但程式助手和別的全螢幕工具,顏色會不對,除非你在 Windows 那邊設一樣東西。
撰寫於
在 Windows 伺服器上,程式助手的面板會變成一塊一塊的純色。本來接近黑的背景變成一整片綠,灰色發濁,diff 裡加行減行那種很淡的底色全擠成同樣的兩三種。字都看得清,就是畫出來的不是程式想要的那個顏色。btop、lazygit、bat、delta 也一樣。
最能說明問題的是:同一個程式連 Linux 或 macOS 伺服器就是對的 —— 同一台手機,同一套配色。所以問題不在程式,也不在你選的終端機主題。
終端機能畫大約 1600 萬種顏色。程式不會預設你有這個本事,它會去環境裡找一個標記;找不到就退回 256 色,再把它想要的每一種顏色換成最接近的那一個。「最接近」就是把接近黑的面板變成一片綠的原因。
連 Linux 和 macOS 的時候,這個標記是 Term 在建立工作階段時替你設好的。Windows 上做不到:cmd 和 PowerShell 看不懂那一行,而往你的提示符裡敲一行只會報錯的東西,比顏色不對更糟。所以在 Windows 上,這個標記得在那台機器上設一次 —— 設完以後每個工作階段都有,用 Term 還是用別的都一樣。
到那台 Windows 機器上 —— 直接坐在它前面,或者用 Term 連過去 —— 用你平時 SSH 登入的那個帳號,在 PowerShell 裡執行:
setx COLORTERM truecolorCOLORTERM 的環境變數,值是 truecolor。機器上別的東西都不動。重連之後顏色還是平的?那是 SSH 服務裡還留著舊的環境。用系統管理員身分的 PowerShell 重啟它 —— 這會把那台機器上別的 SSH 工作階段一起斷掉:
Restart-Service sshd不想動帳號的環境變數,就寫進你的 PowerShell 設定檔。這種只管 PowerShell 的工作階段 —— 落到 cmd 的看不到:
if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force } Add-Content $PROFILE '$env:COLORTERM = "truecolor"'
如果這台伺服器是你管的,也可以反過來,讓它收用戶端遞過去的設定。Term 本來就會把 COLORTERM 連同語言環境和明暗提示一起遞過去,只是伺服器得願意收。加上這一行,然後照上面的辦法重啟服務:
AcceptEnv LANG LC_* COLORTERM COLORFGBG這條路還有個額外好處:Windows 主機上,每台主機自己的環境變數那一欄要能用,靠的也是它。App 裡那一欄底下寫的提示就是這個意思。
連上去直接問機器。第一行在 PowerShell 裡執行,第二行在 cmd 裡:
echo $env:COLORTERM echo %COLORTERM%
什麼都不顯示,就是還沒到 —— 回上一節。顯示 truecolor 就是到了,再不對就不是這個設定的事了。
剩下的是 Windows 自己。Windows 伺服器上,命令列的輸出在送上網之前會先被系統的一層重畫一遍,這一層的舊版本不管程式送的是什麼,都會把顏色壓扁。辦法是把 Windows 和它的 OpenSSH 元件升級;升不了的話,看最後一節。
打字時那行灰色的補全,要有 Linux 或 macOS 的 shell 才做得出來,所以這邊沒有開關可開。PowerShell 自己有歷史搜尋 —— 快捷鍵列上的 ^R 就是它。
產生金鑰的時候,主機清單裡不會出現 Windows 主機。Windows 存授權公鑰的位置不一樣、權限規則不一樣,系統管理員帳號更是整個換一個檔案 —— 一鍵安裝只會悄悄寫錯檔案,然後告訴你成功了。公鑰請在 Windows 上自己加。
Term 認出對面是 Windows 的 shell,多出來的按鍵就換成那邊要用的:寫路徑和參數的 \ 和 -,還有 |、$,以及查歷史的 ^R。
在主機的進階選項裡設的變數,連 Linux 伺服器是自己就能到的。Windows 上它走的是上面 COLORTERM 那條路,所以得先讓伺服器同意收,才到得了。
機器上裝了 WSL 的話,把它設成 SSH 登入進去的那個 shell,這一整頁就都用不上了。顏色、聯想、裝公鑰、環境變數,全都跟連任何一台 Linux 伺服器一樣 —— 因為從 Term 這邊看,你連的就是 Linux。要改的是 OpenSSH 的預設 shell,在登錄檔 HKLM:\SOFTWARE\OpenSSH\DefaultShell。
一個提醒,改任何「SSH 登進哪個 shell」的設定都適用:目前這個工作階段先別關,另開一個試。新的 shell 起不來的時候,還連著的那個就是你改回去的路。