Запуск FTP-сервера PureFTPd из командной строки в PuppyRus Linux.

И заодно немного про автозагрузку.
В прошлой заметке по поводу FTP-сервера мы настраивали для его корректной работы отдельного пользователя и запускали его при помощи встроенной в оболочку графической утилиты. Сейчас речь пойдет о том, как управлять им с командной строки.

Для начала необходимо заметить, что сервер PureFTPd входит в дистрибьютив PuppyRus Jeans-S-1.3.1b2 в несколько обрезанном виде, и для каких-то серьезных задач все-таки лучше установить его полную версию с сайта производителя, настроить сервер для запуска не из под пользователя root, завести виртуальных пользователей.
Но для мелких домашних задач хватит и того, что есть в поставке дистрибьютива.
Так вот, предлагаемая пользователю графическая оболочка является всего лишь удобной «оберткой» для pure-ftpd, собственно сервера представленного в виде резидентной, т.е. постоянно находящейся в оперативной памяти программы или по-иному «демона». Итак.

Скрипт запуска

#! /bin/sh
pure-ftpd -D -b -k 90 -u 100 -E –A

где
-D – показывать скрытые файлы (т.е. файлы, начинающиеся с . (точки)) пользователю, присоединившемуся по FTP
-b – режим дополнительной совместимости с «кривыми» FTP-клиентами
-k число – останавливать загрузку файлов, если объем свободного места на диске меньше чем число процентов.
-u число – позволить подсоединяться пользователям с идентификатором (UID) меньше чем число, указанное в параметре. Таким образом блокируются подключения пользователя root, но можно поставить число и побольше, например 1000 (все равно по умолчанию система начинает присваивать созданным с помощью команды adduser пользователям UID’ы начиная с 1000)
-E – не разрешать подключения анонимным пользователям
-A – не позволять пользователям выходить за пределы домашних каталогов
Более подробно со списком ключей запуска можно ознакомиться в официальном README (на английском языке)
.
Такой скрипт уже можно положить в автозагрузку X-сервера (скопировать в папку /root/Startup), но зачем нам в автозагрузке графической среды программа у которой и графического интерфейса-то нет? Мы пойдем другим путем! Но для начала скрипт необходимо модифицировать:
#! /bin/sh
pure-ftpd -D -b -k 90 -u 100 -E –A &

Очень важно (!) добавить после команды запуска сервера (через пробел) символ &
Это позволит после запуска нашего сервера (и любой другой резидентной программы) продолжить выполнение других команд. В противном случае резидентная программа «захватит» (и не отдаст никому!) текущую консоль, что приведет к зависанию во время загрузки системы.
В таком виде путь к скрипту можно прописать в файле /etc/rc.d/rc.local
Просто откройте данный файл в текстовом редакторе и добавьте туда строчку с путем к вашему скрипту (например /root/scripts/startftp)
Скрипт для остановки сервера

vPid="`pidof pure-ftpd`"
 if [ -z "$vPid" ]; then
    echo "FTP server not started"
  else
    kill $vPid
  fi

В данном случае мы получаем уникальный идентификатор запущенного процесса (PID) pure-ftp в системе с помощью команды pidof pure-ftpd и с помощью операции подстановки команды (символы « — обратные кавычки) передаем PID в переменную vPid, далее проверяем (if), является ли наша строка пустой (-z) и если является, то значит сервер не запущен, о чем мы уведомляем пользователя соответствующим сообщением (echo "FTP server not started"). Если же строка не пуста, следовательно, PID получен, а значит сервер запущен и работает останавливаем его командой kill $vPid, где vPid – наша переменная, содержащая PID. (не забывайте пробелы в нужных местах и знак $ в том месте, где используете переменные в командах)
Запуск, остановка, перезапуск сервера из одного скрипта и автозагрузка демона через init.d

Сначала мы определим функции для наших действий – остановки и запуска сервера. Функция – это подпрограмма, говоря простыми словами — некая обособленная часть программы, которую в самой программе можно неоднократно вызывать. Подробнее про функции можно прочесть здесь
У нас будут определены две функции – start_server и stop_server для соответствующих действий. Заголовок функции начинается с ее имени и в простейшем случае заканчивается конструкцией () , далее в тело функции заключенное между символами {} помещаются команды. В функцию start_server помещаем команды из скрипта запуска сервера (и заодно дополняем их текстовым сообщением):
start_server()
{
echo "Starting FTP server..."
pure-ftpd -D -b -k 90 -u 100 -E -A &
}

Аналогично поступаем и с функцией stop_server, куда помещаем команды из скрипта остановки сервера:
stop_server()
{
echo "Stopping FTP server..."
vPid="`pidof pure-ftpd`"
if [ -z "$vPid" ]; then
echo "FTP server not started"
else
kill $vPid
fi
}

Функции необходимо определять до того, как они будут использованы (вызваны) внутри скрипта!
Далее – основной скрипт:
if [ "$1" = "start" ]; then
start_server
exit
fi
if [ "$1" = "stop" ]; then
stop_server
exit
fi
if [ "$1" = "restart" ]; then
stop_server
start_server
exit
fi
echo "use " $0 " start|stop|restart"

В переменных $1, $2 … $N содержатся параметры скрипта, которые ему передает пользователь в командной строке, т.е. если пользователь введет в командной строке
pftpd start
(предположим, что мы сохраним наш скрипт под именем pftpd) то в переменной $1 окажется строка «start»
Далее нам остается лишь проверить значение переменной $1 с помощью оператора if и выполнить соответствующее действие, т.е. вызвать функцию start_server если переменная равна “start”, stop_server, если переменная равна “stop” и сначала остановку, а потом запуск сервера, если переменная равна “restart” После того, как мы выполнили нужные действия необходимо завершить скрипт командой exit.
Если же пользователь не ввел ни одного из необходимых параметров, или ввел нечто иное, например, допустив опечатку при вводе, то ни одно из условий не сработает и пользователю будет выведена текстовая подсказка по использованию скрипта:

Скрипт при нормальной работе:

В переменной $0 хранится путь к самому скрипту.
Весь скрипт целиком:
#! /bin/sh
start_server()
{
echo "Starting FTP server..."
pure-ftpd -D -b -k 90 -u 100 -E -A &
}
stop_server()
{
echo "Stopping FTP server..."
vPid="`pidof pure-ftpd`"
if [ -z "$vPid" ]; then
echo "FTP server not started"
else
kill $vPid
fi
}
if [ "$1" = "start" ]; then
start_server
exit
fi
if [ "$1" = "stop" ]; then
stop_server
exit
fi
if [ "$1" = "restart" ]; then
stop_server
start_server
exit
fi
echo "use " $0 " start|stop|restart"

Скрипт вроде бы с виду большой, но на самом деле совершенно простой и не страшный 🙂
Этот скрипт можно скопировать в /etc/init.d и он будет стартовать при загрузке системы.
Такой способ запуска рекомендуется для демонов, а как понимаете, к демонам надо относиться уважительно, и вызывать их нужными способами 🙂
Тем более, что наш скрипт соответствует тому, что описано в readme
At bootup, the /etc/rc.d/rc.local0 script will run all scripts found in
/etc/init.d/, with the commandline parameter ‘start’.
At shutdown, the /etc/rc.d/rc.shutdown script will run all scripts found in
/etc/init.d/, with the commandline parameter ‘stop’.

Т.е. при загрузке все найденные в этой директории скрипты будут выполнены с параметром start, а при завершении – с параметром stop.
Не забудьте назначить скрипту права на исполнение!

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/139976.html
Прокомментировать заметку можно по ссылке выше.