参考
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有很多的编译配置选项,下面就列出部分主要的配置
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
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配置文件说明
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脚本内容
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
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脚本
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脚本
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()