Yerel değişkenlerin uzak kabukta etkisi yoktur (perl: warning: Ayar yerel ayarı başarısız oldu.)

84

Yeni bir ubuntu 12.04 yüklemem var. Uzak sunucuma bağlandığımda şu gibi 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.
...

Daha eski bir ubuntu kurulumundan bağlandığımda bu problemim yok. Bu ubuntu 12.04 kurulumundan çı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=

Ubuntu'da bu hata mesajını uzak sunucularda değiştirmek için neler değiştiğini bilen var mı?

    
sordu Janning 30.05.2012 20:51

5 cevap

160

Bunun nedeni, yerel makinenizdeki yerel ayarınızın, SSH'nin sunucuda kullanılmasına ve sunucuda kullanılmaya çalışıldığı, ancak sunucunuzun yüklü olmadığı Almanca'ya ayarlanmasıdır.

Birkaç seçeneğiniz var:

  • Yerel ayarı oluştur . % Co_de% ile sunucudaki Alman yerel ayarını oluşturun.

  • Yerel müşteriyi yönlendirmeyi durdur . Yerel ortam değişkenini yerel makinenizden sunucuya iletmeyin. % Co_de% satırını yerel sudo locale-gen de dosyasında yorumlayabilirsiniz.

  • Sunucudaki yerel ayarları kabul etmeyi durdur . Yerel ortam değişkenini yerel makinenizden sunucuya kabul etmeyin. % Co_de% satırını uzaktan SendEnv LANG LC_* dosyasında yorumlayabilirsiniz.

  • Sunucu yerel ayarını İngilizce’ye ayarlayın . Yerel ayarları sunucudaki İngilizce'ye açıkça ayarlayın. Örnek olarak, aşağıdaki satırları /etc/ssh/ssh_config veya AcceptEnv LANG LC_* dosyalarına ekleyebilirsiniz:

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

Sunucuya root erişiminiz yoksa, İstemciden yönlendirmeyi yerelleştir seçeneği, gitmek için en iyi (ve sadece) yol olabilir.

    
verilen cevap David Planella 31.05.2012 07:47
26

Bu, bazen taze minimum / alternatif yüklemelerde veya diğer durumlarda gerçekleşebilir. Düzeltme oldukça basit. Aşağıdaki sırayla, durumun düzeltilip giderilmediğini görmek için her birini test etmeyi deneyin:

1. Yerel ayarları yeniden yapılandırma

  • % Co_de%
    • bu işe yaramazsa,

2. Yerel dil paketini yeniden yükle

  • % Co_de%
    • bu işe yaramazsa,

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

  • sudo dpkg-reconfigure locales
verilen cevap ish 30.05.2012 21:19
14

SendEnv LANG LC_* satırında% co_de satırını yorumlayın, bu nedenle şöyle görünmelidir:

#SendEnv LANG LC_*
    
verilen cevap Zhengpeng Hou 21.12.2013 15:12
7

Sorun

Varsayılan olarak, ssh istemcisi yerel ayarlarla ilgili ortam değişkenlerini SSH sunucusuna iletir. Bu, istemci tarafında /etc/ssh/ssh_config olarak belirtildi:

Host *
    SendEnv LANG LC_*

Varsayılan olarak, SSH sunucusu bunları kabul eder (sunucuda /etc/ssh/sshd_config 'si olarak):

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

Yani, kabuğunuzda yerel ile ilgili ortam değişkenleri varsa, bunlar sunucu tarafındaki SSH oturumuyla doldurulur.

Maalesef, SendEnv seçeneği birikimli . % Co_de değerine göre:

 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ınmış olamayacağı anlamına gelir.

Çözüm

Bazen, özellikle sunucu tarafında sistem çapında bir yapılandırmayı değiştirmek imkansız veya yanlıştır. Ancak, baypas edebilirsiniz . Ve bu ssh komutunda man 5 ssh_config seçeneğinin yan etkisi. % Co_de değerine göre:

 -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 yapılandırma dosyası -F , kullanılıyorsa kullanılır. Ancak komut satırında açık bir şekilde belirtebilirsiniz man ssh dizisini atlayabilirsiniz:

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config [email protected]_host

~/.ssh/config 'da bir takma ad oluşturursanız daha kullanışlı olur:

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

Bu şekilde, sistem genelindeki yapılandırmadaki varsayılan /etc/ssh/ssh_config yönergeleri etkili değildir ve hiçbir koşul değişkeninin varsayılan olarak SSH sunucusuna gönderilmemesidir.

    
verilen cevap Rockallite 22.01.2017 03:46
4

Benzer bir sorunum vardı. Çözümüm, SendEnv satırında /etc/ssh/ssh_config yorumunu (bunlar geçersiz kılınmadığından) yorumlamak ve aşağıdaki girdiyi ~/.ssh/config dosyasına eklemek oldu:

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> ile herhangi bir ortam değişkeni göndermek istemediğim ana bilgisayar adı.

.     
verilen cevap Gwendal 29.02.2016 11:30

Etiketlerdeki diğer soruları oku