• CentOS安装配置pureftpd


    参考
    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()
  • 相关阅读:
    一个小笔记(5):A*算法
    一个小笔记(4):递归下降分析法
    1.3 初步了解信号和槽
    一个小笔记(3):约瑟夫环
    1.2 第一个程序
    requestAnimationFrame
    javascript reg 不加入分组
    正则表达式匹配除单词外的任何字符
    自動化ツール(コード生成、パターン抽出)
    windows常用DLL及作用
  • 原文地址:https://www.cnblogs.com/diege/p/2758500.html
Copyright © 2020-2023  润新知