CentOS安装配置pure-ftpd

参考
http://machiel.generaal.net/
http://salogs.com/2010/06/pure-ftpd-deploy/
http://www.fishnote.net/?tag=pure-ftpd
SYSTEM:
CentOS release 6.2
IPADDR:
192.168.78.250

一、安装
1、yum安装
yum -y install pure-ftpd
2、编译安装
下载路径:
http://download.pureftpd.org/pub/pure-ftpd/releases/
PureFTPd有很多的编译配置选项,下面就列出部分主要的配置

View Code
 1 --prefix=PREFIX
 2 --with-sysquotas        使用系统磁盘配额 (非虚拟)
 3 --with-altlog           支持选择日志格式(类似Apache)
 4 --with-puredb           支持虚拟用户 (FTP登陆用户而非系统用户)
 5 --with-extauth          支持扩展验证模块
 6 --with-pam              启用PAM验证支持 (默认=禁用)
 7 --with-cookie           启用Cookie支持 (-F 选项)
 8 --with-throttling       支持带宽控制 (默认=禁用)
 9 --with-ratios           支持 上传/下载 速度控制
10 --with-quotas           支持 .ftpquota 文件(指定磁盘配额使用)
11 --with-ftpwho           支持pure-ftpwho(查看在线用户的程序)
12 --with-largefile        支持大于2G的文件
13 --with-welcomemsg       支持 welcome.msg 向后兼容(已经过时)
14 --with-uploadscript     上传后允许执行外部脚本 (测试阶段)
15 --with-virtualhosts     在不同的IP地址提供虚拟服务器功能
16 --with-virtualchroot    允许在chroot的环境下通过符合连接跳转到外部
17 --with-diraliases       启用目录别名
18 --with-nonroot          普通模式或者说是限制模式. 如果你在该服务器上没有root权限
19 那只有启用该项
20 --with-peruserlimits    支持每个用户的并发限制
21 --with-language=        语言支持< english | traditional-chinese | simplified-chinese>
22 --with-ldap             在LDAP目录中提供用户数据库
23 --with-mysql            在MySQL数据库中存放用户数据
24 --with-pgsql            在PostgreSQL数据库中存放用户数据
25 --with-privsep          启用权限分离
26 --with-tls              启用 SSL/TLS 支持 (测试阶段, 需要安装 OpenSSL)
27 --with-certfile=        证书文件 (默认目录: /etc/ssl/private/pure-ftpd.pem)
28 --with-rfc2640          启用兼容 RFC 2640 支持(UTF-8 编码的文件名,测试阶段,需要安装iconv)
29 --with-everything       启用大多数选项,编译完功能版本的服务器端。

为了方便起见,我在这里使用了几个基本的编译命令来配置编译一个全功能版本的程序
# ./configure --prefix=/usr/local/pure-ftpd/ --with-language=simplified-chinese --with-everything
# make && make check && make install

二、配置
1、配置 FTP登录账户:
pure-ftp默认采用Linux的root用户。虚拟用户则能够更好的控制访问权限。虚拟用户是和Linux系统用户关联的独立的账户系统。
所以在创建虚拟用户之前最好先创建一个系统的账户和组。创建一个ftpgroup组和ftpuser用户
# groupadd ftpgroup
# useradd -g ftpgroup -d /dev/null -s /sbin/nologin ftpuser
# mkdir /data/ftpdata
# chown ftpuser.ftpgroup /data/ftpdata
2、配置文件
# cp /etc/pure-ftpd/pure-ftpd.conf /etc/pure-ftpd/pure-ftpd.conf_bak
# vi pure-ftpd.conf

View Code
 1 ChrootEveryone              yes
 2 BrokenClientsCompatibility  yes
 3 Daemonize                   yes
 4 MaxClientsPerIP             20
 5 VerboseLog                  yes
 6 DisplayDotFiles             no
 7 AnonymousOnly               no
 8 NoAnonymous                 yes
 9 SyslogFacility              none
