[原创]解决Smaba服务的中文乱码问题(顺带SSH解决乱码)

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
头像
zhangsuheng
帖子: 59
注册时间: 2007-11-21 10:50

[原创]解决Smaba服务的中文乱码问题(顺带SSH解决乱码)

#1

帖子 zhangsuheng » 2007-12-14 17:04

首先说明一下,因为在单位配置的服务器是FC5的,所以,或许跟UBUNTU下有所不同,但是个人认为,linux是相通的,我写的内容应该很有参考价值

还有,首先定义一下我遇到的samba中文乱码情况,我没有x(x残废多月,用不了也没必要用了).所以我所有的配置都是基于命令行的.
情况一,
smb.conf文件中输入共享中文文件夹的语句如

代码: 全选

[中文文件夹]
       path = /home/shzhang
       . . .
之后,在windows端,便是看到一个文件夹名字显示为 "_____.___",无法进入.
情况二,
smb.conf文件中输入共享英文文件夹的语句,比如共享"FOLDER"文件夹,win一端网上邻居正常使用,可以放入中文文件,win端打开写入什么都正常,但是在linux端,进入"FOLDER"文件夹,你会看到里面的中文文件名都是乱码,无法在命令行下选中或操作.

情况三,
情况二中的中文文件不删除,我在smb.conf文件中定义smb使用的字符类型为中文,重启后,win端看"FOLDER"内皆为乱码,但是win端继续操作,写入中文文件,本次写入的中文显示依然正常,linux本地显示本次写入的也是正常中文.

总之,就是不管lin那儿乱码成什么样,win这儿使用samba服务都能正常使用中文文件名,只要你不改变linux那儿的配置.


====================解决方法精简版========================

偷懒点,先把smb目前共享的文件中正确显示中文名的文件全部通过网上邻居简切出来,等全部完成了再拷贝回去.

执行 locale命令
查看你的系统所用的字符集,
如果LANG是GB的 就在 smb.conf文件中加入

代码: 全选

#================= character set ================================

display charset = cp936
unix charset = cp936
dos charset = cp936
如果 LANG是 UTF-8的
就在smb.conf文件中加入

代码: 全选

#================= character set ================================

display charset = UTF-8
unix charset = UTF-8
dos charset = UTF-8
保存退出后,重启smb服务即可

代码: 全选

# service smb restart
好了,打完收工,就可以在samba中共享中文目录,windows端读写正常.linux本地也正常
[/size]


====================解决方法剧情版========================


单位的FC5曾经在一次强行关机(我干的 :em06 )中,x崩溃了,崩溃原因似乎跟字库有关,但是在重装了字库后,x依然不举,只能命令行使用,不过自从没了x,这台机子健步如飞.焕发第二春....扯远了,说正经的.

话说这个崩溃后,中文就开始抽风了,多次调整后,ssh可以中文,但是samba不能,在smb.conf里写的中文共享目录,在windows下整个乱码. 只好在smb.conf中全部使用英文,于是乎,windows那边用网上邻居拷贝过来的中文目录和文件,在windows下显示正常,linux本地全部乱码.也就这么将就着用了半年,相安无事....呃,说故事了,又远了,耐心,耐心.物价涨了不要乱扔鸡蛋 :em91

终于事发, 工程部要和我们研发部公用服务器,存储他们的文档.但是他们一定要用中文,而且要详细的权限配置,因为中文在linux本地是乱码,所以我无法做到有效的权限配置.只能先解决中文问题.经过....(省略若干字)..找到解决方法

其实不难,ssh正确显示中文,只是和linux本地显示中文的配置有关.

代码: 全选

 # vim /etc/sysconfig/i18n 

文件内容为

代码: 全选

LANG="zh_CN.GB2312"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.GB18030:zh_CN.GB2312:zh_CN.UTF-8:zh:en_US.UTF-8:en_US:en:ja_JP.UTF-8:ja_JP:ja"
SYSFONT="lat0-sun16"
SYSFONTTACH="8859-15"
特别说明,我原来第一行是 LANG="zh_CN.GB18030" 貌似ssh也很正常的显示中文.但是有文章说这里一定要是GB2312,我就2312了,也没看出差别.

