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


89

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


回答:


167

これは、ローカルマシンのロケールがドイツ語に設定されているためです。これは、SSHがサーバーに転送して使用しようとしますが、サーバーにはインストールされていません。

いくつかのオプションがあります:

  • ロケールを生成します。サーバーでドイツ語のロケールを生成しますsudo locale-gen de

  • クライアントからのロケールの転送を停止します。ロケール環境変数をローカルマシンからサーバーに転送しないでください。ローカルファイルのSendEnv LANG LC_*行をコメント化できます。 /etc/ssh/ssh_config

  • サーバーでロケールの受け入れを停止します。ローカルマシンからサーバーへのロケール環境変数を受け入れないでください。リモートファイルのAcceptEnv LANG LC_*行をコメント化できます。 /etc/ssh/sshd_config

  • サーバーのロケールを英語に設定します。サーバーでロケールを明示的に英語に設定します。例として、次の行をリモート~/.bashrcまたは~/.profileファイルに追加できます。

    export LANGUAGE="en"
    export LANG="C"
    export LC_MESSAGES="C"
    

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


2
ハァッ!彼がクライアントのロケール設定をリストしているという事実を完全に見落としていました!偉大な仕事...
っぽい

10
「クライアントからのロケールの転送を停止する」ことにしました。正常に動作します。将来の参考のために、ローカルの〜/ .ssh / configの/ etc / ssh / ssh_configのSendEnv設定を上書きすることはできません。bugzilla.mindrot.org/show_bug.cgi?id=1285-12月1
Janning

3
組み合わせることbugs.php.net/bug.php?id=18556参照、SSHの送信ロケールのは、現実の問題を引き起こす可能性があります(そして実際に私のために引き起こされる)bugzilla.mindrot.org/show_bug.cgi?id=1285#c9を .. 。
ハリル・Özgür

1
私の場合、ロケールを設定すると~/.profile問題が解決しました。ありがとう。
フランシスコ

サーバーは、ドイツ語のロケールを持たない場合、それは、ユーザが要求した値上書きするために、なぜそれが許容可能であるLANG何か他のものとは..?
ミハイル・T.

26

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

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

JVMに問題があり、12.04でもシステムロケールを設定しようとしています。唯一の問題は、何を試してもLC_ALLを設定できないように見えることですが、ロケールではまだLC_ALLが空として表示されています。
ダークスター1

15

の行SendEnv LANG LC_*をコメント化し/etc/ssh/ssh_configます。次のようになります。

#SendEnv LANG LC_*

10

問題

デフォルトでは、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.

つまり、オーバーライドできません。

ソリューション

特にサーバー側で、システム全体の構成を変更することが不可能または賢明でない場合があります。ただし、それをバイパスすることはできます。そして、それ-Fはsshコマンドのオプションの副作用です。によると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サーバーに送信されません。


2
/ etc / ssh / configのシステム構成ファイルには、ユーザー構成に保持したい追加の行が含まれている可能性があることに注意してください。これらの設定を保持するには、〜/ .ssh / configのユーザー設定ファイルにそれらをコピーする必要があります。
スティーブンモード

4

同様の問題がありました。私の解決策は、SendEnv行をコメント化して/etc/ssh/ssh_config(これらはオーバーライドできないため)、次のエントリを追加することでした~/.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>私は先のホスト名であることはなかった任意の環境変数を送信します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.