通過 ssh 附加到 tmux 會話時出現 UTF-8 問題
設想:
我有一台伺服器,在其上執行 tmux 會話。讓我們在本文的其餘部分中呼叫該會話*
tmux_session
*。可以通過兩種略有不同的方式附加到該會話:
- 首先通過 ssh-ing 到伺服器:
user@host$ ssh user@server.tld
然後附加到命名會話:
user@server$ tmux a -d -t tmux_session
- 通過 ssh-ing 和同時附加:
user@host$ ssh user@server.tld -t tmux -a -d -t tmux_session
症狀:
方法№1按預期工作。我
LANG
的設置為C.UTF-8
,echo
-ing 它在裡面tmux_session
工作正常,並且報告正確。像“¹²³¤”這樣的字元的 Unicode 輸入,工作得非常好。方法№2產生一個會話,除了簡單的ASCII 之外,它不能顯示Unicode 字元。所有其他字元都替換為
_
(下劃線)。但是,當輸入特殊字元時,該字元實際上是輸入到內部執行的任何應用程序中tmux_session
,我使用編輯器、IRC 客戶端等確認了它。當我使用方法 №1 分離和重新附加時,之前輸入的字元會正確顯示.使用方法二時的這個問題,只有在使用 ssh 命令附加到會話時才會發生,並且它只影響字元的顯示,而不影響正在輸入的實際字元。
不過,裡面的一些輸出
tmux
兩次都有點壞。當我使用任何echo $LANG
一種方法進入內部時,我都會看到:tmux_session
$ echo $LANG cho C.UTF-8C.UTF-8
出現亂碼,由於某種原因,輸入行(部分)重複。我在 superuser.com 上的另一篇文章中讀到,應該先刪除
.tmux.conf
. 我沒有.tmux.conf
,因此沒有該文件似乎並不能減輕我的問題。無論如何,$LANG
設置為C.UTF-8
是正確的。當只是 ssh-ing 到伺服器時,不會發生這種亂碼輸出。
您正在檢查
tmux
會話中的語言環境設置,而不是那些tmux
本身接收的語言環境設置。
server.ltd
可能沒有AcceptEnv LANG LC_*
它的sshd_config
或/並且您沒有SendEnv LANG LC_*
,ssh_config
因此您的本地系統和終端使用 UTF-8 作為字元集這一事實不會傳輸到遠端tmux
客戶端。您可以通過以下方式解決它:
ssh -t user@server.tld " set -o allexport $(locale | grep -v '"') exec tmux -a -d -t tmux_session"
(假設本地 shell 和遠端使用者的登錄 shell 類似於 POSIX)
或者,如果您知道您的終端正在使用 UTF-8 通話,則只需硬編碼您選擇的 UTF-8 語言環境:
ssh -t user@server.tld 'exec env LANG=C.UTF-8 tmux -a -d -t tmux_session'
(所有 shell 都能理解的語法)。