подними с модом mysql
создаешь в mysql базу данных например ftp
CREATE TABLE `groups` (
`groupname` varchar(30) NOT NULL default '',
`gid` int(11) NOT NULL default '0',
`members` varchar(255) default NULL
) TYPE=MyISAM;
CREATE TABLE `users` (
`username` varchar(30) NOT NULL default '',
`password` varchar(30) NOT NULL default '',
`uid` int(11) default NULL,
`gid` int(11) default NULL,
`homedir` varchar(255) default NULL,
`shell` varchar(255) default NULL,
`count` int(11) NOT NULL default '0',
UNIQUE KEY `username` (`username`)
) TYPE=MyISAM;
далее добавляешь в конфиг профтпд след. настройки
<IfModule mod_dso.c>
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
</IfModule>
<Global>
SQLConnectInfo пользователь_БД@localhost БД ПАРОЛЬ
SQLAuthTypes Crypt
SQLUserInfo users username password uid gid homedir NULL
RequireValidShell off
SQLGroupInfo groups groupname gid members
SQLAuthenticate users*
SQLLogFile /var/log/proftpd_sql.log
SQLNamedQuery getcount SELECT "count, username from users where username='%u '"
SQLNamedQuery updatecount UPDATE "count=count+1 WHERE username='%u'" users
</Global>
далее добавляешь пользователя либо через пхпадмин либо руцями, либо вот скрипт для добавления:
#!/usr/bin/php
<?
/* ********************************************************************************
*******
HELP:
<script_name> list
<script_name> info login
<script_name> add login passwd homedir
<script_name> passwd login newpasswd
<script_name> delete login
********************************************************************************
******* */
if(!isset($_SERVER['argv'])) { die('ftp manager error: can not read arguments from $_SERVER["argv"]'."\n"); }
//////////////////////////
// параметры базы ////////
$mysql_host = 'localhost';
$mysql_database = 'ftp';
$mysql_user = 'ftp';
$mysql_password = 'password';
//////////////////////////
//////////////////////////
// имя ftp-хоста /////////
$ftp_host_name = 'FTP_HOST_NAME';
//////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
// MAIN //////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
$_SERVER['argv'][9] = $ftp_host_name;
$mysql = new class_mysql($mysql_host, $mysql_database, $mysql_user, $mysql_password); // класс для работы с mysql
$ftp_account = new class_ftp_account($_SERVER['argv'], &$mysql); // класс для работы с ftp-аккаунтами
//////////////////////////////////////////////////////////////////////////////////////////
// FTP ACCOUNT CLASS /////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
class class_ftp_account {
var $MYSQL;
var $ARGV;
// конструктор. вызывается при инициализации класса
function class_ftp_account($argv, &$mysql) {
$this->MYSQL = $mysql; // получаем ссылку на mysql объект
$this->ARGV = $argv; // получаем параметры, переданые скрипту
$this->parce_argv(); // эта функция проверяет параметры, которые были переданы скрипту и вызывает нужные функции из класса
}
// эта функция проверяет параметры, которые были переданы скрипту и вызывает нужные функции из класса
function parce_argv() {
if($this->ARGV[1] == 'list') { // вывести список всех пользователей
$this->print_all_accounts(); // вывести список всех аккаунтов
die();
}
elseif($this->ARGV[1] == 'info') { // получение информации о пользователе
if(isset($this->ARGV[2])) {
$this->check_login($this->ARGV[2]); // проверка логина
$this->print_account_info($this->ARGV[2]); // вывести информацию по аккаунту
}
else { $this->print_help(); }
die();
}
if($this->ARGV[1] == 'add') { // добавление пользователя
if(isset($this->ARGV[2]) && isset($this->ARGV[3]) && isset($this->ARGV[4])) {
$this->check_login($this->ARGV[2]); // проверка логина
$this->check_password($this->ARGV[3]); // пароля
$this->check_homedir($this->ARGV[4]); // и домашней директории
$this->add_account($this->ARGV[2], $this->ARGV[3], $this->ARGV[4]); // добавить аккаунт
}
else { $this->print_help(); }
die();
}
elseif($this->ARGV[1] == 'passwd') { // поменять пароль для пользователя
if(isset($this->ARGV[2]) && isset($this->ARGV[3])) {
$this->check_login($this->ARGV[2]);
$this->check_password($this->ARGV[3]);
$this->change_pasword($this->ARGV[2], $this->ARGV[3]); // поменять пароль
}
else { $this->print_help(); }
die();
}
elseif($this->ARGV[1] == 'delete') { // удалить пользователя из базы
if(isset($this->ARGV[2])) {
$this->check_login($this->ARGV[2]);
$this->delete_account($this->ARGV[2]); // удалить аккаунт из базы
}
else { $this->print_help(); }
die();
}
else { // неизвестная команда, выводим хелп
$this->print_help();
}
}
///////////////////////////////////////////////////////////////////////////
// служебные функции //////////////////////////////////////////////////////
function print_account_info($login) { // вывести информацию по аккаунту
$this->MYSQL->connect();
$user = $this->MYSQL->select("SELECT * FROM users WHERE username='".$login."'");
$this->MYSQL->close();
if(!isset($user[0]['username'])) { die('ftp manager error: account "'.$login.'" has not been found'."\n"); }
print "\n".'[ftp-account info for "'.$login.'"]:'."\n";
print 'currentdate: '.date("Y-m-d H:i:s")."\n";
if(isset($this->ARGV[9])) { print 'host: '.$this->ARGV[9]."\n"; }
print 'login: '.$user[0]['username']."\n";
if(($this->ARGV[1] == 'add') || ($this->ARGV[1] == 'passwd')) { // для только что добавленых пользователей
print 'password: '.$this->ARGV[3]."\n";
print 'ftp-link: ftp://'.$user[0]['username'].':'.$this->ARGV[3].'@'.$this->ARGV[9]."\n";
}
print 'homedir: '.$user[0]['homedir']."\n";
print 'uid: '.$user[0]['uid']."\n";
print 'gid: '.$user[0]['gid']."\n";
print 'count: '.$user[0]['count']."\n";
print '[/ftp-account info for "'.$login.'"]'."\n\n";
}
///////////////////////////////////////////////////////////////////////////
function print_all_accounts() { // вывести информацию по всем аккаунтам
print "\n".'[listing ftp-accounts]:'."\n";
$this->MYSQL->connect();
$users = $this->MYSQL->select("SELECT * FROM users");
foreach($users as $user) {
print 'login: '.$user['username'].' , uid: '.$user['uid'].' , gid: '.$user['gid'].' , homedir: '.$user['homedir']."\n";
}
$this->MYSQL->close();
print '[/listing ftp-accounts]'."\n\n";
}
///////////////////////////////////////////////////////////////////////////
function add_account($login, $password, $homedir) { // добавить аккаунт
$uid = $this->create_uid();
if($this->check_account_existance($login) == TRUE) { die('ftp manager error: account "'.$login.'" already exists'."\n"); }
$this->MYSQL->connect();
$this->MYSQL->execute("INSERT INTO users SET username='".$login."',password=ENCRYPT('".$password."'),homedir='".$homedir."',shell='/dev/null',uid='".$uid."',gid='".$uid."'");
$this->MYSQL->close();
mkdir($homedir, 0755, TRUE); // system("mkdir -p ".$homedir); // создание папки
chown($homedir, intval($uid)); // system("chown ".$uid.":".$gid." ".$homedir); // выдача папке прав
chgrp($homedir, intval($uid));
print 'ftp manager success: account "'.$login.'" has been added'."\n";
$this->print_account_info($login);
}
///////////////////////////////////////////////////////////////////////////
function change_pasword($login, $password) { // изменение пароля
if($this->check_account_existance($login) == FALSE) { die('ftp manager error: account "'.$login.'" does not exists'."\n"); }
$this->MYSQL->connect();
$this->MYSQL->execute("UPDATE users SET password=ENCRYPT('".$password."') WHERE username='".$login."'");
$this->MYSQL->close();
print 'ftp manager success: password for account "'.$login.'" has been changed'."\n";
$this->print_account_info($login);
}
///////////////////////////////////////////////////////////////////////////
function delete_account($login) { // удаление аккаунта из базы
$warning_timeout = 10; // таймаут на предупреждение об удалении в секундах
if($this->check_account_existance($login) == FALSE) { die('ftp manager error: account "'.$login.'" does not exists'."\n"); }
$this->print_account_info($login); // вывод информации об аккаунте. в случае ошибки можно будет вовремя остановить удаление
print 'ftp manager warning: deleting account "'.$login.'" in '.$warning_timeout.' seconds, you can still press ctrl+c ';
$this->print_dots($warning_timeout);
$this->MYSQL->connect();
$user = $this->MYSQL->select("SELECT homedir FROM users WHERE username='".$login."'");
$this->MYSQL->execute("DELETE FROM users WHERE username='".$login."'");
$this->MYSQL->close();
print "\n".'ftp manager success: account "'.$login.'" has been deleted'."\n";
print 'ftp manager info: now you can manualy run "rm -rf '.$user[0]['homedir'].'" to erase all user files'."\n";
}
// служебные функции //////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// утилиты ////////////////////////////////////////////////////////////////
function print_dots($seconds) { // печатать по точке в секунду .)
for($i=0;$i<$seconds;$i++){ sleep(1); print '.'; }
}
///////////////////////////////////////////////////////////////////////////
function check_account_existance($login) { // проверка на существование аккаунта в базе
$this->MYSQL->connect();
$user = $this->MYSQL->select("SELECT username FROM users WHERE username='".$login."'");
if(isset($user[0]['username'])) { return TRUE; } else { return FALSE; }
$this->MYSQL->close();
}
///////////////////////////////////////////////////////////////////////////
function create_uid() { // придумать uid и gid для нового пользователя
return mt_rand(10000, 20000);
}
///////////////////////////////////////////////////////////////////////////
function print_help() { // эта функция печатает хелп во всех случаях неправильного ввода параметров
print 'ftp manager error: wrong parameters'."\n";
print '<script_name> list'."\n";
print '<script_name> info login'."\n";
print '<script_name> add login passwd homedir'."\n";
print '<script_name> passwd login newpasswd'."\n";
print '<script_name> delete login'."\n";
die();
}
// утилиты ////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// функции проверки вводимых параметров ///////////////////////////////////
function check_login($login) { // проверка логина
if(!preg_match("/^[0-9a-z\.\-]+$/", $login)) { die('ftp manager error: login can include only "0-9" "a-z" "." "-" symbols'."\n"); }
}
///////////////////////////////////////////////////////////////////////////
function check_password($password) { // проверка пароля
if(!preg_match("/^[0-9a-zA-Z]+$/", $password)) { die('ftp manager error: password can include only "0-9" "a-z" "A-Z" symbols'."\n"); }
}
///////////////////////////////////////////////////////////////////////////
function check_homedir($homedir) { // и домашней директории
if(!preg_match("/^\/[0-9a-zA-Z\/\.\-\_]+$/", $homedir)) { die('ftp manager error: homedir can include only "0-9" "a-z" "A-Z" "/" "." "-" "_" symbols'."\n"); }
}
// функции проверки вводимых параметров ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////
}
//////////////////////////////////////////////////////////////////////////////////////////
// MYSQL CLASS ///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
class class_mysql {
// db access
var $HOST;
var $DATABASE;
var $USER;
var $PASSWD;
// table_prefix
var $TABLE_PREFIX = '';
var $LINK;
var $QUERY;
var $ERROR;
var $RESULT;
var $NUM_ROWS;
// constructor
function class_mysql($host, $database, $user, $password) {
$this->HOST = $host;
$this->DATABASE = $database;
$this->USER = $user;
$this->PASSWD = $password;
//$this->connect();
}
function connect() {
$this->LINK = mysql_pconnect($this->HOST, $this->USER, $this->PASSWD) or die('ftp manager mysql_error: '.mysql_errno().': '.mysql_error()."\n");
mysql_select_db($this->DATABASE) or die('ftp manager mysql_error: '.mysql_errno().': '.mysql_error()."\n");
}
function close() {
mysql_close($this->LINK);
}
function get_insert_id() {
return mysql_insert_id($this->LINK);
}
function execute($query) {
$this->QUERY = $query;
$this->RESULT = mysql_query($this->QUERY, $this->LINK) or die('ftp manager mysql_error: '.mysql_errno().': '.mysql_error()."\n");
$this->ERROR = mysql_error();
}
function select($query) {
$result = array();
$this->QUERY = $query;
$this->RESULT = mysql_query($this->QUERY, $this->LINK) or die('ftp manager mysql_error: '.mysql_errno().': '.mysql_error()."\n");
$this->ERROR = mysql_error();
$this->NUM_ROWS = mysql_num_rows($this->RESULT);
while($row = mysql_fetch_array($this->RESULT)){
array_push($result, $row);
}
return $result;
}
}
?>
соответственно размещаешь его где-то в системе это дело вкуса, далее в консоле /dir_to_script/script_name.php