別のファイル名エンコード(およびユーザーロケール)が使用されているSSHを介してリモートシステムに接続しています。これはいくつかの問題を引き起こす可能性があります。
ロケール一致で解決された問題
ファイル名の問題を議論する前に、このタイプのSSHセッションに関連するいくつかのエンコーディングの問題に言及したいと思います。ローカルロケールと一致するようにリモートロケールを設定することで解決されました。今すぐ
- コマンドライン編集に関する問題(バックスペースを3回押しましたが、ホストではエンコーディングが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存在するLinuxローカルホストでは強く打つ存在するLinux最後に。
答え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...)または1つを設定できますファイルシステム変換ファイルシステムの表示リモート(ローカルエンコードで再エンコードされたファイル名)ですが、簡単な解決策があります。
そのリモートホストと連携するために、ローカルホストに特別に「環境」を作成し、その環境で作業します(sshなどを実行)。つまり、リモートファイル名がCP1251の場合新しい端末Xこのエンコーディングでは動作します。:
$ LC_CTYPE=ru_RU.CP1251 xvt &
そこから働いてください。 (Linuxコンソールが好きなら