Summary: | smbclient неправильно работает в однобайтовых локалях c русским W2k | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | Alexey V. Novikov <shader> |
Component: | samba | Assignee: | Evgeny Sinelnikov <sin> |
Status: | NEW --- | QA Contact: | qa-sisyphus |
Severity: | normal | ||
Priority: | P2 | CC: | mike, sin |
Version: | unstable | ||
Hardware: | all | ||
OS: | Linux |
Description
Alexey V. Novikov
2006-12-18 17:24:26 MSK
(In reply to comment #0) Прошу прощения, был не настроен /etc/samba/smb.conf, однако даже с настроенным неправильное поведение в локали POSIX сохраняется [novikov@novikov novikov]$ LC_ALL=C smbclient -gNL somehost -A ~/.netrc 2>/dev/null IPC|IPC$|Disk|D$|Disk|print$|Disk|C| Disk|D| Printer|hpLaserJ|hp LaserJet 1300 PCL 6 Disk|ADMIN$|Disk|N$| Disk|C$| В остальных локалях вроде работает. Из-за такого поведения не работает auto.smb из пакета autofs, приходится для smbclient'а указывать локаль отличную от POSIX Работа в локали POSIX полностью соответствует логике локали -- в ней возможно только ASCII. Однако, почему-то "проглатывается" заключительный \n в некоторых строках... Соответствующий код выглядит так: /* FIXME: If the remote machine returns non-ascii characters in any of these fields, they can corrupt the output. We should remove them. */ if (!grepable) { d_printf("\t%-15s %-10.10s%s\n", name,typestr,comment); } else { d_printf ("%s|%s|%s\n",typestr,name,comment); } Предполагается, что поступающие на вход d_printf() строки переданы в unix charset и она транслирует их в display charset и выводит на экран. Собственно так и происходит, поскольку в browse_fn() (где этот код присутствует) данные попадают в unix charset, будучи преобразованными туда из UCS2. Комментарий, на мой взгляд, относится только к первой части -- !greppable; там вполне очевидно, что вывод испортится, поскольку он форматируется побайтно пробелами, а на самом деле при юникоде там совсем не восьмибитные буквы. Однако к greppable это не относится. В этом случае d_printf() должен сформировать нормальную строку (в utf-8, насколько я полагаю -- unix charset по умолчанию) и попытаться ее вывести. А чему все же равны настройки *charset в smb.conf? (In reply to comment #2) Сейчас в /etc/samba/smb.conf dos charset = CP866 unix charset = UTF8 display charset = LOCALE [novikov@novikov etc]$ rpm -qf /usr/bin/smbclient samba-client-3.0.14a-alt2 Локаль - UTF-8 Кстати, пока не забыл [novikov@novikov etc]$ man smbclient | grep '^.*-g' [novikov@novikov etc]$ в смысле опция -g в мане отсутствует А так все равно LC_ALL=C smbclient -gNL monakhov -A ~/.netrc >~/aaa в файле имеем IPC|IPC$|Disk|D$|Disk|print$|Disk|C| Disk|D| Printer|hpLaserJ|hp LaserJet 1300 PCL 6 Disk|ADMIN$|Disk|N$| Disk|C$| причем последняя строка без \n moved to sisyphus; please check with 3.0.28+ (In reply to comment #4) > moved to sisyphus; please check with 3.0.28+ Система - branch 4.0 $ rpm -q samba-client samba-client-3.0.28-alt1 LC_ALL=C smbclient -gNL <win2k_ru_host> -A /etc/netrc display charset = LOCALE - не работает display charset = UTF8 - работает Просьба по возможности проверить с 3.5+. (В ответ на комментарий №7) > Просьба по возможности проверить с 3.5+. $ LC_ALL=C smbclient -gNL host -U user 2>/dev/null |hexdump -C 00000000 41 6e 6f 6e 79 6d 6f 75 73 20 6c 6f 67 69 6e 20 |Anonymous login | 00000010 73 75 63 63 65 73 73 66 75 6c 0a 49 50 43 7c 49 |successful.IPC|I| 00000020 50 43 24 7c 44 69 73 6b 7c 70 72 69 6e 74 24 7c |PC$|Disk|print$|| 00000030 44 69 73 6b 7c 43 7c 0a 50 72 69 6e 74 65 72 7c |Disk|C|.Printer|| 00000040 48 50 4c 61 73 65 72 4a 7c 48 50 20 4c 61 73 65 |HPLaserJ|HP Lase| 00000050 72 4a 65 74 20 31 30 31 38 0a 44 69 73 6b 7c 41 |rJet 1018.Disk|A| 00000060 44 4d 49 4e 24 7c 44 69 73 6b 7c 43 24 7c 41 6e |DMIN$|Disk|C$|An| 00000070 6f 6e 79 6d 6f 75 73 20 6c 6f 67 69 6e 20 73 75 |onymous login su| 00000080 63 63 65 73 73 66 75 6c 0a |ccessful.| 00000089 Hint: например, между Disk|ADMIN$ и Disk|C$ не перевод строки, а "|" $ rpmquery samba-client samba-client-3.5.6-alt1 (В ответ на комментарий №7) > Просьба по возможности проверить с 3.5+. А вот с UTF-8 (она же локаль) $ LC_ALL=ru_RU.UTF-8 smbclient -gNL host -U user 2>/dev/null |hexdump -C 00000000 41 6e 6f 6e 79 6d 6f 75 73 20 6c 6f 67 69 6e 20 |Anonymous login | 00000010 73 75 63 63 65 73 73 66 75 6c 0a 49 50 43 7c 49 |successful.IPC|I| 00000020 50 43 24 7c d0 a3 d0 b4 d0 b0 d0 bb d0 b5 d0 bd |PC$|............| 00000030 d0 bd d1 8b d0 b9 20 49 50 43 0a 44 69 73 6b 7c |...... IPC.Disk|| 00000040 70 72 69 6e 74 24 7c d0 94 d1 80 d0 b0 d0 b9 d0 |print$|.........| 00000050 b2 d0 b5 d1 80 d1 8b 20 d0 bf d1 80 d0 b8 d0 bd |....... ........| 00000060 d1 82 d0 b5 d1 80 d0 be d0 b2 0a 44 69 73 6b 7c |...........Disk|| 00000070 43 7c 0a 50 72 69 6e 74 65 72 7c 48 50 4c 61 73 |C|.Printer|HPLas| 00000080 65 72 4a 7c 48 50 20 4c 61 73 65 72 4a 65 74 20 |erJ|HP LaserJet | 00000090 31 30 31 38 0a 44 69 73 6b 7c 41 44 4d 49 4e 24 |1018.Disk|ADMIN$| 000000a0 7c d0 a3 d0 b4 d0 b0 d0 bb d0 b5 d0 bd d0 bd d1 ||...............| 000000b0 8b d0 b9 20 41 64 6d 69 6e 0a 44 69 73 6b 7c 43 |... Admin.Disk|C| 000000c0 24 7c d0 a1 d1 82 d0 b0 d0 bd d0 b4 d0 b0 d1 80 |$|..............| 000000d0 d1 82 d0 bd d1 8b d0 b9 20 d0 be d0 b1 d1 89 d0 |........ .......| 000000e0 b8 d0 b9 20 d1 80 d0 b5 d1 81 d1 83 d1 80 d1 81 |... ............| 000000f0 0a 41 6e 6f 6e 79 6d 6f 75 73 20 6c 6f 67 69 6e |.Anonymous login| 00000100 20 73 75 63 63 65 73 73 66 75 6c 0a | successful.| 0000010c Ещё актуально? |