通过 SSH 连接到我的(Ubuntu)服务器时遇到一个奇怪的问题。
如果我从 Gentoo 盒子连接,一切都很好。所有变音符号等都可以工作,我可以输入“ÄÖÜ”等等。
如果我从 Artix 机器上执行相同操作,则在 shell 中输入变音符号不会产生任何结果,而在 vim 会话中输入它们则会导致乱码输出(例如,“�~D�~V�~”是“ÄÖÜ”的输出)。
两台机器都运行 KDE 并使用 OpenRC,并且都以相同的方式配置了区域设置:
/etc/locale.gen
包含de_DE.UTF-8 UTF-8
,区域设置也设置为此,并且在两台机器上,我得到以下输出(也在 Ubuntu 服务器上!):
$ locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
有趣的是,在进行“间接” SSH 连接时也会发生这种情况:当我从 Gentoo 机器连接到 Artix 机器时,一切仍然按预期工作(输入变音符号等)。当我从此会话内部连接到服务器时,结果与直接从 Artix 机器连接时相同。
奇怪的是,如果我从 Artix 机器到 Gentoo 机器创建 SSH 连接,Umlaut 功能就可以正常工作……但如果我连接到 Ubuntu 服务器则不行。
是什么原因造成的?
答案1
env | grep -E "^LANG|^LC"
在 Gentoo、Artix 以及从 Gentoo 连接到 Ubuntu 上均会显示LANG=de_DE.UTF-8
。如果我从 Artix 连接到 Ubuntu,则不会显示任何输出。
这很可能意味着:
Ubuntu 服务器的 PAM 配置在登录时不会读取 /etc/default/locale 或者该文件未按
LANG=de_DE.UTF-8
应有的方式定义,因此您的 SSH 登录实际上依赖于 SSH 客户端转发的与语言环境相关的环境变量;和您在 Artix 上的 SSH 客户端也未配置为转发与语言环境相关的环境变量,即它没有典型
SendEnv LANG LC_*
的ssh_config
。
最好先修复 #1 – 设置 Ubuntu 服务器的系统区域设置(localectl set-locale
如果有的话),或者可能dpkg-reconfigure locales
采用 Debian 方式。这不仅有助于 SSH 会话,还有助于系统服务(例如,当它们写入系统日志和其他情况时)。
(请注意,对于 #1,并非所有发行版都以相同的方式工作 - Ubuntu 使用 pam_env,而 Arch 通过 /etc/profile 设置环境变量,这增加了更多的复杂性。)