Fedora Core/RedHat Linux提供的软件包

samba  ——samba服务器ruanjianbao

samba-client ——samba客户端工具

samba-common —— 通用工具和库,不管是客户机还是服务器都需要的组件

安装Samba软件包

- 安装rpmdb-fedora/rpmdb-redhat软件包
# rpm -ivh rpmdb-fedora*.rpm                   (主要是解决samba的包依赖问题,samba安装依赖rpmdb)

- 安装samba软件包(Fedora在Packages目录下,rhel5.4在Server目录下)

按照教程上的解说,对于Fedora Core 1,安装samba需要先安装rpmdb-fedora,然后使用如下安装命令:

rpm -ivh --aid samba*.rpm 这里的--aid是使用rpmdb进行辅助安装,缺少什么包自动安装。

使用rpm -qa | grep samba 查询安装的samba软件包,-qa是查询所有软件包,grep进行过滤。

使用rpm -ql samba 查询samba服务器的列表,列出samba服务器的所有文件。

我在rhel5.4上安装samba,安装client和common正常:

android samba实现 android samba客户端_共享目录

而且,不需要安装rpmdb包,而且也找不到这个包,应该集成了,直接使用rpm -ivh -aid samba*.rpm也是可用的。

安装samba服务器的时候出现问题,出现文件依赖:

android samba实现 android samba客户端_客户端_02

依赖perl,而且出现警告,不知道这个警告什么意思。

使用-aid不管用

android samba实现 android samba客户端_服务器_03

手工安装perl(Convert::ASN1):使用ls perl* -m,查看有这样一个文件:

android samba实现 android samba客户端_服务器_04

perl-Convert-ASN1-0.20...安装这个文件:

android samba实现 android samba客户端_android samba实现_05

安装samba服务器成功。

android samba实现 android samba客户端_共享目录_06

/etc/rc.d/init.d/smb是samba的系统启动脚本,其他/etc下的是配置文件,/usr/sbin/nmbd程序提供名称解析服务,提供一个输出的共享名,能够代替wins服务,提供身份验证,索引共享目录等,   /usr/sbin/smbd程序主要是提供传输数据功能,也就是说samba提供了两个服务器。

samba的最权威的帮助文档:

android samba实现 android samba客户端_服务器_07

三个pdf文档。

查看samba的客户端安装程序:

android samba实现 android samba客户端_客户端_08

Samba客户端工具

- smbtree : 作用,显示局域网中的所有共享主机和目录列表。   用法: smbtree [-b] [-D]  [-U username%password]

- nmblookup :作用,显示一台主机的netbios主机名

- smbclient :作用,显示/登录局域网中的共享文件夹。  用法:smbclient -L host            /          smbclient   //host/share

- smbtar :作用,远程备份网上邻居中的文件(需要稍作修改)。用法:smbtar -s server -u user -p password  -x sharename -t output

例子:smbtar -s win2000 -u redhat -p redhat -x shareddoc -t shared.tar

smbtree,相当于在windows中双击网上邻居,查看工作组计算机

android samba实现 android samba客户端_android samba实现_09

smbtree -b,选项-b表示使用广播的方式,而不是用wins服务器,如果只想显示域和工作组名,使用-D选项,Domain

android samba实现 android samba客户端_服务器_10

nmblookup,解析主机的位置,显示主机的ip地址,

android samba实现 android samba客户端_android samba实现_11

使用smbclient查看共享的目录

android samba实现 android samba客户端_android samba实现_12

这是在windows中设置了来宾账户,即guest账户,可以看到,如果仅用guest用户,如下:

android samba实现 android samba客户端_android samba实现_13

看不到了,启用guest账户,并设置密码,测试:

android samba实现 android samba客户端_共享目录_14

或者

android samba实现 android samba客户端_服务器_15

登录共享目录,查看共享内容:

android samba实现 android samba客户端_客户端_16

出现smb:\>说明登录成功,也可以直接使用ip地址进行登录:

android samba实现 android samba客户端_共享目录_17

下载一个文件,上传一个文件:

android samba实现 android samba客户端_客户端_18

下载一个文件使用get ,上传使用put,注意第一次put没有成功,因为我共享目录没有设置写权限。第二次成功,写权限放开。put命令要带两个参数。

如果想要跟访问本地目录一样,可以使用挂载命令:

android samba实现 android samba客户端_android samba实现_19

使用mount.cifs命令挂载,使用计算机名时,一直挂载不上,使用ip很快就挂载上了。因为共享设置了用户、密码,当不输入用户、密码时,提示权限不允许。挂载后,就可以跟操作本地目录一样来操作远程的资源了。

