samba
samba是SMB文件共享协议的应用软件,可以让Linux系统和Windows系统之间相互共享资源。
在Linux系统中使用smbd服务器提供提供共享资源;使用smbclient去访问其他smbd服务器所提供的共享资源。
在Windows中有SMB/CIFS服务器和客户端。
SMB协议
SMB(Server Message Block)协议是一种在局域网上共享资源的协议,它可以为局域网中的Windows系统、Linux系统或是IOS系统提供文件系统、打印服务或其他一些信息。
SMB的工作原理基于NetBIOS(Network Basic Input/Output System)协议与SMB这两种协议。
- NetBIOS:用于发现局域网内主机名;使用下列端口:UDP/137(NetBIOS 名称服务)、UDP/138(NetBIOS 数据报服务)、TCP/139(NetBIOS 会话服务);
- SMB:用于文件传输;使用下列端口:TCP/139、TCP/445。
SMB连接过程
-
首先客户端发送一个 SMB Negotiate Protocol Request 请求数据报,并列出它所支持的所有SMB协议版本。
-
服务器收到请求信息后回应 Negotiate Protocol Response,并列出希望使用的协议版本;如果没有可使用的协议版本则返回0XFFFFH,结束通信。
-
协议确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送 Session Setup Request 请求数据报实现的;客户端发送一对用户名和密码或一个简单密码到服务器。
-
然后服务器通过发送一个 Session Setup Response 应答数据报来允许或拒绝本次连接。
-
当客户端和服务器完成认证之后,它会发送一个 Tree Connect Request 数据报并列出它想访问网络资源的名称
-
之后服务器会发送一个 Tree Connect Response 应答数据报以表示此次连接是否被接受或拒绝。
-
连接到相应资源后,SMB客户端就能够通过open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过close SMB关闭文件。
samba主要有两个进程
- smbd进程:用于控制共享目录、权限和文件传输。
- nmbd进程:用于名称解析,基于NEtBIOS协议获得计算机名称,解析为相应的IP地址。
Linux下搭建samba服务器实现文件共享
samba安装
sudo apt-get install samba
配置文件smb.conf介绍
vim /etc/samba/smb.conf
# 全局选项,为局部选项提供默认参数
[global] // 全局选项
#...
# 局部选项,可以自己设置参数,覆盖全局选项
[homes] // 共享命令
comment = Home Directories // 描述
browseable = no // 隐藏共享名称
read only = yes // 只读的
create mask = 0700 // 在共享目录中创建文件或目录权限
directory mask = 0700 // 共享目录权限
valid users = %S // 有效用户
[printers] // 共享名称
comment = All Printers // 描述
browseable = no // 隐藏共享目录
path = /var/spool/samba // 共享目录路径
printable = yes // 可打印
guest ok = no // 不可匿名访问,需要输入密码
read only = yes // 只读的
create mask = 0700 // 创建文件的权限
共享目录方式一
创建共享目录
mkdir /home/student/share
创建samba账户
sudo smbpasswd -a student
修改samba配置文件
sudo vim /etc/samba/smb.conf
# 在文件最后添加
[test] # 共享名称
comment = This is a share dir # 描述
path = /home/student/share # 共享的目录
available = yes # 共享目录可用
browseable = yes # 共享目录可见
valid users = student # 可访问的samba用户
read only = no # 可读写的,等价于 writable = yes
# writable = yes # 可读写的
guest ok = no # 不可匿名访问,需要输入密码,等价于 public = no
# public = yes # 不可匿名访问
create mask = 0700 # 创建文件的权限,还受掩码影响
directory = 0700 # 创建目录的权限
write list = student,@student # 允许某些用户可写,其他用户只读
hosts deny = 192.168.0 # 拒绝某个网段
hosts allow = 192.168.xxx.xxx # 允许某个IP地址
hosts deny = all # 拒绝所有
hosts allow = 192.168.0. EXCEPT 192.168.xxx.xxx // 允许某个网段,但拒绝某个IP
重启smbd服务
每次修改完配置文件都需要重启smbd服务
sudo systemctl restart smbd.service
共享目录方式二
-
在桌面上创建一个文件加,例如 share
-
选择本地网络共享,选择共享此目录
-
选择创建共享,完成此目录的共享
这样共享的配置文件目录在/var/lib/samba/usershares/
,每个共享目录的配置文件都以目录名命名
Windows下搭建SMB/CIFS服务器实现文件共享
访问samba 共享的目录
Linux下访问共享的目录
- 通过smbclient来访问
smbclient //192.168.xxx.xxx/test -U student
- 可以通过 mount 命令进行挂载
sudo mount -t cifs -o username=student,password=123456 //192.168.xxx.xxx/test /mmt/test
Windows下访问共享的目录
-
输入IP地址和共享目录名
-
然后再输入用户名和密码
samba错误集合
-
tree connect failed:NT_STATUS_BAD_NETWORK_NAME
- 原因:共享名输入的不对或共享路径不存在
-
NT_STATUS_ACCESS_DENIED making remote directory \temp
- 原因:SELINUX没有关
- 解决方法:SELINUX=disabled
-
NT_STATUS_OBJECT_NAME_COLLISION making remote directory \temp
- 原因:因为目录temp已存在
-
protocol negotiation failed:NT_STATUS_INVALID_NETWORK_RESPONSE
- 原因:hosts 网段不允许
-
tree connect failed:NT_STATUS_ACCESS_DENIED
- 原因:不允许该用户访问
- 解决办法:在配置文件中添加该用户
-
Connection to 192.168.xxx.xxx failed (Error NT_STATUS_IO_TIMEOUT)
- 原因:可能是没网、或者防火墙做了限制
-
session setup failed: NT_STATUS_LOGON_FAILURE
- 原因:密码错误
smbpasswd命令
smbpasswd 用于管理samba用户及其密码。
参数 | 说明
参数 | 说明 |
---|---|
-h | 使用说明文档 |
-a | 添加samba用户 |
-x | 删除用户 |
-d | 禁用用户 |
-e | 解除禁用 |
-r | 指定远程机器的用户 |
-U | 指定用户名 |
实例
sudo smbpasswd -a user1 // 添加用户 user1
sudo smbpasswd -d user1 // 禁用用户
sudo smbpasswd -e user1 // 解除禁用
sudo smbpasswd -r 192.168.xxx.xx -U user2 // 修改远端用户 user2 的密码
smbclient命令
smbclient 用于交互式访问samba服务器的共享资源。
常用参数
参数 | 说明 |
---|---|
-? , --help | 使用说明文档 |
-V , --version | 版本 |
-U , --user | 指定用户名 |
-r | 指定密码 |
-p , --port | 指定服务器端TCP连接端口 |
-I , --ip-addr <IP地址> | 指定服务器的IP地址 |
-E , --stderr | 将信息写入到标准错误(stderr),默认是标准输出(stdou) |
-L , --list | 列出服务器所共享的所有资源 |
-T<tar选项> <备份文件> <要备份的文件> | 备份服务端共享的文件,并打包成tar格式的文件 |
-N | 不用询问密码 |
-w<工作群组> | 指定工作群组名称 |
-b | 设置传输过程中缓冲区大小 |
-c <命令> | 执行指定命令后退出连接 |
实例
smbclient //192.168.xxx.xxx/share -U student -r 123456 // 指定用户名和密码连接samba服务器
smbclient //192.168.xxx.xxx/share -U student%123456 // 也可以这样指定用户名和密码
smbclient -c "ls" //192.168.xxx.xxx/share -U student -r 123456 // 执行一条命令,退出
smbclient -L 192.168.xxx.xxx -U student%8 // 列出服务端所有共享的资源
登录samba服务器后可执行的指令
指令 | 说明 |
---|---|
help , ? <命令> | 查看指定命令的作用和用法,不指定命令就列出所有命令 |
cd | 切换目录 |
ls | 列出所有文件目录 |
dir | 列出所有文件目录 |
del | 删除当前文件下符合mask的文件 |
rd | 删除目录 |
rmdir | 删除空文件 |
rename | 重命名 |
rm | 删除当前目录下所有匹配mask的文件 |
tar | 压缩文件 |
stat | 查看文件信息 |
quit , exit | 退出 |
showconnect | 显示当前连接 |
put [remote file] | 发送文件到服务器 |
mput | 发送当前目录下所有匹配msak的文件到服务器 |
get | 从服务器得到文件 |
mget | 获取所有匹配mask的文件 |
du | 列出目录信息和磁盘信息 |
more | 查看文件内容 |