保存退出,注销再进系统,新的字库配置生效(你要不放心就重启,我只是exit了一下,然后又login了)

下面解决samba,
samba默认的是英文的编码规则,所以要在smb.conf文件中写入定义文字编码标准的语句.
且慢!

如果你像我一样,在设置之前已经开始使用samba了,并且共享文件夹中的中文在win的网络邻居是正常显示的,请先通过网络邻居把这些文件移动到windows下,(个人猜测,其实这个移动过程或者拷贝过程中,是存在文件名字符转换的过程的). 如果你不这么做,那么在你配置了samba的中文字符集后, 你在win的网上邻居里看到的都将是乱码,linux本地依然是乱码,总之没有一个地方正常,乱码的后果就是删不掉,也操作不了.但是你恢复了原先的字符集设置后就能恢复原貌.

确保samba共享的那些文件夹中没有中文文件名存在了,可以配置samba了
很简单
先看你本地文件系统的字符集用的是什么

代码: 全选

$ locale
LANG=zh_CN.GB2312
LC_CTYPE="zh_CN.GB2312"
LC_NUMERIC="zh_CN.GB2312"
LC_TIME="zh_CN.GB2312"
LC_COLLATE="zh_CN.GB2312"
LC_MONETARY="zh_CN.GB2312"
LC_MESSAGES="zh_CN.GB2312"
LC_PAPER="zh_CN.GB2312"
LC_NAME="zh_CN.GB2312"
LC_ADDRESS="zh_CN.GB2312"
LC_TELEPHONE="zh_CN.GB2312"
LC_MEASUREMENT="zh_CN.GB2312"
LC_IDENTIFICATION="zh_CN.GB2312"
LC_ALL=

 
显然,我们用的是GB码,不是UTF8的,(我这步适合于刚才没有配置i18n文件的同学)
之后就可以对症修改了

代码: 全选

 #vim /etc/samba/smb.conf 
在这个配置文件中加入

代码: 全选

#================= character set ================================

display charset = cp936
unix charset = cp936
dos charset = cp936

#如果你的locale是UTF8的,请使用下面三行,注释掉上面3行
#display charset = UTF-8
#unix charset = UTF-8
#dos charset = UTF-8 
退出后

代码: 全选

# service smb restart 
即可

此时你就可以在smb.conf文件中直接共享中文目录了,并且,windows那些网上邻居拷过来的中文文件 在linux本地也是正常显示了.[/size]


====================其他相关========================


#表示用root权限运行,$表示一般用户权限

samba下的权限配置可以结合linux本身的权限配置,
优先级为,linux文件系统的权限最高,之后是samba.
如果要很详细的权限配置,就可以考虑使用ACL,这个我目前在折腾.弄好了再来"忽悠"大家 :em08

另外在另一个帖子里看到,有人问smb.conf文件里# ;什么意思, 我看smb的说明里说,这两个都是用来注释的.但从实际观察来看,一般#注释掉的都是描述性的文字, ;注释掉的是有效的命令行.

我现在要用这个ACL是因为两层文件夹,A文件夹下面有abc三个文件夹,工程部要求,我们研发部看不了他们的整个A,然后对于他们,共享文件夹是A,然后进入,abc三个文件夹,不需要网上同时看到A,a,b,c四个文件夹,有四个老总,能看A不能写,管理员可以读写完全的A,经理a能读写文件夹a,只读bc,经理b,只读ac,读写b,经理c,只读ab,读写c.这个功能目前看来只能用acl实现,因为linux本身的权限只有所有人,组,其他,我们这里组的界定不方便.因此只能用acl.

再废话一句,头一次在这儿长篇大论,拍砖时轻点.....
上次由 zhangsuheng 在 2007-12-14 22:59,总共编辑 5 次。
ino1
帖子: 266
注册时间: 2006-10-28 18:05

#2

帖子 ino1 » 2007-12-14 21:06

