ヒント

ヒント

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 サーバーに接続すると同じエラーが発生し、他のディストリビューションと接続しても問題はありません。

アップデート2:追加して問題を解決しました。

LANG="en_US.UTF-8"
export LANG

入力する~/.bashrc

答え1

mosh冗長なオプションやデバッグオプションは明らかではsshありませんが、接続時に使用するコマンドをmosh知らせることができ、オプションを追加するとロケール変数にそれを表示させることができます。ssh-vvvssh送る

例えば、

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構成以降)考慮する必要がある2番目の場所です。 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(異なる場合があります)を使用して対話型ロケールを設定します。 Xの対話型セッション(gdm経由)を使用する代わりに、SSH接続はシステムロケールとは異なる値を使用できます。この場合は、システムロケールを変更する必要があります(参照:ロケールDebian Wikiから)。

答え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シェル全体の変数を変更する代わりに、次のエイリアスを使用することもできます。

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

答え3

AskUbuntuへの答えです。私の問題を解決しました。

(この回避策は、この問題が発生したDebianサーバーユーザーのためのものであり、特定の問題とは別のものです。)マイコンピュータは、Proxmoxが処理するDebian LXコンテナです。

マイコンピュータにlocalesパッケージがインストールされていますが、再設定する必要があります。

sudo dpkg-reconfigure locales

より具体的な情報を見ることができますここ。一部のコンピュータにはこのコマンドがあるようですlocale-gen(私のコンピュータにはありません)。

関連情報