卸载目录:

android samba实现 android samba客户端_服务器_20

使用smbtar命令备份共享的目录:

android samba实现 android samba客户端_服务器_21

Samba服务器的配置

- 修改配置文件/etc/samba/smb.conf

workgroup = workgroup

security = share

[docs]

        path = /usr/share/doc

        comment = share documents

        public = yes

- 重新启动smb服务器

#service smb restart

#chkconfig smb on

测试

#smbclient -L localhost

smb.conf文件有两种注释,#开头的注释是说明性文字,;分号开头的是配置项注释

测试:

android samba实现 android samba客户端_android samba实现_22

在winxp的网上邻居中可以看到Samba Server Version 3.0.33-3.14.el5

android samba实现 android samba客户端_共享目录_23

但是双击无法打开。

android samba实现 android samba客户端_客户端_24

不知道什么问题。

经过查找,这个问题得到解决,是因为linux服务器启动了防火墙的原因,关闭防火墙:service iptables stop,然后访问:

android samba实现 android samba客户端_客户端_25

但是在双击docs共享目录时,又出现了上面的错误画面,只不过是提示变成了:\\Cdserver\docs无法访问。

Samba文件服务器

- Windows的网上邻居

    - 基本概念
    - 共享与访问共享

- Samba工具集

    - samba软件与工具介绍
    - samba为windows提供共享

- Samba文件服务器

    - 安全级别
    - 用户账号与认证

Windows的网上邻居工作原理:通过SMB协议共享传输文件,具有自己的主机名称解析系统(wins),SMB(Server Message Block)/CIFS(Common Internet File System)是基于Netbios协议的,所以不能够跨越子网通信。
服务器端:提供名字查询服务,输出共享文件列表,对客户端用户认证授权
客户端:寻找能够访问的资源,请求验证,请求访问文件和目录
浏览服务器;提供所有主机名和工作组名的缓冲服务

基本概念:

主机名——局域网中的netbios主机名,在局域网中唯一;
共享名——共享资源(目录/打印机)的名称,主机中唯一;
工作组名——主机的组织机构名,主机间地位平等;
域名——主机的认证管理机构名称,客户端主机需要域服务提供认证、浏览、共享服务。

网上邻居的认证模式

- 工作组模式

用户账号分别存储在每台主机上,只有通过对方主机的认证授权才能访问对方的共享资源

- 域服务器模式

用户账号几种存储在域服务器,每台主机都要经过域服务器认证授权才能访问其他主机上的资源

Windows中访问网上邻居

- Win98/2000/xp需要安装TCP/IP,NETBEUI,IPX/SPX其中任意一种协议,但跟linux共享网上邻居必须安装TCP/IP
- 从网络邻居中寻找到“工作组”,“主机名”,“共享目录名”
- 直接在浏览器地址栏中输入\\server\sharedname

Linux中访问网上邻居

- 需要Samba客户端软件的支持
- 使用挂载的方法:# mount -t smbfs  //server/sharename  /localdir  或者  #mount.cifs //server/sharename   /localdir
- 使用smbclient  :#smbclient //server/sharename -U name%passwd

Samba的用户账号——访问控制

一)全局访问控制

[global]

    hosts deny = ALL
    hosts allow = 10.0.0.

二)局部访问控制

[docs]
    hosts deny = 10.0.0.
    hosts allow = 10.0.0.21
[redhat]
    hosts allow = 10.0.0.
    hosts deny = 10.0.0.21(失效)

允许优先

三)共享目录设置有效用户

[redhat]
    path = /var/redhat
    commnet = redhat's files
    valid users = <username>  <@groupname>

四)新建Samba用户

    #useradd username
    #smbpasswd -a username

五)用户账号映射

[global]
    username map = /etc/samba/smbusers
    #smbuseradd unixname:mapname

smbuseradd命令在高版本中不存在,直接编辑/etc/samba/smbusers文件。

实验:

修改public为no,不允许匿名用户访问

android samba实现 android samba客户端_共享目录_26

一般默认的所有共享目录,为了安全public都是no。

设置一个允许特定用户访问的共享目录:

android samba实现 android samba客户端_共享目录_27

这里public设置no,不允许匿名,valid users设置允许访问的有效用户,有两种:一种是用户,直接写用户名,如redhat  tom,多个用户中间用空格分开,一种是组,需要用@符号加组名,如 @root组。这里设置用户redhat。配置文件修改完毕后,需要增加用户到samba的账号数据库中。

