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의 설정을 이용하게 된 것으로 추측해 볼 수 있습니다.
언젠가 좀 더 자세히 알게 되면 다시 정리해보아야겠습니다.
'IT > 리눅스마스터1급' 카테고리의 다른 글
locale(로케일, 로캘) 이란? (0) | 2023.08.19 |
---|---|
linux 에서 라이브러리를 찾을 수 없다며 프로그램 실행이 안 될때 해결방법(error while loading shared libraries) (0) | 2023.08.19 |
[linux/Tip] Openssl 버전 및 openssh 버전 확인 (0) | 2023.08.17 |
Linux, 프로세스 확인(ps,pstree) (0) | 2023.08.17 |
unix , shell, 숫자, 문자 비교, -gt -lt -le -eq -ne (0) | 2023.08.17 |