科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网服务器频道使用FC6自带的vsftpd建立FTP乱码

使用FC6自带的vsftpd建立FTP乱码

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

版本是vsftpd-2.0.5-8,远端在windows下使用cuteftp访问,中文(包括上传的中文文件)全是乱码 #若设置为YES则记录在userlist_file选项指定文件(默认是/etc/vsftpd.user_list)中的用户将无法login,并且将检察下面的userlist_deny选项。 

来源:PC技巧网 2008年11月14日

关键字: 操作系统 Windows ftp VSFTPd

  • 评论
  • 分享微博
  • 分享邮件

  版本是vsftpd-2.0.5-8,远端在windows下使用cuteftp访问,中文(包括上传的中文文件)全是乱码

  locale内容如下:

  LANG=zh_CN.UTF-8

  LC_CTYPE="zh_CN.UTF-8"

  LC_NUMERIC="zh_CN.UTF-8"

  LC_TIME="zh_CN.UTF-8"

  LC_COLLATE="zh_CN.UTF-8"

  LC_MONETARY="zh_CN.UTF-8"

  LC_MESSAGES="zh_CN.UTF-8"

  LC_PAPER="zh_CN.UTF-8"

  LC_NAME="zh_CN.UTF-8"

  LC_ADDRESS="zh_CN.UTF-8"

  LC_TELEPHONE="zh_CN.UTF-8"

  LC_MEASUREMENT="zh_CN.UTF-8"

  LC_IDENTIFICATION="zh_CN.UTF-8"

  LC_ALL=

  我不想改变远端的编码,而对于服务端查了好多资料都不行,小弟初学服务器配置,请大家多多帮助,谢谢!

  ----------

  看置顶帖,安装fedora-cn的仓库,执行:

  代码:

  #yum install fuse-convmvfs

  执行类似:

  代码:

  $convmvfs /ftp/pub_gbk -o srcdir=/ftp/pub, icharset=utf8,ocharset=gbk的代码,那么访问/ftp/pub_gbk的时候文件名就都是GBK的了,windows下也就不会有乱码。

  P。S。:有BUG report说偶尔会SIGSEGV,那就正好在你这里确认下咯,

  ----------------------------------------------------------------------------------------------------------------------------------

  我的ftp服务器配置总结

  看了许多的文章,因为系统版本的原因,都一直没有完全配置出我自己系统的服务器,而且很多次因为没有完全看明白,导致系统都崩溃过,经过无数次的失败和尝试后,终于在自己系统下配置成功,过程记录如下.

  ftp版本: vsftpd-2.0.1-5

  系统: red hat enterprise linuxAS4

  启动: /etc/rc.d/init.d/vsftpd start

  复位: /etc/rc.d/init.d/vsftpd restart

  关闭: /etc/rc.d/init.d/vsftpd stop

  登录:

  # ftp 127.0.0.1

  Connected to 127.0.0.1.

  220 Welcome to blah FTP service.

  530 Please login with USER and PASS.

  530 Please login with USER and PASS.

  KERBEROS_V4 rejected as an authentication type

  Name (127.0.0.1:zhang): ftp

  331 Please specify the password.

  Password:

  230 Login successful.

  Remote system type is UNIX.

  Using binary mode to transfer files.

  ftp>

  (password后面输入空密码,以前失败的时候是因为这里总是在输入不存在的密码) 出现ftp>后表示FTP服务器运行正常,使用匿名用户ftp登陆成功,也可以使用anonymous代替用户名ftp,一样可以成功登陆。输出如下:

  # ftp 127.0.0.1

  Connected to 127.0.0.1.

  220 Welcome to blah FTP service.

  530 Please login with USER and PASS.

  530 Please login with USER and PASS.

  KERBEROS_V4 rejected as an authentication type

  Name (127.0.0.1:zhang): anonymous

  331 Please specify the password.

  Password:

  230 Login successful.

  Remote system type is UNIX.

  Using binary mode to transfer files.

  ftp>

  论坛上的很多文章都只是讲如何配置和一些配置的例子,而我认为对新手来说这个过程更加重要,可是很少有文章对这个过程作充分的说明.ftp的安装比较简单,有源代码和rpm包两种方式,安装方法如下:

  1.源代码

  (我的安装过程因为是很早就安装上的,所以具体的安装过程那个时候没有写下来,因为比较简单所以就没写,但是为了过程的完整性,这里用其他的例子说明)

  下载VSFTP源码包或VSFTP的RPM包软件,这里使用的是vsftpd-

  1.2.1.tar.gz,或是使用RPM包,下载vsftpd-

  1.1.3-8.i386.rpm,无论你使用哪种包安装vsftp都需要有root权限。使用tar.gz源码包安装VSFTP,把下载的源码包放在一个目录下,这里建一个目

  录ftp,所有的操作都在这个目录下进行:

  mkdir ftp

  把vsftpd-1.2.1.tar.gz复制到目录ftp下:

  cp 下载vsftpd-1.2.1.tar.gz放置目录 ftp/

  进入ftp目录:

  cd ftp

  接下来解压:

  tar zxvf vsftpd-1.2.1.tar.gz

  解压之后ftp目录下多了一个名为vsftpd-1.2.1的目录,进入该目录编译VSFTP:

  cd vsftpd-1.2.1

  编译:

  make

  编译之后目录下多了一个可执行文件vsftpd,

  #ls -l vsftpd

  -rwxr-xr-x 1 root root 77144 4月 13 21:17 vsftpd

  这是vsftp的主程序。因为vsftp默认需要使用"nobody"这个用户来配置,所以你必

  须确定你的系统中有这个用户,一般说都会有的,但为了明确起见,执行下述命令

  添加nobody用户:

  #adduser nobody

  adduser: user nobody exists

  因为我的系统里已经有nobody用户了,所以提示该用户已经存在了。

  vsftp默认的配置还需要一个空的目录(empty),该目录的绝对路径应该是

  /usr/share/empty/,另外若ftp服务器需要匿名用户(anonymous)需要加一个用户ftp,此用户的要求这样:用户目录设为/var/ftp,它是VSFTP的匿名用户的映射本地用户,即指anonymous用户在进程中以ftp用户身分运行进程,但anonymous用户并不继承了ftp用户的文件权限,它只拥有其他组的文件权限。可使用下述的命令

  完成上面的需求:

  #mkdir /var/ftp/

  #useradd -d /var/ftp ftp

  如果你的系统已经存在有ftp用户的话,使用下面的命令更改目录属主和用户目录:

  #chown root.root /var/ftp

  #chmod og-w /var/ftp

  接下来把编译的文件安装到相应目录:

  make install

  安装之后,在/usr/local/sbin/目录下有vsftpd这个主程序。

  在/etc/xinetd.d下也有一个vsftpd配置文件,这个文件是由xinetd守护进程启动

  vsftpd 的配置文件。如果不使用xinetd启动vsftp的话,应该在/etc/目录下加一个vsftp的配置文件,默认的文件名为/etc/vsftpd.conf,这个文件可以手动编辑,但在源码目录里已经有一个样本配置文件了,可以直接修改这个文件以满足需求,现在把这个样本配置文件拷贝到这个目录下:

  #cp vsftpd.conf /etc/

  这样在/etc/下有一个配置文件vsftpd.conf了。

  测试一下VSFTP是否能够正常运行,采取使用独立进程而不是xinetd来启动VSFTP,这样要在刚才的文件/etc/vsftpd.conf后面加入一行:

  listen=YES

  加入之后用下面的命令试试启动VSFTP

  /etc/rc.d/init.d/vsftpd start

  如果输出的东西跟本文开头的一样,那就说明ftp安装成功了.

  2.rpm包安装

  使用RPM包安装VSFTP就容易多了,只需要执行下面的命令:

  #rpm -ivh sftpd-1.1.3-8.i386.rpm

  下面是配置过程

  首先是最基本的配置,下面是我的/etc/vsftpd/vsftpd.conf

  #接受匿名用户

  anonymous_enable=YES

  #匿名用户login时不询问口令

  no_anon_password=YES

  #接受本地用户

  local_enable=YES

  #可以上传(全局控制).若想要匿名用户也可上传则需要设置anon_upload_enable=YES,若想要匿名用户可以建立目录则需要设置anon_mkdir_write_enable=YES.这里禁止匿名用户上传,所以不设置这两项.

  write_enable=YES

  #本地用户上传文件的umask

  local_umask=022

  #使用上传/下载日志,日志文件默认为/var/log/vsftpd.log,可以通过xferlog_file选项修改

  xferlog_enable=YES

  #日志使用标准xferlog格式

  xferlog_std_format=YES

  #login时的欢迎信息

  ftpd_banner=Welcome to blah FTP service.

  #设置的话将覆盖上面的ftpd_banner设置,用户login时将显示/etc/vsftpd/banner中的内容

  banner_file=/etc/vsftpd/banner

  #为YES则进入目录时显示此目录下由message_file选项指定的文本文件(,默认为.message)的内容

  dirmessage_enable=YES

  #本地用户login后所在目录,若没有设置此项,则本地用户login后将在他的home目录(/etc/passwd的第六个字段)中.匿名用户的对应选项是anon_root

  local_root=/var/ftp

  #设置为YES则下面的控制有效

  chroot_list_enable=YES

  #若为NO,则记录在chroot_list_file选项所指定的文件(默认是/etc/vsftpd.chroot_list)中的用户将被chroot在登录后所在目录中,无法离开.如果为YES,则所记录的用户将不被chroot.这里选择YES.

  chroot_local_user=YES

  #若设置为YES则记录在userlist_file选项指定文件(默认是/etc/vsftpd.user_list)中的用户将无法login,并且将检察下面的userlist_deny选项

  userlist_enable=YES

  #若为NO,则仅接受记录在userlist_file选项指定文件(默认是/etc/vsftpd.user_list)中的用户的login请求.若为YES则不接受这些用户的请求.

  userlist_deny=NO

  #注意!!!vsftpd还要检察/etc/vsftpd.ftpusers文件,记录在这个文件中的用户将无法login!!

  #服务器以standalong模式运行,这样可以进行下面的控制

  listen=YES

  #匿名用户的传输比率(b/s)

  anon_max_rate=51200

  #本地用户的传输比率(b/s)

  local_max_rate=512000

  #可接受的最大clIEnt数目

  max_clIEnts=100

  #每个ip的最大clIEnt数目

  max_per_ip=5

  connect_from_port_20=YES

  tcp_wrappers=YES

  pam_service_name=vsftpd

  /etc/vsftpd.user_list配置文件里的允许用户根据具体情况而定

  /etc/vsftpd.ftpusers可以使用系统自带的文件

  /etc/vsftpd.chroot_list内容为空

  接着建立系统用户ftpuser,将他加入ftp组并将/etc/passwd中他的记录的最后一个字段改成/sbin/nologin(禁止本地登录).

  设置/var/ftp的所有者和所有组为root,权限为755

  设置/var/ftp/pub的所有者为root,所有组为ftp,权限为775

  至此vsftpd的基本配置就完成了.这里接受匿名用户anonymous和本地用户ftpuser的请求.anonymous只能下载, ftpuser可以下载和上传.他们登录后均在/var/ftp目录下且无法离开这个目录(被chroot了).ftpuser可以在/var/ftp/pub目录中建立目录和上传文件,上传文件的权限为755(设置了local_umask=022).匿名用户的传输比率为50kb/s,ftpuser的传输比率为500kb/s.可联接的最多客户数为100,每ip可联接的最多客户数为5.如果需要使本地用户 ftpput 可以login,只需要将他加入/etc/vsftpd.user_list,要使他可以上传,只需将他加入ftp组.接着我们可以在/var/ftp下的各个目录(包括/var/ftp)下建立.message文件,这样用户进入这个目录时vsftpd将显示. message的内容,你可以在这里面写上欢迎信息或者注意事项等等.另外可以编辑/etc/vsftpd/banner,建立login时的欢迎信息,让ftp更加个性 化.

  一些配置细节的说明:

  vsftp 从XINETD中独立出来,并将设定档从 /etc/vsftpd.conf之中移到/etc/vsftpd/vsftpd.conf。为什么做这样的改变?可以想见的是vsftp已有独立运作 的能力,不需要XINETD来做更进一步的管控,并且类似sendmail、httpd、ssh、samba 等,将设定文件的放入/etc下独立的目 录。 FTP分为两类,一种为PORT FTP,也就是一般的FTP 另一类是PASVFTP,分述如下: PORT FTP这是一般形式的FTP,首先会建立控制频道,默认值是port 21,也就是跟port 21 建立联机,并透过此联机下达指令。第二,由FTP server端会建立数据传输频 道,默认值为20,也就是跟port 20 建立联机,并透过port 20 作数据的传输。 PASV FTP跟PORT FTP类似,首先会建立控 制频道,默认值是port 21,也就是跟port 21建立联机,并透过此联机下达指令。第二,会由clIEnt端做出数据传输的请求,包括数据传输 port 的数字。 这两者的差异为何?PORT FTP 当中的数据传输port 是由FTP server 指定,而PASVFTP 的数据传输 port 是由FTP client决定。通常我们使用PASV FTP,是在有防火墙的环境之下,透过client 与server的沟通,决定数据 传输的port。

  安排欢迎话语是希望使用者在登入时,能够看到欢迎话语,可能包括对该主机的说明,或是目录的介绍,可参考以下步 骤。首先确定在/etc/vsftpd/vsftpd.conf当中是否有底下这一行 dirmessage_enable=YES 接着,在各目录之中,新增名为.message的档案,再这边假设有一个使用者test1,且此使用者的根目录下有个目录名为abc,那首先我们在/home/test1 之下新增.message,内容如下:

  Hello~ Welcome to the home directory This is for test only...

  接 着,在/home/test1/abc 的目录下新增.message,内容如下: Welcome to abc's directory This is subdir... 那么,当使用者test1 登入时,会看到以下讯息: 230- Hello~ Welcome to the home directory 230- 230- This is for test only... 230- 若是切换到abc的目录,则会出现以下讯息: 250- Welcome to abc's directory 250- 250- This is subdir...

  针对不同的使用者限制不同的速度:假设test1所能使用的最高速度为250KBytes/s,test2 所能使用的最高速度为500KBytes/s。

  修改/etc/vsftpd/vsftpd.conf 新增底下一行 user_config_dir=/etc/vsftpd/userconf

  新增一个目录:/etc/vsftpd/userconf mkdir /etc/vsftpd/userconf

  在/etc/vsftpd/userconf 之下新增一个名为test1 的档案 内容增加一行: local_max_rate=250000

  在/etc/vsftpd/userconf 之下新增一个名为test2 的档案 内容增加一行: local_max_rate=500000

  重新启动vsftpd

  一些更加细节化的配置:

  使本地用户能登录FTP。按照上面的源码安装配置我们的FTP还不能让本地用户登录,因为缺少一个认证PAM文件,在源码目录下有一个redHat/vsftpd.pam认证文件,把它复制到/etc/pam.d/ftp。

  #cp RedHat/vsftpd.pam /etc/pam.d/ftp

  (我没有测试,因为没有确定到底用的是哪个版本,准备下次重新装的时候从头来过)

  开启ACSII上传下载传输模式

  ascii_download_enable=YES //开启了下载时的ASCII模式数据传输

  ascii_upload_enable=YES //开启了上传时的ASCII模式数据传输

  因为二进制传输不用进行二进制和ASCII码之间的相互转化,因而速度较ASCII模式快,VSFTP在默认情况下是不开启ASCII码传输模式的,上述两个语句使ASCII上传下载传输模式分别开启。

  更改FTP服务器默认监听端口

  listen_port=2121 //改变默认的21端口号为2121

  设置最大客户端连接数

  max_clIEnts=30 //服务器最大连接数设为30,默认为0,即不加以限制,安全的FTP应该加以限制

  上面讲述的启动服务器的方法是都是以独立(standalone)进程的方式启动的,还有一种启动VSFTP的方法,就是使用超级服务器xinetd启动,这两种方法的区别是,xinetd的启动使支持的并发进程比独立进程方式启动少,不适合访问人数多的大站点,一般如果访问的流量少可以使用 xinetd启动,如果是访问的流量多应该以独立方式启动。因为我还没有涉及到这个,所以不作记录.

  以独立方式启动FTP可以创建虚拟服务器,把服务器改为由独立方式启动的模式,直接更改它们两个配置文件就可以了:

  编辑服务器的配置文件/etc/vsftpd.conf,加入下面的两行:

  listen_address=192.168.0.2

  listen=YES

  保存后退出,由下面的命令来启动服务器:

  #/usr/local/sbin/vsftpd /etc/ftp.conf &

  关于windows用户访问服务器时候出现乱码的问题

  windows访问vsftp出现乱码因为windows默认编码是GB2312,linux用的是UTF-8编码,所以上传文件会有乱码,这时可以更改修改/etc/sysconfig/i18n文件,将第二行改成这样:LANG = "zh_CN.GB2312"就可以了.

  把上面这些都做好了,那应该可以配置出一个比较完整也很安装的ftp站点,我只做了其中的80%左右,准备过几天重新配置一遍.写了那么多,虽然不完全是我写的,但是写完以后就是感觉很累,靠,眼睛痛死了.不过也值得,这可是心血的凝聚!!

  ------------------------------------------------------------------------------------------------------------

  由于在linux下字体的编码是UTF8的,而windows的还是GB2312。

  我在VSFTP服务器的几个文件是中文命命名的,编码是UFT8。

  所以在客户端显示为码码 而我从windows传东东到我服务器上也是乱码

  请问这该怎么处理啊?

  VSFTP服务器要打补丁才能解决utf8,gbk的乱码问题,建议用pureftp,因为只有这个FTP服务器,才是官方支持字符集转换,解决utf8,gbk乱码的问题

  在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)。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章