Samba使用大全(一)-samba服务器


   Samba协议基础

   在NetBIOS出现之后,Microsoft就使用NetBIOS实现了一个网络文件/打印服务系统,这个系统基于NetBIOS设定了一套文件共享协议,Microsoft称之为SMB(Server Message Block)协议。这个协议被Microsoft用于它们Lan Manager和Windows NT服务器系统中,实现不同计算机之间共享打印机、串行口和通讯抽象(如命名管道、邮件插槽等)。

   随着Internet的流行,Microsoft希望将这个协议扩展到Internet上去,成为Inter net上计算机之间相互共享数据的一种标准。因此它将原有的几乎没有多少技术文档的SMB协议进行整理,重新命名为 CIFS(Common Internet File System),并打算将它与NetBIOS相脱离,试图使它成为Internet上的一个标准协议。

   因此,为了让Windows和Unix计算机相集成,最好的办法即是在Unix计算机中安装支持SMB/CIFS协议的软件,这样Windows客户就不需要更改设置,就能如同使用Windows NT服务器一样,使用Unix计算机上的资源了。Samba是用来实现SMB的一种软件,它的工作原理是,让NETBIOS(Windows95网络邻居的通讯协议)和SMB(Server Message Block)这两个协议运行于TCP/IP通信协议之上,并且使用Windows的NETBEUI协议让Unix计算机可以在网络邻居上被Windows计算机看到。它的功能有:

   1.共享Linux磁盘给Win95/NT

   2.共享Win95/NT磁盘给Linux机器

   3.共享Linux打印机给win95/NT

   4.共享win95/NT打印机给Linux机器。

   同时它的文件服务功能比NT系统还高,而且在Windows2000之前就提供了用户磁盘空间限制的功能。

   Samba的配置

   在我写这篇文章的时候,Samba的版本已经到了2.2.2了,需要的可以通过

ftp://samba.org/pub/samba/Binary_Pa...011013.i386.rpm

   得到最新的rpm安装包。然后执行rpm -Uvh samba-2.2.2-20011013.i386.rpm来安装或者升级它。安装完后,可以看见/etc/samba这么一个目录,里面存放和Samba相关的一些文件,最主要的是smb.conf,现在根据配置文件讲讲它的配置选项:

   全局设置:

   workgroup = MYGROUP

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

   server string = MY Samba Server

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

   %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。

   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

   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了。

   关于samba服务端的设置基本就是这些,我想一般应用中所要使用的上面几乎都覆盖到了,所以有些不重要的就省略了,如果要更加详细的信息可以用man smb.conf参考。/dev/null

   3.mf_wrapper是一个magic filter文件,是相关的一些过滤规则。内容是:

   MF_RULE_DIR='/usr/share/printconf/mf_rules'

   MF_RULES=$MF_RULE_DIR/mf[[:digit:]][[:digit:]]-*

   TMP_FILE=`mktemp /tmp/printconf.XXXXXX`' 'exit 1

   cat ./mf.cfg $MF_RULES | m4 > $TMP_FILE

   if [ -n "$DEBUG" ]; then

   case "$DEBUG" in

   2)

   DEBUGSTRING="--debug --debug"

   ;;

   3)

   DEBUGSTRING="--debug --debug --debug"

   ;; 4)

   DEBUGSTRING="--debug --debug --debug --debug"

   ;;

   5)

   DEBUGSTRING="--debug --debug --debug --debug --debug"

   ;;

   *)

   DEBUGSTRING="--debug"

   ;;

   esac

   else

   DEBUGSTRING=""

   fi

   # Run magic filter

   /usr/bin/magicfilter-t $TMP_FILE $DEBUGSTRING $*

