Yerel değişkenlerin uzak kabuk üzerinde etkisi yoktur (perl: warning: Yerel ayarı ayarlama başarısız oldu.)


89

Yeni bir ubuntu 12.04 kurulumum var. Uzak sunucuma bağlandığımda böyle hatalar alıyorum:

~$ 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.
...

Eski bir ubuntu kurulumundan bağlandığımda bu sorunu yaşamıyorum. Bu benim ubuntu 12.04 kurulumumdan çıktı, LANG ve LANGUAGE ayarlandı

$ 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=

Uzak sunucularda bu hata iletisini almak için ubuntu'da nelerin değiştiğini bilen var mı?


Yanıtlar:


167

Bunun nedeni, yerel makinenizdeki yerel ayarınızın Almanca olarak ayarlanmış olmasıdır; SSH, sunucuya yönlendirir ve kullanmaya çalışır, ancak sunucunuzda yüklü değildir.

Birkaç seçeneğiniz var:

  • Yerel ayarı oluşturun . Sunucuda Alman yerel ayarını oluşturun sudo locale-gen de.

  • Yerel ayar istemciden iletmeyi durdurun . Yerel ortam değişkenini yerel makinenizden sunucuya iletmeyin. Yerel dosyadaki SendEnv LANG LC_*satırı yorumlayabilirsiniz . /etc/ssh/ssh_config

  • Sunucuda yerel ayarı kabul etmeyi bırakın . Yerel ortam ortam değişkenini yerel makinenizden sunucuya kabul etmeyin. Uzak dosyadaki AcceptEnv LANG LC_*satırı yorumlayabilirsiniz . /etc/ssh/sshd_config

  • Sunucu yerel ayarını ingilizce'ye ayarlayın . Yerel ayarları açıkça sunucuda İngilizce olarak ayarlayın. Örnek olarak, uzaktan kumandanıza ~/.bashrcveya ~/.profiledosyalarınıza aşağıdaki satırları ekleyebilirsiniz :

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

Sunucuya kök erişiminiz yoksa , İstemciden iletmeyi durdur yerel ayarı seçeneği, gidilecek en iyi (ve yalnızca) yol olabilir.


2
Hah! Müşterinin yerel ayarlarını listelediği gerçeğini kesinlikle kaçırdım ! Harika bir iş ...
ish

10
"Yerel ayar istemciden iletmeyi durdur" kararını verdim. İyi çalışıyor. Gelecekte başvurmak için: yerel ~ / .ssh / config içinde / etc / ssh / ssh_config dosyasındaki SendEnv ayarlarını geçersiz kılamazsınız. Bugzilla.mindrot.org/show_bug.cgi?id=1285
2008’deki

3
Bugs.php.net/bug.php?id=18556 ile birleştirildiğinde , SSH’nin yerel ayarları göndermesi gerçek sorunlara neden olabilir (ve aslında benim için neden olabilir), bkz. Bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 .. .
Halil Özgür

1
Benim durumumda, yerel ayar yapmak ~/.profilesorunumu çözdü. Teşekkürler.
Francisco,

Sunucunun Almanca yerel ayarı yoksa, kullanıcı tarafından istenen değeri LANGbaşka bir şeyle yazmak onun için neden kabul edilebilir ? ..
Mikhail T.

26

Bu, bazen yeni minimum / alternatif kurulumlarda veya başka durumlarda olabilir. Düzeltme oldukça basit. Bunları aşağıdaki sırayla deneyin ve durumun düzeltilip düzeltilmediğini görmek için sınayın:

1. Yerel ayarları yeniden yapılandırma

  • sudo dpkg-reconfigure locales
    • eğer işe yaramazsa,

2. Yerel dil paketini yeniden yükleyin

  • sudo apt-get --reinstall install language-pack-de
    • eğer işe yaramazsa,

3. Yerel ayarları el ile zorla (kalıcı)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8

Bir JVM problemim var ve sistem yerel ayarını 12.04'te de ayarlamaya çalışıyorum. Tek sorun, deneyeceğim ne olursa olsun, LC_ALL'ı ayarlayamıyor gibiyim, yereller hala boş gösteriyor.
Karanlık Yıldız 1

15

Çizgi Comment SendEnv LANG LC_*içinde /etc/ssh/ssh_config, yani olması gerektiği gibi görünür:

#SendEnv LANG LC_*

10

Sorun

Varsayılan olarak, ssh client komutu yerel ayarlarla ilgili ortam değişkenlerini SSH sunucusuna iletir. Bu /etc/ssh/ssh_configmüşteri tarafında belirtilmiştir :

Host *
    SendEnv LANG LC_*

Ve varsayılan olarak, SSH sunucusu bunları kabul eder ( /etc/ssh/sshd_configsunucuda):

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

Bu nedenle, kabuğunuzda yerel ayarlarla ilgili ortam değişkenleri varsa, bunlar sunucu tarafında SSH oturumuna doldurulur.

Ne yazık ki, SendEnvseçenek birikimlidir . Göre 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.

bu geçersiz kılınamayacağı anlamına gelir .

Çözüm

Bazen, özellikle sunucu tarafında, sistem genelinde bir yapılandırmayı değiştirmek imkansız veya akıllı değildir. Ancak bunu atlayabilirsiniz . Ve bu -Fssh komutundaki seçeneğin yan etkisi . Göre 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.

Varsayılan olarak kullanıcı başına konfigürasyon dosyası ~/.ssh/configmevcutsa kullanılır. Ancak bunu açıkça geçmek için komut satırında belirtebilirsiniz/etc/ssh/ssh_config :

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

Bir takma ad yaparsanız daha uygun olur ~/.bashrc:

alias ssh="ssh -F ~/.ssh/config"

Bu yolla, SendEnvsistem genelindeki konfigürasyondaki varsayılan direktifler etkin değildir, ortam değişkenlerinin varsayılan olarak SSH sunucusuna gönderilmemesini sağlar.


2
/ Etc / ssh / config içindeki sistem konfigürasyon dosyasının, kullanıcı konfigürasyonunuzda saklamak istediğiniz ek satırları içerebileceğini unutmayın. Bu ayarları saklamak için bunları ~ / .ssh / config dosyasındaki kullanıcı config dosyasına kopyalamanız gerekir.
Steven Maude

4

Ben de benzer bir sorun yaşadım. Benim çözümüm içindeki SendEnvsatırları yorumlamak /etc/ssh/ssh_config(bunlar geçersiz kılınamadığı için) ve aşağıdaki girişi eklemek oldu ~/.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    

ile <somehost>ben hangi ana makine adı olmaktan vermedi herhangi bir ortam değişkeni göndermek istiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.