提示

提示

我正在尝试从 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.

在 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=

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

更新:问题似乎出在 Gentoo 端,连接到 debian 服务器会产生相同的错误,使用其他发行版连接可以正常工作。

UPDATE2:我通过添加来修复它

LANG="en_US.UTF-8"
export LANG

进入~/.bashrc

答案1

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

例如,从

mosh -ssh='ssh -vvv' root@server

你可能会看到

debug1: Sending env LC_ALL = C  
debug2: channel 0: request env confirm 0

对于 POSIX,以及

debug1: Sending env LC_CTYPE = en_US.UTF-8
debug2: channel 0: request env confirm 0

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

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

即使允许配置设置,它仍然是可能的(特别是因为您正在连接到user)表明某人已决定该用户的区域设置应为 POSIX。为了,这是有道理的,因为通过选择/粘贴复制你会遇到更少的麻烦。

例如,某些系统用于/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

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

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

答案2

我也遇到了错误消息。但是,@Petr 提供的解决方法对我不起作用。我必须将环境变量的值设置LC_ALLen_US.UTF-8.设置LANG变量没有效果(因为在我看来它已经有了正确的值)。

另外,我还有一点小小的澄清:

您在中进行此更改客户环境,即你运行的地方mosh命令的位置。你做不是进行此更改服务器环境,即您要连接到的位置。

当我第一次发现这篇文章时,这对我来说并不直观。

另外,进一步说明一下:如上所述,在我的情况下LANG已经设置为en_US.UTF-8.然而,其他各种变量的设置有所不同:

LANG=en_US.UTF-8
LC_ADDRESS=nl_NL.UTF-8
LC_IDENTIFICATION=nl_NL.UTF-8
LC_MEASUREMENT=nl_NL.UTF-8
LC_MONETARY=nl_NL.UTF-8
LC_NAME=nl_NL.UTF-8
LC_NUMERIC=nl_NL.UTF-8
LC_PAPER=nl_NL.UTF-8
LC_TELEPHONE=nl_NL.UTF-8
LC_TIME=nl_NL.UTF-8

据推测,这会导致mosh应用程序中出现一些混乱,但ssh对此并不大惊小怪。

就我而言,我从 Pop!_OS 22.04 客户端环境连接到 Unbuntu 22.04 服务器环境

提示

您还可以使用以下别名,而不是更改LC_ALL整个 shell 的变量:

alias mosh="export LC_ALL=\"en_US.UTF8\" && mosh"

答案3

AskUbuntu 上的这个答案解决了我的问题。

(此解决方案适用于 Debian 服务器出现此问题的用户,与具体问题不同)。我的机器是由 Proxmox 处理的 Debian LX 容器。

我的机器已locales安装该软件包,但我需要重新配置它:

sudo dpkg-reconfigure locales

更具体的信息可以找到这里。好像有些机器可能有这个locale-gen命令(我的机器没有)。

相关内容