下载proftpd并解压,进入解压目录!
./configure –prefix=/usr/local/proftpd –with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql –with-includes=/usr/local/include/mysql –with-libraries=/usr/local/lib/mysql
注意修改mysql的信息
make
make install
修改proftpd配置
vi /usr/local/proftpd/etc/proftpd.conf
内容改为:
ServerName “Q25.NET”
ServerType standalone
DefaultServer on
# 用户登陆时不显示ftp服务器版本信息
ServerIdent off
# Port 21 is the standard FTP port.
Port 21
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
MaxLoginAttempts 3
TimeoutLogin 120
TimeoutIdle 600
TimeoutNoTransfer 900
TimeoutStalled 3600
MaxClients 100
# 设置每台主机最多并发连接数
MaxClientsPerHost 3
AllowOverwrite no
AllowStoreRestart on
UseReverseDNS off
# 设置如果shell为空时允许用户登录
RequireValidShell off
# 将用户限制在自己的主目录下
DefaultRoot ~
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30
# Set the user and group under which the server will run.
User nobody
Group nobody
# Normally, we want files to be overwriteable.
<Directory />
AllowOverwrite on
</Directory>
# A basic anonymous configuration, no upload directories.
# 匿名登录设置。匿名用户目录为/ftp
<Anonymous /ftp>
User ftp
Group ftp
# We want clients to be able to login with “anonymous” as well as “ftp”
# UserAlias anonymous ftp    停了它
# Limit the maximum number of anonymous logins
MaxClients 10
# We want ‘welcome.msg’ displayed at login, and ‘.message’ displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayFirstChdir .message
# Limit WRITE everywhere in the anonymous chroot
#<Limit WRITE>
# DenyAll
#</Limit>
</Anonymous>
以上是PROFTPD.conf
#连接MYSQL
# 数据库联接的信息,proftpdb是数据库名,localhost是主机名,proftpd是连接数据库的用户名,proftpdb是密码#(如果没有密码留空)
SQLConnectInfo proftpdb@localhost proftp proftpdb
# 数据库认证的类型
SQLAuthTypes Backend Plaintext
# 数据库的鉴别
SQLAuthenticate users* groups*
# 指定用来做用户认证的表的有关信息。
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
# 如果home目录不存在,则系统会根据它的home项新建一个目录
SQLHomedirOnDemand on
#这是目录所有者,我觉得这个很重要。所以我用nobody来做,在此我的nobody为65534,linux的nobody是99
SQLDefaultGID        65534
SQLDefaultUID        65534
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE “count=count+1,accessed=now() WHERE userid=’%u’” ftpuser
# Update modified everytime user uploads or deletes a file
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE “modified=now() WHERE userid=’%u’” ftpuser
# 启用磁盘限额
QuotaDirectoryTally on
# 磁盘限额单位 b”|”Kb”|”Mb”|”Gb”
QuotaDisplayUnits “Kb”
QuotaEngine on
# 磁盘限额日志记录
QuotaLog “/var/log/quota.log”
# 打开磁盘限额信息,当登陆FTP帐户后,使用命令 “quote SITE QUOTA” 后可显示当前用户的磁盘限额
QuotaShowQuotas on
以下为sql语句:
SQLNamedQuery get-quota-limit SELECT “name, quota_type, per_session, limit_type, bytes_in_avail,bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = ‘%{0}’AND quota_type = ‘%{1}’”
SQLNamedQuery get-quota-tally SELECT “name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”
SQLNamedQuery update-quota-tally UPDATE “bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = ‘%{6}’ AND quota_type = ‘%{7}’” ftpquotatallies
SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}” ftpquotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
下面可以用phpmyadmin在mysql里加入,我的sql为以下
CREATE TABLE `ftpgroup` (
`groupname` varchar(16) NOT NULL default ”,
`gid` int(6) NOT NULL default ’65534′,
`members` varchar(16) NOT NULL default ”,
KEY `groupname` (`groupname`)
) TYPE=MyISAM COMMENT=’ProFTP group table’;
 
INSERT INTO `ftpgroup` VALUES (‘nobody’, 65534, ‘nobody’);
 