http://www.linuxaid.com.cn/training...owtod.jsp?i=241


   。这里讲比较有用的使用方法:

   smbclient -L IP或者NETBIOS名称,作用是显示某台提供samba服务的服务器上的共享资源。命令执行效果如下:

   smbclient -L glass

   Sharename Type Comment

   --------- ---- -------

   IPC$ IPC 远程 IPC

   HPLaserJ Printer HP LaserJet 6P

   ADMIN$ Disk 远程管理

   littlep Disk

   C$ Disk 默认共享

   Server Comment

   --------- -------

   GLASS

   GRIND

   Workgroup Master

   --------- -------

   BLUESUN GLASS

   WORKGROUP HEIHEI

   第一段列举了该机器(glass)上面的共享资源,第二段列举了glass所在的工作组里面所有提供samba服务的机器,第三列举了其他工作组提供browse服务的Master机器(关于Master和Browse服务可以参考我的前面一篇samba使用大全-samba服务器)。

   使用网络资源:

   smbclient //IP或者NETBIOS名称/共享资源名 [-U 用户名]

   命令执行效果如下:

   smbclient //glass/littlep

   added interface ip=192.168.1.123 bcast=192.168.1.255 nmask=255.255.255.0

   Got a positive name query response from 192.168.1.123 (192.168.1.123)

   Password:

   Domain=[BLUESUN] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]

   smb: >

   接下来的操作和ftp的时候命令一样,用get下载文件而用put上传文件,命令可以用help查看。

   还有一种方法是用文件系统的方式(这种方式要确定你的内核支持smbfs,如果没有支持的话,编译内核的时候必须选中File systems--->Network File Systems---> SMB file system support (to mount Windows shares etc.) ):

   smbmount //IP或者NETBIOS名称/共享资源名 /本地挂接点 [-o option]

   常用的的option有username=,password=,guest(指定为用guest访问,不用提供密码,前面的即使用username=guest参数的话也会要求输入密码),ro(有时候为了系统安全要指定为只读模式),rw,同时多个option的话用逗号隔开。

   或者可以用mount -t smbfs [-o option] //IP或者NETBIOS名称/共享资源名 /本地挂接点来实现同样的功能。

   例子如下:

   smbmount //glass/littlep /test -o guest或者mount -t smbfs -o guest //glass/littlep /test,然后就能通过访问/test来使用网络上的资源了。

   如果不需要使用的时候,可以简单地使用smbumount /test或者umount /test来解除这个挂接。

   关于samba的功能(共享Linux磁盘给Win95/NT、共享Linux打印机给win95/NT、共享win95/NT打印机给Linux机器。、共享Win95/NT磁盘给Linux机器),前面两个属于samba服务器的内容而后两个属于samba客户段的内容,在我的两篇文章中都有介绍了他们的实现方法,但是samba实在是一个强大的工具,无法十分详细地介绍它地全部功能,而且限于笔者的知识有限,有不到之处请各位指出,还望各位多多交流。

   Samba使用大全中有这样一段:

   force user强制把建立文件的属主是谁。如果我有一个目录,让guest可以写,那么guest就可以删除,如果我用force user= grind强制建立文件的属主是grind,同时限制create mask = 0755,这样guest就不能删除了。

   如上面所述,我建立一个共享文件夹(smb.conf片断)

   ...........

   [MyShare]

   comment = share directory

   path = /home/myshare

   writable = yes

   public = yes

   create mode = 0755

   directory mode = 0755

   force user = root

   按照资料的意思,不论我以任何用户登陆到这个共享文件夹,在这个文件夹里建立的文件都是属于root用户的,当前用户建立文件之后应该就是没有删除的权限了。

   我试验,在win2000登陆到samba服务器,进入myshare目录,在里面建立好一个文本文件test.txt之后,我在samba服务器上用root登陆,进入myshare目录,用ls -l查看,test.txt的属主是root,属性是 -rwxr--r--,这样应该说我在win2000上就应该不能删除这个test.txt文件了,但是,在win2000里,却可以删除这个文件,不知道兄弟们有没有注意这个问题?到底怎样解释?

   还有一个问题,/home/myshare目录是root用户建立的,用命令chmod 777 /home/myshare 更改过权限,上面的权限问题是不是和这个文件夹的权限有关?

   请大家帮忙看看。谢谢!!!

   __________________

   失去不一定不再有;转身不一定最软弱

   meteorsky

   ★

   有分号的是注释

   meteorsky

   ★

   我发现force user = ...这一行的作用不是“force user强制把建立文件的属主是谁。如果我有一个目录,让guest可以写,那么guest就可以删除,如果我用force user= grind强制建立文件的属主是grind,同时限制create mask = 0755,这样guest就不能删除了”这个意思,而是任何登陆的用户进入这个目录时就被当作root,作为root当然可以进行任何操作,登陆身份的改变是在刚登陆之后。

   我在linux系统中察看当前连接到samba的用户id时发现:不管我用那一个用户登陆samba服务器,只要我进入MyShare目录,当前的用户id就变为root,

   可是,这样的话,我就无法实现限制用户在指定目录里只能写,不能删除的权限了,这样的权限限制在windows的ntfs文件系统中是很容易实现的,

   不知道在samba中如何才能实现这样的限制,抑或根本就实现不了?

   还请大家帮忙!!

   Samba服务器的使用

   一、Samba基础

   1、 简介

   1).SMB协议

   SMB(Server Message

   Block,服务信息块)协议可以看作是局域网上的共享文件/打印机的一种协议,它可以为网络内部的其它Windows和Linux机器提供文件系统、打印服务或是其他一些信息。

   SMB的工作原理是让NetBIOS(Win95网络邻居通信协议)与SMB这两种协议运行在TCP/IP的通信协议上,且使用NetBIOS

   nameserver让用户的Linux机器可以在Windows的网络邻居里被看到,所以就可以和Win95/NT主机在网络上相互沟通,共享文件与服务了。

   目前Microsoft正在开发一种新的文件和打印共享协议--CIFS(Common Internet Files

   System,通用网络文件协议),该协议支持TCP/IP和DNS等协议,能在www上支持文件和打印共享。在CIFS下服务器实际上是DNS名,由主机名和域名组成。这种变化是从NetBIOS命令结构中分离出来的。目前CIFS还没有得到广泛的应用。现在在Linux和Win95/NT之间的文件共享注意还是SMB和NFS。

   2).什么是Samba

   Samba是用来实现SMB的一种软件,由澳大利亚的Andew Tridgell开发,是一种在Linux(Unix)环境下运行的免费软件。

   通过使用Samba,Linux系统可以实现如下功能:

   文件服务和打印服务(在Linux和Win95/NT之间系统之间提供打印机和磁盘的共享)

   登陆服务器,使用Windows客户能注册到网络上

   作为主要域控制器和域中成员的功能

   WINS服务器以及浏览功能

   支持SSL(Secure Socket Layer)

   支持SWAT (Samba Web Administration Tool )

   Samba除了支持Linux(Unix)和Win95/NT之外,还支持DOS、IBM OS/2、Macintosh 等操作系统。

   在Samba的软件包中所包括的组件参看表1-1:

   表1-1 Samba软件包的组成列表

   2、Samba的记录文件

   Samba为smbd、nmbd和访问Samba的客户提供了下列记录文件,分别记录有关smbd、nmbd运行信息和每个客户的访问信息:

   记录smbd 信息

   /var/log/samba/log.smb

   记录nmbd信息

   /var/log/samba/log.nmb

   记录客户访问信息

   /var/log/samba/log.%m

   3、启用Samba服务器

   Samba的运行包含两个后台守护进程:smbd和nmbd,它们是Samba的核心,在全部时间内运行。nmbd

   程序使得通过企图计算机可以浏览Linux服务器。Smbd守护进程在SMB软件包到达网上时对它们进行处理,并且为使用或共享它的资源与Linux进行协调。如果指定的是一个文件,该资源就是一个文件;而一个打印机请求就要求访问一台打印机。实际上,在请求访问打印机时,Smbd把要打印的信息存储到打印机队列中;在请求访问一个文件时,Smbd把数据发到内核,最后将它存到磁盘上。

   你可以从inetd选择启动它们,但这种方法会使Samba变慢。建议使用下面命令可以启动这两个进程:

   /etc/rc.d/init.d/smb start

   /usr/sbin/samba start

   如果想要在系统启动时自动启动samba,可以使用/usr/sbin/turboservice命令,选中其中的"SMB (Windows)File

   Services"。

   ---------------------------------------------------

   二、Samba配置及使用

   1、定制文件/etc/smb.conf

   在安装完Samba后,还需要定制它的配置文件smb.conf,才能使Samba正常工作以符合要求。由于SMB是一个非常复杂的协议,所以配置Samba的工作也是比较繁琐的,大约有超过170条配置项出现在smb.conf文件中。

   1).smb.conf的语法

   smb.conf文件有一个清晰的语法结构,与Windows的*.ini文件十分类似。如下所示:

   该文件被分成几部分,每一部分都包括几个参数,用来定义Samba输出的共享及其详细操作。

   文件被分隔成若干节,每一节都由一个被方括号括起来的标识开始(例如,[global]、[home]、[printers]),每一个配置参数或是一个全局参数(影响或控制整个服务器),或是一个服务参数(影响或控***务器提供的某项服务 )。

   global部分定义的参数用来控制Samba的总特性。除global部分外,每一部分都定义了一个专门的服务。

   你可以使用下面的语句来指定一个参数:

   name=VALUE

   name可以是一个单词或者用空格隔开的多个单词。VALUE可以是布尔值(ture或false;yes或no;1或0)、数字或字符串。

   注释以分号开头,可以单独一行,也可以跟在一条语句之后。

   通过在一行的最后一个字符后加反斜杠"\\"可以将一行分成多行。

   每一部分的名字和参数都不区分大小写,例如,参数browseable=yes与browseable=YES是完全等价的

   2).smb.conf文件的功能

   smbd和nmbd这两个守护进程启动时(通常为系统引导时)读配置文件smb.conf,这一配置文件向这两个守护进程说明输出

   什么共享、共享输出给谁以及如何进行输出等等。

   因为安全问题是最重要的,所以你必须指定哪些计算机可以访问这一共享,smb.conf文件可以很灵活的明确指定每一服务有哪些用户可以访问。随着Linux网络的增大,这一控制越来越重要。

   3).smb.conf文件结构

   smb.conf文件主要包括三部分:

   global(全局)参数

   directory shares (目录共享)部分--包括标准的[home]部分

   printer shares(打印共享)部分

   其中,global参数用来设置整个系统的规则;[home]部分和[printer]部分是服务的特定例程,services(服务)这一术语是网络客户机共享或输出的目录和打印机的Samba术语。这些服务定义了哪些用户可以访问这些目录和打印机以及如何访问这些目录和打印机。

   清单1-1给出了smb.conf文件的一个简单的例子。

   清单1-1 smb.conf文件的一个简单示例

   [global]

   netbios name = FRODO

   workgroup = UAB-TUCC

   server string = John Blair\'s Linux Box

   security = user

   printing = lprng

   log file = /var/log/samba

   lock directory = /var/lock/samba

   [homes]

   comment = Home Directory

   browseable = no

   read only = no

   [printers]

   browseable = no

   guest ok = yes

   printable = yes

   在 [global] 段中设置了主机名称, 主机所在的工作组名称和浏览时可看到的对本机的描述。安全参数告诉 Samba

   使用"用户级别"的安全保护方式。 SMB 有两种安全模式: 共享级别, 将资源加密码控制;用户级别, 可以使用某一用户的所有资源。

   这里不能详细解释两种方式的微妙差别, 但大部分情况下, 你会想用用户级别安全控制。

   [global] 段中还定义了日志文件目录和锁定文件的位置。日志文件在解决故障和完善系统时是很有用的,锁定文件可以阻止多个用户同时修改相同的文件。

   [homes] 段中的设置控制了每一个用主目录的共享权限。comment 参数指定的字符串在你浏览本机资源时出现在指定资源的旁边。

   browseable 参数控制一项服务是否能够出现在网络资源浏览表中。这里是一些非直觉的东西, browseable = no

   意味着这个目录将在浏览时显示为要验证的用户名称。 举例来说, 指定 browseable = no, 当我浏览这个 Samba 服务器时,

   我将看到一个名称为 cuckoo 的共享目录。当指定 browseable = yes 时, 我将看到一个名为 homes 和 cuckoo

   的共享目录。设置 read only = no 将允许通过验证的用户对主目录有写入的权限。 但是, 如果他们的主目录的 UNIX 权限 不允许写入,

   那么他们就没有写的权限。 无论 UNIX 的权限怎样, 设置 read only = yes 后, 他们的主目录是只读的。

   printing 命令描述了本地打印系统类型, 这可以让 Samba 知道怎样提交打印任务, 显示打印队列, 删除打印任务和其它操作。

   如果打印系统是 Samba 所不知道的, 你必须在每次执行打印操作时指明命令。

   清单中[printing]一段配置允许任何能够登录到 Samba 服务器的用户使用 printcap 中出现的 每一台打印机。 正常情况下,

   如果使用用户级别安全控制, guest ok = yes 并不能授权每一个用户(使用系统)。 每一个打印服务必须定义为 printable =

   yes。

   下面的一段配置片断增加了一个命名为 public 的共享目录, 直接对匿名FTP目录有只读的 权限。 你必须在客户机上建立打印机驱动程序。 对于

   Windows 95 和 Windows NT 客户机, 你可以使用printer name 和 printer driver命令自动建立打印驱动。

   [public]

   comment = Public FTP Directory

   path = /home/ftp/pub

   browseable = yes

   read only = yes

   这段描述并不是解释一些微妙的主题,

   例如用户级和共享级安全性的区别或者其它的授权认证主题。它仅仅让我们看到了Samba这座冰山的一角。另一方面,这是一个良好的例子,从中我们可以了解产生一个简单但可工作的smb.conf文件是多么容易。

   下面,我们举另一个例子说明如何通过Samba把Linux的打印机共享给Windows机器。

   为了共享Linux的打印机给Windows机器,必须确定Linux机器上的打印机已经设置好。如果能从Linux上打印,那么设定Samba的打印机共享是很简便的。只要根据自己的情况,对smb.conf文件有关打印的部分进行修改就可以了。在修改中唯一需要注意的是确保打印机的路径要与/etc/printcap中的spool目录相符合,然后就可以在Win95/NT上配置网络打印机了(关于如何在Win95/NT上配置网络打印机,本文不做介绍)。

   4).标准smb.conf文件清单

   在Samba的软件包里的example目录中有一个缺省的配置文件smb.conf.defaults。我们可以对它做适当修改后拷贝到你的安装目录下的lib目录里,并改名为smb.conf。清单1-2是Samba系统提供的标准的配置文件。为方便读者阅读,本文翻译了文件中的注释并适当的添加了解释。

   清单1-2 标准smb.conf 文件

   # 这是服务器的主要配置文件。您应该阅读smb.conf(5)的用户手册以了解下面

   # 列出的每一个选项。Samba有很多的选项,它们之中的大多数并没有出现在这

   # 个例子中。

   #

   # 以分号";"或井号"#"开始的每一行都是注释,在执行时被忽略。在本例中

   # 我们使用"#"作为注释而使用";"作为可选配置的注释。

   #

   # 注意:无论何时修改了这个配置文件,您都要运行"testparm"命令来检查您所

   # 做的修改有没有基本的语法错误。

   #

   #=================== 全局变量设置Global Settings ====================

   [global]

   # workgroup用来指定您的机器在网络上所属的NT域名或组名。格式是

   # workgroup = NT-Domain-Name or Workgroup-Name。缺省的组名是 MYGROUP。

   workgroup = MYGROUP

   # server string 用来设置NT描述域。缺省值是Samba Server 。

   server string = Samba Server

   # 下面的选项对于安全很重要。它允许您设置哪些领域的机器可以访问您的Samba

   # 服务器。下面的这个例子允许两个C类子网和"lookup"的连接请求而禁止来

   # 自其他网段机器的连接请求。有关的例子请参看smb.conf的用户手册。

   ; hosts allow = 192.168.1. 192.168.2. 127.

   # 允许自动加载打印机列表,而不需要您单独设置每一台打印机。

   load printers = yes

   # 您也许希望覆盖原有的printcap 文件。

   ; printcap name = /etc/printcap

   # 对于SystemV系统,如果将printcap名设置为lpstat 将允许您从SystemV 的

   # spool中自动获得打印列表。

   ; printcap name = lpstat

   # 除非您的打印机不是标准型号,否则您没有必要在下面指定打印机系统的类型。

   # 目前支持的打印机系统包括:bsd, sysv, plp, lprng, aix, hpux, qnx

   ; printing = bsd

   # 如果希望建立一个客户帐号,去掉下面语句前面的分号";"。同时,您必须在

   # /etc/passwd中加入这个帐号的定义,否则将使用用户"nobody"作为客户帐户。

   ; guest account = pcguest

   # 此选项将为每一个与服务器连接的机器定义一个单独的日志文件。

   log file = /usr/local/samba/var/log.%m