經過許多次的 Try & Error 終於把 ProFTPD + MySQL 架設完畢,在這邊就來做個簡單的紀錄及說明,好讓各位也能輕鬆的使 ProFTPD + MySQL 能正常的 WORK。
過多的廢話在這就不多說了,先簡單的介紹一下我所使用的環境和軟體。
用 FreeBSD 的 ports 來進行安裝其實是很容易的。
1 | # cd /usr/ports/ftp/proftpd-mysql && make install clean |
不過在這邊有一點需注意,如果你跟我一樣已經把 FreeBSD 改成 UTF-8 環境的話,在安裝 ProFTPD 時,別忘了也要安裝 mod_nls,不然可是會發生很多狀況。
在這段開始前先提醒不熟悉 SQL 的人,如果不清楚下面的指令在做些什麼,我想你有兩個選擇。第一是使用圖形化介面來達成該目的,例:phpmyadmin、MySQL GUI Tools … 等。第二個選擇則是照本宣科的做就行了,至於要選哪個就看你自己的程度嚕。
1 2 3 4 | mysql -u root -p CREATE DATABASE FTPDB; GRANT SELECT, INSERT, UPDATE, DELETE ON FTPDB.* TO 'ProFTPD'@'localhost' IDENTIFIED BY 'passwd'; FLUSH PRIVILEGES; |
其中 FTPDB 為資料庫的名稱,ProFTPD 為使用該資料庫的使用者,而 passwd 則為該使用者的密碼,這邊所提的部份都可以依據需求來做更動。
這個資料表是建立 FTP 的群組,主的依據是參照 ProFTPD 的 SQLGroupInfo 這個參數,沒有特殊需求的話就照預設的做吧。
1 2 3 4 5 6 7 | CREATE TABLE FTP_Group ( ID int(10) UNSIGNED NOT NULL AUTO_INCREMENT, GroupName varchar(16) NOT NULL DEFAULT '', GID smallint(6) NOT NULL DEFAULT '5000', Members varchar(16) NOT NULL DEFAULT '', PRIMARY KEY (ID) ) TYPE=MyISAM COMMENT='ProFTPD Group Table'; |
而這個則是建立 FTP 使用者的資料表,一樣是參照 SQLUserInfo 這個參數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE TABLE FTP_User ( ID int(10) UNSIGNED NOT NULL AUTO_INCREMENT, Name varchar(16) NOT NULL DEFAULT '', Passwd varchar(32) NOT NULL DEFAULT '', UID smallint(6) NOT NULL DEFAULT '5000', GID smallint(6) NOT NULL DEFAULT '5000', Home varchar(255) NOT NULL DEFAULT '/home/FTP', Shell varchar(16) NOT NULL DEFAULT '/sbin/nologin', Count int(11) NOT NULL DEFAULT '0', Address varchar(16) NOT NULL DEFAULT '', 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), UNIQUE KEY Name (Name) ) TYPE=MyISAM COMMENT='ProFTPD User Table'; |
這邊主要是以我建置的實際狀況下撰寫出來的東西,所以需求可能會跟你們有些出入,如果有額外的需求其實是可以再做調整的。
由 ports 安裝的 ProFTPD ,其預設的設定檔會放在 /usr/local/etc/proftpd.conf 。開始編輯前,別忘了先複製一份當原始設定參考喔!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # 沒設 off 的話,使用者將會無法登入進來,因為他們 # 的 Shell 都是設定為 /sbin/nologin RequireValidShell off # 接下就是 MySQL 的部份,ProFTPD 還有許多設定, # 但在這我希望能專注於 MySQL 這塊,所以就不多加贅述。 # 告知 ProFTPD 以 MySQL 為首要認證機制 SQLBackend mysql # 登入密碼所使用的 Type。 Backend 是使用 MySQL PASSWORD() 來做加密 # Plaintext 為不加密,Crypt 為 Unix 的 crypt() 加密。詳盡的部份可以再參考 # ProFTPD 的說明文件。 SQLAuthTypes Crypt Backend Plaintext SQLAuthenticate on # MySQL 連線資訊,資料庫名稱@主機 帳號 密碼 SQLConnectInfo <a href="mailto:ProFTPD@localhost">ProFTPD@localhost</a> FTPDB passwd # 使用者和群組資料表欄位 SQLUserInfo FTP_User Name Passwd UID GID Home Shell SQLGroupInfo FTP_Group Name GID Members # SQL Log 檔,這算比較選擇性的參數。不過我都留著來檢查 SQL 有沒有發生 # 什麼問題,主要是用在 debug 上面。 SQLLogFile /var/log/proftpd/sql.log # SQL Log 格式,當正確登入時,要執行的 SQL 語法 SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "Count=Count+1, Address='%h', Accessed=now() where Name='%u'" FTP_User # SQL Log 格式,當儲存或刪除檔案時,要執行的 SQL 語法 SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "Modified=now() where Name='%u'" FTP_User |
另外在這邊簡單解釋一下 SQLLog 和 SQLNamedQuery 的運作方式。
SQLLog 的撰寫方式如下,它和 SQLNamedQuery 的關係很密切,就好比是 IF ELSE。要符合 SQLLog 的條件,SQLNamedQuery 才會啟動。
1 | SQLLog 條件,[條件] 查詢名稱 |
SQLNamedQuery 如果名稱一般,就是負責執行一些 Query 的語法。已讀過文件的人,可能覺得那三個預設的查詢動作似乎有點陽春。不過 ProFTPD 也有發現到這一點,所以 FREEFORM 便因此而誕生啦!至於詳細用法與參數,在這還是希望能自行參閱說明文件。
1 2 | SQLNamedQuery 查詢名稱 [INSERT | UPDATE | SELECT] 查詢語句 [資料表名] SQLNamedQuery 查詢名稱 FREEFORM 查詢語句 |
設定完之後,只要重新啟動 ProFTPD 就可以成功啦!
雖然感覺都東西很多,但其實都很簡單,就只是過程瑣碎了一些。這邊只是提供一個簡單又確定可以成功的方式給大家知道,此外如果有發現錯誤的地方,也希望各位不吝賜教,謝謝。
[...] [教學] ProFTPD + MySQL 這篇所提到的東西外,我還重新設計了一下資料的資料表,打算利用 MySQL [...]