Ssh

通過 ssh 附加到 tmux 會話時出現 UTF-8 問題

  • March 22, 2022

設想:

我有一台伺服器,在其上執行 tmux 會話。讓我們在本文的其餘部分中呼叫該會話*tmux_session*。

可以通過兩種略有不同的方式附加到該會話:

  1. 首先通過 ssh-ing 到伺服器:
user@host$ ssh user@server.tld

然後附加到命名會話:

user@server$ tmux a -d -t tmux_session
  1. 通過 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 都能理解的語法)。

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