+ -
当前位置:首页 → 问答吧 → 做了一个vsftpd的补丁

做了一个vsftpd的补丁

时间:2005-12-31

来源:互联网

在vsftpd里不支持编码和解码,这样当系统使用UTF8的时候,在本地看着正常的中文文件名和中文目录名,在windows机器上看着就是乱码。上传的文件也会有问题,windows下正常的文件名上传后在服务器上看着就是乱码。

我给vsftpd写了一个补丁,在传递文件名和目录名以及文本消息的时候,它可以根据配置文件中的选项来调整编码。这样我的系统就可以使用UTF8,远程的windows机器连接上来也没有问题

安装方法
解压vsftpd-encoding.tar.bz2到/usr/local/portage/net-ftp/目录下(这需要在/etc/make.conf里设置PORTDIR_OVERLAY=/usr/local/portage),然后emerge vsftpd就可以了

为了方便非gentoo的用户,我把patch也单独打了包,就是vsftpd-2.0.3-encoding.patch.tar.bz2,解压后对vsftpd源码打补丁就可以安装了。

使用方法
我给vsftpd增加了三个开关,这些可以在打了补丁的vsftpd.conf的manpage中用charset搜到。
首先是要在vsftpd.conf中加上charset_filter_enable=YES,这个开关使vsftpd配置字符过滤器,缺省是NO,就是说vsftpd缺省不会开启这个解码功能的。
然后就是两个参数charset_client和charset_server,前者表示vsftpd将向外输出的字符编码名称(比如我这样的情况应该是GBK,GB18030或者GB2312),后者是vsftpd所在服务器的系统编码(我这里是UTF8)。

有什么问题可以发信给meteozwh at hotmail dot com
上传的附件
vsftpd-encoding.tar.bz2 (8.8 KB, 523 次查看)
vsftpd-2.0.3-encoding.patch.tar.bz2 (3.3 KB, 733 次查看)

作者: meteo   发布时间: 2005-12-31

Great work!
ps. s/UTF8/UTF-8/

作者: sunmoon1997   发布时间: 2005-12-31

谁能告诉我在Gentoo下vsftpd不能用普通用户登陆是怎么回事?

作者: Freesnake   发布时间: 2005-12-31

local_enable=YES

作者: meteo   发布时间: 2005-12-31

我现在区域设置用的是zh_CN.utf8,以前用UTF-8总是有或多或少的各种问题,就是有的软件会说不支持的区域设置,或者有时候输入方法会出问题。后来用这个zh_CN.utf8好像问题最少。
至于这个UTF8,我试过UTF8,utf8都没问题,其实应该是用iconv --list命令显示出来的编码都可以正常工作。
引用:
作者: sunmoon1997
Great work!
ps. s/UTF8/UTF-8/

作者: meteo   发布时间: 2005-12-31

以前就在煩這個問題, 所以轉了proftpd因為有第3方的iconv() charset conversion patch
問一下, 這個patch適用於big5環境嗎?

作者: semson   发布时间: 2005-12-31

引用:
作者: meteo
local_enable=YES
如果问题真的那么简单我就不会问了……
我怀疑是pam的问题……

作者: Freesnake   发布时间: 2006-01-01

http://www.teatime.com.tw/~tommy/

这位台湾大哥的网站上有这个patch
用iconv转
可惜版本太低
我没用
自己按照patch修改过源码好像没用
也就再也没管了
不楼楼主的patch和我说的这个有没有相同点
我是用debian的
去试试

作者: linuxcpp   发布时间: 2006-01-01

好东西!
终于解决了一个很郁闷的问题
非常感谢!

作者: linuxcpp   发布时间: 2006-01-01

big5应该没问题,只要用iconv --list可以看到的编码都可以转

hehe,当然了,如果有问题就告诉我,

引用:
作者: semson
以前就在煩這個問題, 所以轉了proftpd因為有第3方的iconv() charset conversion patch
問一下, 這個patch適用於big5環境嗎?

作者: meteo   发布时间: 2006-01-01

我看了他的patch,hehe,好像功能比我的好一些,他的patch不工作的原因我可能也遇到过。
就是在vsftpd fork新进程之前,需要调用iconv_open对主机编码和远程编码进行一次空操作。
这个原因在于fork之后的进程空间里,必须能够访问GBK.so或者BIG5.so等,GLIBC里很多编码的支持都依赖于这样的动态库,它自己支持的很少,所以基本上调用iconv_open都会返回-1。这问题我写patch的时候郁闷了好久。
他这个ICNV命令比较有意思,回头看看可以不可以加上,不过现在没空折腾了。
引用:
作者: linuxcpp
http://www.teatime.com.tw/~tommy/

