andylanzhiyong 2011-08-10
1. 基础概念
Samba(SMB是其缩写) 是一套让UNIx系统能够应用Microsoft网络通讯协议的软件,用于Linux和
Windows共享文件之用;Samba 即可以用于Windows和Linux之间的共享文件,也一样用于Linux
和Linux之间的共享文件;不过对于Linux和Linux之间共享文件有更好的网络文件系统NFS,NFS也是
需要架设服务器 的。
在Windows 网络中的每台机器即可以是文件共享的服务器,也可以同是客户机;Samba 也一样能行,
比如一台Linux的机器,如果架了Samba Server 后,它能充当共享服务器,同时也能做为客户机来访
问其它网络中的Windows共享文件系统,或其它Linux的Sabmba 服务器。
在Windows网络中,看到共享文件功能可知道,直接就可以把共享文件夹当做本地硬盘来使用。在Linux
中,就是通过Samba向网络中的机器提供共享文件系统,也可以把网络中其它机器的共享挂载在本地机
上 使用;这在一 定意义上说和FTP是不一样的。
SMB(Server Message Block)通信协议是微软和英特尔在1987年制定的协议,主要作为Microsift网络
的通讯协议, 而Samba则是将SMB协议搬到UNIX上来应用,Samba的核心是SMB协议。SMB是在会
话层和表示层以及下部分应用层的协议。最近微软又将SMB改名为:CIFS(Common Internet File
System)。
2. 应用范围
Samba 应用范围主要是Windows和Linux 系统共存的网络中使用;如果一个网络环境都是Linux或Unix
类的系统,没有必要用Samba,应该用NFS;而Samba主要是共享文件和共享打印机和其他硬件设备的
服 务。
3. 服务理解及命令操作
3.1Samba有两个服务:smb和nmb,各自的功能是:
smb是Samba 的主要启动服务器,让其它机器能知道此机器共享了什么;如果不打开nmb服务器的话,
只能通过IP来访问,比如在Windows的IE浏览器上打入下面的一条来访问;
\\192.168.1.168\共享目录
\\192.168.1.168\public
nmb用于将Linux机器所共享的工作组及在此工作组下的netbios name解析出来。
3.2常见命令操作
查看本机安装的samba库:rpm -qa | grep ^samba
查询阮家安保中有关samba的软件包:yum search samba
服务启动:
[root@localhost ~]# /etc/init.d/smb start
[root@localhost ~]# service smb start
服务停止: [root@localhost ~]# /etc/init.d/smb stop
[root@localhost ~]# service smb stop
服务重启: [root@localhost ~]# /etc/init.d/smb restart
[root@localhost ~]# service smb restart
smb命令所在目录:
[root@localhost ~]# /usr/sbin/smbd
[root@localhost ~]# /usr/sbin/nmbd
可视化配置smb和nmb服务(RHEL6):
选择“系统”,“管理”,“服务”,将smb和nmb服务启动,同时将iptables服务关闭,该设置在服务重启后将
被保留。
[root@localhost ~]# pgrep smbd
[root@localhost ~]# pgrep nmbd
[root@localhost ~]# service smb status
关掉Samba服务器,要root权限来执行; [root@localhost ~]# pkill smbd
[root@localhost ~]# pkill nmbd
[root@localhost ~]# netstat -tlnp | grep smb
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 10639/smbd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 10639/smbd
如果您有防火墙,一定要把这两个端口打开。如果不知道怎么打开。是新手,还是把防火墙规则清掉:
[root@localhost ~]# iptables -F
[root@localhost ~]# /sbin/iptables -F
[root@localhost ~]# service iptables stop
smbcacls smbcontrol smbencrypt smbmount smbprint smbstatus smbtree
smbclient
smbcquotas smbmnt smbpasswd smbspool smbtar smbumount
smbd nmbd
mount
[root@localhost ~]# smbclient -L //ip地址或计算机名
smbclient 是Samba 的Linux 客户端,在Linux机器上用来查看服务器上的共享资源,也可以象FTP一
样,用户可以登录Samba服务器,也可以上传put和下载get文件,但对中文支持并不友好;
查看服务器上的资源:
smbclient -L //IP [-U 用户名]
如果您的Samba服务器配置为user模式,就要加 “-U 用户名“,如果是share模式,省略也可;
比如:
[root@localhost ~]# smbclient -L //192.168.1.168 -U FDC
如果您是用share模式,就可以不必理会用户和密码,直接用;
[root@localhost ~]# smbclient -L //192.168.1.168
Enter root's Password: 直接按回车即可
smbclient //IP地址/共享文件夹 -U 用户
说明:IP地址可以用/sbin/ifconfig 来查看; 共享文件夹是我们在smb.conf中定义的[共享文件夹],
比如[sir01]。-U 用户名表示Samba 的用户;
比如:
[root@localhost ~]# smbclient //192.168.1.168/FDC -U FDC
Password:
Domain=[LINUXSIR] OS=[Unix] Server=[Samba 3.5.4-68.el6]
smb: \> ls
smbclient 命令:
命令 说明
?或help[command]提供关于帮助或某个命令的帮助
![shellcommand]执行所用的SHELL命令,或让用户进入SHELL提示符
cd [目录] 切换到服务器端的指定目录,如未指定,则 smbclient 返回当前本地目录
lcd[目录]切换到客户端指定的目录;
dir或ls列出当前目录下的文件;
exit或quit退出smbclient
get file1 file2 从服务器上下载file1,并以文件名file2存在本地机上;如果不想改名,可以把file2省略
mgetfile1file2file3filen从服务器上下载多个文件;
md或mkdir目录在服务器上创建目录
rd或rmdir目录删除服务器上的目录
putfile1[file2]向服务器上传一个文件file1,传到服务器上改名为file2;
mput file1 file2 filen 向服务器上传多个文件4. 挂在主机共享文件
切换至root用户
su - root
mount //192.168.1.168/WinLinux /mnt/hgfs
取消挂载:umount /mnt/hgfs
5. smb.con文件
本文件中:"#"和";"均为注释,去除注释和范例的命令:grep -v "^#" smb.conf | grep -v "^;"
Global Setting 部分:
workgroup=MYGROUP:Windows主机的工作组名,Windows主机必须工作在同一个组中;
server string = Samba Server Version %v:显示在Window上的信息
log file,max log size均为日志配置。
共享部分:
[Linux Share] #在Windows主机中看到的共享文件名,不一定与Linux中共享的文件名一样
comment = This is Linux Share Directory #对此目录的说明
path = /home/LinuxShare #Linux系统真实的共享目录,要写绝对路径
public = yes #是否允许所有人看到此目录,no为看不到
writable = yes #是否允许用户在此目录下科协,no为不可写,如果可写还需要该目录具有写权限
read only = yes #设置用户是否只读
create mode = 0700 #如果有可写权限,建立的文件默认的权限掩码
directory mode = 0775 #如果有可写权限,建立的目录默认的权限掩码
6. 案例
6.1 在Windows系统中不用输入密码访问Linux共享目录
(1) Linux下创建要共享的目录:mkdir /home/LinuxShare
(2) 编辑配置文件:vi smb.conf
将文件中得内容修改:security=user改成:security=share
在文件末尾添加:
[Linux Share]
comment = This is Linux Share Directory
path = /home/LinuxShare
public = yes
writable = yes
保存,退出。
测试配置参数是否正确命令:testparm
(3) 重启服务:service smb restart
(4) Windows下访问:运行中输入:\\192.168.1.168\LinusShare,若输入:\\192.168.1.168则打
开Linux中所有共享目录。
6.2 在Windows系统中需要输入用户名才能访问Linux共享目录
(1) 更改:security = user
(2) 在smb.conf的securoty = user 下添加:smb passwd file = /etc/samba/smbpasswd
在共享部分添加:valid users = %S
(3) 新建smbpasswd文件:
touch /etc/samba/smbpasswd
smbpasswd -a FDC
NEW SMB passwd
Retype new SMB passwd:
(4) 服务重启。
6.3 在Linux中访问Windows中共享的目录
(1)查看服务器上的资源
访问格式:smbclient -L //ip地址或计算机名 [-U 用户名]
smbclient -L //192.168.1.106
smbclient -L //192.168.1.106 -U Administrator
(2)以用户身份登录
smbclient //IP地址/共享文件夹 -U 用户
smbclient //192.168.1.168/FDC -U FDC
smbclient命令:
?或help,![Shell Command],cd,lcd,dir或ls,exit或quit,get file1 file2,mget file1 fiel2 file3 filen,
md或mkdir,rd或rmdir,put file1 [file2],mput file1 file2 filen
6.4 Windows下访问Linux共享文件
浏览器上输入:\\ip地址或计算机名或"开始","运行","\\192.168.1.168"
这样就能看到这个机器上有什么共享的了,点鼠标操作完成;如果访问不了,不要忘记把Linux的防火墙
规则清掉,或让相应的端口通过。
其他方式:下载explore2fs软件:http://www.chrysocome.net/explore2fs,使用该软件访问。
6.5 Linux下smbfs文件系统的挂载(待验证)
smbmount '\\Windows主机IP\共享目录名' 挂载点 -o username
例如:smbmount '\\192.168.1.106\WinLinux' /mnt/hgfs -o username="Administrator"
说明:
如果服务器是以share共享的,则无需用户名和密码就能挂载,如果出现要密码的提示,直接回车就行;
也可以用smbmount 来挂载,这样就无需用mount -t smbfs来指定文件系统的类型了;
对于挂载点,需要自己建立一个文件夹,比如可以建在/opt/smbhd或mnt/hgfs;
在mount的命令中,有这样的一个参数codepage=cp936,这是服务器端文件系统的编码的指定,
cp936就是简体中文,当然可以用utf8等其他编码;
如果挂载了远程的smbfs文件系统出现的是简体中文乱码,就要考虑挂载时要指定编码了。
7. 常见异常解决
7.1 session setup failed: NT_STATUS_LOGON_FAILURE
Samba的用户应该与具Linux系统用户账号同名来访问系统资源,samba用户密码独立于系统,同名的系
统账号不设密码,为安全起见,不能登录系统。
原因:Samba所使用过的账户必须是系统中现存的用户。
解决:smbpasswd -a FDC
# -a添加指定的用户帐号
7.2 Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.24]
Server not using user level security and no password supplied.
Server requested LANMAN password (share-level security) but 'client lanman auth' is disabled
tree connect failed: NT_STATUS_ACCESS_DENIED
解决:在/etc/samba/smb.conf的[global]字段里面加入:
comment = This is Linux Share Directory
path = /home/LinuxShare
valid users = FDC
public = yes
writable = yes
7.4 用户权限设定无效
设定具体的用户访问Linux下的共享文件,除了需要在smb.conf中配置writable=yes之外,还需该用户
对共享资源有写权限,最简单的实现办法是赋予其他人对目录写权限:
chmod o+w /LinuxShare
最佳方法是将设置权限的用户加入到目录对应的组中,对组授权,进行统一管理。
7.5 Error returning browse list :NT_status_ok
原因:用smbclinet //Windows主机IP/WinLinux -U Administrator,来访问xp上的共享文件,但是
用
smbclient -L //Windows主机IP, 来查看xp上的共享资源时,却得到Error returning browse list
:NT_status_ok的提示。
解决方法:
修改WINDOWS注册表的值/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Lsa
/restrictanonymous 为0,重启WINDOWS的系统则可解决。
7.6 Tree connect failed: NT_STATUS_BAD_NETWORK_NAME
8. Samba官方文档
http://samba.org/samba/docs/man/Samba-HOWTO-Collection/
9. Samba打印机共享
在smb.conf文件中配置如下两行,即可自动的添加打印机列表:
# -------------------- Printing Options -----------------------
loadprinters=yes
cups options = raw #表示自动加载共享打印机RHEL默认的打印系统是cups,打印机的配置文件是/etc/cups/printers.conf,性能配置文件是
/etc/printcap.
系统默认的打印机配置:
[printers]
comment=AllPrinters
path=/var/spool/samba#存放发送给打印机的文件的缓冲目录
browseable=no#标示是否在Samba网络中显示在共享列表中,建议设为yes
guestok=no#设为yes标示不需要对用户进行身份认证即可访问
writable=no
printable = yes #取值为yes标示此共享为打印共享,否则为磁盘共享示例:设置个人打印机的配置案例:
[printers] comment = FDC's Printer
valid users = FDC
path=/var/FDC
browseable=no
guestok=no
writable=no
printable = yespublic = no # 不共享打印机
10. Samba共享权限管理:设置口令文件
(1)首先将Linux中的系统用户口令文件(/etc/passwd)导入到samba口令文件中(/etc/samba
/smbpasswd):
cat /etc/passwd | mksmbpasswd.sh > /etc/samba/smbpasswd
(2)给smbpasswd等文件及文件夹设置访问权限
chown root.root /etc/samba/smbpasswd
chmod 600 /etc/samba/smbpasswd
chomd 600 /etc/samba
(3)若要手动添加一个用户,则首先要保证Linux中存在该用户存在
useradd SambUser
passwd SambPasswd
smbpasswd -a SambUser
11. 匿名用户可读可写的实现
(1)修改smb.conf文件
# cd /etc/samba
# mv smb.conf smb.confBAK #备份文件
touch smb.con #重新创建一份配置文件
在新创建的配置文件中加入以下内容:
[Global]
workgroup=Linux
netbiosname=Linux_FDC
serverstring=LinuxSambaServerTestServer
security=share
[LinuxShare]
path=/home/LinuxShare
writeable=yes
browseable=yes
guest ok = yes(2)建立响应目录并授权
mkdir -p /home/LinuxShare
id nobody #查看nobody用户信息
chown -R nobody:nobody /home/LinusShare
(3)启动smb服务
service smb restart
(4)查看smb进程
pgrep smbd
(5)访问Samba服务器共享
Linux下:smbclient -L //192.168.1.168
Win下: \\192.168.1.168