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

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

设想:

我有一台服务器,上面运行着 tmux 会话。我们称该会话为tmux_session在这篇文章的其余部分。

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

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

    user@host$ ssh [email protected]
    

    然后附加到指定的会话:

    user@server$ tmux a -d -t tmux_session
    
  2. 通过 ssh-ing 并同时附加:

    user@host$ ssh [email protected] -t tmux -a -d -t tmux_session
    

症状:

方法一按预期工作。我的LANG设置为C.UTF-8, echo-ing 它在里面tmux_session工作正常,并且报告正确。 Unicode 输入的字符(如“123¤”)工作得很好。

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

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

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

$ echo $LANG                            
cho C.UTF-8C.UTF-8

某些内容出现乱码,由于某种原因输入行(部分)重复。我在 superuser.com 上的另一篇文章中读到,应该首先尝试删除.tmux.conf.我没有.tmux.conf,所以没有该文件似乎并不能缓解我的问题。无论如何,$LANG设置为C.UTF-8是​​正确的。

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

答案1

您正在检查会话内的区域设置tmux,而不是那些tmux本身接收到的区域设置。

server.ltd可能没有AcceptEnv LANG LC_*在它的sshd_config或/和你没有SendEnv LANG LC_*在你的ssh_config,所以你的本地系统和终端使用UTF-8作为字符集的事实不会传输到远程tmux客户端。

您可以通过执行以下操作来解决它:

ssh -t [email protected] "
  set -o allexport
  $(locale | grep -v '"')
  exec tmux -a -d -t tmux_session"

(假设本地 shell 和远程用户的登录 shell 是类似 POSIX 的)

或者,如果您知道您的终端正在以 UTF-8 进行通信,则只需对您选择的 UTF-8 语言环境进行硬编码:

ssh -t [email protected] 'exec env LANG=C.UTF-8 tmux -a -d -t tmux_session'

(所有 shell 都能理解的语法)。

答案2

tmux -u即使 $LANG 设置不正确,也可用于强制输出 utf-8。

相关内容