vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。并且是一个完全免费开放源码的ftp软件

根据业务需要,要求支持ftp和sftp,我需要在Linux上架设一个ftp服务器,来存放CDN线上节点的用户访问日志。我选择在CentOS 6.3 64bit上使用vsftpd来完成这个任务,服务器ip是10.10.110.158。
sftp是与SSH相关的,与ftp没有任何关系,我采用python中的paramiko模块实现了一个包装类,这里只谈ftp。
下面是安装详细过程实录,仅作参考。
1.检查server上是否已经安装了vsftpd
rpm -qa | grep vsftpd

2.假如没有相应的vsftpd rpm包,我们需要下载安装
yum install vsftpd

3.添加虚拟主机用户
业务要求:被限制用户名为test,被限制路径为/home/test
添加用户test,用户目录指定为/home/test,且此用户不能登陆系统.
#useradd –s /sbin/nologin –d /home/test test
注意-s /sbin/nologin是让其不能登陆系统,-d是指定用户主目录为/home/test,如果不存在会自动创建
#passwd test

输入密码tao_627,并确认

ftp storeFileStream 后工作目录改变 ftp路径修改_vsftpd

4.配置vsftpd配置文件,这里是关键点
# ls /etc/vsftpd/
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh

首先了解vsftpd主配置文件vsftpd.conf,更全面的功能和选项介绍参见vsftpd.conf.5的man page页面,使用命令行
man vsftpd.conf

vim /etc/vsftpd/vsftpd.conf
修改对应的值如下:

anonymous_enable=NO #禁止匿名用户登录,默认允许 
 local_enable=YES #允许本地实体用户登录 
 write_enable=YES #允许用户上传数据,开启写权限 
 local_umask=022 #对本地用户建立新目录(755)与文件(644)的权限,上传文件的权限掩码  
 dirmessage_enable=YES #若登录目录下有.message则会显示该文件内容 可以自己在登录目录下创建.message文件并写入信息 
 xferlog_enable=YES #启动日志文件记录,默认记录于/var/log/vsftpd.log,可用使用vsftpd_log_file改写 
 xferlog_file=/var/log/xferlog
 connect_from_port_20=YES #支持主动式连接功能,默认20,可用使用ftp_data_port指定为其他端口号 
 xferlog_std_format=YES #支持WuFTP的日志文件格式 
 local_root=/home/test #限制登录用户只能在/home/test目录下操作,该用户一登录就切换到该目录下面 
 chroot_local_user=YES #禁用户离开主目录
 chroot_list_enable=YES #不允许FTP用户离开自己的主目录
 listen=YES #使用stand alone方式启动vsftpd 
 pam_service_name=vsftpd #支持PAM模块的管理
 userlist_enable=YES #支持/etc/vsftpd/user_list文件内的账号登录控制,禁止其登陆
 tcp_wrappers=YES #支持TCP Wrappers的防火墙机制


这里为了安全,我们可以编辑 user_list这个文件,把禁止通过FTP登录系统的账号添加进去。这样的话,这些账户尝试远程登录的时候。会被拒绝登录。

实际修改配置项如下

anonymous_enable=NO
 xferlog_file=/var/log/xferlog
 chroot_local_user=YES
 chroot_list_enable=YES
 chroot_list_file=/etc/vsftpd/chroot_list



新建一个文件/etc/vsftpd/chroot_list,因为上面的配置文件,在其中增加test

开放21和20端口
修改iptables文件,然后保存重启
vim /etc/sysconfig/iptables

5.添加系统服务vsftpd,让系统服务随着系统启动而启动
chkconfig vsftpd on
使用下面的命令查看修改是否成功
chkconfig vsftpd --list
启动vsftpd服务,尝试使用ftp传输文件。
service vsftpd start
查看系统端口状态:
netstat -tulnp
如果能看到21端口正在被vsftpd调用说明启动成功。

6.安装ftp客户端组件(用来验证是否vsftpd)
yum -y install ftp
执行命令尝试登陆
ftp localhost
输入用户和密码,如果登陆成功,说明ftp服务可用了。下面是最简单的在线ftp功能测试

ftp storeFileStream 后工作目录改变 ftp路径修改_linux_02

7.命令行操作示例
假设vsftpd所在的服务器的地址是10.10.110.158,在另外的机器上打开命令行(需要事先安装ftp客户端):
ftp 10.10.110.158
输入用户名test,密码为tao_627
ftp>ls
ftp>put /usr/local/src/Python-2.7.10.tgz /home/test/Python-2.7.10.tgz


ftp>quit


ftp storeFileStream 后工作目录改变 ftp路径修改_linux_03


