?

Log in

No account? Create an account

Previous Entry | Next Entry

Так уж случилось, что как основной ftp я всегда использовал Pure-ftpd. Почему не ProFTPD или какой либо другой? Так вот, не сложилось как то. Толи я тупой и не смог составить конфиг для ProFTPD под требуемую мне задачу, толи ProFTPD не очень удобный... Как бы там ни было перепробовав несколько серверов я остановился на Pure-ftpd который легко и быстро настраивается под любую задачу которая может возникнуть у администратора веб сервера. Единственная особеность его в том, что у него нет файла конфигурации. Авторы сочли, что парсинг конфига это долго и все необходимые параметры нужно передавать через флаги при вызове. В общем дело хозяйское, но администратору это может быть не очень удобно. Поэтому возможность использования файла конфига все же есть, но для этого нужно совершить некоторые дополнительные телодвижения.



Кто юзает FreeBSD наверное об этой особенности даже и не догадываются, ведь мейнтейнеры порта под эту ОСь позаботились о привычном для всех админов механизме конфигурационного файла. Но вот, как оказалось, в Debian при установке данного сервера ни файл конфигурации не создается, ни скрипт который мог бы его прочитать. Поэтому я полез в исходники и взял такой Perl скрипт:

#!/usr/bin/perl

# (C) 2001-2004 Aristotle Pagaltzis
# derived from code (C) 2001-2002 Frank Denis and Matthias Andree

use strict;

my ($conffile, @flg) = @ARGV;

my $PUREFTPD;
-x && ($PUREFTPD=$_, last) for qw(
${exec_prefix}/sbin/pure-ftpd
/usr/local/pure-ftpd/sbin/pure-ftpd
/usr/local/pureftpd/sbin/pure-ftpd
/usr/local/sbin/pure-ftpd
/usr/sbin/pure-ftpd
);

my %simple_switch_for = (
IPV4Only => "-4",
IPV6Only => "-6",
ChrootEveryone => "-A",
BrokenClientsCompatibility => "-b",
Daemonize => "-B",
VerboseLog => "-d",
DisplayDotFiles => "-D",
AnonymousOnly => "-e",
NoAnonymous => "-E",
DontResolve => "-H",
AnonymousCanCreateDirs => "-M",
NATmode => "-N",
CallUploadScript => "-o",
AntiWarez => "-s",
AllowUserFXP => "-w",
AllowAnonymousFXP => "-W",
ProhibitDotFilesWrite => "-x",
ProhibitDotFilesRead => "-X",
AllowDotFiles => "-z",
AutoRename => "-r",
AnonymousCantUpload => "-i",
LogPID => "-1",
NoChmod => "-R",
KeepAllFiles => "-K",
CreateHomeDir => "-j",
NoRename => "-G",
CustomerProof => "-Z",
NoTruncate => "-0",
);

my %string_switch_for = (
SyslogFacility => "-f",
FortunesFile => "-F",
ForcePassiveIP => "-P",
Bind => "-S",
AnonymousBandwidth => "-t",
UserBandwidth => "-T",
TrustedIP => "-V",
AltLog => "-O",
PIDFile => "-g",
);

my %numeric_switch_for = (
MaxIdleTime => "-I",
MaxDiskUsage => "-k",
TrustedGID => "-a",
MaxClientsNumber => "-c",
MaxClientsPerIP => "-C",
MaxLoad => "-m",
MinUID => "-u",
TLS => "-Y",
);

my %numpairb_switch_for = (
LimitRecursion => "-L",
PassivePortRange => "-p",
AnonymousRatio => "-q",
UserRatio => "-Q",
);

my %numpairc_switch_for = (
Umask => "-U",
Quota => "-n",
PerUserLimits => "-y",
);

my %auth_method_for = (
LDAPConfigFile => "ldap",
MySQLConfigFile => "mysql",
PGSQLConfigFile => "pgsql",
PureDB => "puredb",
ExtAuth => "extauth",
);

my $simple_switch = qr/(@{[join "|", keys %simple_switch_for ]})\s+yes/i;
my $string_switch = qr/(@{[join "|", keys %string_switch_for ]})\s+(\S+)/i;
my $numeric_switch = qr/(@{[join "|", keys %numeric_switch_for ]})\s+(\d+)/i;
my $numpairb_switch = qr/(@{[join "|", keys %numpairb_switch_for ]})\s+(\d+)\s+(\d+)/i;
my $numpairc_switch = qr/(@{[join "|", keys %numpairc_switch_for ]})\s+(\d+):(\d+)/i;
my $auth_method = qr/(@{[join "|", keys %auth_method_for ]})\s+(\S+)/i;

die "Usage: pure-config.pl [extra options]\n"
unless defined $conffile;

