Linux系统管理实践(5):Samba文件共享配置

   

Samba是一个网络服务器,用于Linux和Windows共享文件之用;Samba 即可以用于Windows和Linux之间的共享文件,也一样用于Linux和Linux之间的共享文件;不过对于Linux和Linux之间共享文件有更好的网络文件系统NFS(NFS也是需要架设服务器的)。Samba可以定位为一套功能极为强大的文件服务器软件,所谓文件服务器就是将文件服务主机上的目录分享出来,让您可以透过网络对分享出来的目录里的文件,做执行、读取、写入等动作。基本上NT/2000的网域是使用NetBEUI做计算机命名服务,使用广播封包来侦测网络上有哪些计算机、哪些目录提供资源共享,而Samba与UNIX主机间的沟通(如目录、文件分享)是透过TCP/IP协议达成任务,Samba若要与NT网域做沟通,透过TCP/IP当然是行不通的,只好使用NetBIOS对NT网域做广播,让Windows机器能够认识它,进而成为NT网域成员;因此Samba是使用smbd守护进程透过TCP/IP联系Unix主机,而使用nmbd守护进程透过NetBIOS对NT/2000网域做联系,也就是说Samba使用两种机制达成资源共享的目的。

t0112441d66e65cab9c.jpg
若没有安装Samba,在Ubuntu中可以用sudo apt-get install来安装samba和smbfs(samba的文件系统)。smb是Samba的主要启动服务器,让其它机器能知道此机器共享了什么;如果不打开nmb服务器的话,只能通过IP来访问,比如在Windows的IE浏览器上键入下面的一条来访问://192.168.1.5/共享目录。Samba服务的启动、重启和停止用"sudo /etc/samba/smb"后跟start、restart或stop。
1、主要的Samba工具(服务器端和客户端):
smbcacls smbcontrol smbencrypt smbmount smbprint smbstatus smbtree
smbclient smbcquotas smbpasswd smbspool smbtar smbumount testparm
testprns swat smbd nmbd
smbclient:利用这个工具可连接其它 Unix like 的 Samba Server,或是连接 Windows 机器,以取得档案分享服务。
testparm :这个工具可让您测试smb.conf档定义是否正确。
smbstatus:这个工具可用来显示目前client端连接到Samba Server的联机状况。
nmblookup:这个工具可使用NT/2000网域内的主机名称查询出对应的IP地址。
smbpasswd:这个工具可用来建立、变更登入 Samba server的加密密码。
swat:这个工具让您可使用web接口(如:IE、Netscape)对Samba Server做组态设定。  
2、Samba配置文件: 为/etc/samba/smb.conf,Ubuntu下的默认内容为:

 

