DataLife Engine > Unix > Unix+ Samba + ftpd, проблемы и решения

Unix+ Samba + ftpd, проблемы и решения


9 ноября 2007. Разместил: podpole
Есть такая проблема: сложно найти ftpd, понимающий перекодировку имен файлов. Если хранить файлы на сервере в koi8, то ftpшник выдает винде крякозябры. Если хранить в CP1251, то ftp не передает букву "Я", считая ее управляющим символом.
Как решать?
Проблема буквы я возникает в случае, если ftpd весь сетевой i/o пропускает через telnet-фильтр, где буква Я - управляющий символ.
В том числе к таким серверам относится ProFtpd

Решаем проблему на его примере:

1. Управляющие символы в телнете называются IAC (Is A Command)
2. Распаковываем исходники и делаем поиск по строке IAC

3. Находим 2 файла: netio.c и netio.h, где эта строка встречается.

4. Смотрим файл netio.c и находим там следующий код:

switch (mode) {
case IAC:
switch (cp) {
case WILL:
case WONT:
case DO:
case DONT:
mode = cp;
continue;

case IAC:
mode = 0;
break;

default:
/* Ignore */
mode = 0;
continue;
}
break;

case WILL:
case WONT:
pr_netio_printf(out_nstrm, "%c%c%c", IAC, DONT, cp);
mode = 0;
continue;

case DO:
case DONT:
pr_netio_printf(out_nstrm, "%c%c%c", IAC, WONT, cp);
mode = 0;
continue;

default:
if (cp == IAC) {
mode = cp;
continue;
}
break;
}

5. Путем вдумчивого рассматривания понимаем, что именно эти строчки отвечают за проверку на телнет-вшивость.

6. Удаляем все это безобразие.

7. Компилим и радуемся!


В итоге имеем:

Все названия лежат на юникс-машине в CP1251- кодировке. Для передачи их винде по фтп ничего не меняется, и буква "Я" исправлена. Для передаче по Самбе используем следующие настройки:

display charset = CP1251
unix charset = CP1251
dos charset = CP866