samba用户首先必须是系统用户,所以需要先用useradd username添加系统用户。

然后用smbpasswd -a username添加用户到samba用户数据库。关于samba用户账户数据库的配置,在全局配置中,增加:passdb backend = tdbsam项(看到网上有这种配置smb password file =/ect/samba/smbpassword,这可能是老版本的一种配置方式,指定具体的账户文件,网上一说明:设定samba服务器访问和存储samba用户账号的后端,在samba-3.0。23之前的默认值为smbpasswd,而之后的默认值为tdbsam。)

passdb backend = tdbsam
说明:passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam应该是security account manager(安全账户管理)的简写。
1.smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实
用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。
2.tdbsam:该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户。pdbedit命令的参数很多,我们列出几个主要的。
pdbedit –a username:新建Samba账户。
pdbedit –x username:删除Samba账户。
pdbedit –L:列出Samba用户列表,读取passdb.tdb数据库文件。
pdbedit –Lv:列出Samba用户列表的详细信息。
pdbedit –c “[D]” –u username:暂停该Samba用户的账号。
pdbedit –c “[]” –u username:恢复该Samba用户的账号。
3.ldapsam:该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend = ldapsam:ldap://LDAP Server

一种用法,在passdb backend = smbpasswd后,在设置smb password file =/ect/samba/smbpassword,指定具体的位置

使用smbpasswd增加samba用户:

android samba实现 android samba客户端_客户端_28

使用tdbdump可以查看passdb.tdb内容,添加前没有用户,添加后多了redhat用户。测试使用smbpasswd参数

android samba实现 android samba客户端_共享目录_29

可以看到,samba的用户写在/etc/samba/smbpasswd文件中了。

按照这种配置后:

[global]

        workgroup = workgroup
        server string =Cd Samba Server Version %v

        security = share
        passdb backend = tdbsam

[docs]
        path = /root/abcd
        comment = share docments
        public = no

[redhat1]
        path = /root/redhat1
        comment = redhat'sfiles
        public = no
        valid users = redhat

在xp的网上邻居双击Cdserver主机,出现了两个共享目录docs和redhat1,双击任意目录,出现:


android samba实现 android samba客户端_服务器_30


不明白为什么登录用户默认成Cdserver\Guest,没有这个用户,怎么登陆呢????

通过不停地测试,终于解决了问题,首先是docs不能访问的问题,这个问题的原因在于共享的linux实际目录,我这里设置的是/root/docs,因为使用的是root用户,直接就建在它的目录下了,而把这个目录改一下,设为/opt/docs,问题迎刃而解,可以访问了。只要在root目录下的共享,不管怎样设置好像都有问题,所以共享目录不要设置在/root下。

然后是共享的文件夹的权限问题,对于匿名访问的共享文件夹,其权限其他用户的权限一定要有读和执行的权限

android samba实现 android samba客户端_android samba实现_31

这是可以浏览匿名共享文件夹的必须权限,只给读写不行,只给写执行也不行,否则就会在网上邻居双击报无法访问的错误,匿名共享文件夹权限只涉及其他用户,对属主和组的权限没有要求,如果想要匿名共享文件夹具有写的权限,其一,这个目录的权限要有写权限,即授权chmod 0xx7,这里xx随意,其二,要在配置文件中设置writable = yes,只设其一也不行。

当browseable设置为browseable = no 时,在共享目录列表中就看不到共享的文件夹了。但是可以通过手工的方式输入,如

android samba实现 android samba客户端_共享目录_32

docs共享看不到:

android samba实现 android samba客户端_android samba实现_33

但可以手工输入:

android samba实现 android samba客户端_服务器_34

到此,匿名访问的问题解决了,然后看非匿名访问,这时要将security 设置为security = user

android samba实现 android samba客户端_客户端_35

其他都不动,效果是:双击网上邻居中的samba服务器主机时,弹出输入用户及密码的对话框(使用user模式,就是进入主机时进行用户身份验证,然后通过这个身份在各个共享目录上的权限进行相应操作):

android samba实现 android samba客户端_服务器_36

下面就是设置samba用户的知识了。

关于public:(网上搜到的一个说明)指明该共享资源是否能给游客帐号访问,这个开关有时候也叫guest ok,所以有的配置文件中出现guest ok = yes其实和public = yes是一样的。我做了一个实验,在security设置为share时,将public设为no,去掉guest ok = yes,docs无法访问了,再添加上guest ok = yes,又可以访问了(guest设置在public之后,否则在其之前设置,一样无法访问)。

