參考
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()