# Debian GNU/Linux下的Samba套件配置文件例子 # # 这是主要的Samba配置文件。为了理解这里列出的选项,你应该阅读smb.conf(5)手册页。 # Samba有一大堆的配置选项,有很多并没有在这里的例子中列出 # 任何以;号或#号开始的行都是注释,会被忽略。在这里的例子中,我们将使用#作为释放, # 使用;的行表示配置文件的选项,这个选项你可能希望激活它 # 注意:每当你修改这个文件时,你应该运行命令"testparm"进行检查,以确保你没有犯基本 # 的语法错误。 # #======================= 全局设置 ======================= [global] ####### 浏览/标识 ####### # Samba服务器要加入的Windows工作组名(即NT域名) workgroup = WORKGROUP # 在NT域中显示的Samba服务器名,%h为本机的主机名 server string = %h server (Samba, Ubuntu) # Windows因特网名字服务支持部分: # WINS支持 - 通知Samba的NMBD组件激活WINS服务器 ; wins support = no # WINS服务器 - 通知Samba的NMBD组件,让它作为一个WINS客户端 # 注意: Samba既可以是一个WINS服务器,也可以一个WINS客户端,但只能为其中之一 ; wins server = w.x.y.z # 这将禁止nmbd通过DNS搜索NetBIOS名称 dns proxy = no # 什么样的名字服务,以及我们应该用什么样的顺序来解析主机名:下面是对IP地址 ; name resolve order = lmhosts host wins bcast ####### 网络 ####### # 要监听的特定网卡/网络集:这可以是网卡名或网卡的IP地址/掩码;通常首选网卡名 ; interfaces = 127.0.0.0/8 eth0 # 只绑定到命名的接口或网络;你必须通过使用上面的\'interfaces\'选项来使用它。 # 如果你的Samba机器没有受防火墙的保护,或者它自己就是一个防火墙,则建议你激活本选项。 # 然而,本选项不能正确地处理动态的或非广播的接口 ; bind interfaces only = true #### 调试/记帐 #### # 设置Samba为每个连接的机器使用独立的日志文件,%m表示客户机的netbios名 log file = /var/log/samba/log.%m # 设置Samba Server日志文件的最大容量,单位为kB,0代表不限制 max log size = 1000 # 是否只通过syslog来记录日志消息 ; syslog only = no # 我们想让Samba记录最小数量的日志消息到syslog中。所有消息应该记录到/var/log/samba/log.{smbd,nmbd}中。 # 如果你想通过syslog来记录日志,你应该把下面的参数设置得大一点 syslog = 0 # 当Samba崩溃时做一些可感觉到的动作:发送一个回溯信息给管理员 panic action = /usr/share/samba/panic-action %d ####### 认证 ####### # 设置Samba服务器的安全性等级。user等级表示每个访问服务器的用户需要在服务器上 # 有一个Unix账号,这总是一个好主意。其他细节可参考 # /usr/share/doc/samba-doc/htmldocs/Samba3-HOWTO/ServerType.html ; security = user # 表示是否指定用户密码以加密的形态发送到SAMBA服务器 encrypt passwords = true # 如果你正使用加密的密码,Samba将需要知道你使用的密码数据库类型 passdb backend = tdbsam obey pam restrictions = yes # 此项默认不使用,它是用来设置Guest帐号名 ; guest account = nobody # 指定登录无效的用户,即不能用这些用户来登录 invalid users = root # 用来控制当passdb中的加密SMB密码被更改时,是否进行同步 unix password sync = yes # 指定设置UNIX帐号密码的程序,其中%u表示用户名称 passwd program = /usr/bin/passwd %u passwd chat = *Enter/snew/s*/spassword:* %n/n *Retype/snew/s*/spassword:* %n/n *password/supdated/ssuccessfully* . # 表示可以使用PAM来修改SMB客户端的密码,而不使用“passwd program”选项中指定的程序 pam password change = yes # 控制成功的认证怎样映射到匿名连接 map to guest = bad user ########## 域 ########### # 表示本机器能对用户进行登录认证。主控制器PDC和从控制器BDC都必须激活本选项。如果你是BDC,则你必须把 # \'domain master\'设置为no ; domain logons = yes # # 下面的设置只有在\'domain logons\'被设设置时才会起作用: # 指定用户配置文件所在的目录(从客户端的角度看),接着需要在samba服务器上 # 有一个[profiles]共享(参看下面) ; logon path = //%N/profiles/%U # 配置文件存放的路径:在用户的主目录中 ; logon path = //%N/%U/profile # 下面的设置只有在\'domain logons\'被设设置时才会起作用: # 指定用户主目录的位置(从客户端的角度看) ; logon drive = H: ; logon home = //%N/%U # 下面的设置只有在\'domain logons\'被设设置时才会起作用: # 指定登录时运行的脚本,它必须存放在[netlogon]共享中 # 注意:必须按DOS文件的格式约定来存放 ; logon script = logon.cmd # 设置允许通过SAMR RPC管道在域控制器中创建Unix用户账号。这里表示创建一个带有失效的Unix密码的 # 用户账号,可以修改它以适应你的需要 ; add user script = /usr/sbin/adduser --quiet --disabled-password --gecos "" %u ########## 打印 ########## # 设置在开机时自动加载浏览列表,以共享打印机 ; load printers = yes # 指定打印系统的类型,这里为lpr(ng)打印 ; printing = bsd # 设置打印机配置文件名 ; printcap name = /etc/printcap # CUPS打印,参看cupsys-client包中的cupsaddsmb(8)手册页 ; printing = cups ; printcap name = cups ############ 杂项 ############ # 允许SAMBA服务器使用其他的配置文件,%m表示客户机的netbios名 ; include = /home/samba/etc/smb.conf.%m # 用来设置服务器和客户端之间会话的Socket选项,可以优化传输速度 # 更多细节参看smb.conf(5)和/usr/share/doc/samba-doc/htmldocs/Samba3-HOWTO/speed.html # Y你可能想在Linux系统中添加下面两项: # SO_RCVBUF=8192 SO_SNDBUF=8192 socket options = TCP_NODELAY # 下面的参数仅在安装了linpopup包后才会有用 ; message command = /bin/sh -c \'/usr/bin/linpopup "%f" "%m" %s; rm %s\' & # 设置Samba服务器是否要成为网域的主浏览器,网域主浏览器可以管理跨子网域的浏览服务 # 如果你要把本机器配置成从控制器,则必须设置成\'no\' ; domain master = auto # 一些winbind方面的默认配置 ; idmap uid = 10000-20000 ; idmap gid = 10000-20000 ; template shell = /bin/bash # 下面是sarge中的默认行为 ; winbind enum groups = yes ; winbind enum users = yes # 设置usershare选项,以允许非root用户用net usershare命令来共享文件 # usershare的最大值,0(默认即为0)意味着usershare不激活 ; usershare max shares = 100 # 允许有usershare特权的用户创建公共的共享,而不只是授权一个共享 usershare allow guests = yes #======================= 共享定义 ======================= # 取消下面的注释,会激活默认用户目录的共享。这将把每个用户的主目录共享为//server/username ;[homes] ; comment = Home Directories ; browseable = no # 用户主目录是否设置为只读,如果你想让它可写,则设置为no ; read only = yes # 由于安全的原因,文件创建掩码设置为0700,如果你想以group=rw的权限创建文件,则应设置为0775 ; create mask = 0700 # 由于安全的原因,文件创建掩码设置为0700,如果你想以group=rw的权限创建文件,则应设置为0775 ; directory mask = 0700 # 默认情况下,//server/username共享能被任何连接samba服务器的用户访问。取消下面的 # 注释可确保只有username能连接到//server/username,%S表示当前登录的用户名 ; valid users = %S # 取消下面的注释,可为基于域的登录创建netlogon目录(你还需要配置Samba作为一个域控制器) ;[netlogon] ; comment = Network Logon Service ; path = /home/samba/netlogon ; guest ok = yes ; read only = yes ; share modes = no # 设置存放配置文件的共享目录 # 取消下面的注释,可创建profiles目录来存放用户的配置文件(参看上面的\'logon path\'选项, # 你还需要配置Samba作为一个域控制器)。下面的路径应该对所有用户可写,以便当他们第一次登录 # 时能够创建他们的配置目录 ;[profiles] ; comment = Users profiles ; path = /home/samba/profiles ; guest ok = no ; browseable = no ; create mask = 0600 ; directory mask = 0700 # 设置共享的打印机目录 [printers] comment = All Printers browseable = no path = /var/spool/samba printable = yes guest ok = no read only = yes create mask = 0700 # Windows客户端使用这个共享名作为下载打印驱动的源位置 [print$] comment = Printer Drivers path = /var/lib/samba/printers browseable = yes read only = yes guest ok = no # 允许写入该共享的用户,把下面的ntadmin改为Windows系统管理员所在的组名 ; write list = root, @ntadmin # 一个例子:对你的CD_ROM进行共享 ;[cdrom] ; comment = Samba server\'s CD-ROM ; read only = yes ; locking = no ; path = /cdrom ; guest ok = yes # 下面两个参数表示当访问cdrom共享时怎样自动挂载CD-ROM。要让它能工作,必须在/etc/fstab中包含 # 类似于下面的条目: # /dev/scd0 /cdrom iso9660 defaults,noauto,ro,user 0 0 # 在连接后,CD-ROM可以自动解挂。如果你不想使用自动挂载/解挂功能,那就要把CD挂载到/cdrom下 ; preexec = /bin/mount /cdrom ; postexec = /bin/umount /cdrom

 