继续吧,一个安全问题,我们添加samba用户时,此用户必须先是一个系统用户,这样的话,就将系统用户暴漏出去了。为此,使用一个用户账号映射,来防止这个问题。建立一张映射表,映射虚拟账号和系统用户账号(samba用户账号),将虚拟账号暴漏给访问者。

这个需要在配置文件中作如下配置:username map = /etc/samba/smbusers

然后使用smbuseradd  unixname : mapname增加账号映射。这个命令在rhel中已经取消,可以手工编辑smbusers文件

配置文件,增加用户名映射文件

android samba实现 android samba客户端_客户端_37

编辑/etc/samba/smbusers,

android samba实现 android samba客户端_共享目录_38

可以看到已经存在两个映射了,添加redhat映射。一个用户变成两个。

将security设置为user,各共享目录设置如下:

android samba实现 android samba客户端_客户端_39

运行结果:

android samba实现 android samba客户端_客户端_40

输入jack,密码123,(不管是tom 还是jack,后台使用的都是redhat这个系统用户,这是/etc/samba/smbusers这个映射文件的功劳)

然后,docs能够访问,并可读写,因为docs本来就是可匿名访问的,不管哪个用户登录,都能访问到,redhat是用户的home目录,虽然是jack登录,但后台用的依然是redhat,所以看到的home目录就是redhat(这里有个问题,前面使用映射文件要解决的安全问题,在这里如果共享home目录,也能暴露系统用户,所以最好禁用home的共享。)redhat1还是无法访问,这是因为共享目录在/root下的问题,temp1能够访问,但是不能写,查看其权限:

android samba实现 android samba客户端_共享目录_41

如上的授权测试都不行,修改共享配置,增加writable = yes,则其他用户权限是7可以写了,或者是修改属主:chown redhat /temp1,也可以写。

使用mount.cifs //192.168.1.23/temp1 /mnt/d1 -o username=tom%123也能成功挂载。

关于home目录:

android samba实现 android samba客户端_android samba实现_42

home目录没有path配置项。默认是用户的home目录,如redhat用户的home目录就是/home/redhat,它是随着不同的用户而变化的。%S代表属主,这个目录只对属主开放,所以可以不用设置,默认就行。

关于samba用户的权限:write list =  ,列出具有写权限的用户。

android samba实现 android samba客户端_android samba实现_43

redhat和user1用户都可以访问test目录,但是只有redhat具有写权限。

经过测试,只有redhat能写,user1只能读,不能写。

关于属主的问题:

android samba实现 android samba客户端_android samba实现_44

对于老版本,如上操作后,在ls挂载的目录和ls实际目录时,文件的属主不同,在客户端,用户是root,写入挂载的目录/mnt/d1时,显示的属主和组是root,显示/test时,属主和组是redhat。在3.0版本没有这个问题,显示都是redhat,即客户端的用户不影响samba的用户属主。

对于write list,一个文件不能即属于这个属主,有属于那个属主,所以一般用一个用户和一个组的形式:

valid user = redhat @redhat
write list = redhat @redhat,否则文件或文件夹的权限就要设置其他用户的读写访问权限。

对于客户端写入的文件或创建的文件夹,默认权限,文件夹:

drwxr-xr-x 2 redhat redhat 0 Jul 22 08:19 new  属主可读写执行,用户组和其他用户都是可读可执行,对于新建的文件:

-rwxr--r-- 1 redhat redhat 0 Jul 22 08:20 new.txt 属主可读写执行,组合其他用户可读。

可以通过修改配置改变这一默认权限:

create mask = 0660   修改创建文件的默认权限
directory mask = 0770   修改创建的文件夹的默认权限

android samba实现 android samba客户端_客户端_45

创建文件和文件夹:

android samba实现 android samba客户端_服务器_46

其权限分别改为了0770和0660。

注意:客户端所有的请求访问身份在服务器端都会映射成登陆账号的身份。

测试工具:testparm。检测配置文件语法是否有错误。

android samba实现 android samba客户端_共享目录_47

可以看到valid user有问题,正确的应该是valid users,修改一下

android samba实现 android samba客户端_服务器_48

成功。

想要看一下某一个客户机对samba的访问情况

android samba实现 android samba客户端_服务器_49

samba配置文件:

[global]字段

[home]

[]用户自定义目录

网上参考资料:

=====================================================================