我现在要用这个ACL是因为两层文件夹,A文件夹下面有abc三个文件夹,工程部要求,我们研发部看不了他们的整个A,然后对于他们,共享文件夹是A,然后进入,abc三个文件夹,不需要网上同时看到A,a,b,c四个文件夹,有四个老总,能看A不能写,管理员可以读写完全的A,经理a能读写文件夹a,只读bc,经理b,只读ac,读写b,经理c,只读ab,读写c.这个功能目前看来只能用acl实现,因为linux本身的权限只有所有人,组,其他,我们这里组的界定不方便.因此只能用acl.
你这个要求我觉得可以不用ACL也能解决。
设置一个经理组,3个经理4个老总都属于这个组;
设置a文件夹的用户为a经理,b是b经理,c是c经理;组都是经理组;目录权限750
使用用户配置文件,想怎么显示共享资源都可以的,所以实现A文件夹你们组看不见而经理组看得见;
老总的配置文件对共享资源A设置read only,老总就不能写了;
经理的个人配置文件对共享资源都放开写权限,但由于系统权限限制,实现各自经理写自己的目录读其他两个目录。

ok,完全实现需求。
P4M 2.4GHz 256+512MDDR IGP340M共享64M
越来越喜欢beryl了,把我的桌面扩展得好大呀!
头像
冲浪板
论坛版主
帖子: 7513
注册时间: 2007-05-06 8:19

#3

帖子 冲浪板 » 2007-12-14 21:23

我的
LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=
smb里的中文没问题啊
头像
zhangsuheng
帖子: 59
注册时间: 2007-11-21 10:50

#4

帖子 zhangsuheng » 2007-12-14 22:01

ino1 写了:
我现在要用这个ACL是因为两层文件夹,A文件夹下面有abc三个文件夹,工程部要求,我们研发部看不了他们的整个A,然后对于他们,共享文件夹是A,然后进入,abc三个文件夹,不需要网上同时看到A,a,b,c四个文件夹,有四个老总,能看A不能写,管理员可以读写完全的A,经理a能读写文件夹a,只读bc,经理b,只读ac,读写b,经理c,只读ab,读写c.这个功能目前看来只能用acl实现,因为linux本身的权限只有所有人,组,其他,我们这里组的界定不方便.因此只能用acl.
你这个要求我觉得可以不用ACL也能解决。
设置一个经理组,3个经理4个老总都属于这个组;
设置a文件夹的用户为a经理,b是b经理,c是c经理;组都是经理组;目录权限750
使用用户配置文件,想怎么显示共享资源都可以的,所以实现A文件夹你们组看不见而经理组看得见;
老总的配置文件对共享资源A设置read only,老总就不能写了;
经理的个人配置文件对共享资源都放开写权限,但由于系统权限限制,实现各自经理写自己的目录读其他两个目录。

ok,完全实现需求。
你少了一个管理员,在你的设置里,管理员成了other,也许是我没说清楚,这个管理员是工程部的管理员,不能获得我们服务器的root权限的.而且一旦他用了root权限,那么文件的所有者就变成了root了,组也不是经理组了.
这个权限设置很绕... :em20 至少我是这么认为
头像
zhangsuheng
帖子: 59
注册时间: 2007-11-21 10:50

#5

帖子 zhangsuheng » 2007-12-14 22:13

冲浪板 写了:我的
LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=
smb里的中文没问题啊
没有问题就好啊,具体为什么我没有深究.管他什么配置方式,能解决问题不就是好方法嘛, 我是看到论坛里有兄弟搞不定这个,恰巧我又刚处理过这个问题,我才写的.

你指的中文正常是指smb.conf文件里就是中文正常,windows那儿看也正常,还是你windows那儿网上邻居一直用的正常,没有关心过linux本地如何?

不过还是很想知道你这个情况为什么会是正常的,我猜测,仅仅是猜测啊,

可能性一,你配置smb是用图形界面配置的而不是直接修改conf文件配置的,所以图形界面也许就帮你完成了这种字符的转换. 我遇到过的情况是,本地文件系统中,如果我文件第一个字母是英文或者数字,用tab键自动补齐,虽然文件名依然乱码,但是一切操作还是正常的.那么我猜测这种情况下,你的smb.conf文件里,相应的文件夹名是乱码.
可能性二,你所有的地方字符集一致,所以不会有这个情况.
ino1
帖子: 266
注册时间: 2006-10-28 18:05

