Bug 10447

Summary: smbclient неправильно работает в однобайтовых локалях c русским W2k
Product: Sisyphus Reporter: Alexey V. Novikov <shader>
Component: sambaAssignee: 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
[novikov@novikov novikov]$ LC_ALL=C smbclient -gNL somehost -A ~/.netrc 
Domain=[SOMEHOST] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
IPC|IPC$|Disk|D$|Disk|print$|Disk|C|
Disk|D|
Printer|hpLaserJ|hp LaserJet 1300 PCL 6
Disk|ADMIN$|Disk|N$|
Domain=[SOMEHOST] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
Disk|C$|

[novikov@novikov novikov]$ LC_ALL=ru_RU.CP1251 smbclient -gNL somehost -A ~/.netrc 
Domain=[SOMEHOST] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
IPC|IPC$|Disk|D$|Disk|print$|Disk|C|
Disk|D|
Printer|hpLaserJ|hp LaserJet 1300 PCL 6
Disk|ADMIN$|Disk|N$|
Domain=[SOMEHOST] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
Disk|C$|

[novikov@novikov novikov]$ LC_ALL=ru_RU.UTF-8 smbclient -gNL somehost -A ~/.netrc 
Domain=[SOMEHOST] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
IPC|IPC$|&#244;&#241;&#225;&#189;&#209;&#161;&#161;&#217;&#174; IPC
Disk|D$|&#230;&#212;&#225;&#161;&#241;&#225;&#211;&#212;&#161;&#217;&#174; &#171;&#237;&#218;&#191;&#174; &#211;&#209;&#223;&#210;&#211;&#223;
Disk|print$|&#228;&#211;&#225;&#174;&#243;&#209;&#211;&#217; &#187;&#211;&#191;&#161;&#212;&#209;&#211;&#171;&#243;
Disk|C|
Disk|D|
Printer|hpLaserJ|hp LaserJet 1300 PCL 6
Disk|ADMIN$|&#244;&#241;&#225;&#189;&#209;&#161;&#161;&#217;&#174; Admin
Disk|N$|
Disk|C$|&#230;&#212;&#225;&#161;&#241;&#225;&#211;&#212;&#161;&#217;&#174; &#171;&#237;&#218;&#191;&#174; &#211;&#209;&#223;&#210;&#211;&#223;
Domain=[SOMEHOST] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
Comment 1 Alexey V. Novikov 2006-12-19 09:32:51 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
Comment 2 Alexander Bokovoy 2006-12-19 10:51:21 MSK
Работа в локали 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?
Comment 3 Alexey V. Novikov 2006-12-19 13:18:10 MSK
(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
Comment 4 Michael Shigorin 2008-02-15 19:58:20 MSK
moved to sisyphus; please check with 3.0.28+
Comment 5 Alexey V. Novikov 2008-02-18 09:36:19 MSK
(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 - работает
Comment 6 Mikhail Gusarov 2008-06-13 13:00:39 MSD

    
Comment 7 Michael Shigorin 2011-01-22 17:17:11 MSK
Просьба по возможности проверить с 3.5+.
Comment 8 Alexey V. Novikov 2011-01-24 08:32:48 MSK
(В ответ на комментарий №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
Comment 9 Alexey V. Novikov 2011-01-24 08:34:57 MSK
(В ответ на комментарий №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
Comment 10 Michael Shigorin 2018-09-03 15:41:29 MSK
Ещё актуально?