全局设置:

  workgroup = MYGROUP
  定义该Samba服务器所在的工作组或者域(如果下面的security=domain的话)。

  server string = MY Samba Server
  设定机器的描述,当我们通过网络邻居访问的时候可以在备注里面看见这个内容,而且还可以使用samba设定的变量。这里说一下samba定义的变量:

         netbios name = server   
        设定机器的ntbios名称

  %S = 当前服务名(如果有的话)
  %P = 当前服务的根目录(如果有的话)
  %u = 当前服务的用户名(如果有的话)
  %g = 当前用户说在的主工作组
  %U = 当前对话的用户名
  %G = 当前对话的用户的主工作组
  %H = 当前服务的用户的Home目录
  %v = Samba服务的版本号。
  %h = 运行Samba服务机器的主机名
  %m = 客户机的NETBIOS名称
  %L = 服务器的NETBIOS名称
  %M = 客户机的主机名
  %N = NIS服务器名
  %p = NIS服务的Home目录
  %R = 说采用的协议等级(值可以是CORE, COREPLUS, LANMAN1, LANMAN2,NT1)
  %d = 当前服务进程的ID
  %a = 客户机的结构(只能识别几项:Samba,WfWg,WinNT,Win95)
  %I = 客户机的IP
  %T = 当前日期和时间

  hosts allow = 网络或者主机
  这里可以设置允许访问的网络和主机IP,比如允许192.168.1.0/24和 192.168.2.1/32访问,就用host allow = 192.168.1. 192.168.2.1 127.0.0.1(网络注意后面加”.”号,各个项目间用空格隔开,记得把本机也加进去)

  printcap name = printcapFile
  到printcapFile(一般是/etc/printcap)这个文件中取得打印机的描述信息

  load printers = yes|no
  设定是否自动共享打印机而不用设置下面的[printer]一节的相关东西

  printing = PrintSystemType
  定义打印系统的类型,缺省是lprng,可选项有:bsd, sysv, plp, lprng, aix, hpux, qnx。

  guest account = pcguest
  定义游客帐号,而且需要把这个帐号加入/etc/passwd,不然它就用缺省的nobody

  log file = LogFileName
  定义记录文件的位置LogFileName(一般是用/var/log/samba/%m.log)

  max log size = size
  定义记录文件的大小size(单位是KB,如果是0的话就不限大小)

  security = security_level
  定义Samba的安全级别,按从低到高分为四级:share,user,server,domain。它们对应的验证方式如下:

  share:没有安全性的级别,任何用户都可以不要用户名和口令访问服务器上的资源。
  user:samba的默认配置,要求用户在访问共享资源之前资源必须先提供用户名和密码进行验证。
  server:和user安全级别类似,但用户名和密码是递交到另外一个服务器去验证,比如递交给一台NT服务器。如果递交失败,就退到user安全级。
  domain:这个安全级别要求网络上存在一台Windows的主域控制器,samba把用户名和密码递交给它去验证。
  后面三种安全级都要求用户在本Linux机器上也要系统帐户。否则是不能访问的。

  password server =
  当前面的security设定为server或者domain的时候才有必要设定它。

  password level = n
  这是设定针对一些SMB客户像OS/2之类而设的,这样的系统在发送用户密码的时候,会把密码转换成大写再发送,这样就和samba的密码不一致,这个参数可以设定密码里允许的大写字母个数,这样samba就根据这个数目对接收到的密码进行大小写重组,以重组过的密码尝试验证密码的正确性。n越大,组合的次数就越多,验证时间就越长,安全性也会因此变得越低。例如n=2,用户的密码是 abcd,但发送出去其实是ABCD,samba就会把这个ABCD进行大小写重组,组合后的结果可以是: Abcd, aBcd, abCd, abcD, abcd, ABcd, AbCd, AbcD,aBCd,aBcD,abCD。

  所以如果没有必要,就把n定为是零。这样的话samba只尝试两次,一个是接收到的密码,另一个尝试的是这个密码都是小写的情况。

  username level = n
  这个是对于用户名的情况,说明和上面一项类似。

  encrypt passwords = yes|no
  设置是否对密码进行加密,samba本身有一个密码文件 /etc/samba/smbpasswd,如果不对密码进行加密则在验证会话期间客户机和服务器之间传递的是明文密码,samba直接把这个密码和 Linux里的/etc/samba/smbpasswd密码文件进行验证。但是在Windows 95 OS/R2以后的版本和Windows NT SP3以后的版本缺省都不传送明文密码,要让这些系统能传送明文密码必须在其注册表里更改,比较麻烦,好的方法就是把这里的这个开关设置为yes。否则,需要在windows修改注册表,改为明文密码形式

  smb passwd file = smbPasswordFile
  设置存放samba用户密码的文件smbPasswordFile(一般是/etc/samba/smbpasswd)。

  ssl CA certFile = sslFile
  当samba编译的时候支持SSL的时候,需要指定SSL的证书的位置(一般在/usr/share/ssl/certs/ca-bundle.crt)。

  unix password sync = yes|no
  passwd program = /usr/bin/passwd %u
  passwd chat = *New*UNIX*password* %n
  *ReType*new*UNIX*password* %n
  *passwd:*all*authentication*tokens*updated*successfully*
  这三项设置能否从windows的应用程序修改unix系统的用户密码

  username map = UsermapFile
  指定用户映射文件(一般是/etc/samba/smbusers),当我们在这个文件里面指定一行root = administrator admin的时候,客户机的用户是admin或者administrator连接时会被当作用户root看待。

  include = MachineConfFile
  指定对不同机器的连接采用不同的配置文件MachineConfFile(一般为了灵活管理使用/etc/samba/smb.conf.%m,由于采用了samba的变量,把配置文件和客户机的NETBIOS名称关联起来,能很容易地控制这些客户机的权限和设置)。

  socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
  这个是网络socket方面的一些参数,能实现最好的文件传输性能。相关的选项还有 SO_KEEPALIVE、 SO_REUSEADDR、SO_BROADCAST、IPTOS_LOWDELAY、IPTOS_THROUGHPUT、SO_SNDLOWAT (*)、SO_RCVLOWAT(*),带*号的要指定数值。一般如果在本地网络,就只用IPTOS_LOWDELAY,如果是有一个本地网络的,就用 IPTOS_LOWDELAY TCP_NODELAY,如果是广域网络,就试试IPTOS_THROUGHPUT。

  interfaces = interface1 interface2
  如果有多个网络接口,就必须在这里指定。如interface = 192.168.12.2/24 192.168.13.2/24

        wins support = yes 启用本地  wins服务器  

      wins server = w.x.y.z 设置wins服务器