我们用得最频繁的是共享目录的设置选项,其含义如下:
[共享名]:在客户端显示的共享名
comment=任意字符串:是对该共享的描述,可以是任意字符串,不过最好把访问的用户名和密码写入。
path=共享目录路径:用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名,用宏表示主要用于[homes]共享域。例如,如果我们不打算用home段做为客户的共享,而是在/home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目录,这样path就可以写成path = /home/share/%u。用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。同样,如果我们不是以用户来划分目录,而是以客户机来划分目录,为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径,作为不同机器的共享资源,就可以这样写path = /home/share/%m。
browseable=yes/no:用来指定该共享是否可以浏览。
writable=yes/no:用来指定该共享路径是否可写。
available=yes/no:用来指定该共享资源是否可用。
admin user=该共享的管理者:用来指定该共享的管理员(对该共享具有完全控制权限)。在samba 3.0中,如果用户验证方式设置成“security=share”时,此项无效。例如"admin users=bobyuan,jane"(多个用户中间用逗号隔开)。
valid users=允许访问该共享的用户:用来指定允许访问该共享资源的用户。例如"valid users = bobyuan,@bob ,@tech"(多个用户或者组中间用逗号隔开,如果要加入一个组就用“@+组名”表示。)
invalid users = 禁止访问该共享的用户:用来指定不允许访问该共享资源的用户。例如"invalid users=root,@bob"(多个用户或者组中间用逗号隔开。)
write list=允许写入该共享的用户:用来指定可以在该共享下写入文件的用户。例如"write list=bobyuan,@bob"。
public=yes/no:用来指定该共享是否允许guest账户访问。
guest ok=yes/no:意义同"public"。
read only=yes:共享目录是否只读。
create mask=0700:文件创建掩码。
directory mask=0700:目录创建掩码。
3、Samba配置实例:
(1)创建共享目录:我们在自己主目录下创建一个共享目录Share,它只允许new用户访问。创建共享目录的命令如下:

 

