FreeBSD 使用 vsftpd 的亂碼問題

這是一個困擾我已久的問題,使用 FileZilla 去連 ftp 時偶爾就會跑出亂碼來。明明 FreeBSD, vsftpd, FileZilla 三者都有支援 utf8 的編碼,但就不知道為什麼還會出這種問題。其實我一度以為是 vsftpd 太機車了所以跟別人格格不入,但這單純只是我的猜測而已。

以前都是在 FileZilla 的站台設定裡面強制使用 utf8 來解決這個問題,但是昨天在幫別人測試 ftp 時,卻發現他們家的 vsftpd 不需要強制使用 utf8,FileZilla就可以正常的偵測到要使用 utf8 !發現這個情況以後我開始找原因,首先看看是不是設定檔哪裡沒設定好,但卻發現他用的設定檔裡面也沒有什麼特別不一樣的,跟我用的差不多。難不成是 vsftpd 偏心嗎?在 CentOS 上面就乖乖的開啟 utf8 ,在 FreeBSD 上就搗亂。

連上朋友的 ftp 以後,可以看見他的 feat 回應是:

然後這是我的:

為什麼硬生生的少了最後的 utf8 啊!?為了這個問題,我去Google了半天都找不到原因,看起來也沒什麼人遇到類似問題。心情非常不愉快,所以就跑去看 vsftpd 的原始碼到底是怎麼回事。

首先就從 feat 的部份查起,feat 指令的回應是在 features.c 裡面,可以看到下列程式碼:

OK,看樣子 tunable_convert_charset_enable 這個變數決定了 feat 裡面有沒有包含 utf8。接著就查這個變數的底,看到底怎麼來的。在 parseconf.c 裡面看到這行:

哦,原來要在設定檔裡面設置 convert_charset_enable=1 就可以了。

設定好以後再試一次看看,還是沒有 -ㄦ- …繼續翻 code 。

接著在 main.c 裡面看到這個:

這下總算抓到了,原來要在設定檔裡面同時存在著 local_charset 與 convert_charset_enable 才可以。最後在 vsftpd.conf 裡增加下面這兩行就搞定了:

雖然問題解決了很高興,但這過程還真是曲折啊….