10 DontResolve                 yes
11 MaxIdleTime                 15
12 LimitRecursion              2000 8
13 AnonymousCanCreateDirs      no
14 MaxLoad                     4
15 PassivePortRange          45000 50000
16 #AnonymousRatio                1 10
17 #UserRatio                 1 10
18 AntiWarez                   yes
19 #AnonymousBandwidth            200
20 UserBandwidth               8  
21 Umask                       133:02
22 MinUID                      100  
23 AllowUserFXP                no   
24 AllowAnonymousFXP           no    
25 ProhibitDotFilesWrite       no    
26 ProhibitDotFilesRead        no   
27 AutoRename                  yes
28 AnonymousCantUpload         yes  
29 AltLog                     clf:/var/log/pureftpd.log
30 PureDB                     /etc/pure-ftpd/pureftpd.pdb
31 MaxDiskUsage               99
32 CreateHomeDir              yes
33 CustomerProof              yes

上面使用的配置文件说明

 1 ChrootEveryone              yes         # 启用chroot
 2 BrokenClientsCompatibility  yes         # 兼容不同客户端
 3 Daemonize                   yes         # 后台运行
 4 MaxClientsPerIP             20          # 每个ip最大连接数
 5 VerboseLog                  yes         # 记录日志
 6 DisplayDotFiles             no          # 显示隐藏文件
 7 AnonymousOnly               no          # 只允许匿名用户访问
 8 NoAnonymous                 yes         # 不允许匿名用户连接
 9 SyslogFacility              none        # 不将日志在syslog日志中显示
10 DontResolve                 yes         # 不进行客户端DNS解析
11 MaxIdleTime                 15          # 最大空闲时间
12 LimitRecursion              2000 8      # 浏览限制,文件2000,目录8层
13 AnonymousCanCreateDirs      no          # 匿名用户可以创建目录
14 MaxLoad                     4           # 超出负载后禁止下载
15 PassivePortRange          45000 50000   # 被动模式端口范围
16 #AnonymousRatio                1 10     # 匿名用户上传/下载比率
17 UserRatio                 1 10          # 所有用户上传/下载比率
18 AntiWarez                   yes         # 禁止下载匿名用户上传但未经验证的文件
19 #AnonymousBandwidth            200      # 匿名用户带宽限制(KB)
20 UserBandwidth               8           # 所有用户最大带宽(KB)
21 Umask                       133:022     # 创建文件/目录默认掩码
22 MinUID                      100         # 验证登录用户的最小UID
23 AllowUserFXP                no          # 仅运行用户进行FXP传输
24 AllowAnonymousFXP           no          # 对匿名用户和非匿名用户允许进行匿名 FXP 传输
25 ProhibitDotFilesWrite       no          # 不能删除/写入隐藏文件
26 ProhibitDotFilesRead        no          # 禁止读取隐藏文件
27 AutoRename                  yes         # 有同名文件时自动重新命名
28 AnonymousCantUpload         yes         # 不允许匿名用户上传文件
29 AltLog                     clf:/var/log/pureftpd.log                # clf格式日志文件位置
30 PureDB                     /usr/local/pure-ftpd/etc/pureftpd.pdb        # 用户数据库文件
31 MaxDiskUsage               99           # 当磁盘使用量打到99%时禁止上传
32 CreateHomeDir              yes          # 如果虚拟用户的目录不存在则自动创建#需要ftp根目录权限为755 chmod 775 /data/ftpdata/
33 CustomerProof              yes          # 防止命令误操作

完整pure-ftpd.conf配置文件说明