cd ~ mkdir share chmod 777 share

 

注意在Ubuntu系统中创建共享目录时要使用777,让所有用户可读可写可运行。当把这个共享设置添加到smb.conf中时,我们把文件创建掩码和目录掩码设置为0755,由于掩码的作用,这样new用户对这个共享目录有读写执行权限,其他用户只有读和执行权限。修改配置文件smb.conf(修改之前先作一下备份),把下面的共享设置加入到smb.conf的末尾:

 

[share] comment = Shared Folder with username:new, password:... path = /home/zhouhuansheng/Share public = yes writable = yes valid users = new create mask = 0755 directory mask = 0755 available = yes browseable = yes

 

(2)创建登录用户并添加到Samba的密码数据库中:创建new这个账号,以便远程用户能通过它来访问共享。

 

sudo useradd new

 

要注意,上面这个new是Linux账号,我们没有给它设置本机登录密码,因此它不能从本机登录,只能从远程访问。由于客户端要用这个账号来登录Samba服务器,因此我们还要把这个账号添加到Samba服务器的smbpasswd文件中(因为登录到Samba服务器也就必须要登录到Linux系统,因此必须先在/etc/passwd中有这个账号,然后我们再把它添加到smbpasswd文件中去),并为它设置一个登录的SMB密码,注意samba的登录密码可以和本机登录密码不一样。

 

sudo smbpasswd -a new # 接下来输入两次SMB密码即可

 

以后要修改new用户的SMB密码时也用这个命令,从smbpasswd文件中移除这个账号则用命令"smbpasswd -x new"。创建了用户后,要建立用户映射文件,并且security安全级别要设置为user,这表示登录Samba服务器必须要有一个账号。修改smb.conf中的security选项,并在下面添加username map选项:

 

security = user username map = /etc/samba/smbusers

 

用户映射文件smbusers用来包含所有的Samba用户名,在其中添加一行内容:new = "network username",表示new这个账号是网络上的远程用户。
(3)修改显示字符集以防止出现乱码:由于Ubuntu系统中通常使用UTF-8编码,而Windows主机中一般使用GBK编码,为防止在Windows中显示为乱码,找到[global],改一下workgroup选项的值,并在下面加一些字符集选项:

 

workgroup = WORKGROUP display charset = UTF-8 unix charset = UTF-8 dos charset = cp936

 

