LINUX.ORG.RU
ФорумAdmin

При завершении сеанса клиента vsftpd нужно скопировать содержимое папки в другую


0

0

Доброе время суток. Я в Linux новичок, прошу помоч опытных людей решить такую проблему. Установил Linux FedoraCore4, на него повесил сервер vsftpd, в корне лежат папки для пользователей в каждой из которых есть папка in и out, out-скрытая папка - потавлена задача по выходу пользователя при наличии файлов в папке in переместить содержимое в папку out. Помогите пожалуйста.


С vsftpd нормально никак не сделать.

Костыли с cron_oм -- это не решение.

Вывод: сменить фтп-сервер на умеющий по событию USE_LOGOUT выполнить скрипт.

sdio ★★★★★
()
Ответ на: комментарий от sdio

Спасибо большое за совет. Я выбрал vsftpd потому что его рекомендуют с точки зрения безопастности. Какой сервер может быть достойной заменой?

vladgr
() автор топика
Ответ на: комментарий от vladgr

В принципе можно обойтись и vsftpd. Если настроить его для запуска из inetd. inetd подсунуть скрипт, который вначале выполняет vsftpd, а потом копирует файлы.

qwe ★★★
()
Ответ на: комментарий от qwe

Благодарен Вам за помощь, сейчас пользуюсь xinetd, надо будет попробовать c inetd. Как Вы считаете, может сталкивались, мне тут подсказали попробовать решить проблемму с помощью параметра конфига - session_support This controls whether vsftpd attempts to maintain sessions for logins. If vsftpd is maintaining sessions, it will try and update utmp and wtmp. It will also open a pam_session if using PAM to authenticate, and only close this upon logout. You may wish to disable this if you do not need session logging, and you wish to give vsftpd more opportunity to run with less processes and / or less privilege. NOTE - utmp and wtmp support is only provided with PAM enabled builds. Я никогда не пользовался PAM, сей час буду разбираться.

vladgr
() автор топика
Ответ на: комментарий от vladgr

>пользуюсь xinetd, надо будет попробовать c inetd

Они выполняют одну и ту же функцию. :)
в файле /etc/xinetd.d/vsftp меняете строку
server = /usr/sbin/vsftpd
на
server = /path/script
где /path/script - имя Вашего скрипта с путем
Скрипт примерно такой
------------------------------
#!/bin/bash
/usr/sbin/vsftpd $@

Необходимые действия
------------------------------

>попробовать решить проблемму с помощью параметра конфига - session_support

Может быть, но пожалуй, придется написать свой модуль PAM.

qwe ★★★
()
Ответ на: комментарий от qwe

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

vladgr
() автор топика
Ответ на: комментарий от vladgr

>------------------------------
>#!/bin/bash
>/usr/sbin/vsftpd $@
>
>Необходимые действия
>------------------------------

"Необходимые действия" - это как раз то, что нужно выполнить по завершению сеанса. :)

qwe ★★★
()
Ответ на: комментарий от qwe

Если я правильно понимаю, xinetd выполняется при запуске системы, в данном случае с помщь скрипта xinetd запустит сразу vsftpd, а затем скрипт который будет перемещать содержимое одних папок в другие. Но копипование будет выполняться только при запуске xinetd, а мне нужно чтобы оно выполнялось при выходе клиента из сеанса - как привязаться к этому событию я и не знаю.

vladgr
() автор топика
Ответ на: комментарий от vladgr

>Если я правильно понимаю, xinetd выполняется при запуске системы

Не совсем так. xinetd запускается при запуске системы и ждет обращений к портам. В данном случае, при присоединении клиента к ftp порту, xinet d вместо vsftpd запускает скрипт, который запускает vsftpd и после его завершения (конец сеанса) выполняет нужные Вам действия.

qwe ★★★
()
Ответ на: комментарий от qwe

Прошу прощения, хотелось бы уточнить если можно. Я организовал на данный момент vsftpd таким образом: клиенты входят каждый со своим логином и паролем, в тоже время они не имею доступа к своим директориям, все они попадают в /home/ftp/pub/ и здесь я организовал структуру папок: каждый пользователь соответственно имеет папку под своим именем в каждой из которых есть папки in и out, папка out скрытая, вот в нее то и нужно мне перенести файлы из папки in которая доступна каждому пользователю вошедшему на ftp. Так вот что хотельсь бы уточнить: как Вы описали при присоединении к ftp порту, xinetd запускает скрипт, который запускает vsftpd и после его завершения(ЗАВЕРШЕНИЯ СЕАНСА ПОЛЬЗОВАТЕЛЯ ИЛИ VSFTPD ?), не перезапускается ли xinetd, потому как в таком случае, он выбросит всех остальных клиентов? И ище если есть такая информация хотелось бы уточнить можно ли привязаться к сеансу каждого конкретного пользователя, что бы скрипт не перебирал папки всех пользователей при выходе одного из системы, а только папку вышедшего.

vladgr
() автор топика
Ответ на: комментарий от vladgr

>ЗАВЕРШЕНИЯ СЕАНСА ПОЛЬЗОВАТЕЛЯ ИЛИ VSFTPD ?

При работе через inetd это одно и тоже.

>не перезапускается ли xinetd

Нет. Даже если б и перезапускался сессии не оборвутся, потому что каждую сессию обслуживает отдельный демон vsftpd.

>хотелось бы уточнить можно ли привязаться к сеансу каждого конкретного пользователя

