當我要求 SSH 在遠端主機上重新附加螢幕會話時,字元被編碼兩次
我希望能夠通過 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
檢查)應該修復它。