Ssh

當我要求 SSH 在遠端主機上重新附加螢幕會話時,字元被編碼兩次

  • September 25, 2020

我希望能夠通過 SSH 連接到遠端主機並使用一個命令恢復螢幕會話。兩台主機都使用 UTF-8 語言環境。我的問題是,然後,在螢幕會話中,字元被編碼兩次。

如其他相關問題所述,我需要將-t選項傳遞給ssh命令以便為互動式會話分配偽 tty:

網路中斷後自動(或更容易)重新連接到螢幕會話

因此我使用的命令是ssh -t remotehost screen -dr. 當我以這種方式恢復螢幕時,我從鍵盤發送的字元被編碼兩次,我從遠端主機接收的字元被解碼兩次:

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

我所說的“字元被編碼兩次”的意思是,如果我輸入,通常我會看到相同的輸出:

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

單獨的偽 tty 分配不會導致問題。我試過了:

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

這表明screen您將會話附加到認為您的終端不在 UTF-8 中。

例如,它認為(如果它假設字元集是 iso-8859-1)0xc3來自終端設備意味著Ã.

然而,螢幕會話以 UTF-8 執行(screen是一個終端仿真器,可以連接到不同類型的終端)。

因此,在輸入 時ä,您正在發送0xc3 0xa4. screen了解您正在輸入兩個字元 (ä)。它需要將它們轉換為等效的 UTF-8。

在顯示時,這些 UTF-8 字元被轉換為它們的 iso-8859-1 等效字元,這就是為什麼你看到ä而不是ä.

您需要告知screen您的終端是 UTF-8。

通常,將語言環境設置為 UTF-8 就足夠了。

大多數 ssh 部署將語言環境資訊從客戶端傳遞給遠端命令。如果客戶端上的語言環境是 UTF-8,那麼 ssh 不傳遞語言環境環境變數,或者 sshd 不接受它們,或者客戶端的語言環境不是伺服器上支持的語言環境之一,或者您~/.bashrc在伺服器上以某種方式覆蓋它。

無論如何,做:

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

(確保fi_FI.UTF-8確實是遠端主機支持的語言環境,請參閱locale -a檢查)應該修復它。

引用自:https://unix.stackexchange.com/questions/154966