这位台湾大哥的网站上有这个patch
用iconv转
可惜版本太低
我没用
自己按照patch修改过源码好像没用
也就再也没管了
不楼楼主的patch和我说的这个有没有相同点
我是用debian的
去试试

作者: meteo   发布时间: 2006-01-02

但愿楼上有空时能再研究一下这个补丁
能保持更新
呵呵
用utf-8的人们可以有福了
向楼主致敬!!!

作者: linuxcpp   发布时间: 2006-03-05

引用:
作者: Freesnake
谁能告诉我在Gentoo下vsftpd不能用普通用户登陆是怎么回事?
确实是pam的问题,解决方法可以去chinaunix的ftp版翻翻老贴子,以前我和另外一个人都问过。

你是从官方下的源代码安装的吧?emerge vsftpd的话,用的是2.0.3没这问题,我今天下午刚试过的。

作者: shaaben   发布时间: 2006-03-05

引用:
作者: Freesnake
谁能告诉我在Gentoo下vsftpd不能用普通用户登陆是怎么回事?
把/home/ftp的属主改为root

作者: leyyer   发布时间: 2006-03-05

用了楼主的包,仍显示乱码,必须手动设置utf8编码才行。至少在浏览器中是这样。

作者: 食古不化   发布时间: 2006-03-16

使用现在的2.0.4-r1时,只要在浏览器中选择utf8编码就可以显示中文。

vsftpd可以设置编码让浏览器识别吗?

作者: 食古不化   发布时间: 2006-03-16

这个赞,等了很久了。曾经尝试着改台湾人写的patch,结果发现it doesn't work

作者: Zer4tul   发布时间: 2006-03-16

按照楼主的设置完vsftpd.conf后,正常启动vsftpd。
但是
代码:
 $ env LC_ALL=zh_CN.GB2312 ftp 192.168.2.100
Connected to 192.168.2.100 (192.168.2.100).
500 OOPS: trunc_len not smaller than alloc_bytes in str_trunc
ftp>

作者: 食古不化   发布时间: 2006-03-16

算了,反正只想在内网使用,直接samba好了。不过还是感觉ftp比samba好用,直接通过web就能访问。

作者: 食古不化   发布时间: 2006-03-16

vsftpd-2.0.4-r1 编码补丁(based on meteo's patch)

在vsftpd.conf中的设置和meteo的一样。
上传的附件
vsftpd-2.0.4-encoding.patch.tar.bz2 (3.3 KB, 125 次查看)

作者: soloforce   发布时间: 2006-05-31

多谢了
我这一阵实在是忙,好久没有折腾我心爱的gentoo了
引用:
作者: Lolita
vsftpd-2.0.4-r1 编码补丁(based on meteo's patch)

在vsftpd.conf中的设置和meteo的一样。

作者: meteo   发布时间: 2006-06-10

这个包不是用来一劳永逸解决乱码问题的
这个包是为了方便使用utf8编码的系统与windows系统或使用GB编码的linux系统互相传递文件用的

你问的两个问题都是客户端的问题,和ftp服务器没关系
如果你用浏览器,可以不用这个包,直接看utf8的编码就可以了
因为浏览器是不可能主动察觉ftp服务器上的编码的(如果是web网页,页面上会有关于编码的信息,ftp协议和http是不一样的)
引用:
作者: 食古不化
用了楼主的包,仍显示乱码,必须手动设置utf8编码才行。至少在浏览器中是这样。

作者: meteo   发布时间: 2006-06-10

我这上面没问题,你到底是怎么设置的,详细的步骤
引用:
作者: 食古不化
按照楼主的设置完vsftpd.conf后,正常启动vsftpd。
但是
代码:
 $ env LC_ALL=zh_CN.GB2312 ftp 192.168.2.100
Connected to 192.168.2.100 (192.168.2.100).
500 OOPS: trunc_len not smaller than alloc_bytes in str_trunc
ftp>

作者: meteo   发布时间: 2006-06-10

我这里也没问题,,好用的说。。

IE/FF 测试通过。

作者: 晨想   发布时间: 2006-06-10

是不是不适用最新的版本了??
ubuntu:~/vsftpd-1.2.1$ patch -p0 <../vsftpd-2.0.3-encoding.patch
can't find file to patch at input line 4
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff -Nur vsftpd-2.0.3/main.c vsftpd-2.0.3-encoding/main.c
|--- vsftpd-2.0.3/main.c 2005-03-19 05:51:39.000000000 -0500
|+++ vsftpd-2.0.3-encoding/main.c 2005-12-30 04:40:44.000000000 -0500
--------------------------
File to patch:

作者: woyao   发布时间: 2006-07-07

Jan 2006 - vsftpd-2.0.4 released

你的 1.2.1 是什么时候的?:)

作者: 晨想   发布时间: 2006-07-07

引用:
作者: 终极幻想
Jan 2006 - vsftpd-2.0.4 released

你的 1.2.1 是什么时候的?:)
哈哈,搞错了,我上了一个非官方网站,结果那里没更新,最新的只有1.2.1,吐死