View Code
  1 # 将每个用户限制在自己的home目录下
  2 ChrootEveryone              yes
  3 
  4 # 兼容ie等比较非正规化的ftp客户端。默认:no
  5 BrokenClientsCompatibility  yes
  6 
  7 # 最大用户连接数。默认:50
  8 MaxClientsNumber            2000
  9 
 10 # 后台模式(守护进程模式)
 11 Daemonize                   yes
 12 
 13 # 同一个IP允许连接数(可以防止迅雷、快车等程序疯狂开线程)。默认:8
 14 MaxClientsPerIP             20
 15 
 16 # 如果要记录所有的客户端命令,请设置为‘yes’该选项可以将日志同步复制到日志服务器。默认:no
 17 VerboseLog                  yes
 18 
 19 # 显示隐藏文件。默认:yes
 20 DisplayDotFiles             yes
 21 
 22 # 不允许验证用户。只作为匿名ftp服务器。默认:no
 23 AnonymousOnly               no
 24 
 25 # 不允许匿名用户连接。只允许验证用户连接。默认:no
 26 NoAnonymous                 no
 27 
 28 # 该选项是说将何种类型的日志同步写入到syslog中。
 29 # 类型包括(auth, authpriv, daemon, ftp, security, user, local*)
 30 # 默认是"ftp"如果不想将ftp的日志显示在/var/log/message中。则禁用即可: "none"
 31 SyslogFacility              none
 32 
 33 # 显示 cookies
 34 # FortunesFile              /usr/share/fortune/zippy
 35 
 36 # 在日志文件中不解析主机名。日志越详细所需要的带宽也就越大。如果服务器的
 37 # DNS解析有问题或者服务器的负载过大,建议将该选项配置yes。默认为:yes
 38 DontResolve                 yes
 39 
 40 # 最大空闲时间。单位:分钟 (默认 = 15 分钟)
 41 MaxIdleTime                 15
 42 
 43 # LDAP 配置文件
 44 # LDAPConfigFile                /etc/pureftpd-ldap.conf
 45 
 46 # MySQL 配置文件 (详情见 README.MySQL)
 47 # MySQLConfigFile               /etc/pureftpd-mysql.conf
 48 
 49 # Postgres 配置文件 (详情见 README.PGSQL)
 50 # PGSQLConfigFile               /etc/pureftpd-pgsql.conf
 51 
 52 # PureDB 用户数据库 (详情见 README.Virtual-Users)
 53 # PureDB                        /etc/pureftpd.pdb
 54 
 55 # pure-authd 的 socket 路径 (详见 README.Authentication-Modules)
 56 # ExtAuth                       /var/run/ftpd.sock
 57 
 58 # 如果要使用PAM验证,取消下面行的注释
 59 # PAMAuthentication             yes
 60 
 61 # 如果要使用/etc/passwd 文件验证。取消下面行的注释
 62 # UnixAuthentication            yes
 63 
 64 # 注意:LDAPConfigFile, MySQLConfigFile, PAMAuthentication 与 UnixAuthentication
 65 # 只能启用一个,但他们可以联合使用。例如:你启用了 MySQLConfigFile 之后又启用了
 66 # UnixAuthentication那么同一时刻只有SQL server 可用。如果SQL authentication 失败,
 67 # 例如用户没有找到,那么系统会重试其他的方式来验证,这时候它就会找/etc/passwd 和
 68 # /etc/shadow文件. 如果通过 SQL 验证的结果是因为密码错误,那么就不会在进行下面的
 69 # 验证了。由此得知,验证方法可以写多个,但同一个时刻只有一个工作,且当验证时找不
 70 # 到信息时才会进行下一个验证方式。但当验证错误时就终止验证了。
 71 
 72 # 'ls' 递归限制。第一个参数是最大可显示的文件数。第二个参数是子文件夹深度
 73 LimitRecursion              2000 8
 74 
 75 # 匿名用户是否可以创建新文件夹
 76 AnonymousCanCreateDirs      no
 77 
 78 # 如果系统负载超过下面所给的数字,那么匿名用户将无法下载
 79 MaxLoad                     4
 80 
 81 # 在被动连接模式下为其分配的端口范围。便于制定防火墙配置。
 82 PassivePortRange          45000 50000
 83 
 84 # 强制某个IP地址工作在 PASV/EPSV/SPSV 模式. - for NAT.
 85 # ForcePassiveIP                192.168.0.1
 86 
 87 # 匿名用户上传/下载比率
 88 # AnonymousRatio                1 10
 89 
 90 # 所有用户 上传/下载 比率。该选项可以取代上面的选项
 91 # UserRatio                 1 10
 92 
 93 # 禁止下载所有者为‘ftp’的文件。例如:那些匿名用户上传后未被本地管理员验证的文件。
 94 AntiWarez                   yes
 95 
 96 # 用来监听的IP地址和端口 (默认=所有 IP 和 21 端口).
 97 # Bind                      127.0.0.1,21
 98 
 99 # 匿名用户最大带宽限制,单位 KB/s
