pol*_*mon 9 ssh character-encoding tmux
我有一台服务器,上面运行着 tmux 会话。让我们tmux_session
在本文的其余部分中将该会话称为“会话”。
可以通过两种略有不同的方式来附加到该会话:
\n首先通过 ssh 连接到服务器:
\nuser@host$ ssh user@server.tld\n
Run Code Online (Sandbox Code Playgroud)\n然后附加到指定的会话:
\nuser@server$ tmux a -d -t tmux_session\n
Run Code Online (Sandbox Code Playgroud)\n通过 ssh-ing 并同时附加:
\nuser@host$ ssh user@server.tld -t tmux -a -d -t tmux_session\n
Run Code Online (Sandbox Code Playgroud)\n方法 \xe2\x84\x961按预期工作。我的LANG
设置为C.UTF-8
, echo
-ing 它在里面tmux_session
工作正常,并且报告正确。像“\xc2\xb9\xc2\xb2\xc2\xb3\xc2\xa4”这样的字符的 Unicode 输入工作得很好。
方法 \xe2\x84\x962产生一个会话,该会话无法显示除简单 ASCII 之外的 Unicode 字符。所有其他字符均被替换为_
(下划线)。但是,当输入特殊字符时,该字符实际上会输入到内部运行的任何应用程序中tmux_session
,我使用编辑器、IRC 客户端等确认了它。当我使用方法 \xe2\x84\x961 分离并重新附加时,之前输入的字符显示正确。
使用方法 \xe2\x84\x962 时,此问题仅在使用 ssh 命令附加到会话时发生,并且仅影响字符的显示,而不影响输入的实际字符。
\n不过,里面的一些输出tmux
两次都有点损坏。当我使用任一echo $LANG
方法进入内部时,我会看到以下内容:tmux_session
$ echo $LANG \ncho C.UTF-8C.UTF-8\n
Run Code Online (Sandbox Code Playgroud)\n某些内容出现乱码,由于某种原因输入行(部分)重复。我在 superuser.com 上的另一篇文章中读到,应该首先尝试删除.tmux.conf
. 我没有.tmux.conf
,所以没有该文件似乎并不能缓解我的问题。无论如何,$LANG
设置为C.UTF-8
是正确的。
当仅通过 ssh 连接到服务器时,不会发生这种乱码输出。
\n您正在检查会话内的区域设置tmux
,而不是那些tmux
本身接收到的区域设置。
server.ltd
可能没有AcceptEnv LANG LC_*
在它的sshd_config
或/和你没有SendEnv LANG LC_*
在你的ssh_config
,所以你的本地系统和终端使用UTF-8作为字符集的事实不会传输到远程tmux
客户端。
您可以通过执行以下操作来解决它:
ssh -t user@server.tld "
set -o allexport
$(locale | grep -v '"')
exec tmux -a -d -t tmux_session"
Run Code Online (Sandbox Code Playgroud)
(假设本地 shell 和远程用户的登录 shell 是类似 POSIX 的)
或者,如果您知道您的终端正在以 UTF-8 进行通信,则只需对您选择的 UTF-8 语言环境进行硬编码:
ssh -t user@server.tld 'exec env LANG=C.UTF-8 tmux -a -d -t tmux_session'
Run Code Online (Sandbox Code Playgroud)
(所有 shell 都能理解的语法)。