server-memo.net

ユーザのロケール設定方法

   

CentOS(bash)でユーザのロケールを変更(設定)する方法についてまとめています。

現在のロケール確認方法

現在設定されているロケールは、「locale」コマンドを実行することで確認することができます。

$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.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=

このように設定されている環境変数が表示されます。

ユーザロケールの変更(設定)方法

ユーザのロケールを変更する方法として、「一時的に変更する方法」と「恒久的に変更する方法」の2通りについて説明させていただきます。

一時的に変更する方法

環境変数「LANG」の設定を変更することで、ユーザのロケールを変更することができます。

ロケール変更(設定)書式

「export」コマンドを使用して設定を行います。

export LANG=ロケール名

こちらの方法で変更したロケールは一時的な設定であるため、ログオフすると設定が元に戻ってしまいます。

ロケール変更例

ユーザのロケールを「en_US.utf8」に変更していきます。

$ export LANG=en_US.utf8
変更確認

「locale」コマンドでロケールが変更されていることを確認します。

$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

ユーザのロケールが「en_US.utf8」に変更されていることが確認できました。

恒久的に変更する方法

「~/.bash_profile」に下記の設定を追加することで、ログイン時に設定が読み込まれてロケールが設定されます。

設定内容

export LANG=ロケール名

この設定を行うと、ログイン毎に「export LANG=ロケール名」コマンドを実行するという面倒から解放されます。

設定例

実際に「~/.bash_profile」にロケールを変更する設定を行っていきます。

※作業前には念のためバックアップを行いましょう。

$ cp -p ~/.bash_profile ~/.bash_profile_yyyymmdd
$ vi ~/.bash_profile

ユーザのロケールを「ja_JP.UTF-8」に変更する設定を追加します。

追加する設定
export LANG=ja_JP.UTF-8

設定を追加した「bash_profile」です。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

export LANG=ja_JP.UTF-8 <---追加した設定
設定確認

「.bash_profile」の設定が完了しましたら、一度ログアウトをして再度ログインしてから「locale」コマンドを実行して、設定したロケールが有効となっていることを確認してください。

無事ロケールが設定されていましたら、作業完了となります。

SSHで接続した場合にロケールが変更される場合

MacやLinuxからSSH接続を行うと、接続先サーバのロケールが「en_US.UTF-8」に設定しているにも関わらずロケールが「ja_JP.UTF-8」になってしまうといったように、勝手にロケールが変更されてしまうという現象が発生して不思議に思っていたのですが、その原因と対応方法がやっと分かったのでまとめておきます。

この現象はOSX(Mac)やLinuxから接続している人が対象となり、WindowsのSSHクライアントから接続している場合はこの現象は発生しないようです。

原因

接続元のクライアントに設定されている、環境変数「LANG」や「LC_」関連の設定が接続先に引き継がれていたのが原因でした。

この現象が発生する原因の設定が、クライアント側と接続先サーバ側の両方にありますので、その設定についてまとめていきます。

クライアント側設定

クライアント側のssh設定「ssh_config」に、下記のように環境変数の内容を接続先サーバ送信する「SendEnv」という設定があります。

 Host *
  SendEnv LANG LC_*

この設定があるために、クライアント側の環境変数「LANG」や「LC_」関連の設定が接続先に送信されていたのです。

設定ファイルの場所は、OSX(Mac)の場合は「/etc/ssh_config」CentOSなどは「/etc/ssh/ssh_config」となります。

※設定ファイルは「sshd_config」(sshサーバの設定ファイル)ではありませんので注意してください。

接続先の設定

接続先のsshサーバの設定「sshd_config」には、クライアントから送信された環境変数の情報を受け付ける「AcceptEnv 」という項目があり、ここで「LANG」や「LC_」関連の設定をクライアントから受け付けるという設定になっています。

# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

解決方法

この現象を起こさないようにする方法として、クライアント側で対応する方法と、接続先サーバで対応する方法の2種類がありますので、それぞれの方法について説明していきます。

クライアント側で対応する方法

クライアント側で対応するのであれば、「ssh_config」の「SendEnv LANG LC_*」をコメントにして無効化し、環境変数の送信を行わないように設定します。

編集前
Host *
  SendEnv LANG LC_*
編集後
Host *
#   SendEnv LANG LC_*

これで環境変数は接続先サーバに送信されないので、サーバ側のロケール設定が有効となります。

接続先サーバ側で対応する方法

接続先サーバ側で対応するのであれば、「sshd_config」の「AcceptEnv」の項目で「LANG」と「LC_」関連の環境変数を受け付けないように、該当する項目をコメントにして設定を無効化することで対応することができます。

変更前
# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
変更後
# Accept locale-related environment variables
#AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
#AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
#AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

設定変更後はSSHサーバの再起動等を行い設定を反映させてください。

 - システム設定