当我要求 SSH 在远程主机上重新连接屏幕会话时,字符被编码两次

当我要求 SSH 在远程主机上重新连接屏幕会话时,字符被编码两次

我希望能够通过 SSH 连接到远程主机并使用一个命令恢复屏幕会话。两台主机都使用 UTF-8 语言环境。我的问题是,在屏幕会话内,字符被编码两次。

正如其他相关问题中所述,我需要将选项传递-tssh命令,以便为交互式会话分配伪 tty:

网络中断后自动(或更容易)重新连接到屏幕会话

因此我使用的命令是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

单独的伪 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 0xa4screen理解您正在输入两个字符 (ä)。它需要将它们转换为 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'.

相关内容