yurikhan: (Default)

Стоит задача: время от времени собирать списки файлов с нескольких окрестных серверов. При этом серверы бывают CIFS и FTP, а те, которые FTP, в свою очередь, делятся на RFC2640-compliant и не-compliant. Но на списки это особо не влияет. Хочется иметь списки в каком-нибудь более или менее однородном формате и кодировке. Кодировку хотим какую-нибудь юникодную, дабы не ограничивать в именах себя и партнёров по обмену.

Под Windows задача тривиально решается для CIFS: cmd /u /c dir /a /-c /s \\server\share |iconv -f ucs-2le -t target_encoding >server-%DATE%.txt.

Под Linux у нас такого UNC-синтаксиса нет. Каноническое решение — замонтировать нужный сервер в файловую систему и сказать ls -lR.

CIFS-серверы монтируются через mount.cifs из пакета smbfs. Есть только один нюанс: в ключах -o должно быть iocharset=utf8, иначе по умолчанию оно берёт cp437. utf8 должно быть написано именно так, без привычного минуса, потому что это в данном случае не имя кодировки в iconv, а имя файла динамически подгружаемой библиотеки.

Если среди жертв есть древние серверы на Samba 1.x (или, возможно, Windows 9x/ME), то дополнительно придётся указать в smb.conf параметр dos charset = cp866.

Для монтирования FTP-серверов есть много разных решений — ftpfs (obsolete), lufs, lftpfs, curlftpfs.

lufs поначалу выглядит очень многообещающе, но мануал ни слова не говорит о кодировках. А значит, правильно смонтируются только серверы с правильной кодировкой. К сожалению, их ещё пока в процентном соотношении очень мало. Кроме того, сам пакет требует компиляции отдельного ядерного модуля, который для сборки под ядро 2.6 ещё надо патчить.

lftpfs работает поверх lftp, а значит, с поддержкой кодировок у него всё нормально. Однако он заточен под кэширование. Что само по себе интересно, но для каких-нибудь других задач.

curlftpfs тоже позволяет для каждого сервера задать, в какой кодировке он отдаёт листинги. На нём я и остановился.

Замеченные проблемы:

  • С curlftpfs не работает umount из-под простого пользователя, говорит, что параметры не совпадают с тем, что написано в fstab. Хотя смонтировано именно оттуда.
  • mount.cifs под пользователем позволяет смонтировать одну и ту же шару несколько раз, после чего опять-таки обламывается umount.
  • Если точки монтирования имеют одинаковые имена (скажем, /mnt/foo/pub и /mnt/bar/pub), то в Nautilus’е они показываются как pub и pub (1), что несколько затрудняет их различение.

PS: под Windows есть некая программа FTPDrive. Только она заброшенная (последний релиз два года назад) и, кроме того, её братья (NetView и KillCopy) не внушают доверия.

yurikhan: (Default)

Есть система-клиент, со своими понятиями о том, какая должна быть везде кодировка (соответственно UCS-2LE на винде или UTF-8 на Linux’е). Есть кривой ftp-сервер, работающий в KOI8-R (ShiftJIS, другой кодировке XX века). Как заставить wget (curl, другую качалку, способную работать на линуксовом сервере без гуя) выкачать с этого сервера файлы с кириллицей (иероглифами, эльфийскими рунами, клингонским pIqaD) в именах, так, чтобы они разложились в файловую систему клиента в правильном виде?

Отвечаю сам себе:

$ sudo apt-get install lftp
set ftp:charset koi8-r
open ftp.example.tld
mirror "/pub/где" "куда"
$ lftp -f get.lftp
yurikhan: (Default)
Вот. Один из немногих опенсорсных FTP-серверов под винду теперь правильно устанавливает data-соединение в активном режиме — с 20-го порта (ну, или с того, который на 1 ниже того, на котором он слушает control-соединения). Firewall’ы могут радоваться. Баг нашёл [livejournal.com profile] eugenius_nsk, патч — мой. Однако, два года без малого багу…

Profile

yurikhan: (Default)
Yuri Khan

June 2017

S M T W T F S
    123
45678910
1112 1314151617
18192021222324
252627282930 

Links

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 2017-07-22 04:48
Powered by Dreamwidth Studios