Mac から Ubuntu に ssh ログインするとなんかロケール云々で怒られるやつ
Mac から Ubuntu 12.04 LTS に ssh でログインすると perl を始め、いくつかのコマンドで locale まわりの設定がおかしいぞみたいな感じで怒られる。コンソールからログインすると問題ない。
$ perl -v perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_CTYPE = "UTF-8", LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C").
locale
コマンドで確認すると、どうも ssh でログインしたときだけ、 LC_CTYPE=UTF-8
になってるのがあやしい。
$ locale locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE=UTF-8 LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
調べてみると、下のような流れでこうなってる様子。
- Mac の Terminal.app の Settings > Advanced > Set locale environment variables on startup がオンになっていると、 Mac 側で
LC_CTYPE=UTF-8
が設定される。 - Mac の
/etc/ssh_config
でSendEnv LANG LC_*
になっているので、LC_CTYPE
が ssh サーバに送信される。 - Ubuntu の
/etc/ssh/sshd_config
でAcceptEnv LANG LC_*
になっているので、 Mac からのLC_CTYPE
が Ubuntu に渡される。 UTF-8
というロケールはない (正しくは en_US.UTF-8 とか ja_JP.UTF-8) ので怒られる。
どこかの層でこの流れを断てば問題は解決する。一番間違った挙動してるのは Mac の Terminal.app だと思うので、上記の "Set locale environment variables on startup" をオフにした。
$ locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
他に考えられる解決方法メモ。