Ký tự nước ngoài sẽ không hiển thị trong SSH


17

Tôi đang gặp một số vấn đề với việc sử dụng sshvà một máy chủ từ xa (mà tôi không có quyền truy cập quản trị viên) - Cụ thể, có một vài thư mục trên đó có văn bản tiếng Hàn và tiếng Cyrillic.

Khi tôi hiển thị nội dung thư mục mẹ ls, các ký tự được thoát là "?". Có lẽ đáng lưu ý là các nhân vật Hàn Quốc dường như thoát ra nhiều hơn so với số lượng nhân vật nên có.

Tôi biết rằng chương trình đầu cuối mà tôi đang sử dụng có thể hiển thị các ký tự, vì sử dụng sftpsẽ hiển thị chúng hoàn hảo. Vấn đề xảy ra trên tất cả các thiết bị đầu cuối tôi đã thử.

Tóm tắt về máy móc

Máy địa phương:

  • Linux 2.6.32-5-686, i686
  • Debian GNU / Linux 6.0.2 (ép)
  • Có quyền truy cập quản trị viên

Máy chủ từ xa:

  • Linux 2.6.32-bpo.5-amd64, x86_64
  • Debian GNU / Linux 5.0.8 (đồng xu)
  • Không có quyền truy cập quản trị viên, cũng không phải vật lý

Có lẽ tôi đã bỏ lỡ một số thống kê quan trọng hoặc một chút thông tin, trong trường hợp đó tôi xin lỗi. Tôi khá mới đối với toàn bộ mặt máy tính không phải Windows, vì vậy tôi hầu như không biết mình đang làm gì ở đây.


2
gửi đầu ra từ localelocale -acác lệnh, cả cục bộ và từ xa, vui lòng
enzotib

Cảm ơn @enzotib - Nhận xét của bạn đã khiến tôi nghĩ rằng các địa điểm được cung cấp có thể không giống nhau ở địa phương và từ xa.
ChemicalRascal

Câu trả lời:


20

Thông tin ngôn ngữ của bạn không được thiết lập chính xác trên máy chủ. Cụ thể, LC_CTYPEbiến chỉ ra mã hóa các ký tự trên thiết bị đầu cuối, không được đặt chính xác (hoặc, tôi nghi ngờ gì cả).

Trong thiết bị đầu cuối cục bộ của bạn, chạy localeđể xem cài đặt ngôn ngữ của bạn. Bạn có thể sẽ thấy (trong số các dòng khác) một cái gì đó như LC_CTYPE=en_US.UTF-8; điều quan trọng ở đây là .UTF-8phần, chỉ ra mã hóa UTF-8 . Đây là mã hóa tiêu chuẩn thực tế cho văn bản đa ngôn ngữ trong thế giới unix (và hơn thế nữa).

Bạn cần truyền thông tin này đến máy chủ. Cách tốt nhất, nếu nó hoạt động, là gửi thông tin miền địa phương thông qua kết nối ssh. Đối với điều này, thêm các dòng sau vào cuối ~/.ssh/config:

Host *
SendEnv LC_* LANG

Điều này đòi hỏi phải có một lệnh phù hợp AcceptEnvtrong cấu hình máy chủ ( /etc/ssh/sshd_config) (theo mặc định trên Debian).

Nếu điều đó không hoạt động và bạn luôn đăng nhập vào máy chủ từ thiết bị đầu cuối UTF-8, hãy thêm dòng vào máy chủ export LC_CTYPE=en_US.UTF-8của bạn ~/.bashrc( ~/.zshrchoặc bất kỳ tệp nào mà shell của bạn sử dụng). Tên miền địa phương (ví dụ en_US.UTF-8) phải là một trong những tên được cung cấp bởi locale -a, và phải có .UTF-8( .utf8hoặc một số biến thể tầm thường).


1
Ah! Đó sẽ là vấn đề: Tôi "sử dụng" en_AU.utf8 cục bộ, dường như đã được chuyển tiếp đến máy chủ (hoặc, ít nhất, các localeđầu ra khớp với nhau). Tuy nhiên, locale -atừ xa chỉ cung cấp en_GB.utf8 và en_US.utf8. Cảm ơn!
ChemicalRascal

1
Để có được mã hóa của miền địa phương hiện tại, bạn cũng có thể sử dụng:locale charmap

Yêu /etc/ssh/ssh_configcầu của tôi cũng gửi LANG( SendEnv LANG LC_*)
Shammel Lee

Và tôi cần phải thêm vào phía máy chủ export LC_CTYPE=en_US.UTF-8của tôi ~/.profile. Thêm nó vào ~/.bashrcdường như không có hiệu lực.
datka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.