Eu tenho uma nova instalação do ubuntu 12.04. Quando me conecto ao meu servidor remoto, recebo 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.
...
Não tenho esse problema quando me conecto a partir de uma instalação mais antiga do ubuntu. Isso é resultado da minha instalação do ubuntu 12.04, LANG e LANGUAGE estão definidas
$ 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 receber essa mensagem de erro em servidores remotos?
Respostas:
Isso ocorre porque o local em sua máquina local está definido como alemão, que o SSH encaminha e tenta usar no servidor, mas o servidor não o instala.
Você tem várias opções:
Gere o código do idioma . Gere o código de idioma alemão no servidor com
sudo locale-gen de
.Pare de encaminhar a localidade do cliente . Não encaminhe a variável de ambiente locale da sua máquina local para o servidor. Você pode comentar a
SendEnv LANG LC_*
linha no arquivo local/etc/ssh/ssh_config
.Pare de aceitar a localidade no servidor . Não aceite a variável de ambiente locale da sua máquina local para o servidor. Você pode comentar a
AcceptEnv LANG LC_*
linha no arquivo remoto/etc/ssh/sshd_config
.Defina o código do idioma do servidor para inglês . Defina explicitamente o código do idioma para inglês no servidor. Como exemplo, você pode adicionar as seguintes linhas ao seu controle remoto
~/.bashrc
ou~/.profile
arquivos:Se você não tiver acesso root ao servidor, a opção Interromper o encaminhamento do código do idioma a partir do cliente pode ser o melhor (e único) caminho a percorrer.
fonte
~/.profile
resolveu meu problema. Obrigado.LANG
com outra coisa ..?Às vezes, isso pode acontecer em instalações mínimas / alternativas novas ou em outras situações. A correção é bem simples. Tente estes, na seguinte ordem, testando após cada um para verificar se a situação foi corrigida:
1. Reconfigure as localidades
sudo dpkg-reconfigure locales
2. Reinstale o pacote de idiomas da localidade
sudo apt-get --reinstall install language-pack-de
3. Forçar manualmente as configurações de local (persistente)
sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
fonte
Comente a linha
SendEnv LANG LC_*
em/etc/ssh/ssh_config
, por isso deve se parece com:fonte
O problema
Por padrão, o comando ssh client encaminha variáveis de ambiente relacionadas ao código do idioma para o servidor SSH. Isso é especificado no
/etc/ssh/ssh_config
lado do cliente:E, por padrão, o servidor SSH os aceita (no
/etc/ssh/sshd_config
servidor):Portanto, se houver variáveis de ambiente relacionadas ao código do idioma no seu shell, elas serão preenchidas na sessão SSH no lado do servidor.
Infelizmente, a
SendEnv
opção é cumulativa . De acordo comman 5 ssh_config
:o que significa que não pode ser substituído .
A solução
Às vezes, é impossível ou imprudente alterar uma configuração em todo o sistema, especialmente no lado do servidor. No entanto, você pode ignorá- lo. E esse é o efeito colateral da
-F
opção no comando ssh. De acordo comman ssh
:Por padrão, o arquivo de configuração por usuário
~/.ssh/config
é usado se apresentar. Mas você pode especificá-lo explicitamente na linha de comando para ignorar/etc/ssh/ssh_config
:Seria mais conveniente se você criar um alias em
~/.bashrc
:Dessa forma, as
SendEnv
diretivas padrão na configuração de todo o sistema não são eficazes, tornando nenhuma variável de ambiente enviada ao servidor SSH por padrão.fonte
Eu tive uma questão semelhante. Minha solução foi comentar as
SendEnv
linhas/etc/ssh/ssh_config
(já que elas não podem ser substituídas) e adicionar a seguinte entrada em~/.ssh/config
:com
<somehost>
sendo o nome do host para o qual eu não quero enviar qualquer variável de ambiente.fonte