준호씨의 블로그

/etc/profile.d/lang.sh: line 19: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory 본문

IT이야기

/etc/profile.d/lang.sh: line 19: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

준호씨 2022. 8. 8. 22:03
반응형

MacOS 터미널에서 CentOS로 ssh로 접속하니 뭔가 경고가 뜹니다.

$ ssh user@some.server.com -t zsh
/etc/profile.d/lang.sh: line 19: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

예전에는 안 떴는데 왜 갑자기 나타나는 걸까요.

 

이 상태에서 vi 등의 편집기로 한글을 입력하면 다음과 같이 깨져버립니다.

 

/etc/profile.d/lang.sh 19번째 줄에 뭐가 있는지 궁금해서 열어 봅니다.

  1 # /etc/profile.d/lang.sh - set i18n stuff
  2
  3 sourced=0
  4
  5 if [ -n "$LANG" ]; then
  6     saved_lang="$LANG"
  7     [ -f "$HOME/.i18n" ] && . "$HOME/.i18n" && sourced=1
  8     LANG="$saved_lang"
  9     unset saved_lang
 10 else
 11     for langfile in /etc/locale.conf "$HOME/.i18n" ; do
 12         [ -f $langfile ] && . $langfile && sourced=1
 13     done
 14 fi
 15
 16 if [ "$sourced" = 1 ]; then
 17     [ -n "$LANG" ] && export LANG || unset LANG
 18     [ -n "$LC_ADDRESS" ] && export LC_ADDRESS || unset LC_ADDRESS
 19     [ -n "$LC_CTYPE" ] && export LC_CTYPE || unset LC_CTYPE
 20     [ -n "$LC_COLLATE" ] && export LC_COLLATE || unset LC_COLLATE
 21     [ -n "$LC_IDENTIFICATION" ] && export LC_IDENTIFICATION || unset LC_IDENTIFICATION
 ...

어딘가 파일에서 LC_CTYPE 등 설정을 가져와서 환경변수로 등록하는 것으로 보입니다.

 

서버의 /etc/environment 수정

 

해결 방법은 구글링 해 보면 /etc/environment 에 다음 내용을 추가해 주라고 합니다.

LANG=en_US.utf-8
LC_ALL=en_US.utf-8

 

ssh로 다시 들어가 보니 이제는 잘 나옵니다.

클라이언트의 /etc/ssh/ssh_config SendEnv LANG LC_* 주석처리

하지만 접속하려는 다른 서버에서 같은 증상이 나타나고 매번 서버 설정을 바꿔주기는 불편합니다.

 

MacOS /etc/ssh/ssh_config에서 SendEnv LANG LC_* 부분을 주석 처리해주면 된다는 말이 있더군요.

ssh 접근 시 LANG, LC_* 설정을 서버로 보내서 맞춰주려고 하면서 오류가 발생하는 것으로 보입니다.

정말 해당 내용을 주석 처리하니 잘 됩니다. 뭔가 문제가 생길지는 모르겠지만 알게 되면 추가해봐야겠습니다.

 

 

기타 - 조금 더 알아보기

LANG, LC_ALL, LC_CTYPE 등등 이슈는 종종 겪고 있지만 어떤 원리로 이런 오류가 나는지, 해결이 되는 건지 아직도 잘 모르겠습니다 ^^; 이런저런 정보를 가지고 확인 및 추측해 본 내용을 적어봅니다.

 

참고로 지금 제 터미널 환경에서 관련 환경변수 값들을 확인해 보면 다음과 같습니다.

LC_CTYPE=UTF-8
LANG=
LC_ALL=

 

그리고 CentOS 리눅스 서버에서의 환경변수 상태는

/etc/environment 수정 전 아래의 상태였고요.

LC_CTYPE=UTF-8
LANG=en_US.UTF-8
LC_ALL=

/etc/environment 수정 후에는 아래의 상태로 바뀌었습니다.

LC_CTYPE=UTF-8
LANG=en_US.utf-8
LC_ALL=en_US.utf-8

 

 

추측해 보기로는 ssh로 접속할 때 client의 언어 설정 관련 환경변수 값들을 보내서 사용하게 되는 거 같습니다. ssh 설정의 SnedEnv 설정에 의해서 말이죠. LC_CTYPE이 있었기에 그 값이 그대로 설정이 된 거 같고요.

LANG값이 없었기 때문에 /etc/profile.d/lang.sh 스크립트에 의해 /etc/locale/conf를 사용하게 되는데 여기에는 다음의 내용이 있습니다.

LANG="en_US.UTF-8"

그래서 LANG이 없었을 때 LANG이 en_US.UTF-8이 되었던 것이고요.

 

그런데 서버에서 /etc/environment를 설정함으로써 LANG, LC_ALL을 넘기지 않았지만 /etc/environment의 설정을 이용하게 된 것으로 추측해 볼 수 있습니다.

 

언젠가 좀 더 자세히 알게 되면 다시 정리해보아야겠습니다.

반응형
Comments