# 服务SMB
SMB、CIFS、Samba在目前来看是一样的,只不过随着技术的发展逐渐进步。通常情况,**tftp和nfs是在嵌入式Linux开发环境中经常使用的传输工具,samba则是Linux和Windows之间的文件传输工具。samba是模仿Windows网上邻居的SMB的通讯协议,将Linux操作系统“假装成”Windows操作系统,通过网上邻居的方式来进行文件传输的。**
## Samba服务
Samba是在Linux系统上实现SMB(Session MessageBlock)协议的一个免费软件,以实现文件共享和打印机服务共享。
### Samba服务器组件
samba有两个主要的进程smbd和nmbd。smbd进程提供了文件和打印服务,而nmbd则提供了NetBIOS名称服务和浏览支持,帮助SMB客户定位服务器,处理所有基于UDP的协议。
### Samba服务器相关的配置文件
- /etc/samba/smb.conf
这是samba的主要配置文件,基本上仅有这个文件,而且这个配置文件本身的说明非常详细。主要的设置包括服务器全局设置,如工作组、NetBIOS名称和密码等级,以及共享目录的相关设置,如实际目录、共享资源名称和权限等两大部分。
- /etc/samba/lmhosts
早期的 NetBIOS name 需额外设定,因此需要这个 lmhosts 的 NetBIOS name 对应的 IP 檔。 事实上它有点像是 /etc/hosts 的功能!只不过这个 lmhosts 对应的主机名是 NetBIOS name 喔!不要跟 /etc/hosts 搞混了!目前 Samba 预设会去使用你的本机名称 (hostname) 作为你的 NetBIOS name,因此这个档案不设定也无所谓。
- /etc/sysconfig/samba
提供启动 smbd, nmbd 时,你还想要加入的相关服务参数。
- /etc/samba/smbusers
由于 Windows 与 Linux 在管理员与访客的账号名称不一致,例如: administrator (windows) 及 root(linux), 为了对应这两者之间的账号关系,可使用这个档案来设定。
- /var/lib/samba/private/{passdb.tdb,secrets.tdb}
管理 Samba 的用户账号/密码时,会用到的数据库档案。
- /usr/share/doc/samba-<版本>
这个目录包含了 SAMBA 的所有相关的技术手册喔!也就是说,当你安装好了 SAMBA 之后,你的系统里面就已经含有相当丰富而完整的 SAMBA 使用手册了!
至于常用的脚本文件案方面,若分为服务器与客户端功能,则主要有底下这几个数据:
- /usr/sbin/{smbd,nmbd}:服务器功能,就是最重要的权限管理 (smbd) 以及 NetBIOS name 查询 (nmbd) 两个重要的服务程序;
- /usr/bin/{tdbdump,tdbtool}:服务器功能,在 Samba 3.0
以后的版本中,用户的账号与密码参数已经转为使用数据库了!Samba 使用的数据库名称为 TDB (Trivial DataBase)。
既然是使用数据库,当然要使用数据库的控制指令来处理啰。tdbdump 可以察看数据库的内容,tdbtool 则可以进入数据库操作接口直接手动修改帐密参数。不过,你得要安装 tdb-tools 这个软件才行;
- /usr/bin/smbstatus:服务器功能,可以列出目前 Samba 的联机状况, 包括每一条 Samba 联机的 PID, 分享的资源,使用的用户来源等等,让你轻松管理 Samba 啦;
- /usr/bin/{smbpasswd,pdbedit}:服务器功能,在管理 Samba 的用户账号密码时, 早期是使用 smbpasswd 这个指令,不过因为后来使用 TDB 数据库了,因此建议使用新的 pdbedit 指令来管理用户数据;
- /usr/bin/testparm:服务器功能,这个指令主要在检验配置文件 smb.conf 的语法正确与否,当你编辑过 smb.conf
时,请务必使用这个指令来检查一次,避免因为打字错误引起的困扰啊!
- /sbin/mount.cifs:客户端功能,在 Windows 上面我们可以设定【网络驱动器机】来连接到自己的主机上面。在 Linux 上面,我们则是透过 mount (mount.cifs) 来将远程主机分享的档案与目录挂载到自己的 Linux 主机上面哪!
- /usr/bin/smbclient:客户端功能,当你的 Linux主机想要藉由【网络上的芳邻】的功能来查看别台计算机所分享出来的目录与装置时,就可以使用 smbclient来查看啦!这个指令也可以使用在自己的 SAMBA 主机上面,用来查看是否设定成功哩!
- /usr/bin/nmblookup:客户端功能,有点类似 nslookup 啦!重点在查出 NetBIOS name 就是了
- /usr/bin/smbtree:客户端功能,这玩意就有点像 Windows 系统的网络上的芳邻显示的结果,可以显示类似【靠近我的计算机】之类的数据, 能够查到工作组与计算机名称的树状目录分布图!
## Samba服务安装和配置
### 配置一:共享一个目录,需要用户名和密码才能登录和查看目录,目录权限可自由设定
1、服务端安装
```bash
#CentOS
yum install -y samba samba-client
#Ubuntu
sudo apt-get install samba samba-common
```
2、创建共享目录并设置权限
```bash
mkdir share
chmod 777 share
```
3、添加用户并设置密码
```bash
sudo smbpasswd -a wang #添加用户
sudo smbpasswd -d wang #删除用户
```
4、配置samba
```bash
sudo vim /etc/samba/smb.conf
==============================================
[share]
comment = share folder
path = /home/wang/share
create mask = 0755
directory mask = 0755
valid users = wang
force user = wang
force group = wang
public = yes
available = yes
writable = yes
browseable = yes
===============================================
#全局配置#
===================================================================================
[global]
workgroup = MYGROUP #工作组名称
server string = Samba Server Version #服务描述
netbios = samba-server #netbios名称,客户端可通过此名称访问服务,需启动nmb服务,并开放udp137/138端口
interfaces = lo eth0 192.168.100.110/24 #设置所使用的网卡接口、地址
hosts allow = 127. 192.168.100. #允许连接的客户端范围
security = user #认证模式,默认是user,即用户密码认证。share(只使用密码或匿名共享)
encrypt passwords = yes #设置是否对samba的密码进行加密,现在windows操作系统都是使用加密密码,所以一般要开启此项
passdb backend = tdsam #当使用加密密码时,指定所使用的密码数据库类型。tdsam可使用smbpasswd或pdbedit命令来创建samba用户密码
username map = /etc/samba/smbusers #设置用户映射,比如可以将root换成administrator、admin等
===================================================================================
#自定义配置说明#
===================================================================================
[sharing]
comment = sharing
path = /var/samba/shared #自定义目录
valid users = sute_jun,@GROUP #允许的用户,或组GROUP下的用户
write list = @GROUP,USER #在writable = no的情况下,只允许GROUP组下的用户可写
public = no #是否公开,如需创建公开共享,需设置成yes,并注释valid users。在[global]中配置security=share,在[sharing]中增加guest ok = yes
browseable = yes #客户端sharing是否可见(不影响直接输入名称sharing访问)
writable = yes #配置公开共享时,可选择性使用read only = yes或者writable = yes
printable = no
create mask = 0664 #默认创建文件的权限值
directory mask = 0755 #默认创建目录的权限值
force group = GROUP #设置默认创建的文件的属组
force user = USER #设置默认创建的文件的所有者
hosts allow = 127.192.168.100. #允许连接的客户端范围
====================================================================================
```
5、重启samba服务
```bash
#Ubuntu系
systemctl restart smbd.service
#或者sudo service smbd restart
#或者sudo /etc/init.d/smb restart
#CentOS系
systemctl restart smb.service
#也可以事先检测samba服务配置是否正确
testparm
#可以查看一下samba使用的端口,一般是139和445
netstat -anpl | grep mbd
```
6、客户端使用
```bash
##########使用场景一##########
Windows+R
\\ip
#输入用户名和密码
#可以右键->映射网络驱动器->保留目录到文件资源管理器
##########使用场景二##########
Linux 下测试(需安装samba-client)`smbclient //192.168.0.139/linson` 出现输入密码提示,无视即可。
##########使用场景三##########
挂在到linux本地目录下,先安装 yum install -y cifs-utils 然后 mount -t cifs //192.168.0.139/linson /opt/ 进入目录即可。
##########使用场景四##########
MacOS系统使用Finder
smb://sharing
```
### 配置二:共享一个目录,任何人不需要密码即可登录,但是目录为只读
1、服务端安装
```bash
#CentOS
yum install -y samba samba-client
#Ubuntu
sudo apt-get install samba samba-common
```
2、创建共享目录并设置权限
```bash
mkdir share
chmod 777 share
```
3、配置samba
```bash
sudo vim /etc/samba/smb.conf
============================================
security=user 修改为 security=share
workgroup=MYGROUP 修改为 workgroup=WORKGROUP
#最后处添加目录
write list = +staff
[linson]
comment = share all
path = /home/wang/share
browseable = yes
public = yes
writable = no
=============================================
cp /etc/passwd /home/wang/share/1.txt
```
5、重启samba服务
```bash
systemctl restart smbd.service
#或者sudo service smbd restart
#或者sudo /etc/init.d/smb restart
```
6、客户端使用
```bash
##########使用场景一##########
Windows 文件资源管理器输入:\\192.168.0.139 即可看到一个叫做linson的分享。
##########使用场景二##########
Linux 下测试(需安装samba-client)`smbclient //192.168.0.139/linson` 出现输入密码提示,无视即可。
##########使用场景三##########
挂在到linux本地目录下,先安装 yum install -y cifs-utils 然后 mount -t cifs //192.168.0.139/linson /opt/ 进入目录即可。
##########使用场景四##########
MacOS系统使用Finder
smb://sharing
```