Os caracteres são codificados duas vezes quando peço ao SSH para reconectar uma sessão de tela no host remoto

2

Eu quero ser capaz de SSH para um host remoto e restaurar uma sessão de tela com um comando. Ambos os hosts usam a localidade UTF-8. Meu problema é que, dentro da sessão de tela, os caracteres são codificados duas vezes.

Como afirmado em outras perguntas relacionadas, preciso passar a opção -t para o comando ssh para alocar uma pseudo-tty para uma sessão interativa:

link

Assim, o comando que eu uso é ssh -t remotehost screen -dr . Quando eu restaurar a tela dessa maneira, os caracteres que eu envio do teclado são codificados duas vezes, e os caracteres que recebo do host remoto são decodificados duas vezes:

localhost % ssh -t remotehost screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 83 c2 a4 0a
0000005

Isso não acontece se eu me conectar primeiro ao host remoto e restaurar a tela:

localhost % ssh remotehost
remotehost % screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 a4 0a
0000003

O que quero dizer com "caracteres são codificados duas vezes" é que normalmente vejo a mesma saída se eu digitar:

localhost % echo ä | iconv -f ISO-8859-1 -t UTF-8 | hexdump -C
00000000  c3 83 c2 a4 0a
00000005

A alocação pseudo-tty sozinha não causa o problema. Eu tentei:

localhost % ssh -t remotehost /bin/zsh
remotehost % screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 a4 0a
0000003
    
por Seppo Enarvi 11.09.2014 / 08:35

2 respostas

3

Isso sugere que o screen que você está anexando à sua sessão acha que seu terminal não está em UTF-8.

Ele pensa, por exemplo (se assumir que o conjunto de caracteres é iso-8859-1) que 0xc3 vindo do dispositivo terminal significa à .

A sessão de tela, no entanto, está sendo executada em UTF-8 ( screen é um emulador de terminal que pode ser conectado a diferentes tipos de terminais).

Portanto, ao digitar ä , você está enviando 0xc3 0xa4 . screen entende que você está digitando dois caracteres ( Ã e ¤ ). Ele precisa convertê-los em seu equivalente UTF-8.

Em exibição, esses caracteres UTF-8 são convertidos em seus equivalentes iso-8859-1, e é por isso que você está vendo ä e não ä .

Você precisa dizer a screen que seu terminal é UTF-8.

Normalmente, basta definir a localidade como uma localidade UTF-8.

A maioria das implantações ssh passa as informações de localidade do cliente para o comando remoto. Se sua localidade no cliente for UTF-8, o ssh não passará as variáveis de ambiente do código de idioma ou o sshd não as aceitará, ou o código do idioma no lado do cliente não será um dos suportados no servidor , ou o seu ~/.bashrc no servidor de alguma forma o substitui.

De qualquer forma, fazendo:

ssh -t remotehost LANG=fi_FI.UTF-8 screen -dr

(certificando-se de que fi_FI.UTF-8 é de fato uma localidade suportada no host remoto, veja locale -a para verificar) deve corrigir isso.

    
por 11.09.2014 / 13:56
1

screen tem uma opção para executar no modo 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'.
    
por 11.09.2014 / 10:41