로케일 변수는 원격 쉘에 영향을 미치지 않습니다 (perl : 경고 : 로케일 설정 실패).


89

새로운 우분투 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.
...

이전 우분투 설치에서 연결할 때이 문제가 없습니다. 이것은 내 우분투 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=

원격 서버 에서이 오류 메시지를 얻기 위해 우분투에서 변경된 사항을 아는 사람이 있습니까?


답변:


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
하! 나는 그가 클라이언트의 로케일 설정 을 나열했다는 사실을 완전히 놓쳤다 ! 훌륭한 직업 ...
ish

10
"클라이언트에서 전달 로캘을 중지"하기로 결정했습니다. 잘 작동합니다. 나중에 참조 할 수 있도록 로컬 ~ / .ssh / config의 / etc / ssh / ssh_config에서 SendEnv 설정을 재정의 할 수 없습니다. 참조 bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning

3
bugs.php.net/bug.php?id=18556 과 결합하여 SSH의 로케일 전송은 실제 문제를 유발할 수 있습니다 (실제로 발생). bugzilla.mindrot.org/show_bug.cgi?id=1285#c9를 참조하십시오 . .
할릴 오즈

1
필자의 경우 로캘을 설정 ~/.profile하면 문제 가 해결되었습니다. 감사.
Francisco

서버에 독일어 로캘이없는 경우 사용자 요청 값을 LANG다른 것으로 덮어 쓰는 것이 왜 허용 됩니까? ..
Mikhail 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.

이는 재정의 될 수 없음을 의미합니다 .

해결책

때로는 서버 전체에서 시스템 전체 구성을 변경하는 것이 불가능하거나 현명하지 못한 경우가 있습니다. 그러나 이를 우회 할 수 있습니다. 이것이 -Fssh 명령 의 옵션 의 부작용 입니다. 에 따르면 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의 사용자 구성 파일로 복사해야합니다.
Steven Maude

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.