mosh-server 需要 UTF-8 本地语言环境才能运行

Pet*_*etr 10 ssh gentoo mosh

我正在尝试从我的 Gentoo 连接到 RHEL 服务器。两者都已mosh安装,但是我收到此错误:

petanb@localhost ~/Documents $ mosh root@server 
mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment ([no charset variables]) specifies
the character set "US-ASCII",

The client-supplied environment ([no charset variables]) specifies
the character set "US-ASCII".

LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
Connection to server closed.
/usr/bin/mosh: Did not find mosh server startup message.
Run Code Online (Sandbox Code Playgroud)

在 RHEL 上,我有以下语言环境:

# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

更新:问题似乎出在 Gentoo 方面,连接到 debian 服务器产生相同的错误,使用其他发行版进行连接。

UPDATE2:我通过添加修复它

LANG="en_US.UTF-8"
export LANG
Run Code Online (Sandbox Code Playgroud)

进入 ~/.bashrc

小智 9

简单的解决方案

user@machine:~$ LC_ALL="en_US.UTF-8" mosh-server
Run Code Online (Sandbox Code Playgroud)


Tho*_*key 5

mosh使用ssh. 虽然mosh显然没有详细或调试选项,但您可以告诉它ssh在连接时使用什么命令,并且通过添加-vvv选项可以显示它发送的ssh区域设置变量。

例如,从

mosh -ssh='ssh -vvv' root@server
Run Code Online (Sandbox Code Playgroud)

你可能会看到

debug1: Sending env LC_ALL = C  
debug2: channel 0: request env confirm 0
Run Code Online (Sandbox Code Playgroud)

对于 POSIX,以及

debug1: Sending env LC_CTYPE = en_US.UTF-8
debug2: channel 0: request env confirm 0
Run Code Online (Sandbox Code Playgroud)

这表明服务器确认了所使用的变量。遥控器sshd可能会忽略您的某些环境,具体取决于AcceptEnv配置中的设置sshd- 或您的用户SendEnv设置(在您的ssh配置中)。

并非所有服务器都通过 ssh 接受您的区域设置变量。

即使允许配置设置,仍然有可能(特别是当您连接到root用户时)有人决定该用户的区域设置应该是 POSIX。对于root来说,这是有道理的,因为通过选择/粘贴复制你会遇到更少的麻烦。

例如,某些系统用于/etc/profile.d/lang.sh设置交互式使用的区域设置。该脚本因系统而异,并且是在寻找区域设置信息未传递到远程系统的解释时要考虑的第二个位置(在 ssh/sshd 配置之后)。对于 Red Hat (CentOS),脚本尝试从系统和主配置中获取信息,例如,

if [ -n "$LANG" ]; then
    saved_lang="$LANG"
    [ -f "$HOME/.i18n" ] && . "$HOME/.i18n" && sourced=1
    LANG="$saved_lang"
    unset saved_lang
else
    for langfile in /etc/locale.conf "$HOME/.i18n" ; do
        [ -f $langfile ] && . $langfile && sourced=1
    done
fi
Run Code Online (Sandbox Code Playgroud)

SuSE 有所不同,它在读取基本相同的文件之前对 ssh 和 gdm 进行假设:

#
# lang.sh:      Set interactive language environment
#
# Used configuration files:
#
#     /etc/sysconfig/language
#     $HOME/.i18n
#

#
# Already done by the remote SSH side
#
test -z "$SSH_SENDS_LOCALE" || return

#
# Already done by the GDM
#
test -z "$GDM_LANG" || return
Run Code Online (Sandbox Code Playgroud)

对于您的特定服务器(未指定版本),脚本可能因版本而异。我的 Debian 服务器没有该文件 - 并且依赖默认系统区域设置和 gdm(可能不同)来设置交互式区域设置。您的 ssh 连接可以使用与系统区域设置不同的值,而不是使用 X 的交互式会话(通过 gdm)。在这种情况下,系统区域设置是需要修复的地方(请参阅Debian wiki 中的区域设置)。