làm việc với tên tệp trong một mã hóa khác trên ssh


8

Tôi đang sử dụng một hệ thống từ xa, nơi mã hóa khác cho tên tệp (và cho địa phương của người dùng) đã được sử dụng. Và điều này gây ra một số vấn đề.

Các vấn đề được giải quyết bằng cách khớp các cài đặt ngôn ngữ

Trước khi tôi chuyển sang các vấn đề với tên tệp, tôi muốn nói rằng một số vấn đề mã hóa với phiên ssh như vậy đã được giải quyết bằng cách đặt ngôn ngữ từ xa sao cho phù hợp với ngôn ngữ địa phương , cụ thể là

  • các vấn đề với việc chỉnh sửa dòng lệnh (Tôi đã nhấn Backspace trice, nhưng vì trên máy chủ của tôi, mã hóa là UTF-8 và ở đầu từ xa - KOI8-R, hoặc có lẽ là CP1251, một số mã hóa Cyrillic 8 bit, điều này đã không xảy ra ' t ảnh hưởng đến chuỗi Cyrillic của tôi một cách chính xác):

 

[imz@localhost ~]$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
[imz@localhost ~]$ echo привет
привет
[imz@localhost ~]$ echo при
при
[imz@localhost ~]$ ssh -vv ivan@example.com
Last login: Fri Nov 25 13:44:56 2011 from NN.NN.NN.NN
[ivan@dell ~]$ locale
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES=POSIX
LC_PAPER="ru_RU.KOI8-R"
LC_NAME="ru_RU.KOI8-R"
LC_ADDRESS="ru_RU.KOI8-R"
LC_TELEPHONE="ru_RU.KOI8-R"
LC_MEASUREMENT="ru_RU.KOI8-R"
LC_IDENTIFICATION="ru_RU.KOI8-R"
LC_ALL=
[ivan@dell ~]$ echo привет
привет
[ivan@dell ~]$ echo при   
привÐ
[ivan@dell ~]$ export LANG=ru_RU.UTF-8
[ivan@dell ~]$ echo привет
привет
[ivan@dell ~]$ echo при
при
[ivan@dell ~]$ 
  • vấn đề với sự hiểu biết chính xác về độ nhạy cảm trường hợp đối với các chuỗi được xử lý; bây giờ nó sẽ hoạt động, sau khi tôi đặt ngôn ngữ:

 

[ivan@dell ~]$ echo привет | fgrep -i ВЕТ
привет
[ivan@dell ~]$ 

nhưng điều này sẽ không hoạt động trước đây.

Vấn đề nhỏ với tên tập tin

Các tiện ích in ra tên tệp (mà bạn nhớ, được lưu trữ từ xa trong một mã hóa khác) sẽ không in chúng nguyên văn, nhưng chúng ảnh hưởng đến các dấu hỏi cho các ký tự nước ngoài:

[ivan@dell ~]$ find ~mama/Desktop/ -iname '*.xls'
/home/mama/Desktop/????????? ????????.xls
/home/mama/Desktop/???????? ??? ???????????? (1).xls
/home/mama/Desktop/???????? ??? ???????????? (2).xls
/home/mama/Desktop/???????? ??? ???????????? (3).xls
/home/mama/Desktop/???????? ??? ????????????.xls
[ivan@dell ~]$ find ~mama/Desktop/ -iname '*.xls' -print
/home/mama/Desktop/????????? ????????.xls
/home/mama/Desktop/???????? ??? ???????????? (1).xls
/home/mama/Desktop/???????? ??? ???????????? (2).xls
/home/mama/Desktop/???????? ??? ???????????? (3).xls
/home/mama/Desktop/???????? ??? ????????????.xls
[ivan@dell ~]$ 

Vấn đề tương tự được thể hiện bởi ls, và như vậy. Nhưng điều này có thể dễ dàng khắc phục bằng cách chuyển chúng dưới dạng chuỗi cho các lệnh in (không nhận thức được vấn đề với mã hóa không khớp của tên tệp và của thiết bị đầu cuối - hoặc vì bất kỳ lý do gì, nhưng nó hoạt động):

[ivan@dell ~]$ find ~mama/Desktop/ -iname '*.xls' -print0 | xargs -0 -n 1 echo 
/home/mama/Desktop/Êðåäèòíûé ïîðòôåëü.xls
/home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (1).xls
/home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (2).xls
/home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (3).xls
/home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé.xls
[ivan@dell ~]$ 

Ngoài ra, thực tế là chúng không thể đọc được không phải là rất khó chịu, bởi vì tôi luôn có thể nối thêm | recode -f cp1251..utf-8vào cuối lệnh.

Vấn đề khó chịu

Vấn đề thiết yếu là việc chọn (bằng chuột) tên tệp trong thiết bị đầu cuối và dán chúng không hoạt động:

[ivan@dell ~]$ diff '/home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (1).xls' '/home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (3).xls'
diff: /home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (1).xls: No such file or directory
diff: /home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (3).xls: No such file or directory
[ivan@dell ~]$ 

Tôi đã nhận thấy một đại diện thoát của tên tệp trong đầu ra của stat, vì vậy tôi có thể chọn và dán nó (bên $''trong bash ):

[ivan@dell ~]$ diff '/home/mama/Desktop/\300\304\320\305\321\300\322\333 \344\353\377 \357\356\347\344\360\340\342\353\345\355\350\351 (1).xls' '/home/mama/Desktop/\300\304\320\305\321\300\322\333 \344\353\377 \357\356\347\344\360\340\342\353\345\355\350\351 (3).xls'
diff: /home/mama/Desktop/\300\304\320\305\321\300\322\333 \344\353\377 \357\356\347\344\360\340\342\353\345\355\350\351 (1).xls: No such file or directory
diff: /home/mama/Desktop/\300\304\320\305\321\300\322\333 \344\353\377 \357\356\347\344\360\340\342\353\345\355\350\351 (3).xls: No such file or directory
[ivan@dell ~]$ diff $'/home/mama/Desktop/\300\304\320\305\321\300\322\333 \344\353\377 \357\356\347\344\360\340\342\353\345\355\350\351 (1).xls' $'/home/mama/Desktop/\300\304\320\305\321\300\322\333 \344\353\377 \357\356\347\344\360\340\342\353\345\355\350\351 (3).xls'
Files /home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (1).xls and /home/mama/Desktop/ÀÄÐÅÑÀÒÛ äëÿ ïîçäðàâëåíèé (3).xls differ
[ivan@dell ~]$ 

Vì vậy, câu hỏi là:

Làm thế nào để thuận tiện làm việc với tên tệp từ xa (trên ssh ), trong một mã hóa khác nhau?

Sẽ thật tuyệt nếu chúng có thể đọc được, và có thể lựa chọn và có thể đọc được (và cũng có thể đánh máy bằng bàn phím của tôi và sau đó có thể hoàn thành bằng Tab trong bash ;

Tôi đang làm việc trong urxvt trong X.org trên Linux trên máy chủ địa phương, và nó bash trên Linux vào cuối từ xa.

Câu trả lời:


4

Bên trong một trình giả lập thiết bị đầu cuối hỗ trợ UTF-8, bạn có thể sử dụng luitlệnh để chạy một lớp con (hoặc chương trình khác) trong một ngôn ngữ khác. Cài đặt ngôn ngữ cho biết bộ ký tự là LC_CTYPE.

LC_CTYPE=ru_RU.KOI8-R luit ls   # run one command
LC_CTYPE=ru_RU.KOI8-R luit      # start a shell (type Ctrl+D or exit to return to the parent shell)

Nếu bạn có toàn bộ cây tập tin theo một mã hóa khác, tôi khuyên bạn nên (nếu có thể) gắn nó thông qua các con trỏ .

mkdir ~/net/ivan@example.com.KOI8-R ~/net/ivan@example.com.UTF-8
sshfs ivan@example.com: ~/net/ivan@example.com.KOI8-R
convmvfs -o srcdir=~/net/ivan@example.com.KOI8-R,icharset=KOI8-R,ocharset=UTF-8 ~/net/ivan@example.com.UTF-8
ls ~/net/ivan@example.com.UTF-8

3

Có lẽ, người ta có thể xem xét sử dụng một số giả lập thiết bị đầu cuối phức tạp như màn hình (trên hai đầu) mà có thể dịch các ký tự, (hoặc sử dụng một số phần mở rộng dịch để ssh ...), hoặc người ta có thể thiết lập một convmvfs xem của hệ thống tập tin từ xa (với tên tệp được mã hóa thành mã hóa cục bộ), nhưng có một giải pháp đơn giản:

chỉ cần tạo một "môi trường" trên máy chủ cục bộ đặc biệt để làm việc với máy chủ từ xa đó và làm việc trong mục đích này (chạy ssh, v.v.), cụ thể là trong trường hợp khi tên tệp từ xa ở CP1251, bắt đầu một thiết bị đầu cuối mới trong X sẽ làm việc với mã hóa đó :

$ LC_CTYPE=ru_RU.CP1251 xvt &

và làm việc từ nó. (Nếu bạn thích bảng điều khiển Linux hơn X, có lẽ bạn có thể thiết lập bảng điều khiển linux ảo phù hợp, nhưng kiến ​​thức về cách thiết lập bảng điều khiển Linux đã bốc hơi khỏi đầu tôi ...)


1
Đừng đặt LC_ALL, đó là ghi đè khẩn cấp cho các địa phương. Đặt LANGnếu bạn muốn đặt mặc định cho tất cả các danh mục hoặc nếu không, hãy đặt danh mục chính xác mà bạn quan tâm, ví dụ: LC_CTYPEcho bộ ký tự và mã hóa.
Gilles 'SO- ngừng trở nên xấu xa'
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.