web-dev-qa-db-ja.com

ロケール変数は、リモートシェルでは効果がありません(Perl:警告:ロケールの設定に失敗しました。)

新しく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で何が変更されたか知っていますか?

88
Janning

これは、ローカルマシンのロケールがドイツ語に設定されているためです。これは、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"
    

サーバーへのルートアクセスがない場合は、クライアントからのロケールの転送を停止するオプションが最適な(唯一の)方法です。

167
David Planella

これは、新規または最小のインストールまたは他の状況で時々発生する可能性があります。修正は非常に簡単です。これらを次の順序で試して、それぞれの後にテストして、状況が修正されたかどうかを確認します。

1.ロケールを再構成する

  • Sudo dpkg-reconfigure locales
    • それが機能しない場合、

2.ロケール言語パックを再インストールします

  • Sudo apt-get --reinstall install language-pack-de
    • それが機能しない場合、

3.ロケール設定を手動で強制する(永続的)

  • Sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
26
ish

SendEnv LANG LC_*/etc/ssh/ssh_config行にコメントを追加します。したがって、次のようになります。

#SendEnv LANG LC_*
15
Zhengpeng Hou

問題

デフォルトでは、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サーバーに送信されません。

10
Rockallite

同様の問題がありました。私の解決策は、/etc/ssh/ssh_configSendEnv行にコメントを付けて(これらは上書きできないため)、~/.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

4
Gwendal