CREATE TABLE `ftpquotalimits` (
`name` varchar(30) default NULL,
`quota_type` enum(‘user’,'group’,'class’,'all’) NOT NULL default ‘user’,
`per_session` enum(‘false’,'true’) NOT NULL default ‘false’,
`limit_type` enum(‘soft’,'hard’) NOT NULL default ‘soft’,
`bytes_in_avail` float NOT NULL default ’0′,
`bytes_out_avail` float NOT NULL default ’0′,
`bytes_xfer_avail` float NOT NULL default ’0′,
`files_in_avail` int(10) unsigned NOT NULL default ’0′,
`files_out_avail` int(10) unsigned NOT NULL default ’0′,
`files_xfer_avail` int(10) unsigned NOT NULL default ’0′
) TYPE=MyISAM;
 
CREATE TABLE `ftpquotatallies` (
`name` varchar(30) NOT NULL default ”,
`quota_type` enum(‘user’,'group’,'class’,'all’) NOT NULL default ‘user’,
`bytes_in_used` float NOT NULL default ’0′,
`bytes_out_used` float NOT NULL default ’0′,
`bytes_xfer_used` float NOT NULL default ’0′,
`files_in_used` int(10) unsigned NOT NULL default ’0′,
`files_out_used` int(10) unsigned NOT NULL default ’0′,
`files_xfer_used` int(10) unsigned NOT NULL default ’0′
) TYPE=MyISAM;
 
CREATE TABLE `ftpuser` (
`id` int(10) unsigned NOT NULL auto_increment,
`userid` varchar(32) NOT NULL default ”,
`passwd` varchar(32) NOT NULL default ”,
`uid` int(6) NOT NULL default ’65534′,
`gid` int(6) NOT NULL default ’65534′,
`homedir` varchar(255) NOT NULL default ”,
`shell` varchar(16) NOT NULL default ‘/sbin/nologin’,
`count` int(11) NOT NULL default ’0′,
`accessed` datetime NOT NULL default ’0000-00-00 00:00:00′,
`modified` datetime NOT NULL default ’0000-00-00 00:00:00′,
PRIMARY KEY (`id`)
) TYPE=MyISAM COMMENT=’ProFTP user table’;
启动proftpd
/usr/local/proftpd/sbin/proftpd start
在数据数中的ftpuser中加入用户,密码和路径就可以了。
附上Proftpd启动脚本
#!/bin/sh
case “$1″ in
start)
/bin/mkdir -p /var/run/proftpd
if [ -x /usr/local/proftpd/sbin/proftpd ]; then
/usr/local/proftpd/sbin/proftpd && echo -n ‘ proftpd’
fi
;;
stop)
killall proftpd
;;
*)
echo “$0 start | stop”
;;
esac
 
proftpd.conf
# This is a basic ProFTPD configuration file (rename it to
# ‘proftpd.conf’ for actual use.  It establishes a single server
# and a single anonymous login.  It assumes that you have a user/group
# “nobody” and “ftp” for normal operation and anon.
ServerName                        “Welcome to Q25.NET”
ServerType                        standalone
DefaultServer                        on
# Port 21 is the standard FTP port.
Port                                21
ServerIdent off
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask                                022
MaxLoginAttempts 3
TimeoutLogin 120
TimeoutIdle 600
TimeoutNoTransfer 900
TimeoutStalled 3600
MaxClients 100
MaxClientsPerHost 2
AllowStoreRestart on
UseReverseDNS off
RequireValidShell off
# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances                        30
# Set the user and group under which the server will run.
User                                nobody
Group                                nobody
# To cause every FTP user to be “jailed” (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~
# Normally, we want files to be overwriteable.
AllowOverwrite                on
# Bar use of SITE CHMOD by default
<Limit SITE_CHMOD>
  AllowAll
</Limit>
# A basic anonymous configuration, no upload directories.  If you do not
# want anonymous users, simply delete this entire <Anonymous> section.
<Anonymous ~ftp>
  User                                ftp
  Group                                ftp
  # We want clients to be able to login with “anonymous” as well as “ftp”
  UserAlias                        anonymous ftp
  # Limit the maximum number of anonymous logins
  MaxClients                        10
  # We want ‘welcome.msg’ displayed at login, and ‘.message’ displayed
  # in each newly chdired directory.
  DisplayLogin                        welcome.msg
  DisplayFirstChdir                .message
  # Limit WRITE everywhere in the anonymous chroot
  <Limit WRITE>
    DenyAll
  </Limit>
</Anonymous>
# Use to mysql server
SQLConnectInfo db@localhost user password
SQLAuthTypes Backend Plaintext
SQLAuthenticate users* groups*
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
SQLHomedirOnDemand on
SQLDefaultGID        65534
SQLDefaultUID        65534
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE “count=count+1,accessed=now() WHERE userid=’%u’” ftpuser
# Update modified everytime user uploads or deletes a file
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE “modified=now() WHERE userid=’%u’” ftpuser
QuotaDirectoryTally on
QuotaDisplayUnits “Kb”
QuotaEngine on
QuotaLog “/var/log/quota.log”
QuotaShowQuotas on
#SQL Query
SQLNamedQuery get-quota-limit SELECT “name, quota_type, per_session, limit_type, bytes_in_avail,bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = ‘%{0}’AND quota_type = ‘%{1}’”
SQLNamedQuery get-quota-tally SELECT “name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”
SQLNamedQuery update-quota-tally UPDATE “bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = ‘%{6}’ AND quota_type = ‘%{7}’” ftpquotatallies
SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}” ftpquotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally