読者です 読者をやめる 読者になる 読者になる

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_configSendEnv LANG LC_* になっているので、 LC_CTYPEssh サーバに送信される。
  • Ubuntu/etc/ssh/sshd_configAcceptEnv LANG LC_* になっているので、 Mac からの LC_CTYPEUbuntu に渡される。
  • 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=

他に考えられる解決方法メモ。

  • Mac 側の .zshrc とかで LC_CTYPE 定義しておく。
  • Mac 側の ssh_config の SendEnvLC_* やめる。
  • Ubuntu 側の sshd_config の AcceptEnvLC_* やめる。
  • Ubuntu 側の .zshrc とかで LC_CTYPE 定義しておく。