open CONF, "< $conffile" or die "Can't open $conffile: $!\n";

!/^\s*(?:$|#)/ and (chomp, push @flg,
/$simple_switch/i ? ($simple_switch_for{$1}) :
/$string_switch/i ? ($string_switch_for{$1} . $2) :
/$numeric_switch/i ? ($numeric_switch_for{$1} . $2) :
/$numpairb_switch/i ? ($numpairb_switch_for{$1} . "$2:$3") :
/$numpairc_switch/i ? ($numpairc_switch_for{$1} . "$2:$3") :
/$auth_method/i ? ("-l" . "$auth_method_for{$1}:$2") :
/UnixAuthentication\s+yes/i ? ("-l" . "unix") :
/PAMAuthentication\s+yes/i ? ("-l" . "pam") :
()
) while ;

close CONF;

print "Running: $PUREFTPD ", join(" ", @flg), "\n";
exec { $PUREFTPD } ($PUREFTPD, @flg) or die "cannot exec $PUREFTPD: $!";

и сохранил его в /etc/pure-ftpd/pure-config.pl. Далее создал файл конфига:

Daemonize yes
PureDB /etc/pure-ftpd/pureftpd.pdb

в /etc/pure-ftpd/pure-ftpd.conf который заставляет сервер запускаться демоном и для виртуальных пользователей использовать файл /etc/pure-ftpd/pure-ftpd.conf который по умолчанию создается программой pure-pw именно в этой директории (тогда как pure-ftpd ищет его в /etc). Собственно все возможные директивы для pure-ftpd.conf можно брать из листинга Perl скрипта, а о выполняемых действиях прочесть в README.

Теперь запустить pure-ftpd и заставить его прочесть файл конфига очень просто:

debian:~#/etc/pure-ftpd/pure-config.pl /etc/pure-ftpd/pure-ftpd.conf

Метки:

Comments

( 6 комментариев — Оставить комментарий )
squirl_ua
13 июл, 2009 22:00 (UTC)
ох уж этот линупс... ох уж этот дебиан...

а по поводу proftpd - самый гибкий из существующих FTP серверов. такой себе Apache FTP мира. куча модулей, конфиг, который умеет грабить корованы...
а proftpd просто ставится и работает. и обычно хватает :)
squirl_ua
13 июл, 2009 22:00 (UTC)
>а proftpd просто ставится и работает. и обычно хватает :)
пардон, pureftpd конечно.
alekciy
14 июл, 2009 00:26 (UTC)
Я тоже думал, что ProFTPD это аналог Apache в ftp мире. С Apache у меня больших проблем ни когда не возникало, поэтому видимо ProFTPD это видимо просто не моё. По крайне мере когда мне возникла необходимость быстро развернуть ftp сервер (а на тот момент с ftp серверами я вообще не работал) и требовалось навесить виртуальных пользователей с квотами, то как я не бился, быстро заставить это работать у меня не получилось. А мне хотелось чего-то простого, быстрого в настройке и логичного, в общем что-то в духе FileZilla Server, который существует только для винды.

А с Pure-FTPd таких заморочек не возникло. Я его скачал, прочитал быстренько доку в той части которая меня интерисовала и запустил его. И все сразу заработало, время ушло только лишь на чтение.

Поэтому когда вчера у меня закончился шаред хостинг под моим доменом и теперь я перетаскиваю его на свою VDS-ку возник вопрос с ftp сервером на оном. Тут я конечно уже не раздумывал, полез на офсайт Pure-FTPd, несказанно обрадовался тому, что проект живет и развивается, даже более того, отрелизился 27-ым апреля сего года, скачал, поставил и более внимательнее прошел по ману. А возможностей там масса, уж запросы к ftp серверу он покрывает с лихвой. В общем даже сподобился описать это все в википедии, ибо текущая статья была конечно довольно куцеватая.
squirl_ua
14 июл, 2009 08:30 (UTC)
ну в фичах proftpd обычно нужды и нету. я его возможности по полной использовал только один раз, при разворачивании системы клиент-банк.
Дмитрий Долбак
20 май, 2013 19:39 (UTC)
ок, а как зделать что бы пользователь которого я создал для Pure-FTPd оставался в папке фтп и не мог попасть дальше в корень?
alekciy
26 май, 2013 06:58 (UTC)
Нужно при создании пользователя через pure-pw использовать опцию d, тогда созданый юзер будет в chroot-е указанной директории:

pure-pw useradd ftp_логин -u системный_юзер -g системная_группа -d абсолютный_путь_до_директории_выше_которой_пользовательно_не_пройдет
pure-pw mkdb
/etc/init.d/pure-ftpd restart


Edited at 2013-05-26 06:59 (UTC)
( 6 комментариев — Оставить комментарий )