配置顺利的话,现在就可以用ftp传输文件了。
8.ftp常用命令介绍
如果没有远程机的专用登录帐号,许多ftp站点设有可以使用的特殊帐号。这个帐号的登录名为anonymous(也称为匿名ftp),当使用这一帐号时,要求输入email地址作为口令。
如果远程系统提供匿名ftp服务,用户使用这项服务可以登录到特殊的,供公开使用的目录。一般专门提供两个目录:pub目录和incoming目录。pub目录包含该站点供公众使用的所有文件,incoming目录存放上载到该站点的文件。
一旦用户使用ftp在远程站点上登录成功,将得到“ftp>”提示符。现在可以自由使用ftp提供的命令,可以用 help命令取得可供使用的命令清单,也可以在 help命令后面指定具体的命令名称,获得这条命令的说明。

最常用的命令有:
ls 列出远程机的当前目录
cd 在远程机上改变工作目录
lcd 在本地机上改变工作目录
ascii 设置文件传输方式为ASCII模式
binary 设置文件传输方式为二进制模式
close 终止当前的ftp会话
hash 每次传输完数据缓冲区中的数据后就显示一个#号
get(mget) 从远程机传送指定文件到本地机
put(mput) 从本地机传送指定文件到远程机
open 连接远程ftp站点
exit 断开与远程机的连接并退出ftp
? 显示本地帮助信息
! 转到Shell中

常用命令说明
◆启动ftp会话
open命令用于打开一个与远程主机的会话。该命令的一般格式是:
open 主机名/IP
如果在ftp 会话期间要与一个以上的站点连接,通常只用不带参数的ftp命令。如果在会话期间只想与一台计算机连接,那么在命令行上指定远程主机名或IP地址作为ftp命令的参数。
◆终止ftp会话
close、disconnect、和bye命令用于终止与远程机的会话。close和disronnect命令关闭与远程机的连接,但是使用户留在本地计算机的ftp程序中。和bye命令都关闭用户与远程机的连接,然后退出用户机上的ftp 程序。
◆改变目录
“cd [目录]”命令用于在ftp会话期间改变远程机上的目录,lcd命令改变本地目录,使用户能指定查找或放置本地文件的位置。
◆远程目录列表
ls命令列出远程目录的内容,就像使用一个交互shell中的ls命令一样。ls命令的一般格式是:
ls [目录] [本地文件]
如果指定了目录作为参数,那么ls就列出该目录的内容。如果给出一个本地文件的名字,那么这个目录列表被放入本地机上您指定的这个文件中。
◆从远程系统获取文件
get和mget命令用于从远程机上获取文件。get命令的一般格式为:
get 文件名
您还可以给出本地文件名,这个文件名是这个要获取的文件在您的本地机上创建时的文件名。如果您不给出一个本地文件名,那么就使用远程文件原来的名字。
mget命令一次获取多个远程文件。mget命令的一般格式为:
mget 文件名列表
使用用空格分隔的或带通配符的文件名列表来指定要获取的文件,对其中的每个文件都要求用户确认是否传送。
◆向远程系统发送文件
put和mput命令用于向远程机发送文件。Put命令的一般格式为:
put 文件名
mput命令一次发送多个本地文件,mput命令的一般格式为:
mput 文件名列表
使用用空格分隔的或带通配符的文件名列表来指定要发送的文件。对其中的每个文件都要求用户确认是否发送。
◆改变文件传输模式
默认情况下,ftp按ASCII模式传输文件,用户也可以指定其他模式。ascii和brinary命令的功能是设置传输的模式。用ASCII模式传输文件对纯文本是非常好的,但为避免对二进制文件的破坏,用户可以以二进制模式传输文件。
◆检查传输状态
传输大型文件时,可能会发现让ftp提供关于传输情况的反馈信息是非常有用的。hash命令使ftp在每次传输完数据缓冲区中的数据后,就在屏幕上打印一个#字符。本命令在发送和接收文件时都可以使用。
◆ftp中的本地命令
当您使用ftp时,字符“!”用于向本地机上的命令shell传送一个命令。如果用户处在ftp会话中,需要shell做某些事,就很有用。例如用户要建立一个目录来保存接收到的文件。如果输入!mkdir new_dir,那么Linux就在用户当前的本地目录中创建一个名为new_dir 的目录。

9.安装中出现的问题
1.客户端报
500 OOPS: could not read chroot() list file:/etc/vsftpd/vsftpd.chroot_list
解决方法:
查看vsftpd的配置,果然缺少这个文件,加上了启动成功。
2.ftplib.error_perm: 553 Could not create file.


发现问题是没有权限创建文件或是目录,查找原因


因为我将selinux关闭了。发现上传的文件夹的权限不对,在指定用户test主目录下,我自己创建了一个root组和用户名的文件夹。将它们改为test后就可以了。


此时,上传文件的组和用户不限制,可以是root超级用户,也可以是其它普通用户,比如taoyx,不一定是test,都可以的。