话说SAMBA服务器,那可真不是一般的难于配置啊!闲话不说了,先说说我们的应用情况:

  • 共享的目录是,servershare

  • 共享的权限是,匿名用户可读,其他一堆认证的用户可写。

实现思路:

  • 首先,要求匿名可读,没得说,那必然的全局的[global]段security取值必须是share才行。

  • 接着,要求有人可写,那么共享的[share]段中,read only取值必须是no(或者writable必须是yes,注意不是writeable)。

  • 最后,矛盾出现了,SAMBA的读写字段不是针对用户的,那对整个段的用户都有效。而valid user又不是针对读或写的,而是读写一起限制的。

如何处理这个问题呢?用POSIX权限!

根据【思路】中的分析,前两项是必须设置的。设置好了之后,看起来是所有用户可读可写了。

其实不然,在SAMBA中,匿名用户是当作nobody(如果没有设置[global]段的guest项的话)用户的。所有的操作都是以nobody用户在SAMBA服务器上的权限限制下实行的。

比如这里SAMBA虽然给了匿名用户读写权限,但是如果你把share共享的物理路径设置为nobody无法读写的话,nobody照样死翘翘。所以我们的解决办法就有了:

  • 按照【思路】设置前两项,使得所有用户都可读写;

  • 给将所有可写的用户建立一个用户组share_grp,将这些用户加到组里;

  • 将共享目录share的权限设置为0775,属组为share_grp;这样就能保证只有该组的用户、以及创建目录(通常是管理员)的用户具备写权限,nobody是不行的;

  • 在share段添加create mask项,值为0664,添加directory mask项,值为0775,这样保证以后SAMBA客户端创建的文件也符合第3项的要求;

  • 在share段添加valid users项,值包括所有的认证用户和nobody。

  • 打完收工!

说点题外话:

服务器这边这么设置就可以了。但是对于客户端,就需要看人品了。尤其是一会儿用匿名用户,一会儿又用认证用户的情况,基本上很崩溃。因为Windows有个不知道算是好还是恶心的特性——记忆和自动设置网络访问权限。简单的说就是只要匿名用户可以读取,那么他就上匿名用户,不会提示你输入账户和密码。就算是你通过手动映射网络驱动器的方式,如果此前有用匿名成功访问过,他也会忽视你新设置的用户名。而且重新注销后会自动沿用这一匿名用户优先的规则

解决办法就是首先退出所有和服务器的联接,注销重新登录,然后直接从命令行指名道姓的用XXX用户和XXX密码映射驱动器,方法如下: