共計 8425 個字符,預計需要花費 22 分鐘才能閱讀完成。
這篇文章主要介紹了 FTP 服務 Proftpd+mysql+quota 的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
1 下載相關軟件
1.1 下載 proftpd
1.2 下載 MySQL
1.3 下載 proftpd-mod-quotatab
2 安裝
2.1 解壓 proftpd-1.2.9rc1.tar.gz
2.2 解壓 proftpd-mod-quotatab-1.2.10.tar.gz
2.3 安裝 MySQL
2.4 編譯安裝 proftpd 和 proftpd-mod-quotatab
3 配置
3.1 配置 proftpd.conf 文件
3.1.1 設置磁盤限額
3.1.2 指定磁盤限額模塊使用的數據庫信息
3.1.3 配置 FTP 用戶為 MySQL 數據庫認證方式
4 創建 FTP 系統用戶和組
5 建立 FTP 用戶認證相關表
6 建立磁盤限額數據表
7 數據表數據初始化
8 運行 proftpd
9 配置 proftpd 執行腳本
10 FAQ
11 其它問題
1 下載相關軟件
1.1 下載 proftpd
在以下地址可下載到 for Linux 的 proftpd-1.2.9rc1 版:
http://www.proftpd.org/download.html
以上地址是一個 FTP 下載站點的列表,自己選一個吧。
1.2 下載 MySQL
MySQL 可以到 http://www.mysql.com 去下載,一般每一種 Linux 發行版都已經默認安裝了 MySQL,可以用以下命令查看:
rpm ndash;qa|grep MySQL
如果沒有的話,請在自己的 Linux 安裝光盤中找到并予以安裝,一般裝完后就會自動啟動了,可用如下命令查看:
ps ndash;ef|grep mysql
如果看到了相應進程則表明 MySQL 已經運行,否則請自行啟動:
/etc/rc.d/init.d/mysql start
1.3 下載 proftpd-mod-quotatab
下面是 proftpd-mod-quotatab 的下載地址:
http://www.castaglia.org/proftpd/modules/proftpd-mod-quotatab-1.2.10.tar.gz
2 安裝
2.1 解壓 proftpd-1.2.9rc1.tar.gz
假設下載的 proftpd-1.2.9rc1.tar.gz 文件在 /root 目錄下,則先進入此目錄,然后執行:
tar ndash;xzvf proftpd-1.2.9rc1.tar.gz
2.2 解壓 proftpd-mod-quotatab-1.2.10.tar.gz
tar ndash;xzvf proftpd-mod-quotatab-1.2.10.tar.gz
2.3 安裝 MySQL
假設 MySQL 的 rpm 包名字為 MySQL-3.23.56-i386.rpm
rpm ndash;ivh MySQL-3.23.56-i386.rpm
2.4 編譯安裝 proftpd 和 proftpd-mod-quotatab
首先將進入解壓后的 proftpd-mod-quotatab 目錄,將此目錄下的所有文件復制到解壓后的 proftpd 目錄下的 modules 目錄中,接著到 contrib 目錄中編輯 mod_sql_mysql.c 文件:
vi mod_sql_mysql.c
找到 #include 這一行,將 mysql.h 改成你的系統中此文件所在的路徑,如 /usr/include/mysql/mysql.h
然后在解壓后的 proftpd 目錄中執行:
./configure –prefix=/usr/local/proftpd –with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql –with-includes=/usr/include/mysql –with-libraries=/usr/lib/mysql
注意請根據自己的 Linux 系統找到 MySQL 的相應 include 和 lib 目錄,以上例子中的相關路徑是大多數 Linux 系統默認的,如果你的 MySQL 是通過源碼編譯安裝的,則這兩個目錄一般在安裝路徑下。
如果 configure 沒有錯誤,接下來就可以 make;make install 了。
make
make install
完成后,在 /usr/local 目錄下會產生一個 proftpd 目錄:
cd /usr/local/proftpd
ls 會看到 bin etc man sbin var 五個目錄,執行 sbin/proftpd 就會啟動 proftpd 服務了,但現在還是使用的系統用戶,請繼續看下面 hellip; hellip;
3 配置
3.1 配置 proftpd.conf 文件
編輯 /usr/local/proftpd/etc/proftpd.conf 文件:
3.1.1 設置磁盤限額
# 設置磁盤限額
QuotaDirectoryTally on
# 設置磁盤容量顯示時的單位
QuotaDisplayUnits Kb
# 打開磁盤限額引擎
QuotaEngine on
# 設置磁盤限額日志文件
QuotaLog /usr/local/proftpd/var/quota
# 允許顯示磁盤限額信息,ftp 登錄后可執行 quote site quota 命令查看當前磁盤使用情況
QuotaShowQuotas on
3.1.2 指定磁盤限額模塊使用的數據庫信息
在 proftpd.conf 文件中加入以下配置:
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
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
3.1.3 配置 FTP 用戶為 MySQL 數據庫認證方式
在 proftpd.conf 文件中加上以下配置:
SQLConnectInfo databaseName@hostName:port userName password
#databaseName 是為 proftpd 建立的 MySQL 數據庫的名字
#hostName 是 MySQL 數據庫所在的服務器的名字或 ip 地址
#port 是 MySQL 服務所使用的端口
#userName 是數據庫的用戶名
#password 是數據庫用戶密碼
SQLAuthTypes Backend Plaintext
#Backend 表示用戶認證方式為 MySQL 數據庫的認證方式
#Plaintext 表示明文認證方式,排在最前面的為 *** 使用的方式
SQLUserInfo ftpUser userid passwd uid gid homedir shell
# 指定 ftp 用戶數據表的名字和其中的字段名,表名可自行定義,字段名不要改動。
SQLGroupInfo ftpGroup groupname gid members
# 指定 ftp 用戶組數據表的名字和其中的字段名,這個數據表是可選的,字段名不要改動。
RequireValidShell off
# 指定是否必須為 FTP 用戶指定一個系統 shell,off 表示不用指定,on 表示必須指定。為了系統安全應該指定為 off。
SQLAuthenticate users groups usersetfast groupsetfast
# 校驗數據表
SQLHomedirOnDemand on
# 如果用戶主目錄不存在,則系統會根據此用戶在用戶數據表中的 homedir 字段的值新建一個目錄
4 創建 FTP 系統用戶和組
創建一個 FTP 用戶和組,以后所有的其它 FTP 用戶實際上都是通過這個系統用戶進行 FTP 的:
groupadd ndash;g 2003 ftpGroup
useradd ndash;u 2003 ndash;g ftpGroup ndash;d /home ftpUser
以上建立了一個名為 ftpGroup 的 ftp 組,組 id 為 2003; 建立了一個 ftp 用戶,用戶 id 為 2003,并加入 ftpGroup 組,用戶主目錄為 /home
接著修改 /home 的屬主和訪問權限:
chown ndash;R ftpUser.ftpGroup /home
chmod 644 /home
644 的具體含義請自查看相關文檔。
再修改 proftpd.conf 文件,找到 User 和 Group,將 User 指定為 ftpUser,Group 指定為 ftpGroup,替換掉原默認值,否則如果系統中沒有原默認值所指定的用戶和組的話,proftpd 是不能成功啟動的。
5 建立 FTP 用戶認證相關表
mysql ndash;u root
use mysql
添加一個 mysql 用戶:ftp
添加一個數據庫:proftpd
具體指令請參考 MYSQL 手冊。
建完用戶和數據庫后,以新建的用戶登錄 MYSQL:
mysql ndash;u ftp
use proftpd;
create table ftpUser (userid TEXT NOT NULL,passwd TEXT NOT NULL,uid INT NOT NULL,gid INT NOT NULL,homedir TEXT,shell TEXT);
userid 是用戶名,passwd 是用戶密碼,uid 是用戶 id,gid 是用戶所在組的 id,homedir 是用戶主目錄,shell 是用戶的系統 shell。
create table ftpGroup (groupname TEXT NOT NULL,gid SMALLINT NOT NULL,members TEXT NOT NULL);
groupname 是組名,gid 是組 id,members 是組的成員,有多個成員時,要用逗號隔開。
以上建立了 FTP 用戶和用戶組的數據表。
6 建立磁盤限額數據表
CREATE TABLE quotalimits (
name VARCHAR(30),
quota_type ENUM(user , group , class , all) NOT NULL,
per_session ENUM(false , true) NOT NULL,
limit_type ENUM(soft , hard) NOT NULL,
bytes_in_avail FLOAT NOT NULL,
bytes_out_avail FLOAT NOT NULL,
bytes_xfer_avail FLOAT NOT NULL,
files_in_avail INT UNSIGNED NOT NULL,
files_out_avail INT UNSIGNED NOT NULL,
files_xfer_avail INT UNSIGNED NOT NULL
);
CREATE TABLE quotatallies (
name VARCHAR(30) NOT NULL,
quota_type ENUM(user , group , class , all) NOT NULL,
bytes_in_used FLOAT NOT NULL,
bytes_out_used FLOAT NOT NULL,
bytes_xfer_used FLOAT NOT NULL,
files_in_used INT UNSIGNED NOT NULL,
files_out_used INT UNSIGNED NOT NULL,
files_xfer_used INT UNSIGNED NOT NULL
);
以上 quotalimits 表是 FTP 用戶的磁盤限額配置信息,quotatallies 表存放的是用戶磁盤限額變動的信息。
quotatallies 表不需要作修改,由程序自動記錄
下面是 quotalimits 表中各字段的含意:
quota_type 磁盤限額的鑒別
bytes_in_avail 上傳 *** 字節數,就是 FTP 用戶空間容量
bytes_out_avail 下載 *** 字節數
bytes_xfer_avail 總共可傳輸的文件的 *** 字節數 (上傳和下載流量)
files_in_avail 總共能上傳文件的數目
files_out_avail 能從服務器上下載文件的總數目
files_xfer_avail 總共可傳輸文件的數目 (上傳和下載)
7 數據表數據初始化
表全部建完后,就可以創建 FTP 用戶了,在 ftpUser 表中插入一條記錄如下:
INSERT INTO ftpUser (userid, passwd, uid, gid, homedir, shell) values (shine , password( lsquo;yourpassword rsquo;), 2003 , 2003 , /home/shine ,
以上建立了一個新的 FTP 用戶,用戶名為 shine, 密碼為 yourpassword,可以看到密碼用 mysql 的系統函數 password 進行了加密,用戶 id 和組 id 均為 2003,這里隨便填,我填了和系統用戶 ftpUser 和系統組 ftpGroup 相同的 id,不知道會不會有問題。/home/shine 為用戶主目錄,用戶 shell 為空。
如果要想應用到更多的功能,且建立了組的數據表,你也要為此添加記錄,不過一定要注意在 members 的字段多個成員一定要用逗號隔開。
INSERT INTO ftpGroup VALUES (ftpGroup , 2003, ftpUser
下面再來建立初始的用戶磁盤限額信息:
將已經建立的 shine 帳號賦予 50M 空間,最多能上傳 500 個文件,文件傳輸流量為 512k,總共只能傳輸 2000 個文件,插入記錄如下:
INSERT INTO quotalimits (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)VALUES (lsquo;shine rsquo;, lsquo;user rsquo;, lsquo;true rsquo;, lsquo;soft rsquo;, lsquo;51200000 rsquo;, lsquo;0 rsquo;, rsquo;512000 rsquo;, lsquo;500 rsquo;, rsquo;0 rsquo;, rsquo;2000 rsquo;);
8 運行 proftpd
執行以下命令啟動 proftpd 服務:
/usr/local/proftpd/sbin/proftpd
開一個控制臺輸入:
ftp ftpHostName
輸入用戶名:shine
輸入用戶密碼:yourpassword
成功登錄后執行:
quote site quota
可以看到此用戶的磁盤使用情況。
9 配置 proftpd 執行腳本
cd /usr/local/proftpd/bin
vi proftpd
輸入以下內容:
#!/bin/sh
# ProFTPD files
FTPD_BIN=/usr/local/proftpd/sbin/proftpd
FTPD_CONF=/usr/local/proftpd/etc/proftpd.conf
PIDFILE=/usr/local/proftpd/var/proftpd.pid
# If PIDFILE exists, does it point to a proftpd process?
if [-f $PIDFILE]; then
pid=`cat $PIDFILE`
fi
if [! -x $FTPD_BIN]; then
echo $0: $FTPD_BIN: cannot execute
exit 1
fi
case $1 in
start)
if [-n $pid]; then
echo $0: proftpd [PID $pid] already running
exit
fi
if [-r $FTPD_CONF]; then
echo Starting proftpd…
$FTPD_BIN -c $FTPD_CONF
else
echo $0: cannot start proftpd — $FTPD_CONF missing
fi
;;
stop)
if [-n $pid]; then
echo Stopping proftpd…
kill -TERM $pid
else
echo $0: proftpd not running
exit 1
fi
;;
restart)
if [-n $pid]; then
echo Rehashing proftpd configuration
kill -HUP $pid
else
echo $0: proftpd not running
exit 1
fi
;;
*)
echo usage: $0 {start|stop|restart}
exit 1
;;
esac
exit 0
存盤退出。
chmod +x proftpd
修改此腳本為可執行。
ln ndash;s ./proftpd /etc/rc.d/init.d/proftpd
在 /etc/rc.d/init.d/ 目錄中做一個軟鏈接指向 proftpd 腳本文件。
cd /etc/rc.d/rc0.d
ln ndash;s ../init.d/proftpd ./K15proftpd
cd ../rc1.d
ln ndash;s ./init.d/proftpd /K15proftpd
cd ../rc2.d
ln ndash;s ./init.d/proftpd /K15proftpd
cd ../rc3.d
ln ndash;s ./init.d/proftpd /S91proftpd #注意 S 后面的數字,如果在此目錄中存在 mysql 相關的鏈接文件,請保證這個數字比那個文件中 S 后面的數字大! 這樣 proftpd 將在 mysql 數據庫服務啟動以后再啟動,這是個良好的啟動順序,當然不用管它也沒什么問題。
cd ../rc4.d
ln ndash;s ./init.d/proftpd /S91proftpd
cd ../rc5.d
ln ndash;s ./init.d/proftpd /S91proftpd
cd ../rc6.d
ln ndash;s ./init.d/proftpd /K15proftpd
經過以上設置,每次系統開機時 proftpd 服務將會自動啟動,關機時則會自動停止。
當然,也不必在每個 rc 目錄中都加上鏈接,實際上只需要在執行啟動任務的 rc 目錄中加上就行了,比如 rc3.d,rc4.d,rc5.d,其中 rc4.d 也不是必需的,而 rc3.d 是在系統進入運行級三時自動運行的,無論如何這里要有 proftpd 的鏈接,運行級三是系統正常啟動的級別,而運行級四則是預留的用戶自定義的運行級,所以可不管它,運行級 5 是啟動 X -Window 的,但一般情況下是先進入運行級三,然后才是運行級五,所以也不用在 rc5.d 目錄中建立 proftpd 的鏈接,而運行級六是系統重啟,就不用說了。
一句題外話:
想切換系統運行級可執行:init number,number 是代表運行級的數字,舉個例子:
init 5 等同于 startx
init 6 等同于 reboot
其它運行級就不在這里一一介紹了,有興趣的朋友可自行查閱相關資料。
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“FTP 服務 Proftpd+mysql+quota 的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!