通过 ssh 连接到 tmux 会话时出现 UTF-8 问题

pol*_*mon 9 ssh character-encoding tmux

设想:

\n

我有一台服务器,上面运行着 tmux 会话。让我们tmux_session在本文的其余部分中将该会话称为“会话”。

\n

可以通过两种略有不同的方式来附加到该会话:

\n
    \n
  1. 首先通过 ssh 连接到服务器:

    \n
    user@host$ ssh user@server.tld\n
    Run Code Online (Sandbox Code Playgroud)\n

    然后附加到指定的会话:

    \n
    user@server$ tmux a -d -t tmux_session\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 通过 ssh-ing 并同时附加:

    \n
    user@host$ ssh user@server.tld -t tmux -a -d -t tmux_session\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
\n

症状:

\n

方法 \xe2\x84\x961按预期工作。我的LANG设置为C.UTF-8, echo-ing 它在里面tmux_session工作正常,并且报告正确。像“\xc2\xb9\xc2\xb2\xc2\xb3\xc2\xa4”这样的字符的 Unicode 输入工作得很好。

\n

方法 \xe2\x84\x962产生一个会话,该会话无法显示除简单 ASCII 之外的 Unicode 字符。所有其他字符均被替换为_(下划线)。但是,当输入特殊字符时,该字符实际上会输入到内部运行的任何应用程序中tmux_session,我使用编辑器、IRC 客户端等确认了它。当我使用方法 \xe2\x84\x961 分离并重新附加时,之前输入的字符显示正确。

\n

使用方法 \xe2\x84\x962 时,此问题仅在使用 ssh 命令附加到会话时发生,并且仅影响字符的显示,而不影响输入的实际字符。

\n

不过,里面的一些输出tmux两次都有点损坏。当我使用任一echo $LANG方法进入内部时,我会看到以下内容:tmux_session

\n
$ 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是​​正确的。

\n

当仅通过 ssh 连接到服务器时,不会发生这种乱码输出。

\n

Sté*_*las 9

您正在检查会话内的区域设置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 都能理解的语法)。