As variáveis de localidade não têm efeito no shell remoto (perl: warning: Falha na configuração de localidade.)

82

Eu tenho uma nova instalação do Ubuntu 12.04. Quando eu me conecto ao meu servidor remoto eu tenho erros como este:

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

Eu não tenho esse problema quando me conecto de uma instalação mais antiga do Ubuntu. Esta é a saída da minha instalação do Ubuntu 12.04, LANG e LANGUAGE estão definidos

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

Alguém sabe o que mudou no Ubuntu para obter essa mensagem de erro em servidores remotos?

    
por Janning 30.05.2012 / 20:51

5 respostas

155

Isso porque sua localidade em sua máquina local está configurada para alemão, que o SSH encaminha para e tenta usar no servidor, mas seu servidor não o tem instalado.

Você tem várias opções:

  • Gere o código do idioma . Gere a localidade alemã no servidor com sudo locale-gen de .

  • Pare de redirecionar o código de idioma do cliente . Não encaminhe a variável de ambiente local de sua máquina local para o servidor. Você pode comentar a linha SendEnv LANG LC_* no arquivo local /etc/ssh/ssh_config .

  • Pare de aceitar a localidade no servidor . Não aceite a variável de ambiente local de sua máquina local para o servidor. Você pode comentar a linha AcceptEnv LANG LC_* no arquivo remote /etc/ssh/sshd_config .

  • Defina a localidade do servidor para inglês . Defina explicitamente a localidade para inglês no servidor. Como exemplo, você pode adicionar as seguintes linhas aos arquivos ~/.bashrc ou ~/.profile remotos:

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

Se você não tem acesso root ao servidor, a opção Parar o encaminhamento do código de idioma do cliente pode ser o melhor (e único) caminho a percorrer.

    
por David Planella 31.05.2012 / 07:47
26

Isso pode acontecer às vezes em instalações recentes mínimas / alternativas ou em outras situações. A correção é bem simples. Tente estes, na seguinte ordem, testando depois de cada um para ver se a situação está resolvida:

1. Reconfigurar localidades

  • %código%
    • se isso não funcionar,

2. Reinstale o pacote de idioma locale

  • %código%
    • se isso não funcionar,

3. Forçar manualmente as configurações de localidade (persistente)

  • sudo dpkg-reconfigure locales
por ish 30.05.2012 / 21:19
13

Comente a linha SendEnv LANG LC_* em /etc/ssh/ssh_config , por isso deve parecer:

#SendEnv LANG LC_*
    
por Zhengpeng Hou 21.12.2013 / 15:12
5

O problema

Por padrão, o comando do cliente ssh encaminha variáveis de ambiente relacionadas ao local para o servidor SSH. Isso está especificado em /etc/ssh/ssh_config no lado do cliente:

Host *
    SendEnv LANG LC_*

E por padrão, o servidor SSH aceita-os (em /etc/ssh/sshd_config no servidor):

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

Portanto, se houver variáveis de ambiente relacionadas ao local em seu shell, elas serão preenchidas na sessão SSH no lado do servidor.

Infelizmente, a opção SendEnv é cumulativa . De acordo com 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.

o que significa que não pode ser substituído .

A solução

Às vezes é impossível ou imprudente alterar uma configuração de todo o sistema, especialmente no lado do servidor. No entanto, você pode ignorá-lo . E esse é o efeito colateral da opção -F no comando ssh. De acordo com 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.

Por padrão, o arquivo de configuração por usuário ~/.ssh/config é usado se for apresentado. Mas você pode explicitamente especificá-lo na linha de comando para ignorar /etc/ssh/ssh_config :

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

Seria mais conveniente criar um alias em ~/.bashrc :

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

Dessa forma, as diretivas SendEnv padrão na configuração de todo o sistema não são efetivas, fazendo com que nenhuma variável de ambiente seja enviada ao servidor SSH por padrão.

    
por Rockallite 22.01.2017 / 03:46
3

Eu tive um problema semelhante. Minha solução foi comentar as linhas SendEnv em /etc/ssh/ssh_config (já que elas não podem ser substituídas) e adicionar a seguinte entrada em ~/.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    

com <somehost> sendo o nome do host para o qual eu não queria enviar qualquer variável de ambiente.

    
O
por Gwendal 29.02.2016 / 11:30

Tags