以上两句不能同时设置

    wins proxy = yes

      dns proxy = yes

wins服务器,解析netbios名与ip地址的对应关系。

  remote browse sync = host(subnet)
  这里指定浏览列表同步信息从哪里取得, 如果用host(比如192.168.3.25)或者整个子网(192.168.5.255)。

  ★这里说明一下什么是浏览(Browse):
  在SMB协议中,计算机为了访问网络资源,就需要了解网络上存在的资源列表(例如在 Windows下使用网络邻居查看可以访问的计算机),这个机制就被称为浏览(Browse)。虽然SMB协议中经常使用广播的方式,但如果每次都使用广播的方式了解当前的网络资源(包括提供服务的计算机和各个计算机上的服务资源),就需要消耗大量的网络资源和浪费较长的查找时间,因此最好在网络中维护一个网络资源的列表,以方便查找网络资源。只有必要的时候,才重新查找资源,例如使用Windows下的查找计算机功能。
  但没有必要每个计算机都维护整个资源列表,维护网络中当前资源列表的任务由网络上的几个特殊计算机完成的,这些计算机被称为Browser,这些Browser通过记录广播数据或查询名字服务器来记录网络上的各种资源。
  Browser并不是事先指定的计算机,而是在普通计算机之间通过自动进行的推举产生的。不同的计算机可以按照其提供服务的能力,设置在推举时具备的不同权重。为了保证一个Browser停机时网络浏览仍然正常,网络中常常存在多个 Browser,一个为主Browser(Master Browser),其他的为备份Browser。★

  remote announce = host(subnet)
  指定这些机器向网络宣告自己,而不是有Browser得到。

  local master = yes|no
  这个参数指定nmbd是否试图成为本地主浏览器,默认值是yes,如果设为no则samba服务器就永远都不会成为本地主浏览器。但即使设置了yes,也不等于samba服务器就会成为本地主浏览器。只是参与本地主浏览器选择。

  os level = n
  n的值是个整数,决定了nmbd是否有机会成为本地广播区域的工作组里的本地主浏览器,默认值是零,零则意味着nmbd失去浏览选择。如果要nmbd更有机会成为本地主浏览器的话,可以设为65。

  domain master = yes|no
  这个参数让nmbd成为一个域浏览器,取得各本地主浏览器的浏览列表,并将整个域的浏览列表递交给各本地主浏览器。

  preferred master = yes|no
  这个参数指定nmbd是否是工作组里的首要的主浏览器,如果指定为yes,nmbd在启动的时候就强制一个浏览选择。

  ★Domain master和local master
  工作组和域这两个概念在进行浏览时具备同样的用处,都是用于区分并维护同一组浏览数据的多个计算机。事实上他们的不同在于认证方式上,工作组中每台计算机都基本上是独立的,独立对客户访问进行认证,而域中将存在一个(或几个)域控制器,保存对整个域中都有效的认证信息,包括用户的认证信息以及域内成员计算机的认证信息。浏览数据的时候,并不需要认证信息,Microsoft将工作组扩展为域,只是为了形成一种分级的目录结构,将原有的浏览和目录服务相结合,以扩大Mircrosoft网络服务范围的一种策略。
  工作组和域都可以跨越多个子网,因此网络中就存在两种Browser,一种为 Domain Master Browser ,用于维护整个工作组或域内的浏览数据,另一种为Local Master Browser,用于维护本子网内的浏览数据,它和Domain Master Browser通信以获得所有的可浏览数据。划分这两种Browser 主要是由于浏览数据依赖于本地网广播来获得资源列表,不同子网之间只能通过浏览器之间的交流能力,才能互相交换资源列表。
  但是,为了浏览多个子网的资源,必须使用NBNS名字服务器的解析方式,没有 NBNS的帮助,计算机将不能获得子网外计算机的NetBIOS名字。Local Master Browser也需要查询NetBIOS名字服务器以获得Domain Master Browser的名字,以相互交换网络资源信息。
  由于域控制器在域内的特殊性,因此域控制器倾向于被用做Browser,主域控制器应该被用作Domain Master Browser,他们在推举时设置的权重较大。★

  preserve case = yes|no
  short preserve case = yes|no
  指定拷贝DOS文件的时候保持大小写,缺省是no

  default case = lower|upper
  所有的DOS文件的缺省是大写还是小写

  case sensitive = yes|no
  大小写敏感,一般是no,不然会出现一些问题。

  三、共享设置:

  ★共享资源:
  每个SMB服务器能对外提供文件或打印服务,每个共享资源需要被给予一个共享名,这个名字将显示在这个服务器的资源列表中。如果一个资源的名字的最后一个字母为$,则这个共享名就为隐藏共享,不能直接表现在浏览列表中,而只能通过直接访问这个名字来进行访问。在SMB协议中,为了获得服务器提供的资源列表,必须使用一个隐藏的资源名字IPC$来访问服务器,否则客户无法获得系统资源的列表。★

  共享设置中有个比较奇怪的段:
  [homes],在smb.conf文件中一般没有对这个目录的设定特定内容比如路径等。当客户机发出服务请求时,就在smb.conf文件的其它部分查找友特定内容的服务。如果没有发现这些服务,并且提供了homes段时,那么就搜索密码文件得到用户的Home目录。通过Homes段,Samba可以得到用户的Home目录并使之共享。下面是这个段的最基本的几个设置。

  [homes]

  comment=Home Directory
  browseable=no
  writable=yes

  比较正常的共享的配置如下例:

  [MyShare]

  comment = grind’s file
  path = /home/grind
  allow hosts = host(subnet)
  deny hosts = host(subnet)
  writable = yes|no
  user = user(@group)
  valid users = user(@group)
  invalid users = user(@group)
  read list = user(@group)
  write list = user(@group)
  admin list = user(@group)
  public = yes|no
  hide dot files = yes|no
  create mode = 0755
  directory mode = 0755
  sync always = yes|no
  short preserve case = yes|no
  preserve case = yes|no
  case sensitive = yes|no
  mangle case = yes|no
  default case = upper|lower
  force user = grind
  wide links = yes|no
  max connections = 100
  delete readonly = yes|no

  其中[]里面的MyShare指定共享名,一般就是网络邻居里面可以看见的文件夹的名字。

  comment指的是对改共享的备注。
  path指定共享的路径,其中可以配合samba变量使用。比如你可以指定path =/data/%m,这样如果一台机器的NETBIOS名字是 grind,它访问MyShare这个共享的时候就是进入/data/grind目录,而对于NETBIOS名是glass的机器,则进入 /data/glass目录。
  allow hosts和deny hosts和前面的全局设置的方法一样这里不再提及。
  writeable指定了这个目录缺省是否可写,也可以用readonly = no来设置可写。
  user设置所有可能使用该共享资源的用户,也可以用@group代表group这个组的所有成员,不同的项目之间用空格或者逗号隔开。
  valid users指定能够使用该共享资源的用户和组。
  invalid users指定不能够使用该共享资源的用户和组。
  read list 指定只能读取该共享资源的用户和组。
  write list指定能读取和写该共享资源的用户和组。
  admin list指定能管理该共享资源(包括读写和权限赋予等)的用户和组。
  public指明该共享资源是否能给游客帐号访问,这个开关有时候也叫guest ok,所以有的配置文件中出现guest ok = yes其实和public = yes是一样的。
  hide dot files指明是不是像unix那样隐藏以“.”号开头的文件。
  create mode指明新建立的文件的属性,一般是0755。
  directory mode指明新建立的目录的属性,一般是0755。
  sync always指明对该共享资源进行写操作后是否进行同步操作。
  short preserve case指明不管文件名大小写。
  preserve case指明保持大小写。
  case sensitive指明是否对大小写敏感,一般选no,不然可能引起错误。
  mangle case指明混合大小写。
  default case指明缺省的文件名是全部大写还是小写。
  force user强制把建立文件的属主是谁。如果我有一个目录,让guest可以写,那么guest就可以删除,如果我用force user= grind强制建立文件的属主是grind,同时限制create mask = 0755,这样guest就不能删除了。
  wide links指明是否允许共享外符号连接,比如共享资源里面有个连接指向非共享资源里面的文件或者目录,如果设置wide links = no将使该连接不可用。
  max connections = n设定同时连接数是n。
  delete readonly指明能否删除共享资源里面已经被定义为只读的文件。

  有两类特殊的共享,分别是光驱和打印机

  光驱的共享设置:

  [cdrom]

  comment = grind’s cdrom
  path = /mnt/cdrom
  public = yes
  browseable = yes
  root preexec = /bin/mount -t iso9660 /dev/cd0 /mnt/cdrom
  root postexec = /bin/umount /mnt/cdrom

  这里root preexec指明了连接时用root的身份运行mount命令,而root postexec则指明了断开时用root身份运行umount,有效实现了对光驱的共享。

  打印机共享的设置:

  [printers]

  path = /var/spool/samba
  writeable = no
  guest ok = yes
  printable = yes
  printer driver = HP LaserJet 5L

  这里printable指明该打印机可以打印, guest ok说明游客也能打印,path指明打印的文件队列暂时放到/var/spool/samba目录下。printer driver的作用是指明该打印机的类型,这样我们在安装网络打印机的时候可以直接自动安装驱动而不必选择。

  添加用户:

  samba添加用户比较方便,一般是用smbadduser,用法是 smbadduser unixid:netid,举个例子:如果你的本机有个叫grind的用户,你用smbadduser grind:grind,这样从网上邻居访问的时候用户名就用grind,而如果你用了smbadduser grind:glass的话,网上邻居访问的时候提供的用户名就是glass而不是grind了。

