Собираем списки файлов
2008-02-29 01:07Стоит задача: время от времени собирать списки файлов с нескольких окрестных серверов. При этом серверы бывают 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) не внушают доверия.