SSH를 통해 다르게 인코딩된 파일 이름 사용

SSH를 통해 다르게 인코딩된 파일 이름 사용

다른 파일 이름 인코딩(및 사용자 로케일)이 사용되는 SSH를 통해 원격 시스템에 연결하고 있습니다. 이로 인해 몇 가지 문제가 발생할 수 있습니다.

로케일 일치로 해결된 문제

파일 이름 문제를 논의하기 전에 이러한 유형의 SSH 세션과 관련된 몇 가지 인코딩 문제를 언급하고 싶습니다.로컬 로케일과 일치하도록 원격 로케일을 설정하여 해결되었습니다.,지금 바로

  • 명령줄 편집 관련 문제(백스페이스를 세 번 눌렀지만 호스트에서는 인코딩이 UTF-8이고 원격 측에서는 KOI8-R 또는 CP1251, 일부 8비트 키릴 문자 인코딩이므로 이는 영향을 미치지 않습니다.) 내 키릴어 문자열이 정확함):

 

[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 [email protected]
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명령 끝에 항상 추가할 수 있기 때문에 그다지 짜증나지 않습니다.

짜증나는 문제

근본적인 문제는 터미널에서 (마우스로) 파일 이름을 선택하고 붙여넣는 것이 작동하지 않는다는 것입니다.

[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이를 선택하여 붙여넣을 수 있었습니다 $''(세게 때리다):

[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을 통해 수행할 수도 있음).세게 때리다;물론 제가 타이핑하려면 읽을 수 있어야 합니다.)

나는에서 일한다UrxVT존재하다X.org존재하다리눅스로컬호스트에서는세게 때리다존재하다리눅스맨 끝에.

답변1

UTF-8을 지원하는 터미널 에뮬레이터에서는 다음을 사용할 수 있습니다.luit다른 로케일에서 서브쉘(또는 다른 프로그램)을 실행하는 명령입니다. 로캘의 문자 집합을 나타냅니다 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)

인코딩이 다른 전체 파일 트리가 있는 경우 (가능한 경우) 다음을 통해 설치하는 것이 좋습니다.파일 시스템 변환.

mkdir ~/net/[email protected] ~/net/[email protected]
sshfs [email protected]: ~/net/[email protected]
convmvfs -o srcdir=~/net/[email protected],icharset=KOI8-R,ocharset=UTF-8 ~/net/[email protected]
ls ~/net/[email protected]

답변2

아마도 다음을 사용하는 것을 고려할 수도 있습니다.일부 정교한 터미널 에뮬레이터.화면(양쪽 끝에서) 문자를 번역합니다. (또는 일부 번역 확장 프로그램을 사용합니다.SSH...) 또는 하나를 설정할 수 있습니다파일 시스템 변환파일 시스템 보기원격(로컬 인코딩으로 다시 인코딩된 파일 이름)이지만 간단한 해결책이 있습니다.

해당 원격 호스트와 작업하기 위해 특별히 로컬 호스트에 "환경"을 만들고 해당 환경에서 작업합니다(ssh 등 실행). 즉, 원격 파일 이름이 CP1251인 경우 시작새로운 터미널엑스이 인코딩에서는 작동합니다.:

$ LC_CTYPE=ru_RU.CP1251 xvt &

거기서부터 일하세요. (Linux 콘솔을 더 좋아한다면

관련 정보