新しくubuntu 12.04をインストールしました。リモートサーバーに接続すると、次のようなエラーが発生しました。
~$ ssh example.com Sudo aptitude upgrade
...
Traceback (most recent call last):
File "/usr/bin/apt-listchanges", line 33, in <module>
from ALChacks import *
File "/usr/share/apt-listchanges/ALChacks.py", line 32, in <module>
sys.stderr.write(_("Can't set locale; make sure $LC_* and $LANG are correct!\n"))
NameError: name '_' is not defined
Perl: warning: Setting locale failed.
Perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_TIME = "de_DE.UTF-8",
LC_MONETARY = "de_DE.UTF-8",
LC_ADDRESS = "de_DE.UTF-8",
LC_TELEPHONE = "de_DE.UTF-8",
LC_NAME = "de_DE.UTF-8",
LC_MEASUREMENT = "de_DE.UTF-8",
LC_IDENTIFICATION = "de_DE.UTF-8",
LC_NUMERIC = "de_DE.UTF-8",
LC_PAPER = "de_DE.UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
Perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_ALL to default locale: No such file or directory
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.
...
古いubuntuインストールから接続する場合、この問題は発生しません。これは私のubuntu 12.04インストールからの出力で、LANGとLANGUAGEが設定されています
$ locale
LANG=de_DE.UTF-8
LANGUAGE=de_DE:en_GB:en
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
リモートサーバーでこのエラーメッセージを取得するためにubuntuで何が変更されたか知っていますか?
これは、ローカルマシンのロケールがドイツ語に設定されているためです。これは、SSHがサーバーに転送して使用しようとしますが、サーバーにはインストールされていません。
いくつかのオプションがあります:
ロケールを生成する。 Sudo locale-gen de
を使用して、サーバー上でドイツ語のロケールを生成します。
クライアントからのロケールの転送を停止する。ロケール環境変数をローカルマシンからサーバーに転送しないでください。 localSendEnv LANG LC_*
ファイルの/etc/ssh/ssh_config
行をコメント化できます。
サーバーでロケールの受け入れを停止する。ローカルマシンからサーバーへのロケール環境変数を受け入れないでください。 remoteAcceptEnv LANG LC_*
ファイルの/etc/ssh/sshd_config
行をコメント化できます。
サーバーのロケールを英語に設定。サーバーでロケールを明示的に英語に設定します。例として、次の行をリモートの~/.bashrc
または~/.profile
ファイルに追加できます。
export LANGUAGE="en"
export LANG="C"
export LC_MESSAGES="C"
サーバーへのルートアクセスがない場合は、クライアントからのロケールの転送を停止するオプションが最適な(唯一の)方法です。
これは、新規または最小のインストールまたは他の状況で時々発生する可能性があります。修正は非常に簡単です。これらを次の順序で試して、それぞれの後にテストして、状況が修正されたかどうかを確認します。
Sudo dpkg-reconfigure locales
Sudo apt-get --reinstall install language-pack-de
Sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
SendEnv LANG LC_*
の/etc/ssh/ssh_config
行にコメントを追加します。したがって、次のようになります。
#SendEnv LANG LC_*
デフォルトでは、ssh clientコマンドはロケール関連の環境変数をSSHサーバーに転送します。これは、クライアント側の/etc/ssh/ssh_config
で指定されています:
Host *
SendEnv LANG LC_*
デフォルトでは、SSHサーバーはたまたまそれらを受け入れます(サーバー上の/etc/ssh/sshd_config
内):
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
そのため、シェルにロケール関連の環境変数がある場合、それらはサーバー側のSSHセッションに入力されます。
残念ながら、SendEnv
オプションは累積です。 man 5 ssh_config
によると:
SendEnv
... Multiple environment variables may be separated
by whitespace or spread across multiple SendEnv directives. The
default is not to send any environment variables.
つまり、オーバーライドすることはできません。
特にサーバー側で、システム全体の構成を変更することが不可能または賢明でない場合があります。ただし、bypass itとすることができます。そして、それはsshコマンドの-F
オプションの副作用です。 man ssh
によると:
-F configfile
Specifies an alternative per-user configuration file. If a con-
figuration file is given on the command line, the system-wide
configuration file (/etc/ssh/ssh_config) will be ignored. The
default for the per-user configuration file is ~/.ssh/config.
デフォルトでは、ユーザーごとの構成ファイル~/.ssh/config
が存在する場合に使用されます。ただし、コマンドラインで明示的に指定を使用して/etc/ssh/ssh_config
をバイパスできます。
$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_Host
~/.bashrc
でエイリアスを作成すると便利です。
alias ssh="ssh -F ~/.ssh/config"
この方法では、システム全体の構成のデフォルトのSendEnv
ディレクティブは有効ではないため、デフォルトでは環境変数がSSHサーバーに送信されません。
同様の問題がありました。私の解決策は、/etc/ssh/ssh_config
のSendEnv
行にコメントを付けて(これらは上書きできないため)、~/.ssh/config
に次のエントリを追加することでした。
Host *,!<somehost>
SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
SendEnv XMODIFIERS
<somehost>
は、環境変数を送信するホスト名ですdid n't。