원격 호스트에 SSH로 연결하고 하나의 명령으로 화면 세션을 재개하고 싶습니다. 두 호스트 모두 UTF-8 로케일을 사용합니다. 내 문제는 스크린 세션 내에서 문자가 두 번 인코딩된다는 것입니다.
다른 관련 질문에서 언급했듯이 대화형 세션에 의사 tty를 할당하려면 명령 -t
에 옵션을 전달해야 합니다 .ssh
네트워크 중단 후 화면 세션에 자동으로(또는 더 쉽게) 다시 연결
그래서 제가 사용하는 명령은 입니다 ssh -t remotehost screen -dr
. 이런 식으로 화면을 복원하면 키보드에서 보낸 문자는 두 번 인코딩되고 원격 호스트에서 받은 문자는 두 번 디코딩됩니다.
localhost % ssh -t remotehost screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 83 c2 a4 0a
0000005
먼저 원격 호스트에 연결한 다음 화면을 복원하면 이런 일이 발생하지 않습니다.
localhost % ssh remotehost
remotehost % screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 a4 0a
0000003
"문자가 두 번 인코딩됩니다"라는 말은 다음을 입력하면 일반적으로 동일한 출력이 표시된다는 것입니다.
localhost % echo ä | iconv -f ISO-8859-1 -t UTF-8 | hexdump -C
00000000 c3 83 c2 a4 0a
00000005
pseudo-tty 할당만으로는 문제가 발생하지 않습니다. 나는 시도했다:
localhost % ssh -t remotehost /bin/zsh
remotehost % screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 a4 0a
0000003
답변1
이는 screen
터미널이 UTF-8이 아니라고 생각하여 세션을 연결하고 있음을 나타냅니다.
예를 들어, 문자 집합이 iso-8859-1이라고 가정하는 경우 0xc3
최종 장치에서 오는 것은 Ã
.
그러나 스크린 세션은 UTF-8( screen
다양한 유형의 터미널에 연결할 수 있는 터미널 에뮬레이터)에서 실행됩니다.
따라서 을 입력하면 ä
을 보내는 것입니다 0xc3
0xa4
. 두 문자( 및 ) screen
를 입력한다는 점을 이해하세요 . UTF-8에 해당하는 형식으로 변환해야 합니다.Ã
¤
표시되면 이러한 UTF-8 문자는 iso-8859-1과 동등한 문자로 변환되므로 표시되는 내용 ä
은 ä
.
screen
터미널에 UTF-8임을 알려주어야 합니다 .
일반적으로 로케일을 UTF-8로 설정하면 충분합니다.
대부분의 SSH 배포는 클라이언트의 로케일 정보를 원격 명령으로 전달합니다. 클라이언트의 로케일이 UTF-8 로케일인 경우, ssh가 로케일 환경 변수를 전달하지 않거나, sshd가 이를 허용하지 않거나, 클라이언트의 로케일이 서버에서 지원되는 로케일 중 하나가 아니거나, 어떻게 ~/.bashrc
든 서버에서 재정의하세요.
어쨌든 다음을 수행하십시오.
ssh -t remotehost LANG=fi_FI.UTF-8 screen -dr
fi_FI.UTF-8
( 원격 호스트가 해당 로케일을 지원하는지 확인하세요 . locale -a
확인을 참조하세요.) 문제가 해결되어야 합니다.
답변2
screen
실행하는 옵션이 있습니다UTF-8모델:
-U Run screen in UTF-8 mode. This option tells screen that your terminal sends and understands UTF-8 encoded characters. It also sets the default encoding for new windows to `utf8'.