=========================================================================================================================

对于windows用户,因为security设置为user后,想要访问共享列表,必须输入用户,即使共享的目录设置为了可匿名访问,而对于linux来说不存在这个问题,即使设置了user级别,还是可以列出共享列表,并可以访问设置为了匿名访问的目录。

关于访问控制:

android samba实现 android samba客户端_客户端_50

关于主机的匹配模式,可以看hosts_access帮助。

注意这里允许优先。全局配置和局部配置有允许则拒绝失效。

应用案例

要求:1、所有员工都能够在公司内流动办公,但不管在哪台电脑,都要把自己的文件数据保存在samba文件服务器上
分析:需要samba作为文件服务器,为所有的用户创建账号和目录,用户默认都在服务器上有一个home目录,只有认证通过才能看到

2、市场部、技术部都有各自的目录,同一个部门内部的员工有一个共享目录,其他部门的人只有个人的独立home目录。
分析:需要为市场部和技术部创建不同的组sales和tech,并且分配目录,把所有市场部的员工加入sales组,技术部的员工加入tech组,通过samba共享sales和tech组

3、所有的用户都不允许使用服务器上的shell
分析:建立用户账号的时候,不分配shell

案例实施

1、为所有的用户创建账号和目录,不分配shell。假设市场部有tom,jack,技术部有red、blue,总经理是ceo,财务是finance

2、建组sales和tech,把所有市场部的员工加入sales组,技术部的员工加入tech组。

3、创建两个目录/home/sales和/home/tech,并且修改两个目录的权限,分别属于sales组和tech组

4、通过samba共享/home/sales和/home/tech组

5、测试。


samba共享与自动挂载相结合。