FTP-сервер на базе Proftpd — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
| Строка 11: | Строка 11: | ||
Вносим в <code bash>/etc/rc.conf</code>: | Вносим в <code bash>/etc/rc.conf</code>: | ||
proftpd_enable="YES" | proftpd_enable="YES" | ||
| − | |||
| − | |||
| − | |||
| Строка 285: | Строка 282: | ||
SQLAuthenticate users | SQLAuthenticate users | ||
| − | SQLConnectInfo | + | SQLConnectInfo <font color=blue>USER</font>@localhost:3306 <font color=blue>DB</font> <font color=blue>PASSWORD</font> |
SQLLogFile /var/log/proftpd/proftpd_mysql.log | SQLLogFile /var/log/proftpd/proftpd_mysql.log | ||
SQLUserInfo `users` `userid` `passwd` `uid` `gid` `homedir` `shell` | SQLUserInfo `users` `userid` `passwd` `uid` `gid` `homedir` `shell` | ||
| Строка 304: | Строка 301: | ||
'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', 'admin', 0, 0, 0, 0, 1, 0, 'admin'); | 'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', 'admin', 0, 0, 0, 0, 1, 0, 'admin'); | ||
| − | |||
| − | |||
| − | |||
| − | |||
Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в <code bash>config.inc.php</code> параметры подключения к БД. Теперь можно залогиниться в админку. | Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в <code bash>config.inc.php</code> параметры подключения к БД. Теперь можно залогиниться в админку. | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| Строка 345: | Строка 331: | ||
должно быть: | должно быть: | ||
$query .= ", $table_users.$users_passwd = '$new_passwd1'"; | $query .= ", $table_users.$users_passwd = '$new_passwd1'"; | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| Строка 365: | Строка 337: | ||
* ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию). | * ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию). | ||
* ftptop - аналог программы top для процессов ProFTPD. | * ftptop - аналог программы top для процессов ProFTPD. | ||
| + | * proftpd -V - показывает как собран пакет | ||
| + | * proftpd -q -d 10 - посмотреть как запускается | ||
| − | + | Прикручиваем смотрелку логов.<br/> | |
| − | Прикручиваем смотрелку логов. | + | <spoiler> |
| − | + | <?php | |
| − | + | //Чтоб при нажатии на всё, не выдавало ошибку | |
| + | set_time_limit(60 * 5); | ||
| + | if (isset($_GET['go'])); | ||
| + | |||
| + | //Параметры подключения к MySQL | ||
| + | $db_host = "localhost"; | ||
| + | $db_user = ""; | ||
| + | $db_passwd = ""; | ||
| + | $db_db = ""; | ||
| + | |||
| + | //Считываем текущее время | ||
| + | $start_time = microtime(); | ||
| + | // разделяем секунды и миллисекунды | ||
| + | //(становятся значениями начальных ключей массива-списка) | ||
| + | $start_array = explode(" ",$start_time); | ||
| + | // это и есть стартовое время | ||
| + | $start_time = $start_array[1] + $start_array[0]; | ||
| + | |||
| + | //Пытаемся приконнектится к БД | ||
| + | if(!mysql_connect($db_host,$db_user,$db_passwd)) | ||
| + | { | ||
| + | echo "<br><br><BIG><CENTER>Not connect to MySQL!!!</CENTER></BIG>"; | ||
| + | exit; | ||
| + | } | ||
| + | mysql_set_charset('cp1251'); | ||
| + | |||
| + | //Выбираем базу данных | ||
| + | mysql_select_db($db_db); | ||
| + | |||
| + | // Смотрим, всё, или не всё хочет. (дефолт - сегодня.) | ||
| + | if(isset($_GET['whats_date'])) | ||
| + | { | ||
| + | $whats_date = $_GET['whats_date']; | ||
| + | }else{ | ||
| + | $whats_date = "today"; | ||
| + | } | ||
| + | |||
| + | $part_sql = ""; | ||
| + | $timestamp_begin_day = ((date('H',time()))*3600) + ((date('i',time()))*60) + (date('s',time())); | ||
| + | |||
| + | // за сегодня | ||
| + | if($whats_date == 'today'){ | ||
| + | $part_sql = "WHERE `timestamp` > " . (time() - $timestamp_begin_day); | ||
| + | } | ||
| + | |||
| + | // за вчера | ||
| + | if($whats_date == 'yesterday'){ | ||
| + | $part_sql = "WHERE `timestamp` BETWEEN " . (time() - $timestamp_begin_day - 86400) . " AND " . (time() - $timestamp_begin_day); | ||
| + | } | ||
| + | |||
| + | // за позавчера | ||
| + | if($whats_date == 'd_b_yesterday'){ | ||
| + | $part_sql = "WHERE `timestamp` BETWEEN " . (time() - $timestamp_begin_day - 172800) . " AND " . (time() - $timestamp_begin_day - 86400); | ||
| + | } | ||
| + | |||
| + | // за три дня | ||
| + | if($whats_date == 'three_days'){ | ||
| + | $part_sql = "WHERE `timestamp` BETWEEN " . (time() - $timestamp_begin_day - 259200) . " AND " . (time() - $timestamp_begin_day - 172800); | ||
| + | } | ||
| + | |||
| + | // за неделю | ||
| + | if($whats_date == 'week'){ | ||
| + | $part_sql = "WHERE `timestamp` > " . (time() - $timestamp_begin_day - 604800); | ||
| + | } | ||
| + | |||
| + | $page_content = ""; | ||
| + | $i = 0; | ||
| + | // строим кверю на выбор чего тама накачано... | ||
| + | $sql = "SELECT FROM_UNIXTIME(`timestamp`,'%d-%m-%Y') AS `ymd`,FROM_UNIXTIME(`timestamp`,'%H:%i') AS `his`,`file_and_path`,`client_name`,`bytes`,((`bytes`/(1024*1024))/`send_time`) AS `speed` FROM \ | ||
| + | `xfer_table` " . $part_sql . " ORDER BY `unic_id` DESC"; | ||
| + | //echo $sql; | ||
| + | $sql = mysql_query("$sql"); | ||
| + | |||
| + | // строим таблицу для вывода | ||
| + | while ($row_id = mysql_fetch_assoc($sql)){ | ||
| + | if ($i%2 == 0){ // число чётное. ничё не делаем | ||
| + | $fone_color = "#f1f1f1"; | ||
| + | // четное | ||
| + | }else{ // чётное - > нечётное | ||
| + | $fone_color = "#FFFFFF"; | ||
| + | } // закрытие - нечётное число | ||
| + | // дёргаем чистое имя файла | ||
| + | $file_name = substr($row_id['file_and_path'], strpos($row_id['file_and_path'], '/')+4); | ||
| + | $page_content = $page_content . "\n\t\t\t\t<TR bgcolor=\"" . $fone_color . "\"> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"70\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">" . $row_id['ymd'] . "</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"60\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">" . $row_id['his'] . "</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">" . iconv("koi8-r", "cp1251", $file_name ) . "</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"100\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">" . $row_id['client_name'] . "</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"50\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">" . round(($row_id['bytes']/(1024*1024)),2) . "</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"50\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">" . round($row_id['speed'],2) . "</CODE> | ||
| + | \t\t\t\t\t</TD>"; | ||
| + | |||
| + | // прибавляем 1 к счётчику | ||
| + | $i++; | ||
| + | } | ||
| + | |||
| + | $page_top = "<HTML> | ||
| + | <HEAD> | ||
| + | <TITLE>яРЮРХЯРХЙЮ FTP-ЯЕПБЕПЮ</TITLE> | ||
| + | <META NAME=\"description\" CONTENT=\"яРЮРХЯРХЙЮ FTP-ЯЕПБЕПЮ\"> | ||
| + | <META http-equiv=\"Content-Type\" content=\"text/html;charset=cp1251\"> | ||
| + | <!-- начало таблиц стилей для страницы --> | ||
| + | <STYLE type=\"text/css\"> | ||
| + | <!-- стиль для линков --> | ||
| + | A.text_link {COLOR: blue; TEXT-DECORATION: none} | ||
| + | A.text_link:link {COLOR: blue; TEXT-DECORATION: none} | ||
| + | A.text_link:visited {COLOR: blue; TEXT-DECORATION: none} | ||
| + | A.text_link:hover {COLOR: darkblue; TEXT-DECORATION: underline} | ||
| + | A.text_link:active {COLOR: darkblue; TEXT-DECORATION: none} | ||
| + | </STYLE> | ||
| + | </HEAD> | ||
| + | <BODY style=\"margin: 0 0 0 0; padding: 0 0 0 0; BACKGROUND-COLOR: #f1f1f1; BORDER-RIGHT: #999999 1px solid; MARGIN: 0px; BORDER-LEFT: #999999 1px solid; \"> | ||
| + | <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=today\">ЯЕЦНДМЪ</a> | ||
| + | <br> | ||
| + | <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=yesterday\">БВЕПЮ</a> | ||
| + | <br> | ||
| + | <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=d_b_yesterday\">ОНГЮБВЕПЮ</a> | ||
| + | <br> | ||
| + | <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=three_days\">РПХ ДМЪ</a> | ||
| + | <br> | ||
| + | <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=week\">ОНЯКЕДМЪЪ МЕДЕКЪ</a> | ||
| + | <br> | ||
| + | <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=all\">БЯ╦</a> | ||
| + | <br> | ||
| + | <br> | ||
| + | <CENTER> | ||
| + | <TABLE width=\"95%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"> | ||
| + | <TBODY> | ||
| + | <TR> | ||
| + | <TD width=\"100%\" bgcolor=\"#707680\"> | ||
| + | <TABLE border=\"0\" width=\"100%\" cellspacing=\"1\" cellpadding=\"3\"> | ||
| + | <TBODY> | ||
| + | <TR bgcolor=\"#B9CCDF\"> | ||
| + | <TD align=\"center\" colspan=\"6\"> | ||
| + | <CODE><b>яРЮРХЯРХЙЮ FTP-ЯЕПБЕПЮ</b></CODE> | ||
| + | </TD> | ||
| + | </TR> | ||
| + | <TR bgcolor=\"#f1f1f1\"> | ||
| + | <TD align=\"center\" colspan=\"6\"> | ||
| + | <CODE> </CODE> | ||
| + | </TD> | ||
| + | </TR> | ||
| + | \t\t\t\t<TR bgcolor=\"#DAE0E7\"> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"70\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">дЮРЮ</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"50\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">бПЕЛЪ</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">тЮИК</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"100\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">IP-ЮДПЕЯ</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"80\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">пЮГЛЕП(лА)</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | \t\t\t\t\t<TD align=\"center\" width=\"70\"> | ||
| + | \t\t\t\t\t\t<CODE style=\"font-size:12px\">яЙНПНЯРЭ</CODE> | ||
| + | \t\t\t\t\t</TD> | ||
| + | "; | ||
| + | |||
| + | $page_down = " </TBODY> | ||
| + | </TABLE> | ||
| + | </TD> | ||
| + | </TR> | ||
| + | </TBODY> | ||
| + | </TABLE> | ||
| + | <BR><BR> | ||
| + | </BODY> | ||
| + | </HTML>"; | ||
| + | |||
| + | // выводим наделанное | ||
| + | |||
| + | echo $page_top . $page_content . $page_down; | ||
| + | |||
| + | // Выводим время генерации скрипта | ||
| + | $end_time = microtime(); | ||
| + | $end_array = explode(" ",$end_time); | ||
| + | $end_time = $end_array[1] + $end_array[0]; | ||
| + | // вычитаем из конечного времени начальное | ||
| + | $time = $end_time - $start_time; | ||
| + | // выводим в выходной поток (браузер) время генерации страницы | ||
| + | echo "<center><CODE>бПЕЛЪ ЦЕМЕПЮЖХХ ЯРПЮМХЖШ " . round($time,4) . " ЯЕЙСМД</CODE></center>"; | ||
| + | ?> | ||
| + | </spoiler> | ||
Версия 17:00, 9 октября 2015
Озадачился я как-то поставить для любимых юзверей в локалке фтп-сервер, пусть думаю обмениваются своим любимым поревом.
Чтоб там с пользователями, с записями в базу, с красивой статистикой и т.д. Выбор пал на proftpd. Задумано-сделано. Поехали.
Система FreeBSD 10.2
Корневой каталог /ftp
Ставить будем из пакетов(версия 1.3.5a):
# pkg install proftpd proftpd-mod_sql_mysql-1.3.5a
Вносим в /etc/rc.conf:
proftpd_enable="YES"
Вариант 1. Простейший
Рихтуем proftpd.conf под наши нужды:
ServerName "My FTP server" ServerType standalone DefaultServer on ScoreboardFile /var/run/proftpd/proftpd.scoreboard DefaultAddress localhost Port 21 Umask 022 MaxInstances 30 CommandBufferSize 512 AllowOverwrite on AllowRetrieveRestart on AllowStoreRestart on TimeoutNoTransfer 300 User nobody Group nogroup #Загоняем всех подключившихся в папку ftp DefaultRoot /ftp ### Security AllowForeignAddress off DenyFilter \*.*/ MaxClientsPerHost 2 "The %m client are already connected from your host, it is not authorized any more" MaxLoginAttempts 20 "It is too much attempts to enter " PathDenyFilter "(^\.ftpaccess$)" RequireValidShell off ### Логи DebugLevel 1 TransferLog /var/log/proftpd/proftpd-transfer.log ExtendedLog /var/log/proftpd/proftpd-extended.log SystemLog /var/log/proftpd/proftpd-system.log LogFormat default "%h %l %u %t \"%r\" %s %b" LogFormat auth "%v [%P] %h %t \"%r\" %s" LogFormat write "%h %l %u %t \"%r\" %s %b" <Anonymous /ftp> User ftp Group ftp UserAlias anonymous ftp MaxClients 10
Добавляем пользователя ftp для анонимного входа(без пароля)
# pw useradd ftp -s /usr/sbin/nologin
В принципе всё. Для простейшего случая, с анонимным пользователем этого достаточно. Можно юзать.
Теперь переходим к дальнейшей настройке сервера и остальным рюшечкам.
Вариант 2. Авторизация из файла
Пользователей можно заводить с помощью утилиты ftpasswd.
Заводим юзверя или группу таким образом:(почему-то заводится только в папке в которой находимся)
# ftpasswd --passwd --name ftp_user --file /usr/local/etc/proftpd/ftpd.passwd --uid 2000 --gid 2001 --home /ftp --shell /bin/false # ftpasswd --group --name ftp_group –-file /usr/local/etc/proftpd/ftpd.group --gid 2001 --member ftp_user
в proftpd.conf добавляем:
AuthUserFile /usr/local/etc/proftpd/ftpd.passwd AuthGroupFile /usr/local/etc/proftpd/ftpd.group
Ну и собственно примерные права для папок(предварительно заведём пользователя boss).
<Directory /ftp/download>
<Limit WRITE DELE RMD MKD>
DenyAll
</Limit>
</Directory>
<Directory /ftp/upload>
<Limit WRITE MKD>
AllowAll
</Limit>
<Limit DELE RMD>
AllowUser boss
DenyAll
</Limit>
</Directory>
Итоговый конфиг
Spoiler
Вариант 2. Авторизация из MySQL и админка
(Взято и адаптировано отсюда http://www.lissyara.su/articles/freebsd/programms/proftpd+mysql/)
Создаём базу proftpd:
mysql> create database proftpd set utf8 collate utf8_general_ci;
Заводим пользователя proftpd
mysql> grant all on proftpd.* to proftpd@localhost identified by 'ПАРОЛЬ';
Создаём таблицы
CREATE TABLE IF NOT EXISTS `users` (
`userid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` varchar(255) DEFAULT NULL,
`mail` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`uid` int(11) DEFAULT '2000',
`gid` int(11) DEFAULT '2001',
`passwd` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`shell` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/bin/nonexistent',
`homedir` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/ftp',
`note` text CHARACTER SET utf8 COLLATE utf8_general_ci,
`last_login` int(15) NOT NULL,
`count` int(11) NOT NULL DEFAULT '0',
`last_err_login` int(15) NOT NULL,
`err_login_count` int(15) NOT NULL,
`admin` int(1) NOT NULL DEFAULT '0',
`closed` int(1) NOT NULL DEFAULT '1',
`groupname` varchar(24) DEFAULT 'unregistered',
PRIMARY KEY (`userid`),
KEY `groupname` (`groupname`),
KEY `closed` (`closed`),
KEY `admin` (`admin`),
KEY `count` (`count`),
KEY `passwd` (`passwd`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `xfer_errors` (
`unic_id` int(32) NOT NULL AUTO_INCREMENT,
`timestamp` int(15) NOT NULL,
`user_name` varchar(64) COLLATE utf8_general_ci NOT NULL,
`file_and_path` tinytext COLLATE utf8_general_ci NOT NULL,
`client_name` varchar(127) COLLATE utf8_general_ci NOT NULL,
`client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL,
`client_command` varchar(5) COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`unic_id`),
KEY `user_name` (`user_name`),
KEY `client_name` (`client_name`),
KEY `client_IP` (`client_IP`),
KEY `client_command` (`client_command`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
CREATE TABLE IF NOT EXISTS `xfer_table` (
`unic_id` int(32) NOT NULL AUTO_INCREMENT,
`timestamp` int(15) NOT NULL,
`user_name` varchar(64) COLLATE utf8_general_ci NOT NULL,
`file_and_path` tinytext COLLATE utf8_general_ci NOT NULL,
`bytes` int(15) NOT NULL DEFAULT '0',
`client_name` varchar(127) COLLATE utf8_general_ci NOT NULL,
`client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL,
`client_command` varchar(5) COLLATE utf8_general_ci NOT NULL,
`send_time` varchar(9) COLLATE utf8_general_ci NOT NULL DEFAULT '0',
PRIMARY KEY (`unic_id`),
KEY `timestamp` (`timestamp`),
KEY `user_name` (`user_name`),
KEY `client_name` (`client_name`),
KEY `client_IP` (`client_IP`),
KEY `client_command` (`client_command`),
KEY `send_time` (`send_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
CREATE TABLE IF NOT EXISTS `quotalimits` (
`userid` varchar(30) NOT NULL,
`quota_type` enum('user','group','class','all') NOT NULL,
`per_session` enum('false','true') NOT NULL DEFAULT 'false',
`limit_type` enum('soft','hard') NOT NULL DEFAULT 'hard',
`bytes_in_avail` float NOT NULL DEFAULT '1.57286e+08',
`bytes_out_avail` float NOT NULL DEFAULT '0',
`bytes_xfer_avail` float NOT NULL DEFAULT '0',
`files_in_avail` int(10) unsigned NOT NULL DEFAULT '0',
`files_out_avail` int(10) unsigned NOT NULL DEFAULT '0',
`files_xfer_avail` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `quotatallies` (
`userid` varchar(30) NOT NULL,
`quota_type` enum('user','group','class','all') NOT NULL,
`bytes_in_used` float NOT NULL DEFAULT '0',
`bytes_out_used` float NOT NULL DEFAULT '0',
`bytes_xfer_used` float NOT NULL DEFAULT '0',
`files_in_used` int(10) unsigned NOT NULL DEFAULT '0',
`files_out_used` int(10) unsigned NOT NULL DEFAULT '0',
`files_xfer_used` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
В конфиг добавляем следующее:
LoadModule mod_sql.c LoadModule mod_sql_mysql.c SQLBackend mysql #В каком виде хранятся пароли, в данном случае - открытым текстом #SQLAuthTypes backend SQLAuthTypes Plaintext SQLAuthenticate users SQLConnectInfo USER@localhost:3306 DB PASSWORD SQLLogFile /var/log/proftpd/proftpd_mysql.log SQLUserInfo `users` `userid` `passwd` `uid` `gid` `homedir` `shell` SQLLog PASS counter_login SQLLog ERR_PASS counter_err SQLLog RETR,STOR log_story_transfer SQLLOG ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO log_err_modify SQLNamedQuery counter_login UPDATE "`last_login`=UNIX_TIMESTAMP(),`count`=`count`+1 WHERE `userid`='%u'" `users` SQLNamedQuery counter_err UPDATE "`last_err_login`=UNIX_TIMESTAMP(),`err_login_count`=`err_login_count`+1 WHERE `userid`='%U'" `users` SQLNamedQuery log_story_transfer INSERT ",UNIX_TIMESTAMP(),'%u','%f', '%b', '%h','%a', '%m', '%T'"`xfer_table` SQLNamedQuery log_err_modify INSERT ",UNIX_TIMESTAMP(),'%u', '%f', '%h','%a', '%m'" `xfer_errors`
Добавляем админа:
mysql> INSERT INTO `users` (`userid`, `name`, `mail`, `uid`, `gid`, `passwd`, `shell`, `homedir`, `note`, `last_login`, `count`, `last_err_login`, `err_login_count`, `admin`, `closed`, `groupname`) VALUES ('admin', 'admin',
'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', 'admin', 0, 0, 0, 0, 1, 0, 'admin');
Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в config.inc.php параметры подключения к БД. Теперь можно залогиниться в админку.
P.S. Чтобы админка пускала админа с открытым паролем, в файлике /libs/auth.lib.php в 31 строке вносим изменения:
вместо:
$users_passwd = PASSWORD('$passwd')";
должно быть:
$users_passwd = '$passwd'";
P.S. Чтобы пароли для пользователей фтп создавались в открытом виде, в файлике register.inc.php в 35 строке вносим изменения:
вместо:
} else {
$query = "SELECT PASSWORD('$passwd1')";
$result = mysql_query($query) or die("Database query failed.");
должно быть:
} else {
$query = "SELECT '$passwd1'";
$result = mysql_query($query) or die("Database query failed.");
P.S.Чтобы при смене пароля они тоже отображались в базе в открытом виде, в файлике /libs/admin.lib.php делаем следующие изменения в строке 375:
вместо
$query .= ", $table_users.$users_passwd = PASSWORD('$new_passwd1')";
должно быть:
$query .= ", $table_users.$users_passwd = '$new_passwd1'";
Полезности:
- ftpcount - показывает число соединений в настоящий момент (с разбивкой по виртуальным хостам).
- ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию).
- ftptop - аналог программы top для процессов ProFTPD.
- proftpd -V - показывает как собран пакет
- proftpd -q -d 10 - посмотреть как запускается
Прикручиваем смотрелку логов.
Spoiler