[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
今天決定來查一下這到底是怎麼一回事… 找到下面這一篇講的非常的清楚:
原來這是兩個原因綜合起來,造成的結果:
1. Mac terminal 預設會設定 LC_CTYPE 成 UTF-8
打開 Terminal > Preferences > Profiles > Advanced,
可以看到 Set locale environment variables on startup 預設是有勾選的:
而因為預設的 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
4 thoughts on “[Mac] SSH 到 Linux 機器時,出現 cannot change locale (UTF-8) 訊息”
Saves my day!
You are welcome 🙂
Thanks. This helps.
You are welcome!