我希望能够通过 SSH 连接到远程主机并使用一个命令恢复屏幕会话。两台主机都使用 UTF-8 语言环境。我的问题是,在屏幕会话内,字符被编码两次。
正如其他相关问题中所述,我需要将选项传递-t
给ssh
命令,以便为交互式会话分配伪 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
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'.