# 啟用 MySQL USE flag
echo 'net-ftp/pure-ftpd mysql' >> /etc/portage/package.use
# 安裝 Pure-FTPd(會自動引入 MySQL 依賴)
emerge pure-ftpd
# 互動式配置 MySQL(設定 root 密碼、初始化資料目錄)
ebuild /var/db/pkg/dev-db/mysql-5.5.28/mysql-5.5.28.ebuild config
# 設定 root 密碼為 root(生產環境請使用強密碼)
編輯 /etc/mysql/my.cnf,新增 [client] 區段方便管理:
[client]
user = root
password = root
host = 127.0.0.1
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld]
server-id = 220
skip-name-resolve
/etc/init.d/mysql start
mysql -A # 使用上方 my.cnf 設定自動登入
CREATE DATABASE IF NOT EXISTS pureftpd;
USE pureftpd;
CREATE TABLE IF NOT EXISTS `ftpd` (
`User` varchar(16) NOT NULL DEFAULT '' COMMENT '用戶名',
`status` enum('0','1') NOT NULL DEFAULT '0' COMMENT '可用狀態:0-不可用;1-正在使用',
`Password` varchar(64) NOT NULL DEFAULT '' COMMENT '密碼',
`Uid` varchar(11) NOT NULL DEFAULT '-1' COMMENT '用戶ID',
`Gid` varchar(11) NOT NULL DEFAULT '-1' COMMENT '組ID',
`Dir` varchar(128) NOT NULL DEFAULT '' COMMENT '擁有的權限路徑',
`ULBandwidth` smallint(5) NOT NULL DEFAULT '0' COMMENT '上傳帶寬',
`DLBandwidth` smallint(5) NOT NULL DEFAULT '0' COMMENT '下載帶寬',
`comment` tinytext NOT NULL COMMENT '備註',
`ipaccess` varchar(15) NOT NULL DEFAULT '*' COMMENT 'IP地址',
`QuotaSize` smallint(5) NOT NULL DEFAULT '0' COMMENT '大小配額',
`QuotaFiles` int(11) NOT NULL DEFAULT '0' COMMENT '文件類型配額',
PRIMARY KEY (`User`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='ftp用戶名密碼表';
GRANT SELECT ON pureftpd.* TO 'ftpduser'@'%' IDENTIFIED BY 'ftpdpassword';
FLUSH PRIVILEGES;
INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`)
VALUES ('testuser', '1', MD5('testpassword'), '1002', '81', '/var/www', 0, 0, '備註', '*', 0, 0);
/etc/conf.d/pure-ftpdIS_CONFIGURED="yes"
SERVER="-S 10.36.32.220,21"
MAX_CONN="-c 50"
MAX_CONN_IP="-C 20"
AUTH="-l mysql:/etc/pureftpd-mysql.conf"
MISC_OTHER="-A -H -x -j -R -Z -E -p 50001:59999 -O clf:/var/log/pureftpd/pureftpd.log"
mkdir -p /var/log/pureftpd/
/etc/pureftpd-mysql.confMYSQLServer 127.0.0.1
MYSQLPort 3306
MYSQLUser ftpduser
MYSQLPassword ftpdpassword
MYSQLDatabase pureftpd
MYSQLCrypt md5
MYSQLGetPW SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID SELECT Gid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetDir SELECT Dir FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
關鍵說明:
MYSQLCrypt md5指定密碼加密方式為 MD5,需與資料表存儲方式一致。\L代表登入用戶名,\R代表客戶端 IP。
groupadd apache
useradd nfsuser -u 1002 -g apache -d /dev/null -s /sbin/nologin
mkdir -p /var/www
chown -R nfsuser:apache /var/www
/etc/init.d/pure-ftpd start
使用 FTP 客戶端(FileZilla、WinSCP 等)以 testuser / testpassword 登入測試。
| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| 連線被拒絕 | 防火牆阻擋 21 埠或被動模式埠範圍 | 開放 21 與 50001-59999 埠 |
| 驗證失敗 | MySQL 連線參數錯誤、密碼加密方式不符 | 檢查 pureftpd-mysql.conf 設定 |
| 無法切換目錄 | 系統用戶 UID/GID 與資料表設定不符 | 確認 Uid/Gid 欄位正確 |