원격 호스트에서 스크린 세션을 다시 연결하도록 SSH에 요청하면 문자가 두 번 인코딩됩니다.

원격 호스트에서 스크린 세션을 다시 연결하도록 SSH에 요청하면 문자가 두 번 인코딩됩니다.

원격 호스트에 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'.

관련 정보