ProFTPd и русские символы

Материал из Linux в Могилеве.
Перейти к: навигация, поиск

Автор: CoderInside
e-mail: coder@vmail.ru
icq: 233503535
10.09.2006


Версия 1.2


Содержание

Введение

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

Проблема с буквами "ыьэюя" (коды 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 ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.0.tar.bz2 http://linuxportal.vrn.ru/file/proftpd-1.3.0-rus.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 должен запуситься автоматически. В названиях закачиваемых из Windows файлов не должны пропадать буквы "ыьэюя", названия должны отображаться в консоли без кракозябликов.

Удачи!

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

Личные инструменты

    Linux.by

    Могилевский Форум

    Диски почтой

    Каталог TUT.BY