준호씨의 블로그
/etc/profile.d/lang.sh: line 19: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory 본문
/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:03MacOS 터미널에서 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의 설정을 이용하게 된 것으로 추측해 볼 수 있습니다.
언젠가 좀 더 자세히 알게 되면 다시 정리해보아야겠습니다.
'IT이야기' 카테고리의 다른 글
삼성전자 노트북 블루스크린 오류로 A/S까지 (0) | 2022.08.20 |
---|---|
MacOS - alfred에서 클립보드 기능이 동작하지 않을때 (1) | 2022.08.17 |
OSX - fzf - fuzzy finder 입문 (0) | 2022.08.04 |
OSX - 한자키 설정하기 - Karabiner-Elements (0) | 2022.08.03 |
OSX 핫코너 - 마우스 커서를 코너에 가져다 두면 화면 보호기가 실행되도록 (0) | 2022.07.20 |