Samba使用大全(一)-samba服务器 1. 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 计算机看到。它的功能有: > 共享Linux磁盘给Win95/NT > 共享Win95/NT磁盘给Linux机器 > 共享Linux打印机给win95/NT > 共享win95/NT打印机给Linux机器。 同时它的文件服务功能比NT系统还高,而且在Windows2000之前就提供了用户磁盘空间限制的功能。 2. Samba的配置 在我写这篇文章的时候,Samba的版本已经到了2.2.2了,需要的可以通过http://us1.samba.org/samba/得到最新...包。然后执行rpm -Uvh samba-*.rpm来安装或者升级它。安装完后,可以看见/etc/samba这么一个目录,里面存放和Samba相关的一些文件,最主要的是 smb.conf,现在根据配置文件讲讲它的配置选项: a) 全局设置 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 = <NT-Server-Name> 当前面的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,不然会出现一些问题。 b) 共享设置: ★共享资源: 每个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参考。< Samba使用大全(二)-Samba客户端 1. 使用Samba网络打印: 使用unix网络打印以前的文章比较少涉及,最近试验了一下,效果还是不错的,现在讲讲基本的实现方法: 比如你要建立一台网络打印机grind,而打印机对应网络上面的//glass/HPLaserj,所有需要配置的文件有下面几个: 1./etc/printcap,内容一般为: grind: :sh: #禁止提示的header :ml=0: #打印的文件的长度下限, :mx=0: #最大的打印文件大小,0为不限制 :sd=/var/spool/lpd/grind: #打印机的spool目录 :lp=|/usr/bin/smbprint: #打印输出需要的设备名或者管道名 :lpd_bounce=true: #强制lpd守护进程过滤打印文件 :if=/usr/share/printconf/mf_wrapper: #过滤命令文件 2.smbprint这个一般在安装完smb相关的rpm包以后就有了,主要内容是: eval acct_file=$$# spool_dir=`dirname $acct_file` config_file=$spool_dir/.config eval `cat $config_file` share=`echo $share | sed "s/[]///g"` if [ "$user" != "" ]; then usercmd="-U" else usercmd="" fi if [ "$workgroup" != "" ]; then workgroupcmd="-W" else workgroupcmd="" fi if [ "$translate" = "yes" ]; then command="translate ; print -" else command="print -" fi cat | /usr/bin/smbclient "$share" "$password" -E ${hostip:+-I} $hostip -N -P $usercmd "$user" $workgroupcmd "$workgroup" -c "$command" 2>/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 $* < /dev/stdin RETVAL=$? if [ -f $TMP_FILE ]; then rm -f $TMP_FILE; fi ;; esac else DEBUGSTRING="" fi # Run magic filter /usr/bin/magicfilter-t $TMP_FILE $DEBUGSTRING $* < /dev/stdin RETVAL=$? if [ -f $TMP_FILE ]; then rm -f $TMP_FILE; fi if [[ $RETVAL -eq 0 ]]; then TERMINATION=`grep '^[[:space:]]*#[[:space:]]*TERMINATION=' ./mf.cfg | se d 's/^[[:space:]]*#[[:space:]]*TERMINATION=//;'` if [ -n $TERMINATION ]; then echo -n -e $TERMINATION; fi fi 同时需要在/var/spool/lpd/grind下面有这么两个文件:mf.cfg和script.cfg。 mf.cfg的内容是: define(TEXTfilter, text "" 14 )dnl define(PSfilter, `filter /usr/share/printconf/util/mf_postscript_wrapper --mfomatic -d lj5gray-75168.foo')dnl script.cfg的内容是: share="//glass/HPLaserj" #glass机器上面共享的打印机 hostip="192.168.1.123" #glass这台机器的IP user="" password="" workgroup="" translate="no" 完成这个工作后,启动lpd进程,然后就能用lpr等命令使用网络打印机打印了。 2. 使用网络共享文件资源: * 列出网络资源: 可以用smbclient来列出某台机器的资源,smbclient用法参考 http://www.linuxaid.com.cn/training...owtod.jsp?i=241 这里讲比较有用的方法: 1) 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配置解释=============== 一、 客户命令: 1. smbclient smbclient 命令用来存取远程 samba 服务器上的资源,它的界面到目前为止还是文本方式的,命令形式和 ftp 类似。 smbclient 命令的语法是: smbclient <servicename> [password] [options] 其中 servicename 是要连接的资源名称,资源名称的形式如下: //server/service 其中 server 是远程服务器的 netbios 名字,对于 windows 服务器来说,就是它们出现在“网络邻居”中的名字。 service 是各 server 所提供的资源的名字,同样是出现在“网络邻居”中的名字。 password 是存取该资源所需的口令。 如果既没有给出 password 参数,也没有使用 -N 选项。smbclient 会提示用户输入口令;如果目标资源并不需要口令,用户可直接回车跳过。 -N 选项禁止 smbclient 提示用户输入口令,当连接不需要口令的资源时可以使用该选项。 使用 -L 选项将列出远程服务器提供的所有资源。如果不知道服务器的 netbios 名,可以使用 -I 选项来指定它的 IP 地址,如: smbclient //unknown/service -I 192.168.1.2 使用了 -I 选项之后,servicename 中的 netbios 名部分将被忽略。 smbclient 命令运行之后,会出现如下提示符(和 DOS 提示符比较相像): smb:\> 用户在该提示符下输入各种命令。其命令和 ftp 相似,如 cd、lcd、get、mget、put、mput 等,其他比较常用的命令如下所示: * ?[comand] 显示有关command的帮助信息,若无command参数,则列出所有可能的命令。 * ![shell command] 在本地执行shell命令,如果没有给出shell command,则在本地运行一个shell。用户可以在该shell中执行各种命令,用exit回到smbclient。 * lowercase 关闭或者打开文件名小写转换。如果打开,smbclient 会自动将 get 和 mget 命令取回的文件以相应的小写文件名命名。 * print <filename> 在远程服务器上打印文件 filename。 * queue 显示打印队列。 * quit 或者 exit 退出 smbclient。 smbclient 的 mget 和 mput 命令可以使用通配符“*”和“?”,它们还可以工作在递归模式下。当工作在递归模式时,它们将处理当前目录以及所有由 mask 命令指定的子目录。 用 recurse 命令打开或关闭递归模式。 mask 命令指定一个含通配符的模式,当 mget 和 mput 工作在递归模式时,它们将只处理能匹配该模式的目录;如果不工作在递归模式,则忽略该模式。 mask 命令的使用方法是: mask <expr> expr 是含通配符的模式。smbclient 还可以发送 WinPopup 消息,方法是: smbclient -M NetBIOS_name NetBIOS_name 是目标计算机的 NetBIOS 名。连接建立后,键入要发送的消息,按Ctrl-d 组合键结束。 Smbclient 的工作模式和 ftp 还有一点相像的地方:当我们要处理绝大多数的文件(如执行一个在远端的文件)时必须先下载到本地系统上,然后才能执行相应的操作。 这种操作方法自有它的好处,如比较节省网络资源,但也会造成文件的重复存取。 smbclient 命令则可以直接利用远端的文件资源而不用先下载。 可用的 smbclient 开关: sharename : 完整的共享名路径。如 \\server\share。 -U username : 登录的用户名。 password : 登录用口令。 -L : 列出所有已知的服务器和共享资源。 连接到NT服务器 comet 以访问共享目录dir1 ,登录的用户名与口令之间用%分开: smbclient \\\\comet\\dir1 -U gugong%password smbclient -L comet 开关 -L 查询服务器 comet 中的可用共享资源。 它还会查询系统(comet)的浏览器,以发现该服务器(comet)已经在网上发现的其它共享资源。 2. smbmount 要使用 smbclient 安装 samba 文件系统,linux 内核必须包含 smbfs 的支持模块。在 Turbolinux 里默认内核包含了该模块。除非你自己重新编译了新内核才需要加以注意。smbmount 命令的语法是: smbmunt <servicename> <mount-point> 其中 servicename 是资源名,mount-point 是安装点。 smbmount 常用的选项有: 1) -C smbmount 默认将口令转换成大写,使用 -C 选项禁止这种转换。 2) -N 当连接不需要口令的资源时应该使用本选项。 3) -P password 指定口令。如果没有指定 -N 或 -P 选项,smbmount 会提示用户输入口令。 4) -s server-name smbmount 的行为和 smbclient 不同,它使用服务器的 Internet 主机名(即 hostname 命令给出的主机名)来获得其 IP 地址,而不是使用服务器的 NetBIOS 名。如果服务器使用不同的 NetBIOS 和 Internet名,则应该用 -s 选项指定其 NetBIOS 名,而在 servicename 中使用Internet 主机名。 5) -c command-string 执行指定的相对独立的命令。 6) -I hostname/IP 本选项恰好和 -s 选项相反,它允许在 servicename 中使用服务器的NetBIOS 名,而在 -I 之后指定服务器的 Internet 主机名或IP地址。 -I 和 -s 的效果是一样的,smbmount 总是利用 Internet 主机名查找主机。,然后用服务器的 NetBIOS 名登录(有些服务器要求客户机给出自己的 NetBIOS 名)。 7) -U username 如果用户在服务器上的帐号和本地机上的不同,则应该使用该选项指定在服务器上的帐号。 ****** 如果要装载一个 SMB 的文件系统,建议使用“-c”选项来使 smbmount ****** 执行 mount 命令。例如: ****** smbmount "\\\\server\\tmp" -c 'mount /mnt -u 123 -g 456' 这样就可以把名字叫做“server”的计算机的共享资源“tmp”的内容装载到本地的 /mnt 目录下,并给这个目录以及其下所有的文件分配一个本地的 uid(UserID)123 和 gid(Group ID)456 。这样正确执行了之后(指用户输入了正确的路径和密码),读者就可以在 /mnt 目录下看到本来使远端计算机上的内容,并且可以与操作本地的文件一样进行各种被允许的操作,这样非常节省本地的系统资源。 卸载一个已经装载的 SMB 文件系统用 smbumount 命令。smbumount 命令的格式非常简单,只要指定要卸载的装载点就可以了。 可用的 smbmount 开关: sharename : 以 //server/share 格式输入的共享名。 mount point : 希望附着共享文件的目录。 -I server : 包含共享资源的服务器。 -U username : 登录时使用的用户名。(和 -n 类似,但比 -n 更管用!) -P password : 登录时使用的口令。 -N : 没有口令的登录名,不用提示输入口令。 -h : 列出可用开关的简单帮助信息。 想用登录名“gugong”和口令“123”来安装共享文件“\\comet\dir1”到目录“/mnt/comet” smbmount \\\\comet\\dir1 /mnt/comet -I comet -U gugong -P 123 3. smbumount 要卸掉上一例子中创建的共享安装,可以输入: smbumount /mnt/comet 二、 服务 除了客户服务功能,SAMBA 还允许 UNIX 系统发布文件和打印共享。 有三个文件提供这种连接性: nmbd (/usr/sbin/nmbd) smbd (/usr/sbin/smbd) smb.conf (/etc/smb.conf) 1. nmbd nmbd 实用工具控制系统的 NetBIOS 通信。 它作为后台程序运行,并且负责监听用于名字服务请求的 NetBIOS 端口。 当接收了名字服务请求时, nmbd 用系统的 IP 地址作出回答。 负责保持浏览器能通报在一个已知的工作组中哪个成员在编写 NetBIOS 名字目录。 可用的 nmbd 开关: -D 告诉 nmbd 作为后台进程运行。 -H lmhost_file 路径和 NetBIOS 主机名字文件的路径名字。 -d number 告诉 nmbd 运行于由 number 指定的调试级。0~5有效。 -l log_file_base 指定日志文件的库名。 -n NetBIOS_name 在主机名不宜用的条件下,指定该系统的 NetBIOS 名字。 -p port_number 改变缺省的监听端口号。 -s config_file 若 smb.conf 没有在 /etc 目录下,则指定其位置。 2. smbd smbd 实用工具是负责所有文件和打印共享服务的后台进程。 一旦客户通过 nmbd 寻址到一个 SAMBA 服务器,就由 smbd 负责客户的文件和打印请求。 可用的 smbd 开关: -D 告诉 smbd 作为后台进程运行。 -O socket_option 调节通信参数。 -a 重写日志文件,缺省是添加。 -d number 告诉 smbd 运行于由 number 指定的调试级。0~5有效。 -l log_file_base 指定日志文件的库名。 -p port_number 改变缺省的监听端口号。 -s config_file 若 smb.conf 没有在 /etc 目录下,则指定其位置。 3. smb.conf smb.conf 在初始化期间被用于配置 nmbd 和 smbd. /etc/rc.d/init.d/smb stop /etc/rc.d/init.d/smb start [global] Global Setting 与配置特定的共享相对,全局设置用于配置整体 SAMBA 环境。全局设置列出在段标题[global]下。 该节中的参数适用于整个 Samba 服务器,或者是其他节的默认值。 guest account=username 浏览共享资源时,允许指定可用的有效客户帐户。该帐户必须是有效的帐户名,并且只能拥有最小限度的系统权利。通常为ftp 的这种设置将允许访问共享资源。 workgroup=Workgroup 允许指定该系统应该加入的工作组名。Workgroup 与域很相似,因为它们都代表了一个 NetBIOS 系统的套件合。Workgroup 与域不同的地方在于,没有套件中的帐户管理——所有的登录名和口令都由每个单独的系统管理。 Home Directories 当用户得到 SAMBA 的认证后,有一个选项允许用户访问作为共享 SAMBA 主目录。目录的位置可以从 /etc/smbpasswd 文件只查询到,该文件被用于在全系统范围内定义登录名和口令。主目录设置与 smb.conf 被一起列在段标题[homes]下。(?) Other Shares 你可以把文件系统的任何部分设置为共享。创建共享时,以附上了方括号的共享名作为共享部分的开始,例如 [public]。在共享名之后,每行用列出的一个命令,你指定任何你想应用于该共享部分的参数。 Share Setting 以下是一个可用于处理共享资源的某些命令的简短列表: browseable=yes/no 它指出共享对于正在浏览的客户是否可见,或者共享通过使用UNC(通用命名约定)才能访问。例如要访问共享名 public ,而其浏览功能已经被关闭(no),则必须通过输入 UNC\\server\pubic 来访问它。它不会出现在浏览列表中(即在浏览器中不可见)。 creat mode=number 在SAMBA 共享条件下创建文件时,允许分配给这些文件以缺省许可这个字段的数值使用和 chmod 命令一样的数字格式。和 create mask 相反。 only guest=yes 指定用户对该共享资源的访问只能是客户级的。如果文件许可被正确地设置,则其作用是用户只能看到目录下的文件,但不能进行读写操作。 path=share directory path 定义了一个目录,当用户要访问一个已发布了的共享名字时,就可以访问上述被定义的目录。例如,如果创建了一个名为 public 的共享资源,并且指定 path 等于 /usr/expense/template,则对共享的 public 的访问将直接进入 template 目录,系统将不允许进入该目录的上一级目录结构,而只能进入下一级。 public= yes/no 定义一个共享是否对公共访问开放。当设置为 yes 时,在系统上没有帐户的用户将基于所定义的客户帐户的属性来接收访问。 valid users=username 指定只有具有特定的登录名的用户才能访问共享。可以指定用空格分开的多个登录名。(all 表示所有) writable=yes/no 定义了一个共享能否使用读/写许可来访问,或一个文件系统能否替代地被认为只读。定义用户接受到访问级的是这个设定和分配给用户 UNIX 帐户一些许可的组合,不管其中哪一个较低。例如,如果用户访问标记为可写的共享,但其 UNIX 帐户有只读许可,那么该用户只能得到该共享的只读访问权。 [home] 如果配置文件中包含该节,那么服务器就可以动态地为用户提供连接到其私人目录的共享. 如果用户要求连接一个配置文件中不存在的共享,服务器就假设用户提供的共享名是一个帐号,然后在本地的密码文件中查找该帐号.如果该帐号存在,并且用户提供了正确的口令,那么服务器就拷贝[在home]节来建立一个新的共享,同时作出如下修改: 1> 将共享名改为帐号名. 2> 如果在[home]节中没有指定要共享的目录,那么就使用该帐号的私人目录. 3> 如果要在[home]节中指定 path 参数,那么宏 %S 是非常有用的,它代表当前共享的名称.例如: path=/data/%S 这种方法允许为 PC 用户和 Linux 用户提供不同的私人目录. 由此可见,使用 [home] 节可以简单而快速地允许大量用户存取各自的私人目录.如果用户请求的共享名就是 homes ,服务器同样会为其动态地建立共享,唯一的不同是新共享的名称仍然是 homes. [printers] 该节有点类似于 [homes] 节,只不过是针对打印机的.如果配置文件中包含 [homes] , 用户就可以连接到本地 printcap 文件中定义的任何一台打印机.如果用户请求连接一个配置文件中不存在的共享,若 [homes] 节存在,那么服务器会像上节所述那样处理该请求;否则服务器将请求连接的共享名视为一个打印机名,并且在 printcap 文件中查找是否存在可以匹配的打印机,如果存在,就拷贝 [printers] 节以建立新的共享. 注意: [printers] 节必须是可打印的,否则服务器将拒绝装载配置文件,例如: [printers] path = /home/samba/print/public writeable = no guest ok = yes printable = yes 宏替换: 配置文件中允许宏替换,"注意大小写". ----------------------------------------------------------------------- 宏 描 述 ----------------------------------------------------------------------- %S ?当前服务或共享的名称 %P ?当前服务或共享的目录 %u ?当前服务或共享使用的用户名 %g ?%u 所在组的名称 %U ?当前会话使用的用户名(登录名?!),即客户机所期望的用户名,可以和客户机真正得到的用户名不同. %G ?%U 所在组的名称 %H ?%u 的私人目录(主目录) %v ?Samba 的版本号 %h ?Samba 服务器的 NetBIOS 名 %m ?客户机的 NetBIOS 主机名(Win9x的机器名) %L ?服务器的 NetBIOS 名 %N ?服务器的(?????)名 %M ?客户机的 Internet 主机名 %I ?客户机的 IP 地址 %T ?当前的日期和时间 %d ?当前服务器进程 ID %a ?远程客户机的体系结构,目前只能识别WfWg,NT,和 Win 95、98,并且不是100%可靠,其他系统被标示为 UNKNOWN ----------------------------------------------------------------------- 三、 用户身份验证: 帐号对于 Samba 来说非常重要,用户必须拥有合法的帐号才能连接非 guest 性质的Samba 服务,并且该帐号决定了他享有的权限.即使一个共享是 guest 共享, Samba 也需要一个特定的帐号来提供服务. 用户有许多种连接 Sabma 服务的方法.服务器遵循下面的步骤决定是否允许一个连接,如果所有的步骤都失败了,就拒绝连接;如果其中有一步成功了,就不再执行其后的步骤. 1> 如果请求连接的共享包含 " guest only = yes " 参数,那么用户就以" guest account = " 参数制定的身份连接,而不考虑其提供的密码. 2> 如果客户机提供了一个帐号/密码对,并且该帐号/密码对通过了 Linux 系统的身份验证,那么用户就以该帐号连接.注意这里包括以 "\\server\service\%username" 形式提供的帐号. 3> 检查客户机的 NetBIOS 名称(亦即 Windows 在网络中使用的计算机名)以及其他曾使用过的帐号,如果有一个可以和提供的密码匹配,那么就允许连接. 4> 如果客户机已经通过了帐号\密码验证,并且向服务器发送了验证标志( validation token),那么用户就以该帐号连接. 5> 如果请求的共享包含 " user = " 参数,同时客户机提供了一个密码,并且该密码可以和帐号列表中的一个帐号匹配,那么用户就以该帐号连接.如果" user = " 参数中的某个帐号以 " @ " 开头,那么它会被视为一个用户组名,该组中所有的用户帐号都被包含在 " user = " 列表中. 四、 Samba 的安全级 Samba 有四种安全级,由参数 security 定义,该参数只能出现在 [global] 中,是一个全局参数. 这四种安全级是 share,user,server,domain ,其中后三种属于安全模式( Security Mode ),这里重点讨论 share 和 user 安全级. 1) security = share 当客户机连接到一个 share 安全级的服务器时,它在连接共享之前,不需要首先提供正确的帐号和密码就可以登录到服务器(虽然 Windows 95/98/NT 等客户机在连接share 级服务器时会发出一个登录请求,该请求只包含帐号).相反的,客户机只有在连接特定的共享时才需提供密码. 注意: 服务器总是使用有效的 Linux 帐号来提供服务,即使是工作在 share 安全级. 因为客户机并不向 share 级的服务器提供帐号,所以服务器使用下面的技术来确定使用什么帐号提供服务: 1> 如果该共享包含 " guest only =yes " 参数,则使用 " guest account= " 参数指定的 guest 帐号,忽略下面的步骤. 2> 如果连接请求同时提供一个帐号,那么该帐号被认为是潜在的帐号. 3> 如果客户机在此之前发出过登录请求,那么该请求包含的帐号也被视为潜在的帐号. 4> 客户机请求连接的共享名被视为潜在帐号. 5> 客户机的 NetBIOS 名被视为潜在帐号. 6> " user = " 列表中的帐号被视为潜在帐号. 如果 " guest only " 参数为假,则检查所有的潜在帐号,使用第一个和密码匹配的帐号.如果 guest only " 参数为真,或者该共享允许使用 " guest account " ,则使用之,否则拒绝连接.可见, share 服务器决定帐号的过程是很复杂的. 2) security = user 这是 Samba 默认使用的安全级.使用 user 安全级时,服务器要求客户机首先以正确的帐号和密码登录(可以对帐号进行映射). " user = " 和 "guest only " 等可能改变用户身份的参数只有在用户成功登录之后才起作用. 注意: 客户机请求连接的共享名只有在登录之后才传递给服务器,因此没有通过身份验证的用户无法访问任何共享(包括 guest 共享).可以使用 "map to guest " 选项将未知用户映射为 guest 用户,以允许访问 guest 共享. 3) security = server 在 server 安全级下, Samba 使用远程 SMB 服务器(如 Windows NT 服务器)进行身份验证,如果失败则自动切换到 user 安全级.对于客户机来说, server 安全级和 user 安全级没有什么不同. 4) security = domain 要是用本模式,必须使用 smbpasswd 程序将 Samba 服务器加到一个 Windows NT 域中,并且使用"加密口令(Encrypted Passwords)".在本安全级下, Samba 借助 Windows NT 主控服务器( Windows NT Primary )或者是后备域控制器(Backup Domain Controller) 进行身份验证,采取 Windows NT 服务器相同的行为. *************************************************************************** share 和 user 安全级的比较 share 安全级面向资源,用户每连接一个非 guest 共享都需要提供一个密码.如果主要提供 guest 共享,就应该使用 share 安全级. user 安全级面向用户,用户登录后,就无需再为单独的共享提供密码,比较方便.如果用户再 PC 上的帐号和在 Linux 上的帐号相同,那么使用 user 安全级是非常合适的. *************************************************************************** ? 五、 常用参数 1) 全局参数: 1>NetBIOS name 设定Samba服务器的NetBIOS名,客户机用这个名字来识别它,默认值是主机DNS名的第一部分. 2>workgroup 设定Samba服务器所在的工作组. 3>server string 设定服务器的描述信息,其值可以任意设定. 4>security 设定服务器的安全级,有效值是share,user(默认),server,doamin. 5>announce as 通常,Samba服务器会对外宣称自己是一个Windows NT服务器,可以用该选项来更改这个设定.其有效值是"NT","Win95"或者"WfW",分别代表Windows NT ,Windows 95 和 Windwos for Workgroups. 6>log file 指定Samba服务器的日志文件. 7>max log size 设定日志文件的最大长度,其值是一个整数,单位是千字节.如果日志文件超出了规定的长度,Samba会为文件名加上后缀.old,然后再建立一个新文件.如果该值是0,则没有限制,默认值是 max log size = 5000. 8>map to guest guest用户映射,有效值是"Never"、"Bad User"、"Bad Password"。 9>username map 用户映射,其值是一个文件名。 10>load printers 布尔值,决定是否装载printcap文件中所有的打印机以供浏览。默认值是 load printers = yes。 2) 其他参数 有些参数有“同义词”,这些同义词放在其后的括号中。 1>path(或directory) 设定要共享的目录。路径中出现的%u会被替换成为客户机使用的Linux帐号,%m会被替换为客户机的NetBIOS名。 2>comment 注释信息。 3>guest ok(或public) 如果该参数为yes,则对应的共享允许以guest方式访问。默认值是no。 4>guest account 为guest访问方式指定Linux帐号,Samba使用该帐号提供服务,它的权限就是guest用户享有的权限。 5>guest only 布尔值,决定该共享是否允许以guest方式访问。如果已经指定了 guest ok 或 public 参数,则本参数不起作用。默认值是 no。 6>browsable(browseable) 布尔值,决定该共享是不是可浏览的。如果其值为yes,则相应的共享会出现在“网络邻居”中。 7>read only 布尔值,决定该共享是否以只读方式共享。 8>writeable(或write ok) 布尔值,决定是否允许用户修改相应的共享。 9>user(或username users) 为共享指定潜在的帐号列表。 10>invalid users 禁止访问该共享的用户列表。 11>valid users 允许访问该共享的用户列表。 12>writelist 具有写权限的用户列表。在该列表中的用户可以修改相应的共享,即使该共享的 read only 选项被设为真。 13>readlist 具有只读权限的用户列表。无论该共享是否设置了read only选项,该列表中的用户都只享有只读权限。 14>admin users 超级用户列表。该列表中的用户对相应的共享拥有一切权限。 15>force user 指定一个Linux帐号,所有用户都使用该帐号访问相应的共享。这有助于在用户间共享文件。该帐号只有在连接之后才起作用(!),因此客户机仍然需要提供正确的帐号和口令以连接共享。一旦连接确立,客户机将以该帐号进行任何文件操作,而不管它连接时使用的帐号是什么。 16>force group(或group) 同force user类似,只不过强制的是用户组。 17>available 该选项允许用户关闭一个共享,其默认值是yes。 18>allow host(或hosts allow) 允许访问相应共享的主机列表,主机间用逗号、空格或制表符分隔。可以使用IP地址和主机名来标识主机。 19>deny hosts(或hosts deny) 禁止访问相应共享的主机列表。 20>preexec 指定连接建立之后执行的命令,例如: preexec = echo \"%u connected to %S from %m(%l)\" >> /tmp/log 会在连接建立时向日志文件中追加一条记录。 21>postexec 指定连接断开之后执行的命令。 22>root preexec 和preexec类似,但是这里指定的命令是以root权限运行的。这通常用来安装一个文件系统,如CDROM等。 23>root postexec 和postexec类似,但这里指定的命令是以root权限运行的。可以用来卸载文件系统。 六、 使用用户映射 Samba提供的用户映射机制包括“guest用户映射”和“用户映射”两种: 1) guest用户映射 guest用户映射仅适用于安全模式(user,server和domain安全级).如果一个用户没有通过身份验证,就可以将其映射为guest用户,从而允许他访问guest共享.这里 guest 用户由"guest account="参数指定. guest用户映射由全局参数"map to guest"控制,它只能放在[global]节中,可以是如下三个值: 1>map to guest = Never 不进行映射,拒绝非法用户访问任何资源.这是默认行为. 2>map to guest = Bad User 如果用户使用一个不存在的帐号登录,就将它映射为guest用户;如果提供的帐号正确而口令错误,则禁止连接. 3>map to guest = Bad Password 将使用错误口令登录的用户映射为guest用户.这样的设置会产生一个问题,即如果用户不小心键入了错误的口令,服务器会"偷偷地"将他映射为guest用户,而不 出任何错误信息,这样用户会在不知情的情况下受到种种访问限制. 2) 用户映射 全局参数"username map"用来控制用户映射,它允许管理员指定一个映射文件,该文件包含了在客户机和服务器间进行用户映射的信息,如: username map = /usr/local/samba/lib/users.map 用户映射经常用来在 Windows 和 Linux 主机之间进行映射,因为用户可能在两个系 统上拥有不同的帐号;另一个用途是将几个用户映射为一个用户,以使他们能更方便地共享文件. 下面是一个映射文件的例子: # Map Windows admain to Linux root root = admin administrator ; Map all the members of group system(用户组) to sys sys = @system 等号左边的是单独的 Linux 帐号,等号右边的是要映射的帐号列表.服务器逐行分析映射文件,如果提供的帐号和某行右侧列表中的帐号匹配,就把它替换为等号左边的帐号. 如果该行前面没有"!"符号,则继续分析下面的行,否则不继续分析. "@"符号表示其后跟的是一个用户组,该组中所有的用户都会被映射为相应的 Linux帐号. 符号"*"是通配符,它可以匹配任何用户帐号. 以"#"或";"开头的行是注释行. 如果要映射包含空格的帐号(Windows帐号中允许有空格),可以用引号将其括起来,如: # Map a windows account to LInux account tridge = "Andrew Tridgell" 下面的例子将帐号fred和mary映射为帐号sys,将其他帐号映射为guets帐号. !sys = mary fred guest = * 注意: 服务器将对出现在任何位置上的帐号进行映射.例如,如果连接到 \\server\fred,并且fred被映射为mary,那么实际连接的是\\server\mary,用户应该提供mary的口令,而不是fred的口令.Samba默认不提供用户映射. ? 七. 使用加密口令 从 Windows NT 4.0 Service Pack 3 开始,Microsoft决定不再在网络中传递未加密的口令,而仅传递加密口令 (Encripted Password),新版本的Windwos 95 以及Windows98也采用这一约定.这些客户机在和不支持加密口令并且以 user 安全级运行的 Samba 服务器通信时,会遇到很大的困难.为了能顺利地和这些客户机通信,Samba 也加入了对加密口令的支持. 1) Samba 口令文件 为了使用加密口令,Samba 需要一份自己的口令文件,并且该文件应该和Linux/etc/passwd 文件保持同步,可以使用mksmbpasswd.sh脚本来制作这份文件: cat /etc/passwd | mksmbpasswd.sh > /etc/smbpasswd 其中smbpasswd就是需要的口令文件,其权限应该设为0600,拥有者是root.samba口令 文件中的记录和 /etc/smbpasswd 文件的记录一一对应.每行的格式如下: username:uid:xxx...xxx:xxx...xxx:Logname:user home dir:user shell 它的格式和 /etc/passwd 文件基本相同,只有密码字段不同.密码字段由两个部分组成, 每部分都是32个"x".这两部分就是Samba使用的加密口令,前一部分用于和LANManager通信, 后一部分用于和 Windows NT通信. Linux 的口令是无法破译的,因此刚建立的口令文件中所有的用户都没有正确的口令,用32个"x"来表示.root用户可以使用 smbpasswd 命令为每个用户设定一个初始口令,这样用户就可以使用smbpasswd命令更改自己的 samba口令了. smbpasswd的使用方法和 passwd 命令类似. root 用户也可以将口令设置为空,方法是手工修改口令文件,将前11个"x"改为 "NO PASSWORD": NO PASSWORDxxx...xxx:xxx...xxx 这样当smbpasswd命令询问用户旧密码时,就可以直接按回车键跳过. 2) 指定 samba 使用加密口令 要使 samba 使用加密口令,必须在 /etc/ssmb.conf 文件中的 [global]节中加入以下参数: encrypt passwords = yes smb passwd file = /etc/smbpasswd 其中第一行通知 samba 使用加密口令。第二行给出口令文件的路径。如果允许用户使用空口令,则应该使用如下参数: null passwords = yes 但这会带来安全问题。 3) smbpasswd 命令 smbpasswd 命令除了可以修改用户口令之外,还可以帮助 root 用户添加和删除用户。smbpasswd 命令如果被 root 用户运行,那么它将直接修改口令文件,而不需要借助smbd;如果被普通用户运行,smbpasswd 就以客户机/服务器模式工作,它连接到smbd 以完成必要的修改。客户机/服务器模式使得 smbpasswd 不必成为一个 SUID 程序,避免产生安全漏洞。 smbpasswd命令常用选项有: 1> -a 增加一个用户帐号,该帐号必须出现在 /etc/passwd 文件中,亦即是一个合法的 Linux 帐号,只有 root 可以使用本选项。 2> -d 禁止一个用户帐号,并不将其删除,仅供 root 使用。 3> -e 恢复一个被禁止的用户帐号,仅供 root 使用。 4> -n 将帐号的口令设为空,即将口令字段的前11个字符改为“NO PASSWORD”。 仅供 root 使用。 5> -r remote_machine_name 本选项允许用户指定远程主机,如果没有该选项,那么smbpasswd 默认修改本地 Samba 服务器上的口令。remote-machine-name 是 远程主机的 NetBIOS 名。 6> -U username 本选项只能和 -r 选项连用。当修改远程主机上的口令,用户可以用该选项指定欲修改的帐号。这允许在不同系统中使用不同帐号的用户修改自己的口令。 7> -s 该选项使 smbpasswd 以 silent (沉默)模式工作,在此模式下,smbpasswd 将从标准输入读取数据,而不是默认的 /dev/tty,这样可以帮助用户编写调用 smbpasswd 的脚本。 4) 怎样才能不使用加密口令 上面曾提到,使用加密口令主要是为了能顺利地和 Windows NT 等客户机进行通信。为了达到这个目的,也可以修改 Windows NT 的注册表,以强制其使用不加密的口令(Plain Password)。 TurboLinux 的 /usr/doc/samba-2.0.3/docs 目录中有两个注册表文件,它们可以用来自动修改 Windows NT 4 和 Windows 95 的注册表,用户只需在 Windows 系统中双击其图标即可。这两个文件是:NT4_PlainPassword.reg 和 Win95_plainPassword.reg。 现在,windows 的共享文件夹可以直接写在 /etc/fstab 中,例如: //2000_server/gugong /mnt/smb/2000 smbfs username=gugong,password=123,rw,noauto 0 0 在 shell 中, 用 mount [-t smbfs] /mnt/smb/2000 装载 (因为上面是 noauto;若是 auto,系统启动时会自动装载)。? 作 域登录 服务 的 /etc/samba/smb.conf ,主要是加上: domain master = yes preferred master = yes domain logons = yes 主要是这个“domain logons = yes”起作用的 !
=================================================================================================== Samba服务配置文件中涉及到的配置命令列表 在下面所列出的,等号后没有内容的是系统没有设置或为空的(本人理解) coding system = # client code page = 936 #设置SAMBA所使用的字符集(默认是:850,936是简体中文) code page directory = /usr/share/samba/codepages # workgroup = CCGD.COM #设置SAMBA工作组; netbios name = CCGD.COM #netbios名子; netbios aliases = #设置samba服务的别名,(netbios的别名,在网络里同netbios一样做用); netbios scope = # server string = Samba Server #SAMBA服务器说明; interfaces = 192.168.0.35/24 172.169.0.1/24 #SABMA服务器的网络接口设置,即网卡的IP地址; bind interfaces only = No # security = USER #设置共享级别; encrypt passwords = Yes #使用加密密码进行SAMBA访问; update encrypted = No # allow trusted domains = Yes # hosts equiv = # min passwd length = 5 #设置密码的最小长度; map to guest = Never # null passwords = No #是否使用空密码; obey pam restrictions = Yes # password server = #进行密码验证的服务器(即当security = server/domain时用到此选项,用来设置服务器名子) smb passwd file = /etc/samba/smbpasswd #加密密码验证文件存放位置; root directory = #设置root访问时的主目录,系统默认是不允许root进行访问的; pam password change = Yes # passwd program = /usr/bin/passwd %u # passwd chat = *New*password* %n *Retype*new*password* %n *passwd:*all*authentication*tokens*updated*successfully* # passwd chat debug = No # username map = /etc/samba/smbusers #SAMBA用户 password level = 0 # username level = 0 # unix password sync = Yes # restrict anonymous = No # lanman auth = Yes # use rhosts = No # admin log = No #是否启用管理记录文件; log level = 0 # syslog = 1 # syslog only = No #是否只做系统日志的记录; log file = /var/log/samba/%m.log #日志文件的存放路径; max log size = 100 #日志文件的大小(KB) timestamp logs = Yes # debug hires timestamp = No # debug pid = No # debug uid = No # protocol = NT1 # large readwrite = No # max protocol = NT1 # min protocol = CORE # read bmpx = No # read raw = Yes # write raw = Yes # nt smb support = Yes # nt pipe support = Yes # nt status support = Yes # announce version = 4.5 # announce as = NT # max mux = 50 # max xmit = 65535 # name resolve order = lmhosts host wins bcast # max packet = 65535 # max ttl = 259200 # max wins ttl = 518400 # min wins ttl = 21600 # time server = No #设置成时间服务器 unix extensions = No # change notify timeout = 60 # deadtime = 0 # getwd cache = Yes # keepalive = 300 # lpq cache time = 10 # max smbd processes = 0 # max disk size = 0 # max open files = 10000 # read size = 16384 # socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 # stat cache size = 50 # use mmap = Yes # total print jobs = 0 # load printers = Yes # printcap name = /etc/printcap # disable spoolss = No # enumports command = # addprinter command = # deleteprinter command = # show add printer wizard = Yes # os2 driver map = # strip dot = No # mangling method = hash # character set = # mangled stack = 50 # stat cache = Yes # domain admin group = # domain guest group = # machine password timeout = 604800 # add user script = # delete user script = # logon script = logon.bat #设置用户登录脚本文件名(构建虚拟NT域时所需); logon path = %L%U.profile.pds #设置登录用户配置文件(构建虚拟NT域时所需); logon drive = # logon home = %N%U #设置用户配置文件的主目录; domain logons = Yes #启用域登录; os level = 64 #设置操作系统级别; lm announce = Auto # lm interval = 60 # preferred master = True #A local master = Yes #B domain master = True #C A、B、C把Samba设置成域主浏览器; browse list = Yes # enhanced browsing = Yes # dns proxy = No # wins proxy = No # wins server = #用来指定WINS服务器(IP地址); wins support = Yes #将Samba设置成WINS服务器; wins hook = # kernel oplocks = Yes # lock spin count = 3 # lock spin time = 10 # oplock break wait time = 0 # add share command = # change share command = # delete share command = # config file = # preload = # lock dir = /var/cache/samba # pid directory = /var/run/samba # utmp directory = # wtmp directory = # utmp = No # default service = # message command = # dfree command = # valid chars = # remote announce = # remote browse sync = # socket address = 0.0.0.0 # homedir map = auto.home # time offset = 0 # NIS homedir = No # source environment = # panic action = # hide local users = No # winbind uid = # winbind gid = # template homedir = /home/%D/%U # template shell = /bin/false # winbind separator = # winbind cache time = 15 # winbind enum users = Yes # winbind enum groups = Yes # winbind use default domain = No # comment = # path = # alternate permissions = No # username = # guest account = nobody #设置游客账号的用户名; invalid users = #无效用户(即不能访问该Samba服务器的用户); valid users = #有效用户(即可以访问该Samba服务器的用户); admin users = #设置管理员账号; read list = #设置具有只读权限的用户列表; write list = #设置具有写权限的用户列表; printer admin = #设置打印机管理员; force user = #强行设置文件及文件夹的属主用户; force group = #强行设置文件及文件的属主级; read only = Yes #设置共享文件或文件夹仅有只读; create mask = 0744 #设置创建文件时的默认权限; force create mode = 00 # security mask = 0777 # force security mode = 00 # directory mask = 0755 #设置创建文件夹时的默认权限; force directory mode = 00 # directory security mask = 0777 # force directory security mode = 00 # force unknown acl user = 00 # inherit permissions = No # inherit acls = No # guest only = No #设置共享只允许GUEST账号访问; guest ok = No #设置是否允许GUEST账号访问; only user = No # hosts allow = 192.168.0. 172.169.0. 127. #设置允许访问SAMBA有网络; hosts deny = #设置不允许访问SAMBA有网络; status = Yes #SAMBA的运行状态; nt acl support = Yes # block size = 1024 # max connections = 0 # min print space = 0 # strict allocate = No # strict sync = No # sync always = No # write cache size = 0 # max print jobs = 1000 # printable = No # postscript = No # printing = bsd # print command = lpr -r -P%p %s # lpq command = lpq -P%p # lprm command = lprm -P%p %j # lppause command = # lpresume command = # queuepause command = # queueresume command = # printer name = # use client driver = No # default devmode = No # printer driver = # printer driver file = /etc/samba/printers.def # printer driver location = # default case = lower # case sensitive = No #对字符的大小定是否敏感; preserve case = Yes # short preserve case = Yes # mangle case = No # mangling char = # hide dot files = Yes # hide unreadable = No # delete veto files = No # veto files = # hide files = #在客户端进行访问的时候是不显示隐藏文件; veto oplock files = # map system = No # map hidden = No # map archive = Yes # mangled names = Yes # mangled map = # browseable = Yes # blocking locks = Yes # csc policy = manual # fake oplocks = No # locking = Yes # oplocks = Yes # level2 oplocks = Yes # oplock contention limit = 2 # posix locking = Yes # strict locking = No # share modes = Yes # copy = # include = #引用其它配置文件; exec = # preexec close = No # postexec = # root preexec = #设置用户访问共享以root身份执行的命令; root preexec close = No #关闭的ROOT用户执行shell命令; root postexec = #设置当用户退出共享时root身份执行的命令; available = Yes #设置共享是否可用; volume = #设置卷标; fstype = NTFS # set directory = No # wide links = Yes #是不允许进行符号连接; follow symlinks = Yes # dont descend = # magic script = # magic output = # delete readonly = No #是否可以删除只读文件; dos filemode = No # dos filetimes = No # dos filetime resolution = No # fake directory create times = No # vfs object = # vfs options = #

|