不过现在已经有2.0.5了 :)

作者: woyao   发布时间: 2006-07-07

引用:
作者: Lolita
vsftpd-2.0.4-r1 编码补丁(based on meteo's patch)

在vsftpd.conf中的设置和meteo的一样。

谢谢了,试用了一下,很好用啊。不过有一个小问题,打了这个补丁后,用IE浏览FTP服务器,不会*出填写用户名和密码的登录框。而是*出一个“该服务器不支持匿名”的提示框,需要点右键选“登录”才能进去。

作者: ak137   发布时间: 2006-07-28

引用:
作者: ak137
谢谢了,试用了一下,很好用啊。不过有一个小问题,打了这个补丁后,用IE浏览FTP服务器,不会*出填写用户名和密码的登录框。而是*出一个“该服务器不支持匿名”的提示框,需要点右键选“登录”才能进去。
这个提示是1.0.4增加的,之前的版本没有。应该不是补丁的问题

作者: soloforce   发布时间: 2006-07-28

推销一下
关于vsftpd还有一个解决方法:
http://sourceforge.net/projects/fuse-convmvfs
一个简单FUSE文件系统,用类似下列命令:
代码:
/usr/local/bin/convmvfs -o srcdir=/data/share,ocharset=gb18030,allow_other /data/share18030
可以实现/data/share18030作为/data/share1目录的一个镜像,但文件名编码不同。这样的话
就可以同时讨好UTF-8和GB*用户了

代码:
# ls /data/share/music/|tail
瘦人
眼镜蛇
窦唯
罗大佑
范晓萱
许巍
跳房子
达明一派
陈升
陈绮贞

# ls /data/share18030/music/|iconv -f gb18030 |sort|tail
瘦人
眼镜蛇
窦唯
罗大佑
范晓萱
许巍
跳房子
达明一派
陈升
陈绮贞

作者: hellwolf   发布时间: 2006-07-28

hellwolf ,我用#convmvfs ftpsite_gbk/ -o srcdir=ftpsite,icharset=utf8,ocharset=gbk,allow_other,uid=1002,gid=102 挂载后,再启动FTP服务器,FTP的HOME是ftpsite_gbk, GBK编码下读FTP没有一点问题。但是上传有点问题,可以mkdir testing建立文件夹,但是,新建立的文件夹testing下面不能再写东西。我看了一下ftpsite/upload下面刚建立的testing文件夹,其属性是root的。 再看ftpsite_gbk里面,所有的文件和目录及其子目录都是virtual(uid=1002)的属主,里面本来有几个属于root的文件,也被显示成virtual了。
我想,如果要解决上传问题的话,是不是一定要用virtual用户执行convmvfs挂载ftpsite_gbk目录呢? 但是virtual用户我这里是不允许登录的,有没有更好的挂载办法呢?

作者: ak137   发布时间: 2006-07-29

写操作的支持方面BUG是挺多的,我有时间尽量去解决掉,或者有谁感兴趣也可以加入到项目中来。

P.S:virtual不能登录也可以执行,debian有个start-stop-daemon工具,不知道gentoo的是什么。我不熟悉gentoo。

补充:
http://sourceforge.net/project/showf...roup_id=166276
0.2.2解决了刚才的问题。

作者: hellwolf   发布时间: 2006-07-29

vsftpd-2.0.5能不能打这个补丁啊?
还有那个patch文件是怎么用的?

作者: very0717   发布时间: 2006-07-29

官方怎么不搞下支持UTF8的啊。。。
2.0.5什么时候有补丁哦

作者: kaemnt   发布时间: 2006-07-31

write an ebuild for fuse-convmvfs, have fun! ;-)
and it works well on amd64.

/usr/local/portage/sys-fs/fuse-convmvfs/fuse-convmvfs-0.2.2.ebuild
代码:
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-fs/fuse-convmvfs/fuse-convmvfs-0.2.2.ebuild,v 1.3 2004/12/18 21:20:05 stuart Exp $

