Конфигурирование с поддержкой разных кодировок

Конфигурирование FTP-сервера (Настройки FTP-сервера, ProFTPD)
Ответить
Аватара пользователя
Роман Торопов
Администратор
Сообщения: 141
Зарегистрирован: 24 мар 2008, 10:49
Откуда: г. Пермь
Контактная информация:

Конфигурирование с поддержкой разных кодировок

Сообщение Роман Торопов » 25 мар 2008, 11:42

До недавнего времени постоянно возникал вопрос о просмотре клиентами винды на серверах ProFTPD. Теперь эта проблема решена.

Код: Выделить всё

Автор: CoderInside 
e-mail: coder@vmail.ru 
icq: 233503535
Введение

У ProFTPd существуют две проблемы связанные с русским языком. Первая - при закачивании на сервер окошки клиентами файлов с русскими названиями из них вырезаются буквы "ыьэюя". Вторая - так как эти файлы были закачаны в кодировке CP1251 их названия невозможно прочитать через Linux консоль, где обычно KOI8-R или UTF-8. Если для пользователей это не большая проблема, ведь через FTP все отображается нормально, администратору этого сервера такие файлы доставляют значительные неудобства. Для того чтобы научить ProFTPd автоматически конвертировать названия файлов в Linux кодировку при загрузке на сервер и в окошки кодировку при скачивании - существует специальный патч. Патч этот выпустили японцы - так как у них похоже эта проблема тоже не на последнем месте .

Проблема с буквами "ыьэюя" (коды 251-255) возникают потому, что ProFTPd пропускает весь свой сетевой трафик через Telnet фильтр, который воспринимает символы с кодами 251-255 как управляющие последовательности и вырезает их. Это лечится небольшим вмешательством в один из исходных файлов.

Нашей целью будет сервер ProFTPd который будет автоматически конвертировать кодировки и хорошо работать с буквами "ыьэюя".

Подготовка

Для осуществления всего выше задуманного потребуется исходный код сервера ProFTPd и патч. На момент написания статьи самая последняя версия сервера - 1.3.0. Патч выпущенный японцами существует только для версии 1.2.10 и на новый код не накладывается. Пришлось немого повозиться и сделать из него патч для 1.3.0 попутно добавив в него строки для нормальной работы с маленькими буквами "ыьэюя". Готовый патч лежит здесь. Как вы уже догадались, мы будем собирать и устанавливать ProFTPd из исходников, поэтому если он у вас уже установлен - его предварительно нужно удалить.

Создадим директорию /tmp/src и скачаем в нее исходники и патч:

$ mkdir /tmp/src
$ cd /tmp/src
$ wget http://ingineer.ru/linux/ftp/files/prof ... .0.tar.bz2 http://ingineer.ru/linux/ftp/files/prof ... s.patch.gz

Распакуем исходный код ProFTPd

$ tar xjvf proftpd-1.3.0.tar.bz2

Накладывание патча

Находясь в каталоге /tmp/src наложим патч на исходный код сервера

$ gzip -cd proftpd-1.3.0-rus.patch.gz | patch -p0

Должно появиться сообщение о том что пропатчились 4 файла

patching file proftpd-1.3.0/modules/mod_codeconv.c
patching file proftpd-1.3.0/modules/mod_df.c
patching file proftpd-1.3.0/modules/mod_ls.c
patching file proftpd-1.3.0/src/netio.c

Если все так - полдела сделано!

Сборка

Переходим в каталог с исходными текстами ProFTPd

$ cd proftpd-1.3.0

Запускаем configure с модулем для конвертации

$ ./configure --with-modules=mod_codeconv

Собираем

$ make

Устанавливаем

$ sudo make install

Конфигурирование

Открываем конфигурационный файл сервера /usr/local/etc/proftpd.conf и добавляем туда строки отвечающие за перекодировку. Например в случае когда на Linux UTF-8 пишем:

CharsetLocal UTF-8
CharsetRemote CP1251

Смысл параметров думаю понятен из их названий.

Запуск

Для запуска сервера создадим скрипт /etc/init.d/proftpd и сделаем его исполняемым

#!/bin/sh
# ProFTPD files
FTPD_BIN=/usr/local/sbin/proftpd
FTPD_CONF=/usr/local/etc/proftpd.conf
PIDFILE=/usr/local/var/proftpd.pid
# If PIDFILE exists, does it point to a proftpd process?
if [ -f $PIDFILE ]; then
pid=`cat $PIDFILE`
fi

if [ ! -x $FTPD_BIN ]; then
echo "$0: $FTPD_BIN: cannot execute"
exit 1
fi

case $1 in

start)
if [ -n "$pid" ]; then
echo "$0: proftpd [PID $pid] already running"
exit
fi

if [ -r $FTPD_CONF ]; then
echo "Starting proftpd..."

$FTPD_BIN -c $FTPD_CONF

else
echo "$0: cannot start proftpd -- $FTPD_CONF missing"
fi
;;

stop)
if [ -n "$pid" ]; then
echo "Stopping proftpd..."
kill -TERM $pid

else
echo "$0: proftpd not running"
exit 1
fi
;;

restart)
if [ -n "$pid" ]; then
echo "Rehashing proftpd configuration"
kill -HUP $pid

else
echo "$0: proftpd not running"
exit 1
fi
;;

*)
echo "usage: $0 {start|stop|restart}"
exit 1
;;

esac

exit 0

Делаем исполняемым

chmod a+x /etc/init.d/proftpd

Готово! Данный скрипт позволяет запускать, останавливать и перегружать запущенный сервер

* запуск

/etc/init.d/proftpd start

* останов

/etc/init.d/proftpd stop

* перезагрузка

/etc/init.d/proftpd restart

Для того чтобы сервер автоматически загружался при старте системы - пропишите комманду /etc/init.d/proftpd start в /etc/rc.local или любой другой стартовый скрипт. Для Debian: находясь в каталоге /etc/init.d выполните комманду

update-rc.d proftpd defaults 99

Все. Перегружаемся и проверяем. ProFTPd должен запуситься автоматически. В названиях закачиваемых из окошки файлов не должны пропадать буквы "ыьэюя", названия должны отображаться в консоли без кракозябликов.

Удачи!

По всем вопросам пишите на coder@vmail.ru

Ответить