#6

帖子 ino1 » 2007-12-14 22:22

zhangsuheng 写了:
ino1 写了:
我现在要用这个ACL是因为两层文件夹,A文件夹下面有abc三个文件夹,工程部要求,我们研发部看不了他们的整个A,然后对于他们,共享文件夹是A,然后进入,abc三个文件夹,不需要网上同时看到A,a,b,c四个文件夹,有四个老总,能看A不能写,管理员可以读写完全的A,经理a能读写文件夹a,只读bc,经理b,只读ac,读写b,经理c,只读ab,读写c.这个功能目前看来只能用acl实现,因为linux本身的权限只有所有人,组,其他,我们这里组的界定不方便.因此只能用acl.
你这个要求我觉得可以不用ACL也能解决。
设置一个经理组,3个经理4个老总都属于这个组;
设置a文件夹的用户为a经理,b是b经理,c是c经理;组都是经理组;目录权限750
使用用户配置文件,想怎么显示共享资源都可以的,所以实现A文件夹你们组看不见而经理组看得见;
老总的配置文件对共享资源A设置read only,老总就不能写了;
经理的个人配置文件对共享资源都放开写权限,但由于系统权限限制,实现各自经理写自己的目录读其他两个目录。

ok,完全实现需求。
你少了一个管理员,在你的设置里,管理员成了other,也许是我没说清楚,这个管理员是工程部的管理员,不能获得我们服务器的root权限的.而且一旦他用了root权限,那么文件的所有者就变成了root了,组也不是经理组了.
这个权限设置很绕... :em20 至少我是这么认为
多一个管理员也能够的。
a,b,c3个目录住属性设置成3个经理的私有组,管理员加入3个经理的私有组,目录属性775并设置SGID位。
P4M 2.4GHz 256+512MDDR IGP340M共享64M
越来越喜欢beryl了,把我的桌面扩展得好大呀!
cfk
帖子: 6
注册时间: 2007-08-09 14:16

#7

帖子 cfk » 2007-12-14 22:39

:)
上次由 cfk 在 2007-12-14 22:43,总共编辑 1 次。
头像
zhangsuheng
帖子: 59
注册时间: 2007-11-21 10:50

#8

帖子 zhangsuheng » 2007-12-14 22:40

775,就是我的rdteam也能看他们工程部的东西了?
有一个我们研发部的组不能看他们整个文件夹A啊
还有SGID,我认为是很危险的行为,公司也明文规定,机要部门文件不允许使用SUID,SGID,包括SMB里的force user
SUID
当设置了 SUID 位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有超级用户的特权了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。

SGID
与上面的内容类似。文件运行时,运行者将具有所属组的特权。

很明显,作为服务器的主管理员,我就看不出历史了,谁干的坏事都不知道...
winter009
帖子: 1
注册时间: 2006-07-16 13:29

#9

帖子 winter009 » 2007-12-14 22:57

可否留下具体联系方式,深入探讨一下这个问题
ino1
帖子: 266
注册时间: 2006-10-28 18:05

#10

帖子 ino1 » 2007-12-14 23:14

zhangsuheng 写了:775,就是我的rdteam也能看他们工程部的东西了?
有一个我们研发部的组不能看他们整个文件夹A啊
还有SGID,我认为是很危险的行为,公司也明文规定,机要部门文件不允许使用SUID,SGID,包括SMB里的force user
SUID
当设置了 SUID 位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有超级用户的特权了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。

SGID
与上面的内容类似。文件运行时,运行者将具有所属组的特权。

很明显,作为服务器的主管理员,我就看不出历史了,谁干的坏事都不知道...
洗澡回来。
虽然是775,你研发的系统管理员也看不见他们的东西,只要记住采用用户配置文件,你部们的用户更本就没有加载人家的共享资源。同样由于使用用户配置文件,他们工程部只要在配置文件中没有加载你部门的共享资源,他们也是看不见的。用户配置文件是samba灵活应用的精髓,每个用户只加载自己需要的共享文件,干净、省事,哪里还会满屏幕的共享资源列表。
SGID的确有一定的危险。但是,其实作为文件服务器,我根本就没给文件服务器用户登录系统shell的权利,无论你使用哪一个帐号建立的文件,都不可能在服务器上运行的。显然,你的这些需求也是没必要给工程部用户登录系统shell的权利的,他们爱在客户端怎么折腾都可以的,对服务器没有丝毫影响。

