ヒント

ヒント

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から)。

おすすめ記事