Нужно подумать/попробовать. Если получится напишу.

qwe ★★★
()
Ответ на: комментарий от vladgr

>хотелось бы уточнить можно ли привязаться к сеансу каждого конкретного пользователя

Единственное, что пока пришло в голову, это анализировать переменную окружения REMOTE_HOST, которая выставляется xinetd и содержит IP адрес клиента.

qwe ★★★
()
Ответ на: комментарий от qwe

Поменял строку в xinetd в соответствии с Вашими коментариями Создал фай: #!/bin/bash /usr/sbin/vsftpd S@

mv /var/ftp/pub/vladislav/in/* /var/ftp/pub/vladislav/out/

Как я понял при завершении сеанса клиента, содержимое папки in должно переместитья в папку out.

Но что-то видимо я недоделал?

vladgr
() автор топика
Ответ на: комментарий от vladgr

Надо использовать подходящее ПО (pure-ftpd, wzdftpd, ...) для решения поставленной задачи, а не приделывать костыли к vsftpd.

sdio ★★★★★
()
Ответ на: комментарий от vladgr

>/usr/sbin/vsftpd S@

/usr/sbin/vsftpd $@

На самом деле sdio *** (*) (29.10.2005 15:31:13) прав. Мне тоже нравится vsftpd, но в Вашем случае это костыли.

qwe ★★★
()
Ответ на: комментарий от qwe

Спасибо большое за помощь. С учетом всего выше сказанного и сделанного, а также срочности работы, я попытаюсь настроить pure-ftpd. Но очень хочетя найти возможность решить эту проблемму на базе vsftpd. Если что-то получится обязательно поделюсь. Желаю успехов!

vladgr
() автор топика
Ответ на: комментарий от vladgr

Всем привет. Наконец - то заработало. Как Вы и говорили:

в файле /etc/xinetd.d/vsftp меняем строку server = /usr/sbin/vsftpd на server = /path/script где /path/script - имя скрипта с путем ------------------------------ #!/bin/bash /usr/sbin/vsftpd $@ mv /var/ftp/pub/vladislav/in/* /var/ftp/pub/vladislav/out/ ______ И все чудестно работает, хоть после выхода, хоть перед входом. Нужно пути к правильным файлам прописать. Но пока не приваязано к конкретному пользователю. Спасибо за помощь!

vladgr
() автор топика
Ответ на: комментарий от vladgr

>Но пока не приваязано к конкретному пользователю.

/path/script
8<--------------------------------------------------
#!/bin/bash

# Запускаем vsfptd в фоне и
# переназначаем ввод-вывод на него
/usr/sbin/vsftpd $@ <&0 >&1 2>&2 &

# Отрываемся от TCP сокета
exec </dev/null
exec >/dev/null
exec 2>/dev/null

# Ждём логина пользователя
while true
do
    # Выходим если во время ожидания
    # vsfptd неожиданно завершился.
    [ ! -f /proc/$!/status ] && exit
    # Для всех запущенных vsfptd
    # ищем процесс, который является
    # потомком запущенного нами vsfptd
    # и UID которого не совпадает с nopriv_user
    # из vsftpd.conf (здесь 99).
    for p in `pidof vsftpd`
    do
        if [ `grep ^PPid: /proc/$p/status | cut -f2` -eq $! ] && \
            [ `grep ^Uid: /proc/$p/status | cut -f2` -ne 99 ]
        then
            # Пользователь открыл сессию.
            uid=`grep ^Uid: /proc/$p/status | cut -f2`
            # В переменной uid теперь ID пользователя.
            # Ищем имя пользователя в /etc/passwd.
            user=`cut -d: -f1,3 -d: /etc/passwd | grep -w $uid | cut -d: -f1`
            # В переменной user теперь имя пользователя.
            break 2 # Всё, можно дожидаться конца сессии.
        fi
    done
    # Не грузим процессор, немножко ждем.
    sleep 1
    # Ньюанс. Если пользователь войдёт и выйдет
    # быстрее чем мы ожидали, то не узнаем кто заходил. :(
    # (Для ожидания меньше 1с можно использовать usleep)
done
# Ожидаем завершения сессии.
wait
# Дождались.

# В целях отладки проверяем что получилось.
# Пишем имя пользователя и его ID в /tmp/ftp.log.
# Не забудьте удалить следующую строку после отладки.
echo UID=$uid USER=$user >>/tmp/ftp.log

# Далее нужные Вам действия
# .........................

# vim:ts=4:sts=4:
8<--------------------------------------------------

Проверил, работает. :)

qwe ★★★
()
Ответ на: комментарий от qwe

Я впечатлен Вашими познаниями Shell и Linux. Спасибо за желание помочь. Извините пожалуйста но у меня скрипт не работает так как нужно или снова я чего-то недопонимаю. В /tmp/ftp.log мне прописывает такие строки: UID=504 USER=vsftpd UID=504 USER=vsftpd Под каким бы я пользователем не воходил/ Я добавил строку mv /var/ftp/pub/user/in/* /var/ftp/pub/user/out/ Информация после выхода пользователя даже fsftpd не перемещается Если можете проясните пожалуйста ситуацию. И если возможно просьба подсказать нужные источники для подробного изучения Linux и Shell на уровне программиста, администратора.

vladgr
() автор топика
Ответ на: комментарий от qwe

Огромное спасибо за подсказку, все заработало, и еще большее спасибо за ман - афигенная информация. Желаю удачи!!!

vladgr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.