[Mac] SSH 到 Linux 機器時,出現 cannot change locale (UTF-8) 訊息

[Mac] SSH 到 Linux 機器時,出現 cannot change locale (UTF-8) 訊息

從 Mac 的 terminal ssh 到我的 CentOS 機器時,常常都會看到一個錯誤訊息:

warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

老實說這個訊息一直持續看到,都已經習慣性的忽略了:

testuser@localhost ~ $ ssh_linux
Last login: Fri Jan  1 00:22:50 2016 from 10.28.28.39
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

 

今天決定來查一下這到底是怎麼一回事… 找到下面這一篇講的非常的清楚:

OS X Terminal: -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory Fix

原來這是兩個原因綜合起來,造成的結果:

 

1. Mac terminal 預設會設定 LC_CTYPE 成 UTF-8

打開 Terminal > Preferences > Profiles > Advanced,

可以看到 Set locale environment variables on startup 預設是有勾選的:

Screen Shot 2016-01-03 at 10.46.05 PM  

 

而因為預設的 Text encoding 是 UTF-8,因此每次 Terminal 一打開,

就會將 LC_CTYPE 設定成 UTF-8,我們可以檢查一下 LC_CTYPE 這個環境變數:

testuser@localhost ~ $ set | grep LC_
LC_CTYPE=UTF-8

 

2. SSH 會將 locale 相關變數設定到遠端伺服器上

打開 Mac 的 /etc/ssh/ssh_config,可以看到下面兩行:

 Host *
SendEnv LANG LC_*

 

這表示不管 SSH 到哪一台伺服器,ssh 都會將目前 Mac 上的 LANG 和 LC_ 開頭的環境變數,

設定到遠端的伺服器上面,自然也包括 LC_CTYPE 了~

因此 Mac 上的 LC_CTYPE  (UTF-8) 就會設定到 Linux 上面去,

但因為 Linux 上沒有這種 LC_CTYPE,所以就會出現警告訊息~

 

在 Linux 機器上,執行 locale -a 可以看到所有支援的 locale,

可以注意到並沒有 UTF-8 這種 locale,但是會有像 en_US.UTF-8 這種:

testuser@localhost ~ $ locale -a
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER@saaho
aa_ER.utf8
......

 

了解了問題的起因之後,原本的參考網頁也提到了三種解決方法,

第一個是讓 Mac terminal 不要設定 LC_CTYPE 變數,

第二個是讓 SSH 不要將本地端的 locale 設定複製到遠端伺服器上,

第三個是將遠端伺服器缺少的 locale 安裝上去~

 

考慮了一下,覺得 Mac 本身設定 LC_CTYPE 成為 UTF-8 並沒有什麼問題,

而安裝缺少的 locale 不太實際,因為隨時可能連線到新的 Linux 伺服器上,

所以我選擇的是第二種解法,這種解法就是將 /etc/ssh/ssh_config 裡的 SendEnv 那行註解掉:

 Host *
#   SendEnv LANG LC_*

 

修改好後,再連線到 Linux 上時就不會再出現警告訊息了:

testuser@localhost ~ $ ssh_linux
Last login: Sun Jan  3 22:31:18 2016 from 10.28.28.39

 

 

(本頁面已被瀏覽過 282 次)

4 thoughts on “[Mac] SSH 到 Linux 機器時,出現 cannot change locale (UTF-8) 訊息

發表迴響

你的電子郵件位址並不會被公開。