100 AnonymousBandwidth            200
101 
102 # 所有用户的最大带宽限制(包括匿名)单位 KB/s
103 # 没有必要同时开启 AnonymousBandwidth 和 UserBandwidth
104 # UserBandwidth             8
105 
106 # 新建文件默认掩码. <文件掩码>:<目录掩码>
107 # 为了安全起见可以设置为 177:077
108 Umask                       133:022
109 
110 # 验证登录用户的最小UID
111 MinUID                      100
112 
113 # 仅允许认证用户进行 FXP 传输
114 AllowUserFXP                no
115 
116 # 对匿名用户和非匿名用户允许进行匿名 FXP 传输
117 AllowAnonymousFXP           no
118 
119 # 用户不能删除/写入隐藏文件,即便是文件的拥有者也不允许。
120 # 如果 TrustedGID 选项为 enabled 文件所属组用户可以访问隐藏文件
121 ProhibitDotFilesWrite       no
122 
123 # 禁止读取隐藏文件 (如 .history, .ssh...)
124 ProhibitDotFilesRead        no
125 
126 # 永不覆盖文件。如果上传的文件已经存在,系统会自动将其命名为file.1, file.2, file.3, ...
127 AutoRename                  yes
128 
129 # 不允许匿名用户上传文件 (no = 允许上传)
130 AnonymousCantUpload         no
131 
132 # 仅允许来自以下IP地址的非匿名用户连接。你可以使用这个指令来打开几个公
133 # 网IP来提供匿名FTP,而保留一个私有的防火墙保护的IP来进行远程管理。你
134 # 还可以只允许一内网地址进行认证,而在另外一个IP上提供纯匿名的FTP服务。
135 #TrustedIP                  10.1.1.1
136 
137 # 如果你要在登陆日志的每一行添加PID标记,去掉下行的注释
138 #LogPID                     yes
139 
140 # 使用类似于Apache格式创建一个附加的日志文件,如:
141 # fw.c9x.org - jedi [13/Dec/1975:19:36:39] "GET /ftp/linux.tar.bz2" 200 21809338
142 # 这个日志文件可以被www流量分析工具来处理
143 AltLog                     clf:/var/log/pureftpd.log
144 
145 # 使用优化过的格式为统计报告创建一个额外的日志文件
146 # AltLog                     stats:/var/log/pureftpd.log
147 
148 # 使用标准的W3C格式创建一个额外的日志文件。(与大部分的商业日志分析器兼容)
149 # AltLog                     w3c:/var/log/pureftpd.log
150 
151 # 不允许使用chmod命令.用户不能修改他们上传文件的属性
152 #NoChmod                     yes
153 
154 # 允许用户恢复和上传文件,但不能够上除他们
155 #KeepAllFiles                yes
156 
157 # 用户主目录不存在的话,自动创建目录
158 #CreateHomeDir               yes
159 
160 # 启用虚拟磁盘配额。第一个参数是最大文件数,第二个参数是总共的大小,单位是MB
161 # 如: 1000:10 限制每个用户最大文件1000个且不能超过10MB
162 #Quota                       1000:10
163 
164 # 如果你在编译 pure-ftpd 时加入了‘standalone’选项,那么你可以更改pid文件位置
165 # 默认目录 /var/run/pure-ftpd.pid
166 #PIDFile                     /var/run/pure-ftpd.pid
167 
168 # 如果你在编译 pure-ftpd 时加入了 pure-uploadscript 选项,这个指令将会使
169 # pure-ftpd 发送关于新上传的情况信息到 /var/run/pure-ftpd.upload.pipe,
170 # 这样 pure-uploadscript 就能读然后调用一个脚本去处理新的上传。
171 #CallUploadScript yes
172 
173 # 这个选项对于匿名上传的服务器是很有用的。/var/ftp 在 /var 里时,需要保留一定
174 # 磁盘空间来保护日志文件。当所在磁盘分区使用超过百分之 X 时,将不在接受新的上传。
175 MaxDiskUsage               99
176 
177 # 如果不想让用户来重命名文件,请将其设置为yes
178 #NoRename                  yes
179 
180 # 'customer proof' : 选项可以阻止普通用户因误操作而执行的错误命令
181 # 如:'chmod 0 public_html', 这是有效的命令,但执行完命令之后用户
182 # 就将他们自己的文件锁定了,这时你的麻烦就来了,你需要给用户解决这
183 # 些由于用户而造成的愚蠢问题。如果你确信的你用户都具有一些unix基础
184 # 知识的话,那么该选项就没有必要设置,否则建议启用它。
185 CustomerProof              yes
186 
187 # 所有用户都做同样的限制。只有编译时加入了--with-peruserlimits 选项
188 # 才可以启用。格式为: <每一个用户最大许可的进程>:<匿名用户最大进程>
189 # 例如:3:20 同一个认证用户最大可以有3个同时活动的进程。而且同时最多
190 # 只能有20个匿名用户进程
191 # PerUserLimits            3:20
192 
193 # 当文件上传时,服务器上之前已经有一个同名的文件时,旧的文件既不会被移动
194 # 也不会被删除。在新文件上传完毕之前会将上传的部分暂时放到一个临时的文件
195 # 中,当上传完毕之后会自动的切换到新上传的文件。例如:当服务器上有一个PHP
196 # 脚本正在执行,但我现在要上传一个新的PHP脚本,那么当我在上传完毕之后才将
197 # 旧的文件切换到新的文件。而不是像某些程序那样在开始上传的时候就将旧的文件
198 # 覆盖掉了,这样做的目的就是可以最大程度的减少正在运行中的程序错误。该选项
199 # 与虚拟配额不能同时使用。
200 # NoTruncate               yes
201 
202 # 该选项可以接受3个可选值:
203 # 0 : 禁用 SSL/TLS 加密层 (默认).
204 # 1 : 同时接受传统的和加密的连接
205 # 2 : 拒绝没有经过 SSL/TLS 安全验证的连接,包括匿名连接
206 # 在没有确定下面三个问题之前不要盲目的取消注释:
207 # 1) 编译PureFTPd时是否启用了 SSL/TLS 支持 (--with-tls),
208 # 2) 系统中是否包含一个有效的证书
209 # 3) 开启后只有兼容的客户端才能登陆
210 # TLS                      1
211 
212 # 在 standalone 模式下只监听IPV4的地址 (与禁用 IPv6 相同)
213 # 默认是IPV4与IPV6同时监听
214 # IPV4Only                 yes
215 
216 # 在 standalone 模式下只监听IPV6的地址 (与禁用 IPv4 相同)
217 # IPV6Only                 yes
218 
219 # 文件名的UTF-8支持
220 # FileSystemCharset big5
221 # ClientCharset     big5

