Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

vsftpd 在 UTF-8 下頭, 如何與 Big5 的 client 溝通
post by tommy @ 25 二月, 2005 15:23
前幾天 "不小心" 把自己家裡的主機內的檔案名, 都改成 UTF-8 來處理, 在 samba 上頭是可以很正常的處理, 不過.... 發現在使用 ftp 時, 問題就不小了.

如果是支援 UTF-8 的 ftp client, 是可以正常運作, 如 gftp, smartftp....

不過, 在用了一天的 smartftp 之後, 實在發現和之前用 filezilla 的習慣大不相同, 用起來實在不習慣.

原本打算動手改 filezilla 的程式碼.... 只是, 在 windows 下頭, 似乎沒有 iconv 可以用... 又懶的去找 win32 可以用的函式... 所以, 就直接改 server 上的 vsftpd 來配合非 UTF-8 的 ftp client.

修改的構想主要來自 proftpd 的 iconv patch:
http://home.h01.itscom.net/para/software/misc/proftpd-iconv/index-e.html

我是修改 Debian 的 vsftpd 2.0.1 的版本. patch 可以到這兒抓
http://www.teatime.com.tw/~tommy/linux/vsftpd_iconv.patch

如果是使用 Debian Sarge, 也可以直接用這個:
http://www.teatime.com.tw/~tommy/debian/vsftpd_2.0.1-11_i386.deb

在使用這個 patch 之後, 你可以在 vsftpd.conf 中指定下面三個參數:

enable_iconv=YES
local_charset=UTF-8
remote_charset=BIG5 
  • local_charset 是主機檔案名稱使用的編碼. 內定為 UTF-8.
  • remote_charset 是 ftp client 的編碼. 內定為 BIG5.
  • enable_iconv 預設是關閉的, 也就是所有的動作應該都與沒加上這個 patch 時一樣. 如果設為 true/yes 時, 就會使用 iconv 來轉換檔名.

動作如下:

  1. 所有的 client 送來的指令, 參數, 檔案或路徑名稱, 會使用 iconv 由 remote_charset 轉成 local_charset. 所以, 實際存取是使用 local_charset 的編碼.
  2. 在 ls 指令時, 要送出檔名之前, 會用 iconv 由 local_charset 轉成 remote_charset 再送出.
  3. 如果轉碼的動作是失敗的, 就不做轉碼的動作.
  4. 加上一個 icnv on/off 指令 (非 ftp 標準), 可以讓 client 決定是否打開這個功能.
  5. 主機上頭的檔案存取, 如果在轉成 local_charset 時, 存取失敗的話, 就假設該檔案或路徑為 remote_charset 的編碼格式, 再試一次.
  6. 把 enable_iconv 設為 yes, 且 remote_charset 設為 UTF-8 的時候, 會在 Clinet 使用 FEAT 指令時, 傳回 UTF8 表示支援檔名使用 UTF-8 編碼. (rfc-2640 好像就是要求 FEAT 有 UTF8, 且檔名都用 UTF-8 傳送)

以上述主機使用 UTF-8, client 使用 Big5 的情形下, 不管主機上頭的檔案路徑名稱是用 UTF-8 或 Big5, 都會轉成 Big5 送到 client 上頭, 所以當我們使用像 filezilla 之類不支援 UTF-8 的程式時, 所收到的都會是 Big5 編碼的資料.

如果我們使用支援 UTF-8 的 client 時, 如 gftp, 會發現, 反而原本在 UTF-8 的檔名, 在轉成 Big5 之後, 反而看不到正確的名稱. 此時, 可以使用上述的 icnv off 指令 (gftp 使用 site icnv off, 其他程式可能用 quote icnv off) 把轉碼的動作關閉, 就可以正常看到 UTF-8 編碼的檔案.

而在檔案抓取或更換目錄時, 會先用 UTF-8 試一次, 如果失敗, 再用 Big5 試一次. 以確定主機上頭的檔名無論是 Big5 或 UTF-8 都可以被存取. 而在檔案儲存或建立目錄時, 主機上只會使用 UTF-8 來編碼.

Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] 請問vsftpd 2.03-1的能不能用 [ 回覆 ]

請問vsftpd 2.03-1的能不能用上面的方法

commons icon [2] [ 回覆 ]

要自行 patch, build 應該可以用.
不過, 直接用 utf-8, client 改用支援 utf-8 的 filezilla 或 smartftp 比較容易. 同時又可以使用多國語言.

commons icon [3] Re:vsftpd 在 UTF-8 下頭, 如何與 Big5 的 client 溝通 [ 回覆 ]

请教,我现在用windows xp IE6.0客户端,上传多层次中文目录下文件至vsftpd服务器时候,提示错误.取消错误一样可以上传上去.按上文patch vsftpd-2.0.1后加进三条目,问题依旧.请问有办法解决吗?
(如果使用软件上传无此问题)
i18n
declare -x LANG="zh_CN.UTF-8"
###############################
declare -x LANG="zh_CN.GB2312"
这两种方式都试了。
enable_iconv=YES
local_charset=utf-8
remote_charset=cp936
##################
vsftpd.log
Mon Dec 17 15:00:46 2007 1 10.0.0.101 373248 /mysql????????????/05??????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:00:47 2007 1 10.0.0.101 458752 /mysql????????????/06??????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:00:48 2007 1 10.0.0.101 401408 /mysql????????????/07??????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:13:15 2007 1 10.0.0.101 601600 /mysql????????????/03????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:13:15 2007 1 10.0.0.101 19456 /mysql????????????/02????????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:13:16 2007 1 10.0.0.101 31744 /mysql????????????/01????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:13:16 2007 1 10.0.0.101 379392 /mysql????????????/04??????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:13:17 2007 1 10.0.0.101 373248 /mysql????????????/05??????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:13:18 2007 1 10.0.0.101 458752 /mysql????????????/06??????.doc b _ i r jiangshu ftp 0 * c
Mon Dec 17 15:13:18 2007 1 10.0.0.101 401408 /mysql????????????/07??????.doc b _ i r jiangshu ftp 0 * c

commons icon [4] Re:vsftpd 在 UTF-8 下頭, 如何與 Big5 的 client 溝通 [ 回覆 ]

把 LC_ALL 也設成不同的編碼試看看吧. 看能不能看出來那一種是正常的吧.

IE 也可能是用 UTF-8 傳送. (要看 IE 的設定)

不過, 建議改用 FileZilla 吧, 不要用 IE, 就不會有問題了.

迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 60 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS