Intereting Posts
Как настроить параметр gcl-agent по умолчанию-cache-ttl? Scripting htdigest -c / path / to / file / $ user $ user $ password в Bash Нужно ли создавать виртуальный хост? используя sudo -u <имя> для запуска команд внутри сценариев оболочки В диспетчере виртуальных машин есть ли способ добавить дисковое пространство на существующий диск? Невозможно скопировать-вставить из или в гном-терминал Каталог / файлы, принадлежащие несуществующему пользователю useradd в CentOS с домашним каталогом и привилегиями sudo Как ядро ​​решает, какие страницы совершают обмен? Автоматизация восстановления документов Libreoffice Почему systemd отключает мои файловые системы с предохранителями сразу после их установки? обнаружение звука из колонок Монетный двор 12 – Ошибка обновления MySQL (mysql-client-core-5.1) Автозаполнение удаляет последний символ из слов иногда Когда использовать арку против noarch при создании RPM?

работа с именами файлов в другой кодировке по ssh

Я использую ssh'ing для удаленной системы, где используется другая кодировка имен файлов (и для локалей пользователей). И это вызывает некоторые проблемы.

Проблемы, решаемые путем сопоставления настроек локали

Прежде чем перейти к проблемам с именами файлов, я хочу сказать, что некоторые проблемы с кодировкой такого сеанса ssh решаются путем установки удаленного локали, чтобы он соответствовал локальному языку , а именно,

  • проблемы с редактированием командной строки (я нажал Backspace trice, но поскольку на моем хосте кодировка – UTF-8, а на удаленном конце – KOI8-R или, возможно, CP1251, некоторые 8-битные кириллические кодировки, t правильно влияют на мою кириллицу):

[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 ~]$ 
  • проблема с правильным пониманием нечувствительности к регистру для обрабатываемых строк; теперь это сработает, после того, как я установил локаль:

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

но это не сработало раньше.

Незначительные проблемы с именами файлов

Утилиты, которые распечатывают имена файлов (которые, как вы помните, хранятся удаленно в другой кодировке), не будут печатать их дословно, но они могут содержать вопросительные знаки для иностранных символов:

 [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 ~]$ 

Та же проблема проявляется в ls и т. Д. Но это можно легко преодолеть, передав их как строки для печати команд (которые не знают о проблеме с несогласованными кодировками имен файлов и терминала – или по какой-либо причине, но это работает):

 [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 ~]$ 

Кроме того, тот факт, что они не читаются, не очень раздражает, потому что я всегда могу добавить | recode -f cp1251..utf-8 | recode -f cp1251..utf-8 в конце команды.

Досадная проблема

Существенной проблемой является то, что выбор (с помощью мыши) имен файлов в терминале и их вставка не работает:

 [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 ~]$ 

Я заметил скрытое представление имен файлов в выводе stat , поэтому я смог выбрать и вставить его (внутри $'' в 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 ~]$ 

Итак, вопрос:

Как удобно работать с удаленными именами файлов (поверх ssh ), которые находятся в другом кодировании?

Было бы неплохо, если бы они были удобочитаемыми, а также выбираемыми и скоропортящимися (а также с помощью клавиатуры с клавиатуры, а затем завершаемыми Tab в bash , чтобы быть удобными для меня, они должны быть читаемыми, конечно).

Я работаю в urxvt на X.org в Linux на локальном хосте, и это bash на Linux на удаленном конце.

Внутри эмулятора терминала, который поддерживает UTF-8, вы можете использовать команду luit для запуска подоболочки (или другой программы) в другой локали. Параметр locale, обозначающий набор символов, представляет собой 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) 

Если у вас есть целое дерево файлов в другом кодировании, я рекомендую (если возможно) его монтировать через convmvfs .

 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 

Вероятно, можно подумать о том, чтобы использовать некоторые сложные эмуляторы терминалов, такие как экран (с обоих концов), который будет переводить символы (или использовать некоторое переводное расширение для ssh …), или можно удаленно настроить представление convmvfs файловой системы (с помощью имена файлов, перекодированные в локальную кодировку), но есть простое решение:

просто создайте «среду» на локальном хосте специально для работы с этим удаленным хостом и работайте в этом envoronment (запустите ssh и т. д.), а именно в ситуации, когда удаленные имена файлов находятся в CP1251, запустите новый терминал в X который будет работать с этой кодировкой :

 $ LC_CTYPE=ru_RU.CP1251 xvt & 

и работать от него. (Если вам нравится консоль Linux больше, чем X, возможно, вы можете настроить виртуальную консоль Linux соответственно, но знания о настройке консоли Linux испарялись из моей головы …)