Tính di động của ngôn ngữ UTF-8 (và ssh)


9

Tôi dành rất nhiều thời gian của mình cho sshcác máy khác nhau, tất cả đều khác nhau (một số được nhúng, một số chạy Linux, một số chạy BSD, & c.). Tuy nhiên, trên các máy cục bộ của riêng tôi, tôi sử dụng OS X, tất nhiên có vùng người dùng dựa trên BSD. Ngôn ngữ của tôi trên các máy đó được đặt thành en_GB.UTF-8, đây là một trong những tùy chọn khả dụng:

% echo `sw_vers`
ProductName: Mac OS X ProductVersion: 10.8.2 BuildVersion: 12C60
% locale -a | grep -i 'en_gb.utf'
en_GB.UTF-8

Một số hệ thống Linux có khả năng cao hơn mà tôi sử dụng dường như có một tùy chọn tương đương, nhưng tôi lưu ý rằng trên Linux tên này hơi khác:

% lsb_release -d
Description: Debian GNU/Linux 6.0.3 (squeeze)
% locale -a | grep -i 'en_gb.utf' 
en_GB.utf8

Điều này khiến tôi tự hỏi: Khi tôi sshvào một máy Linux từ máy Mac của mình và nó chuyển tiếp tất cả các LC_*biến của tôi với hậu tố 'UTF-8', máy Linux đó có hiểu những gì đang được hỏi về nó không? Hay nó chỉ rơi trở lại một số địa phương khác?

chỉnh sửa: Đây là một ví dụ về những gì tôi đang đề cập đến:

% ssh -v odin
...
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LC_ALL = en_GB.UTF-8
debug1: Sending env LC_COLLATE = en_GB.UTF-8
debug1: Sending env LC_CTYPE = en_GB.UTF-8
debug1: Sending env LC_MESSAGES = en_GB.UTF-8
debug1: Sending env LC_MONETARY = en_GB.UTF-8
debug1: Sending env LC_NUMERIC = en_GB.UTF-8
debug1: Sending env LC_TIME = en_GB.UTF-8
debug1: Sending env LANG = en_GB.UTF-8
odin:~ % locale | tail -1  # locale is set to .UTF-8 without error...
LC_ALL=en_GB.UTF-8
odin:~ % locale -a | grep 'en_GB.UTF-8'  # ... even though .UTF-8 isn't an option
odin:~ % 

Trong cả hai trường hợp, cơ chế đằng sau hành vi của nó là gì và nó có phụ thuộc vào bất kỳ thiết lập cụ thể nào không (ví dụ: tôi sẽ thấy hành vi tương tự trên hệ thống dựa trên BusyBox như trên hệ thống dựa trên GNU)?


giải thích ở đó: superuser.com/questions/999133/ (câu trả lời từ sự phô trương). Vì vậy, từ BSD đến Linux không có vấn đề gì. Từ Linux (nếu định nghĩa utf8 thay vì UTF-8) đến BSD, có thể có một vấn đề.
AB

Câu trả lời:


0

Đó là một câu hỏi thú vị, nhưng tôi nghĩ có thể có một quan niệm sai lầm trong đó về cách các biến được thiết lập. Khi phiên shell an toàn được bắt đầu ( ssh remotehost), điều xảy ra ở đầu kia là khởi tạo một shell mới với môi trường riêng. Đó là một cách thú vị để nói rằng máy chủ bắt đầu một lớp vỏ mới. Shell mới đó có thể hoặc không thể được cấu hình với cùng ngôn ngữ với shell cục bộ ban đầu của bạn.

Ví dụ

geee: ~
$ echo `miền địa phương | grep LANG` ::` ngày`
LANG = en_US.UTF-8 :: Thứ hai ngày 3 tháng 12 07:04:00 CET 2012

$ ssh
flode: ~
$ echo `miền địa phương | grep LANG` ::` ngày`
LANG = nb_NO.UTF-8 NGÔN NGỮ = nb_NO.UTF-8 :: ma. 03. des. 06:59:33 +0100 2012

Để chứng minh điều này, tôi đã thiết lập miền địa phương trên vỏ từ xa cho tiếng Na Uy bằng cách thêm các dòng sau vào tệp ~ / .bash_profile:

export     LANG=nb_NO.UTF-8
export LANGUAGE=nb_NO.UTF-8
export   LC_ALL=nb_NO.UTF-8

Tương tự, bạn sẽ phải thiết lập môi trường trên shell từ xa để làm tương tự. Tất nhiên, các shell khác đọc các tệp khởi động khác nhau, chẳng hạn như ~ / .zprofile cho shell Z.

