proftpd mysql with quota
yum install proftpd-mysql
# username 使用者帳號
# uid 系統的 uid 這個可以自己隨便給個數字,不要重複到系統帳號
# gid 系統的 gid 這個看你用途是什麼來去對應
# password 使用者密碼
# homedir 使用者家目錄
# shell 使用者的 shell 最好是填 /sbin/nologin
# accessed 使用者最後登入的時間
# count 登入次數
#這個部份增加了兩個欄位 accessed, count ,因為使用者登入時,會執行 updatecount 的SQL語法,但沒有這兩個欄位,會寫不進去
#其實還少了 modified 欄位,但是我想不出來儲存這個欄位有什麼用途,所以不修正
DROP TABLE IF EXISTS `FTPUser`;
CREATE TABLE IF NOT EXISTS `FTPUser` (
`username` varchar(60) default NULL,
`ID` int(10) NOT NULL,
`GroupID` int(10) default NULL,
`password` varchar(30) default NULL,
`homedir` varchar(60) default NULL,
`shell` varchar(32) default ‘/usr/bin/nologin’,
`accessed` datetime NOT NULL,
`count` int(10) NOT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
接下來建立 group 資料表
# groupname 群組帳號
# gid 系統的 gid 這個對應到系統 /etc/group 的 gid 值,也可以不用,看你怎麼用
# members 這個群組的成員
CREATE TABLE IF NOT EXISTS `FTPGroups` (
`pname` varchar(30) NOT NULL DEFAULT “,
`ID` int(10) NOT NULL DEFAULT ‘0’,
`members` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
接下來修改 proftpd.conf
UseReverseDNS off
#建議開啟 Log,登入發生錯誤時,也比較好抓問題
SystemLog /var/log/proftpd/ftp.log
DefaultAddress ::
# 使用 mysql 資料庫為主
SQLBackend mysql
# SQLAuthTypes Backend
# 密碼認證 已 PASSWORD() 產生為主
# 密碼使用明碼 Plaintext
SQLAuthTypes Plaintext
# 開啟認證
SQLAuthenticate on
# MySQL 連線資訊,資料庫名稱@主機 帳號 密碼
SQLConnectInfo UploadFileTest@localhost upload MhevvdRYU7RNr9QZ
# 使用者資料庫欄位
SQLUserInfo FTPUser username password ID GroupID homedir shell
#SQLUserInfo custom:/get-user-by-name/get-user-by-id/get-user-names/get-all-users
# 群組資料庫欄位
SQLGroupInfo FTPGroups name ID members
# SQL Log 檔
SQLLogFile /var/log/proftpd/sql.log
# 當 Home 目錄不存在,會自己產生。
#SQLHomedirOnDemand on
CreateHome on
RequireValidShell off
#SQLDefaultGID 99
#SQLDefaultUID 99
# SQL Log 格式,當正確登入時,要執行的 SQL 語法
SQLLog PASS updatecount
# updatecount 增加登入跟時間
SQLNamedQuery updatecount UPDATE “count=count+1, accessed=now() where username=’%u'" FTPUser
# SQL Log 格式,當儲存或刪除檔案時,要執行的 SQL 語法
SQLLog STOR,DELE modified
# modified 語法
#SQLNamedQuery modified UPDATE “accessed=now() where ID=’%u'" FTPUser
#SQLNamedQuery get-user-by-name SELECT “username, password, ID, GroupID, homedir, shell FROM FTPUser WHERE username = ‘%U'"
#SQLNamedQuery get-user-by-id SELECT “username, password, ID, GroupID, homedir, shell FROM FTPUser WHERE ID = %{0}"
#SQLNamedQuery get-user-names SELECT “username FROM FTPUser"
#SQLNamedQuery get-all-users SELECT “username, password, ID, GroupID, homedir, shell FROM FTPUser"
# 硬碟限額部分
QuotaDirectoryTally on
#硬碟限額單位 b | Kb | Mb| Gb
QuotaDisplayUnits “Mb"
# 啟動 Quota
QuotaEngine on
# 硬碟限額日志記錄
QuotaLog /var/log/proftpd/proftpd_quota.log
# 打開硬碟限額資訊,當登陸FTP帳戶后,使用命令 “quote SITE QUOTA" 后可顯示當前使用者的硬碟限額
QuotaShowQuotas on
QuotaLock /var/lock/ftpd.quotatab.lock
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
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 QuotaLimits 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 QuotaTallies 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}'" QuotaTallies
SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" QuotaTallies