inherit eutils

DESCRIPTION="This is a filesystem client use the FUSE(Filesystem in USErspace) interface to convert file name from one charset to another."
HOMEPAGE="http://fuse-convmvfs.sourceforge.net/"
SRC_URI="mirror://sourceforge/fuse-convmvfs/${P}.tar.gz"
LICENSE="GPL-2"

SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE=""
DEPEND=">=sys-fs/fuse-2.5"


src_unpack() {
        unpack ${A}
}

src_install() {
        make DESTDIR=${D} install || die "make install failed"
        dodoc AUTHORS ChangeLog README
}

作者: fiag   发布时间: 2006-08-09

用fuse的方法,如果有多个用户的话,每个用户都要挂一次,而且登陆的时候是转了码的,很不爽.只适合不能登陆的少量用户使用.

作者: zhou3345   发布时间: 2006-09-02

fuse有个allow_other_user选项,可以让其他用户也访问到。

作者: hellwolf   发布时间: 2006-09-09

各位, 我现在用的是CentOS, /etc/下都没有make.conf文件等, 我应该怎么给我的vsftpd打补丁呢?! 谢谢!!!

作者: Eric_DZT   发布时间: 2007-01-25

引用:
作者: hellwolf
推销一下
关于vsftpd还有一个解决方法:
http://sourceforge.net/projects/fuse-convmvfs
一个简单FUSE文件系统,用类似下列命令:
代码:
/usr/local/bin/convmvfs -o srcdir=/data/share,ocharset=gb18030,allow_other /data/share18030
可以实现/data/share18030作为/data/share1目录的一个镜像,但文件名编码不同。这样的话
就可以同时讨好UTF-8和GB*用户了

代码:
# ls /data/share/music/|tail
瘦人
眼镜蛇
窦唯
罗大佑
范晓萱
许巍
跳房子
达明一派
陈升
陈绮贞

# ls /data/share18030/music/|iconv -f gb18030 |sort|tail
瘦人
眼镜蛇
窦唯
罗大佑
范晓萱
许巍
跳房子
达明一派
陈升
陈绮贞
具体应该怎么做?
我的系统是CentOS - vsftpd...

作者: Eric_DZT   发布时间: 2007-01-27

引用:
作者: Eric_DZT
具体应该怎么做?
我的系统是CentOS - vsftpd...
你可以试试fedora-cn的fuse-convmvfs的RPM

作者: hellwolf   发布时间: 2007-01-28

引用:
作者: hellwolf
你可以试试fedora-cn的fuse-convmvfs的RPM
你是說fedora安裝盤下的RPM包裡嗎? 還是在fedora系統下安裝fuse-convmvfs ??

作者: Eric_DZT   发布时间: 2007-01-30

http://sourceforge.net/projects/fuse-convmvfs

ftp://ftp.fedora.cn/pub/fedora-cn/di...s-0.2.2.tar.gz

ftp://ftp.fedora.cn/pub/fedora-cn/li...c6.y0.i386.rpm

作者: hellwolf   发布时间: 2007-01-30

hellwolf兄,
都下載了, 但我不會配置啊!! 還請詳細賜教!!! 謝謝!!!

作者: Eric_DZT   发布时间: 2007-01-30

http://blog.chinaunix.net/u/8057/showart.php?id=135033

作者: hellwolf   发布时间: 2007-01-30

哎~不合用,解压时都出错,错误提示为:
# rpm -ivh fuse-convmvfs-0.2.2-1.fc6.y0.i386.rpm
warning: fuse-convmvfs-0.2.2-1.fc6.y0.i386.rpm: V3 DSA signature: NOKEY, key ID cfda5baf
error: Failed dependencies:
fuse-libs >= 2.5.0 is needed by fuse-convmvfs-0.2.2-1.fc6.y0.i386
libc.so.6(GLIBC_2.4) is needed by fuse-convmvfs-0.2.2-1.fc6.y0.i386
libfuse.so.2 is needed by fuse-convmvfs-0.2.2-1.fc6.y0.i386
libfuse.so.2(FUSE_2.2) is needed by fuse-convmvfs-0.2.2-1.fc6.y0.i386
libfuse.so.2(FUSE_2.5) is needed by fuse-convmvfs-0.2.2-1.fc6.y0.i386
rtld(GNU_HASH) is needed by fuse-convmvfs-0.2.2-1.fc6.y0.i386

按照网站上的说法,解压gz包的,进入目录./configure后,又没有make 与 make install 文件. 

作者: Eric_DZT   发布时间: 2007-01-31

热门下载

更多