我正在尝试从 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
的设置- 或您的用户设置(在您的配置中)。AcceptEnv
sshd
SendEnv
ssh
并非所有服务器都通过 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_ALL
为en_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
命令(我的机器没有)。