三、用户管理
1、添加用户
# pure-pw useradd lily -u ftpuser -g ftpgroup -d /data/ftpdata/lily
Password:
Enter it again:
# pure-pw mkdb -> 当使用pure-pw 生成虚拟用户之后一定要使用pure-pw mkdb命令生成数据库文件,
否则pure-ftp启动之后也无法验证虚拟用户
第一个用户,需要手动建立文件

pure-pw命令的格式
pure-pw useradd <login> [-f <passwd file>] -u <uid> [-g <gid>]
-D/-d <home directory> [-c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client host>[/<mask>][,...]
[-R <deny client host>[/<mask>][,...]
[-i <allow local host>[/<mask>][,...]
[-I <deny local host>[/<mask>][,...]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m]

使用-z参数可以指定用户只能在一天中的某个时间段可以登陆ftp服务器。例如 -z 0900-1800那么joe只能在早上9点和下午6点这个时间段登陆。
注意:如果设置登陆时间的用户已经通过验证登陆到ftp服务器上了,那么所做的登陆时间限制只能在他下次登陆验证的时候才能生效。
-r 与 -R 参数是约束用户从哪些IP登陆的。可以使用IP/mask的形式,如-r 192.168.1.0/24多个段用逗号隔开,
如:-r 192.168.1.0/24,10.1.0.0/16,127.0.0.1/32 。单独的IP:-r 192.168.1.4,10.1.1.5主机名:-r bla.bla.net,yopcitron.com。
以及一些相兼容的格式。
-y 参数是限制同一时刻一个用户最多能发起多少个会话(sessions)。''或0 代表无限制。该选项可以降低系统负载。效果同配置文件中的 MaxClientsPerIP
# cat /usr/local/pure-ftpd/etc/pureftpd.passwd
joe:$1$ocfl1XW0$R0JaEh3CjGFByGbdN7qNy/:501:501::/home/ftpusers/joe/./::::::::::::
密码字段是经过加密的。

2、更改用户信息
虚拟用户创建之后,你也可以通过pure-pw命令来修改其相关的信息,如限制下载
带宽、磁盘配额、用户全名、下载上传率等等
例如:我要修改用户joe的最大文件数为1000个,大小为10MB,命令如下:
# pure-pw usermod joe -n 1000 -N 10
查看一下虚拟用户列表文件
# cat /etc/pure-ftpd/pureftpd.passwd
lily:$1$gH6aMxg0$he9g3F/HHFwvipEozvU4G0:505:504::/data/ftpdata/lily/./::::::::::::

3、重置用户属性
要禁用文件数配额,执行 pure-pw usermod -n ''
要禁用文件大小配额,执行 pure-pw usermod -N ''
要禁用上传/下载比率,执行 pure-pw usermod -q '' -Q ''
要禁用下载带宽限制,执行 pure-pw usermod -t ''
要禁止上传带宽限制,执行 pure-pw usermod -T ''
要禁止IP地址过滤,使用 pure-pw usermod <-i,-I,-r or -R> ''
要禁止登陆时间限制,执行 pure-pw usermod -z ''
要禁止最大并发数控制,执行 pure-pw usermod -y ''

4、删除用户
使用pure-pw userdel 命令可以删除一个已经存在的用户
pure-pw userdel <login> [-f <passwd file>] [-m]
如:pure-pw userdel joe
用户home目录中的文件不会被删除,需要手动删除

5、更改密码
更改用户密码的命令
# pure-pw passwd <login> [-f <passwd file>] [-m]

6、利用pure-pw命令查看用户信息
# pure-pw show lily

Login : lily
Password : $1$gH6aMxg0$he9g3F/HHFwvipEozvU4G0
UID : 505 (ftpuser)
GID : 504 (ftpgroup)
Directory : /data/ftpdata/lily/./
Full name :
Download bandwidth : 0 Kb (unlimited)
Upload bandwidth : 0 Kb (unlimited)
Max files : 0 (unlimited)
Max size : 0 Mb (unlimited)
Ratio : 0:0 (unlimited:unlimited)
Allowed local IPs :
Denied local IPs :
Allowed client IPs :
Denied client IPs :
Time restrictions : 0000-0000 (unlimited)
Max sim sessions : 0 (unlimited)

四、使用数据管理
1、导入数据
# mysql -uroot -p < script.mysql
sql脚本内容

View Code
 1 --
 2 -- Create MySQL user called 'ftp'
 3 -- Login = ftp
 4 -- Password = tmppasswd
 5 -- Host = 127.0.0.1
 6 --
 7 
 8 #INSERT INTO mysql.user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv) VALUES('127.0.0.1','ftp',PASSWORD('tmppasswd'),'Y','Y','Y','Y','N','N','N','N','N','N','N','N','N','N');
 9 
10 #FLUSH PRIVILEGES;
11 
12 CREATE DATABASE ftpusers;
13 
14 USE ftpusers;
15 
16 --
17 -- Table structure for table 'admin'
18 --
19 
20 CREATE TABLE admin (
21   Username varchar(35) NOT NULL default '',
22   Password char(32) binary NOT NULL default '',
23   PRIMARY KEY  (Username)
24 ) TYPE=MyISAM;
25 
26 --
27 -- Data for table 'admin'
28 --
29 
30 
31 INSERT INTO admin VALUES ('Administrator',MD5('tmppasswd'));
32 
33 --
34 -- Table structure for table 'users'
35 --
36 
37 CREATE TABLE users (
38   User char(16) NOT NULL default '',
39   Password char(32) binary NOT NULL default '',
40   Uid int(11) NOT NULL default '14',
41   Gid int(11) NOT NULL default '5',
42   Dir char(128) NOT NULL default '',
43   QuotaFiles int(10) NOT NULL default '500',
44   QuotaSize int(10) NOT NULL default '30',
45   ULBandwidth int(10) NOT NULL default '80',
46   DLBandwidth int(10) NOT NULL default '80',
47   PRIMARY KEY  (User)
48 ) TYPE=MyISAM;
49 
50 --
51 -- Data for table 'users'
52 --
53 INSERT INTO users VALUES ('diege',MD5('1111'),14,5,'/data/ftpdata/diege/',500,30,80,5);
54 grant all on ftpusers.* to 'ftp'@'localhost' identified by 'tmppasswd';
55 FLUSH PRIVILEGES;

2、配置
# vim pure-ftpd.conf

View Code
 1 ChrootEveryone              yes
 2 BrokenClientsCompatibility  yes
 3 Daemonize                   yes
 4 MaxClientsPerIP             20
 5 VerboseLog                  yes
 6 DisplayDotFiles             no
 7 AnonymousOnly               no
 8 NoAnonymous                 yes
 9 SyslogFacility              none
10 DontResolve                 yes
11 MaxIdleTime                 15
12 LimitRecursion              2000 8
13 AnonymousCanCreateDirs      no
14 MaxLoad                     4
15 PassivePortRange          45000 50000
16 AntiWarez                   yes
17 Umask                       133:02
18 MinUID                      100  
19 AllowUserFXP                no   
20 AllowAnonymousFXP           no    
21 ProhibitDotFilesWrite       no    
22 ProhibitDotFilesRead        no   
23 AutoRename                  yes
24 AnonymousCantUpload         yes  
25 AltLog                     clf:/var/log/pureftpd.log
26 MySQLConfigFile             /etc/pure-ftpd/pureftpd-mysql.conf
27 MaxDiskUsage               99
28 CreateHomeDir              yes
29 CustomerProof              yes

# vim pureftpd-mysql.conf
修改
MYSQLUser ftp
MYSQLPassword tmppasswd
MYSQLDatabase ftpuser
MYSQLCrypt md5

3、重启
# /etc/init.d/pure-ftpd restart

4、详细配置mysql
ULBandwidth 上传速度
DLBandwidth 下载数据
默认mysql配置只有用户认证,其他功能需要开启
打开上传下载速度控制
# vim /etc/pure-ftpd/pureftpd-mysql.conf
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User='\L'
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User='\L'

五、使用GUI管理
http://machiel.generaal.net/有一个php的管理程序,在RHCE5,FREEBSD8都可以使用,在RHEL6(PHP5.3)上有问题
准备有空用django开发一个GUI管理工具

六、脚本

1、vsftpd添加用户shell脚本

View Code
 1 #!/bin/bash
 2 #Created on 2012-08-17
 3 #@author: Jin
 4 
 5 fusername=$1
 6 fpasswd=$2
 7 ch_list=/etc/vsftpd/chroot_list
 8 vuserdir="/etc/vsftpd/vconf"
 9 vuserfile=${vuserdir}/vir_user
10 vuserdb=${vuserdir}/vir_user.db
11 if [ $# -eq 2 ];then
12         grep -q $fusername $vuserfile
13         code="$?"
14         if [ $code -eq 0 ];then
15                 echo "${fusername} exist!" && exit 1
16         fi
17         mkdir /opt/${fusername} && chown ftpuser:ftpuser /opt/${fusername}
18         echo "${fusername}" >> ${ch_list}
19         echo "${fusername}" >> $vuserfile && echo "${fpasswd}" >> $vuserfile
20         exitcode="$?"
21         if [ $exitcode -eq 0 ];then
22                 /usr/bin/db_load -T -t hash -f $vuserfile ${vuserdb}
23         fi
24         if [ -f ${vuserdir}/${fusername} ];then
25                 echo "${vuserdir}/${fusername} exist!"
26         else
27                 cp ${vuserdir}/default ${vuserdir}/${fusername} && sed -i s/default/${fusername}/g ${vuserdir}/${fusername}
28         fi
29 else
30         echo "Please give ftpusername and ftppassword!"
31 fi

2、pure-ftpd添加删除账号,修改账号python脚本

View Code
  1 #!/bin/env python
  2 '''
  3 Created on 2012-11-7
  4 
  5 @author: Jin
  6 
  7 '''
  8 import os
  9 import sys
 10 import optparse
 11 import subprocess
 12 
 13 
 14 #ftproot='/disk3/biftp/dump/'
 15 ftproot='/data/ftpdata/'
 16 reload_cmd='/usr/bin/pure-pw mkdb'
 17 
 18 def addftpuser(ftpusername):
 19         userftpdir=ftproot+ftpusername
 20         cmd='/usr/bin/pure-pw useradd '+ftpusername+' -u ftpuser -g ftpgroup -d '+userftpdir
 21         '''
 22         print "ftproot is:%s\n" % ftproot
 23         print "user is:%s\n" % ftpusername
 24         print "userftpdir is:%s\n" % userftpdir
 25         print "cmd is:%s\n" % cmd
 26         print "reload_cmd is:%s\n" % reload_cmd
 27         '''
 28         try:
 29                 pstat=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
 30         except StandardError,e:
 31                 print "Add ftpuser (%s) failed:: %d (%s)" % (ftpusername,e.errno, e.strerror)
 32                 sys.exit(1)
 33         else:
 34                 pstat.wait()
 35                 if pstat.returncode == 0:
 36                         retcode=subprocess.call(reload_cmd,shell=True)
 37                         if retcode==0:
 38                                 print "Add ftpuser (%s) Successful" % ftpusername
 39                         else:
 40                                 print "Add ftpuser (%s) Successful,But reload puredb failed,Pleae rum command 'pure-pw mkdb' in shell" % ftpusername
 41                 else:
 42                         print "Add ftpuser (%s) failed,exit code is %s,With reason <%s>" % (ftpusername,pstat.returncode,pstat.stderr.read().rstrip('\n'))
 43 
 44 def delftpuser(ftpusername):
 45         cmd='/usr/bin/pure-pw userdel '+ftpusername 
 46         try:
 47                 pstat=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
 48         except StandardError,e:
 49                 print "Delete ftpuser (%s) failed:: %d (%s)" % (ftpusername,e.errno, e.strerror)
 50                 sys.exit(1)
 51         else:
 52                 pstat.wait()
 53                 if pstat.returncode == 0:
 54                         retcode=subprocess.call(reload_cmd,shell=True)
 55                         if retcode==0: 
 56                                 print "Delete ftpuser (%s) Successful" % ftpusername
 57                         else:
 58                                 print "Delete ftpuser (%s) Successful,But reload puredb failed,Pleae rum command 'pure-pw mkdb' in shell" % ftpusername
 59                 else:
 60                         print "Delete ftpuser (%s) failed,exit code is %s,With reason <%s>" % (ftpusername,pstat.returncode,pstat.stderr.read().rstrip('\n'))
 61 
 62 
 63 def changepwd(ftpusername):
 64         cmd='/usr/bin/pure-pw passwd '+ftpusername 
 65         try:
 66                 pstat=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
 67         except StandardError,e:
 68                 print "Change ftpuser (%s) password failed:: %d (%s)" % (ftpusername,e.errno, e.strerror)
 69                 sys.exit(1)
 70         else:
 71                 pstat.wait()
 72                 if pstat.returncode == 0:
 73                         retcode=subprocess.call(reload_cmd,shell=True)
 74                         if retcode==0: 
 75                                 print "Change ftpuser (%s) password Successful" % ftpusername
 76                         else:
 77                                 print "Change ftpuser (%s) password Successful,But reload puredb failed,Pleae rum command 'pure-pw mkdb' in shell" % ftpusername
 78                 else:
 79                         print "Change ftpuser (%s) password failed,exit code is %s,With reason <%s>" % (ftpusername,pstat.returncode,pstat.stderr.read().rstrip('\n'))
 80 
 81 def main():
 82         p=optparse.OptionParser(description="'ftpuser' is command add or delete ftp user or change ftp user password",prog="ftpuser",version="0.0.1",usage="%prog [-a|--add|-d|--delete|-p|--passwd] ftpusername")
 83         p.add_option("--add",'-a',action='store_true',help="Add ftp user")
 84         p.add_option("--delete","-d",action='store_true',help="Delete ftp user")
 85         p.add_option("--passwd","-p",action='store_true',help="Change ftp user password")
 86         options,arguments=p.parse_args()
 87         if len(arguments)==1 and options:
 88                 if options.add:
 89                         addftpuser(arguments[0])
 90                 elif options.delete:
 91                         delftpuser(arguments[0])
 92                 elif options.passwd:
 93                         changepwd(arguments[0])
 94                 else:
 95                         p.print_help()
 96         else:
 97             p.print_help()
 98     
 99 
100 if __name__ == '__main__':
101       main()

posted on 2012-11-07 11:43  @Jin  阅读(3763)  评论(0编辑  收藏

导航

统计