解決遠端 SSH 連線主機時文字編碼設定 locale 錯亂問題

文字編碼錯亂

其實也忘記我 Mac 在換 Oh-My-Zsh 前 Bash 是不是也有這問題XD

但! 碰到問題就來解才是有趣的地方

剛好這幾天都有直接連上主機修改檔案的需求,偏偏原本看起來正常的中文 UTF8 編碼卻很有事的亂了調,怎麼查也都是 UTF8 連線,沒什麼大問題,深入去了解 SSH 與 locale 設定的關係才知道不得了,太貼心。

SSH 有個參數( AcceptEnv )預設可以接收來自 client 連線時帶入的語系編碼參數搭配顯示

AcceptEnv LANG LC_*

而在 client 端也有個預設的參數( SendEnv ),預設會傳送本地語系編碼

SendEnv LANG LC_*

兩邊一搭一唱就把這整個亂碼事件給串起來,Mac 預設的參數 LC_CTYPE="zh_TW.UTF-8" 在遠端機器上沒有,而收到這參數的主機就會造成顯示錯誤。

解決辦法

  1. 改本機的 locale 設定,在 ~/.bash_profile 或是 ~/.zshrc 裡 export LC_CTYPE="en_US.UTF-8" ,讓傳送時以預設語系編碼方式帶入,需重啟終端。(推薦作法,傳送預設設定即可)

  2. 改本機 ssh_config 檔中的 SendEnv ,將此段註解後重啟服務。(以後都不傳送了的意思)

  3. 改遠端 sshd_config 檔中的 AcceptEnv ,將此段註解後重啟服務。(以後都不接收了的意思)

以改變與設定彈性來看,第一個解決辦法是比較沒可能出事拉,至於其他方式手段都稍微硬了點,使用前請自行斟酌XD

參考資料:

  1. Locale variables have no effect in remote shell

  2. Inside screen over ssh, the default prompt not showing

Facebook 功能:

Share: