リモートホストからスクリーンセッションを再接続するようにSSHに要求すると、文字は2回エンコードされます。

リモートホストからスクリーンセッションを再接続するようにSSHに要求すると、文字は2回エンコードされます。

リモートホストにSSHで接続し、1つのコマンドで画面セッションを再開したいと思います。どちらのホストもUTF-8ロケールを使用します。私の問題は、スクリーンセッション内で文字が2回エンコードされることです。

他の関連質問で述べたように、対話型セッションに疑似ttyを割り当てるには、コマンドに-tオプションを渡す必要があります。ssh

ネットワーク停止後に画面セッションに自動的に(またはより簡単に)再接続する

だから私が使用するコマンドはですssh -t remotehost screen -dr。このように画面を復元すると、キーボードから送信された文字は2回エンコードされ、リモートホストから受信した文字は2回デコードされます。

localhost % ssh -t remotehost screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 83 c2 a4 0a
0000005

最初にリモートホストに接続してから画面を復元すると、これは発生しません。

localhost % ssh remotehost
remotehost % screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 a4 0a
0000003

「文字が2回エンコードされます」という言葉は、次のように入力すると通常同じ出力が表示されることです。

localhost % echo ä | iconv -f ISO-8859-1 -t UTF-8 | hexdump -C
00000000  c3 83 c2 a4 0a
00000005

pseudo-tty 割り当てだけでは問題は発生しません。私は試した:

localhost % ssh -t remotehost /bin/zsh
remotehost % screen -dr
remotehost % echo ä | hexdump -C
0000000 c3 a4 0a
0000003

ベストアンサー1

これは、screen端末がUTF-8ではないと考えてセッションを接続していることを示します。

たとえば、文字セットがiso-8859-1であると仮定した場合、エンド0xc3デバイスから来るのはÃ

ただし、スクリーンセッションはUTF-8(screenさまざまな種類の端末に接続できる端末エミュレータ)で実行されます。

したがって、を入力するとä送信します0xc3 0xa4。 2文字(および)をscreen入力することを理解してください。 UTF-8に対応する形式に変換する必要があります。ä

表示されると、これらのUTF-8文字はiso-8859-1と同等の文字に変換されるため、表示される内容ää

screen端末にUTF-8であることを知らせる必要があります。

通常、ロケールを UTF-8 に設定すれば十分です。

ほとんどのSSHデプロイメントは、クライアントのロケール情報をリモートコマンドに渡します。クライアントのロケールがUTF-8ロケールの場合は、sshがロケール環境変数を渡さない、sshdがそれを許可しない、クライアントのロケールがサーバーでサポートされているロケールの1つではない、または何らかの方法でサーバー~/.bashrcでオーバーライドしてください。

とにかく、次のことを行います。

ssh -t remotehost LANG=fi_FI.UTF-8 screen -dr

fi_FI.UTF-8(リモートホストがそのロケールをサポートしていることを確認してください。locale -a確認を参照してください。)問題を解決する必要があります。

おすすめ記事