Quan niệm sai lầm mà tôi nghi ngờ nằm ​​ở chỗ các biến cục bộ (cài đặt) không có cách nào chuyển tiếp. Shell từ xa có cài đặt riêng của nó. Để liệt kê các ngôn ngữ khả dụng trên máy chủ từ xa, có thể là trình bao BusyBox tối giản hoặc HĐH GNU toàn diện, hãy sử dụng localelệnh với công -atắc (như đã lưu ý trong câu hỏi). Bất kỳ dòng in nào cũng có thể được sử dụng làm cài đặt ngôn ngữ cho môi trường đó.

Đối với câu hỏi đầu tiên, ngôn ngữ mặc định mà mọi shell bắt đầu thường được cấu hình ở vị trí trung tâm như / etc / profile. Hầu hết các shell đăng nhập đọc tệp này khi khởi động.


2
Công cụ địa phương chắc chắn được chuyển tiếp. /etc/ssh_configtrên mọi máy mà tôi đã từng xem xác định điều đó LANGLC_*được gửi đến tất cả các máy chủ theo mặc định và ssh -vhiển thị một số dòng như debug1: Sending env LC_ALL = en_GB.UTF-8. Tất nhiên, nếu cấu hình vỏ ở đầu bên kia sau đó ghi đè lên điều đó, thì đó là một điều khác - nhưng trên một số máy của tôi, đó không phải là trường hợp
kine

Tái bút: Tôi đã cập nhật bài viết gốc của mình với lẽ có thể minh họa rõ hơn về những gì tôi đang đề cập đến
kine

Phải thừa nhận rằng tôi chưa bao giờ thấy điều này. Các máy bạn đang đề cập đến, Debian? Có lẽ điều này sẽ giải thích cơ chế chuyển tiếp ssh env. Tôi vẫn nghĩ rằng tên miền địa phương phải khớp chính xác, bởi vì miền địa phương không được cho là đủ thông minh để tìm ra điều này. Lý do tại sao các chuỗi khác nhau là do thư viện C khác nhau đối với các máy dựa trên BSD và GNU / Linux. Họ không biết về nhau. Nhưng có lẽ tôi đang quá hoài nghi và chương trình bản địa có cách điều chỉnh điều này tự động.
Ярослав Рахматуллин

Đó là phần mà tôi tò mò - sshcông cụ chuyển tiếp là ngẫu nhiên, nó chỉ là bối cảnh cho lý do tại sao địa phương của tôi được đặt theo cách của nó. Tôi chỉ không biết làm thế nào để xác định cái vỏ ở đầu bên kia đang thực sự làm gì - tôi thường không gặp lỗi khi cố gắng đặt ngôn ngữ (mặc dù đôi khi tôi làm trên các thiết bị nhúng) và hiển thị / nhập văn bản Unicode hoạt động bình thường (?), nhưng ngôn ngữ tôi đang sử dụng rõ ràng không có trên hệ thống. Hầu hết các thiết bị Linux mà tôi kết nối là dựa trên Debian hoặc Ubuntu, trong khi các thiết bị khác dựa trên uClibc / BusyBox (thiết bị mạng, & c.).
kine

0

Có phải tên cho UTF-8 hỗ trợ hơi khác nhau trên các hệ thống khác nhau cho lệnh sau không?

LC_ALL='' locale charmap  # UTF-8 (on Mac OS X 10.6.8)

Nếu bạn gặp phải các vấn đề địa phương liên quan đến kỳ lạ, nó có thể giúp cho các khách hàng SSH để không gửi những LC_*biến bằng cách bình luận ra SendEnv LANG LC_*trong /etc/ssh_config(xem, ví dụ, Sửa SSH UTF-8 vấn đề Mac OS X LionTerminal trong OS X Lion: lon 't viết åäö trên máy từ xa ).

Một cách tiếp cận giải pháp khác là:

# from: http://mod16.org/hurfdurf/?p=189
tjac wrote:
Actually the real problem that's causing this is that Mac OS 10.7 sets totally 
non-standard locale values, at least when you tweak some of the formats in
SysPrefs/Language&Text as I did.

If you type "locale" on your Mac terminal you should see pretty much the same as on 
other Unices (e.g. lots of en_US.UTF-8s if you prefer US English), but you don't. 
If these garbled settings get transferred to other Unix hosts by the SendEnv option 
they naturally do not know what's going on.

So if you want to fix it cleanly to allow for sshing to all kinds of remote hosts,
including those with older character sets, put the following lines in your 
~/.bash_profile on your Mac client machine.

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Monday, September 12, 2011 at 22:54 #
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.