附注,如果对用户配置文件不很清楚,可以参见CU论坛的samba专区,精华贴里有。
上次由 ino1 在 2007-12-14 23:17,总共编辑 1 次。
P4M 2.4GHz 256+512MDDR IGP340M共享64M
越来越喜欢beryl了,把我的桌面扩展得好大呀!
cfk
帖子: 6
注册时间: 2007-08-09 14:16

#11

帖子 cfk » 2007-12-14 23:16

winter009 写了:可否留下具体联系方式,深入探讨一下这个问题
请问是不是中科院的牛博?

前些日子你那儿的 symbol processing machine 流片了吗?
头像
zhangsuheng
帖子: 59
注册时间: 2007-11-21 10:50

#12

帖子 zhangsuheng » 2007-12-14 23:18

服务器隶属于我们RDteam,所以,我们rdteam是有权力直接ssh上服务器的,那么你的755就没辙了...但是工程部是只给我们文件服务器的需求,所以他们不会拥有shell的.这么看来,还是没解决文件权限的问题....所以说,我现在寄希望于acl了,不然我会抓狂的...
ino1
帖子: 266
注册时间: 2006-10-28 18:05

#13

帖子 ino1 » 2007-12-14 23:35

zhangsuheng 写了:服务器隶属于我们RDteam,所以,我们rdteam是有权力直接ssh上服务器的,那么你的755就没辙了...但是工程部是只给我们文件服务器的需求,所以他们不会拥有shell的.这么看来,还是没解决文件权限的问题....所以说,我现在寄希望于acl了,不然我会抓狂的...
有ssh要求的确不敢SGID了。
那么,就把需求适当变通一下,从我的经验来看,其实用户蛮喜欢有个自己的主目录的,很方便用户自己快速定位自己的资源。所以,只要工程部愿意接受共享资源列表中出现他们每个用户的主目录,问题就很简单了:
把A设置成管理员的主目录,abc分别是经理们的主目录。当然,各个目录的组属性都是工程部,权限都是770,为了保证各用户建立的文件的组属性不零乱,还是得SGID的,不过,由于other为0,即使研发ssh上去也是没法进入的。
这样,管理员的配置文件只有[home],老总的则只有[工程部]并限制为只读,经理们则有[home]和只读的[工程部]。
只是,这和你的需求的确有小小的不同,但是,这样的改进其实很受用户欢迎的。想一想,经理a一登录就可以直达他的目录a,他何乐而不为呢?
P4M 2.4GHz 256+512MDDR IGP340M共享64M
越来越喜欢beryl了,把我的桌面扩展得好大呀!
头像
zhangsuheng
帖子: 59
注册时间: 2007-11-21 10:50

#14

帖子 zhangsuheng » 2007-12-14 23:38

以后目录复杂了就不好办了,这还只是刚开始,以后文件多了,分类会更细.而且能阅读的人也不仅限这些了.
ino1
帖子: 266
注册时间: 2006-10-28 18:05

#15

帖子 ino1 » 2007-12-14 23:54

zhangsuheng 写了:以后目录复杂了就不好办了,这还只是刚开始,以后文件多了,分类会更细.而且能阅读的人也不仅限这些了.
这倒是实情。能够解决复杂的文件权限的只能靠ACL。
其实事情的发展远没有想象的那么复杂,因为公司的框架基本是不变的,而用户配置文件的运用使得可以很轻松的更改特定用户的共享资源性质。所以,我使用samba3年了也还没必要用上ACL。
不过,现在ACL已经比较成熟了,是得为扩展作一些准备的。
P4M 2.4GHz 256+512MDDR IGP340M共享64M
越来越喜欢beryl了,把我的桌面扩展得好大呀!
回复