这里因为大部分Windows主机的默认工作组名为WORKGROUP,因此我们改成这个值,你必须确保你的Windows主机的工作组名与smb.conf中的配置一致。注意如果你的Ubuntu中的字符集为zh_CN.GB2312或zh_CN.GBK,则display charset和unix charset都要设置为cp936(即简体中文)。设置完毕后,需要注销一次。才可以看到中文的目录。
(4)当所有设置均完成后,运行一下testparm,检查一下配置是否有语法错误,然后重启Samba服务。
4、访问共享目录:
(1)Windows访问Linux中的共享:这个比较简单,像正常的Windows主机之间的共享访问一样。在“网上邻居”里查看工作组,里面会显示Ubuntu主机,点击可看到相应的共享。也可以在资源管理器的地址栏中输入://Ubuntu的IP,就会列出相应的共享。双击共享,然后输入用户名new和相应的SMB密码,即可进入共享目录。由于我们配置为可写,因此你还可以往共享目录里写东西。注意如果Window中可以看到共享目录,但是就是打不开,原因就在于权限问题。假设你在自己Ubuntu系统下右击一个文件夹,点共享,然后创建共享文件,你还必须把它设置为可读可写可运行,这样在Windows中才能访问它。
(2)Linux访问Windows中的共享:
第一种方法:用smb访问。直接点击系统菜单中的"位置->网络",里面有个“Windows Network",点进去,再找你要找的电脑和文件,届时可能需要被访问的那个计算机的帐号和密码。这种方法的成功率不高。
第二种方法:用ubuntu系统自带的连接到服务器功能来访问。点击"位置->连接到服务器",在服务类型中选择“windows share”,在"Server"中输入windows计算机的ip地址或计算机名、"Folder"中输入共享文化夹名、"User Name"中输入Windows的账号、"Domain Name"中输入Windows的工作组名,点击连接,然后输入账号的密码,这样在Ubuntu系统桌面上就会显示这个共享的文件夹。这个方法的成功率比较高。接下来的两种方法是最基本的方法。
第三种方法:用mount或smbmount把远地的共享目录挂载到本地。

 

cd /mnt sudo mkdir wind sudo mount -t smbfs -o iocharset=utf8,username=new,password=new //192.168.0.180/my_pictures /mnt/wind

 

先建立一个挂载点,然后用Samba的new用户及其密码来挂载远程Windows中的共享目录。由于本地Ubuntu使用utf8,为防止显示乱码,指定传输的字符集为utf8。这样共享目录my_pictures就被挂载到/mnt/wind下了。也可用smbmount命令,它其实就是加了参数的mount(注意回车后可能还会要你输入一遍密码)。

 

sudo smbmount //192.168.0.180/my_pictures wind -o iocharset=utf8 user=new pass=new

 

第四种方法:用smbclient工具来连接到共享目录,这是一个类似于ftp的工具。

 

smbclient //192.168.0.180/my_pictures -U new password:new

 

然后就可以用smbclient命令来操作共享目录,主要的命令有:
命令 说明
?或help [command] 提供关于帮助或某个命令的帮助
![shell command] 执行所用的SHELL命令,或让用户进入SHELL提示符
cd [目录] 切换到服务器端的指定目录,如未指定,则smbclient返回当前本地目录
lcd [目录] 切换到客户端指定的目录
dir 或ls 列出当前目录下的文件
exit 或quit 退出smbclient
get file1 file2 从服务器上下载file1,并以文件名file2存在本地机上的主目录下;如不想改名可把file2省略
mget file1 file2 filen 从服务器上下载多个文件
md或mkdir 目录 在服务器上创建目录
rd或rmdir 目录 删除服务器上的目录
put file1 [file2] 向服务器上传一个文件file1,传到服务器上改名为file2
mput file1 file2 filen 向服务器上传多个文件

附:
(1)security选项一共有四种安全级别:
share:用户访问Samba Server不需要提供用户名和口令, 安全性能较低。
user:Samba Server共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。
server:依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用 Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式。
domain:域安全级别,使用主域控制器(PDC)来完成认证。
(2)smb.conf中其他的一些常用选项:
hosts allow=127. 192.168.1. 192.168.10.1:表示允许连接到Samba Server的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。hosts deny与hosts allow刚好相反。
max connection=0:用来指定连接Samba Server的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。
deadtime=0:用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。
time server=yes/no:用来设置让nmdb成为windows客户端的时间服务器。