SSHでリモートマシンにログインして、コマンドを実行すると、「can't set the locale; make sure $LC_* and $LANG are correct」というエラーが出力されました。この対処法を記しておきます。
環境
- Ubuntu 18.04 LTS
エラーの内容
出力されたエラーを直訳すると「ロケールを設定できない;$LC_*と$LANGが正しいか確認して」となります。
つまり、ロケール関係の変数の中で設定されていないものがあったり、様々なロケールが入り混じっていたりした場合に、このエラーが出力されます。
対処方法
直接接続の場合
まずは、どのロケール変数の設定不備かを確認します。
$ locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=ja_JP.UTF-8
LC_TIME=ja_JP.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=ja_JP.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=ja_JP.UTF-8
LC_NAME=ja_JP.UTF-8
LC_ADDRESS=ja_JP.UTF-8
LC_TELEPHONE=ja_JP.UTF-8
LC_MEASUREMENT=ja_JP.UTF-8
LC_IDENTIFICATION=ja_JP.UTF-8
LC_ALL=
この例ではLC_ALLの設定不備があります。
$ export LC_ALL=en_US.UTF-8
$ sudo locale-gen en_US.UTF-8
Generating locales (this might take a while)...
en_US.UTF-8... done
Generation complete.
$ sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
en_US.UTF-8... done
Generation complete.
sudo dpkg-reconfigure locales
の実行後に下記のような画面が表示されますので、自分が設定したい言語を設定してください。ここでは、en_US.UTF-8
を選択します。
これで、エラーの対応は終了です。
SSHの場合
SSHの場合ではロケール関係の変数をクライアントサイドかサーバーサイドで制御してあげればエラーはなくなります。
やることは該当する一行をコメントアウトするだけです。←超簡単w
ただし、直接接続した時にエラーが出力されない状態が前提です。(上記の直接接続の場合を参照してください)
①クライアントサイド
ロケール変数の送信をストップさせます。
$ sudo vi /etc/ssh/ssh_config
- SendEnv LANG LC_*
+ #SendEnv LANG LC_*
②サーバーサイド
ロケール変数の受信をストップさせます。
$ sudo vi /etc/ssh/sshd_config
- AcceptEnv LANG LC_*
+ #AcceptEnv LANG LC_*
$ sudo systemctl restart sshd
これでSSH経由でもエラーがなくなりました。
おわり!!