リモートホストに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
確認を参照してください。)問題を解決する必要があります。
答え2
screen
実行するオプションがありますUTF-8モデル:
-U Run screen in UTF-8 mode. This option tells screen that your terminal sends and understands UTF-8 encoded characters. It also sets the default encoding for new windows to `utf8'.