Samba 简述
samba:局域网中一种基于 SMB/CIFS 协议的跨平台的开源文件共享软件套件。其作用有:
- 跨操作系统的文件共享
- 身份验证与授权
- 名称解析
- 打印服务
早期的文件共享方式:
- Windows 的「网上邻居」 – 「网上邻居」使用的协议是 CIFS(Common Internet File System,通用互联网文件系统),虽然名称中带有文件系统,但它本质是一种协议,其依赖 NetBIOS 协议进行通信 。该方式只能在同一个局域网中使用且共享方与访问方都必须是 Windows 系统,无法跨网段与路由。
- NFS(Network File System) – 设计之初主要用于 GNU/Linux 与 GUN/Linux 之间的文件共享。NFS 的服务器端(共享方)通常部署在类 UNIX 上,Windows 原生不支持作为 NFS 服务器端,但可以通过第三方软件实现;NFS 的访问方(客户端)支持各类平台,但 Windows 访问 GNU/Linux 的 NFS 服务时可能会出现一部分的兼容性问题。
早期由于 Windows 与类 UNIX 之间无法跨系统共享数据,1991 年一位名叫 Andrew Tridgell 的大学生也有这样的困扰,他手上有三台机器:
- 运行 DOS 的个人计算机
- DEC 公司的 Digital UNIX 系统
- Sun 公司的 UNIX 系统
在当时, DEC 公司开发出了一套被称为 PATHWORKS 的软件,这套软件可以用来实现 Digital UNIX 与 DOS 这两个操作系统之间的数据共享,可惜让 Tridgell 觉得较困扰的是,Sun 公司的 UNIX 无法借由这个软件来达到数据分享的目的。为了解决这样的的问题,他决定自己通过逆向工程去抓取 DOS 与 Digital UNIX 系统在进行数据共享/传输时的 SMB 协议流量,最终开发出了 Samba 软件,这套软件能够实现 UNIX 与 DOS 之间的数据共享。
Q:为什么当年不采用 FTP 呢?
FTP 的局限性在于客户端无法直接在服务器端修改数据,即客户端必须从 FTP 服务器上下载文件到客户端本地,修改完毕然后上传到 FTP 服务器端。
Samba 与相关协议:
- NetBIOS 协议 – IBM 开发的 NetBIOS 协议是为了局域网内少数计算机进行通信的协议,Samba 的早期版本需要使用 NetBIOS 协议
- SMB (Server Messages Block,信息服务块)协议 – 一种网络文件共享协议,最初由 IBM 的 Barry Feigenbaum 进行开发。
早期局域网内的计算机之间要进行通信,并不是通过 IP 地址,而是通过 MAC 地址实现数据交互,计算机的主机名(NetBIOS 名称)与 MAC 地址之间的映射关系通过 NetBIOS 解析来实现。在现代的局域网中,由于 TCP/IP 分层网络协议中定义了 IP 地址,这时的主机名、IP地址、MAC 地址之间关系如下:
- 主机名 —> IP 地址 – 通过 DNS 和 NetBIOS 解析完成映射关系
- IP 地址 —> MAC地址 – 通过 ARP 协议完成映射关系
- MAC 地址 —> IP 地址 – 通过 RARP 协议完成映射关系
Samba 软件版本 SMB 协议版本
SMB 版本 | 关键性说明 |
---|---|
SMBv1(CIFS) | 安全性较低,存在比较严重的漏洞,仅在旧设备兼容性场景下临时启用 |
SMBv2 | 重构架构,提升性能与安全性,优化大文件传输效率 |
SMBv3 | 在 SMBv2 基础之上进一步提升稳定性、安全性以及性能,安全性上有诸多改进,如消息签名、加密传输、支持更多的加密算法等 |
Samba 版本 | 主要特性支持 |
---|---|
Samba 3.x | SMBv1(CIFS) |
Samba 4.0+ | SMBv2 和 SMBv1(默认禁用) |
Samba 4.3+ | SMBv3 |
RL 8.x 安装 Samba
键入以下命令即可:
Shell > dnf install -y samba samba-client
这将会安装以下相关的依赖包:
samba
– Samba 的主要软件包avahi-libs
– 运行 avahi 所依赖的库,avahi 主要是用来在本地网络中发现设备与主机cups-libs
– 运行 CUPS 所依赖的库,CUPS 是管理 UNIX 打印服务相关的这样一个系统libicu
– 提供支持 Unicode 字符集的库libnetapi
– libnet 的 API 抽象层libwbclient
– Samba 套件中的其中一个组成部分,与 Windows 的域环境相关libsmbclient
– 包含 SMB 客户端库samba-client-libs
– Samba 客户端功能的依赖库samba-common
– Samba 公共组件,负责配置管理samba-common-libs
– Samba 公共组件所依赖的库samba-common-tools
– Samba 公共组件的工具链samba-dcerpc
– 通过命名管道为 dcerpc 提供服务samba-ldb-ldap-modules
– Samba 中支持 LDAP 的软件包samba-libs
– Samba 的库依赖
samba 服务器端的守护进程
- smbd – 提供对服务器中文件、打印资源的共享访问,端口占用139、445
- nmbd – 提供主机名称的解析,端口占用137、138
相关文件
Shell > ls -l /etc/samba/
-rw-r--r-- 1 root root 20 Apr 22 16:57 lmhosts
-rw-r--r-- 1 root root 940 Apr 22 16:57 smb.conf
-rw-r--r-- 1 root root 11319 Apr 22 16:57 smb.conf.example
smb.conf
– 配置文件lmhosts
– 定义局域网中 IP 地址与主机名的映射文件。通常而言,当 Samba 服务器端启动相关守护进程后,会自动扫描局域网当中所有的主机名,但是扫描会消耗掉一部分的资源,如果觉得扫描慢,可以将 IP 地址和主机名手工对应起来,省略搜索过程,节省时间。请不要与/etc/hosts
文件混淆。/etc/samba/smbpasswd
– SMB 密码保存文件,默认不存在。/etc/samba/smbusers
– 定义用户别名或者说用户名映射,用于适应不同操作系统中的用户名习惯。比如写入root = administrator admin
,这样就可以用 administrator 或 admin这两个用户来代替 root 登陆 Samba 服务器,更贴近 Windows 用户的使用习惯。需要在 /etc/samba/smb.conf 配置文件中加入username map = /etc/samba/smbusers
参数smb.conf.example
– 配置文件的参数示例以及说明
相关命令
testparm
– 检测 /etc/samba/smb.conf 配置文件是否正确。直接键入该命令且回车后会显示配置文件当中实际生效的内容。
smbclient
– 该命令由软件包 samba-client 释放出来,其常用选项有:
-L <IP>
– 查看指定主机共享资源的情况-U <user>
– 指定用户,如果访问的共享文件夹需要身份验证-N
– 以游客身份进行访问,不需要交互密码-c "<SAMBA-COMMAND>"
– 在 Shell 命令行交互中键入 samba 命令行操作。如smblicent -N //192.168.100.20/public -c "get test.txt"
smbpasswd
– 用来给操作系统中的用户设置 Samba 密码,选项有:
-a <user>
– 将系统用户添加到 Samba 中并设置 Samba 密码-x <user>
– 从 Samba 中删除用户
pdbedit
– 操作 Samba 用户,选项有:
-L
– 查阅具有 Samba 密码的用户-x <user>
– 删除 Samba 用户-a -u <user>
– 将系统用户添加到 Samba 中
Samba 中的登录用户与密码
默认情况下,Samba 的登录需要使用到操作系统中的用户,但其密码则是使用单独的 Samba 密码。
配置文件说明
Shell > cat /etc/samba/smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.
#
# Note:
# SMB1 is disabled by default. This means clients without support for SMB2 or
# SMB3 are no longer able to connect to smbd (by default).
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
# Install samba-usershares package for support
include = /etc/samba/usershares.conf
[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
[printers]
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @printadmin root
force group = @printadmin
create mask = 0664
directory mask = 0775
格式说明:
-
以 "#" 开头或 ";" 开头的行表示注释行
-
global 标题,使用 "[" 和 "]" 包含,表示 Samba 的全局配置,标题的下面则是具体的配置项
-
除 global 标题外的其他标题表示共享设置,初始有三个,即
- homes 标题 – 用户目录共享设置,针对任意用户生效的配置。
- printers 标题 – 打印机共享设置
- print$ 标题 – 打印机驱动
-
配置项的格式为
name = value
全局配置
-
workgroup = SAMBA
– 指定工作组。Windows 中默认所有主机的工作组为 「WORKGROUP」,在 Windows10 的 「网络」中,如果所有人都加入到了默认的工作组中,则会直接显示主机名。如果局域网中存在多个工作组,则是先显示工作组,工作组下面包含各个主机名。工作组的目的就是为了方便管理。 -
security = user
– security 是 Samba 中最重要的设置之一,用于定义 Samba 服务器的认证机制,控制客户端访问共享资源时的身份验证方式- user – 要求客户端提供用户名和密码进行本地验证
- domain – 由域控制器提供认证
- share – 不需要密码就可以访问,相当于 Windows 共享目录时开启 guest 用户,已经被弃用
-
passdb backend = tdbsam
– 选择哪种后端来存储用户信息以及可能的组信息。- tdbsam – 采用本地 TDB 文件存储用户以及相关信息
- smbpasswd – 传统的明文格式文件(/etc/samba/smbpasswd)来存储密码
- ldapsam – 通过 LDAP 目录来存储用户信息,适用于企业级环境
-
printing = cups
– 用于定义打印系统的类型,其值有:- bsd
- aix
- lprng
- plp
- sysv
- hpux
- qnx
- softq
- cup
- iprint
-
printcap name = cups
– 用于指定打印机配置文件的路径或类型 -
load printers = yes
– 控制默认情况下是否加载 printcap 中的所有打印机以进行浏览 -
cups options = raw
– 用于指定将打印任务提交给 cups 打印系统时的附加选项。raw 表示直接传递原始的打印数据,不经过 CUPS 的过滤与转换 -
include = /etc/samba/usershares.conf
– 包含其他配置文件的内容,拆分配置文件后更加容易维护 -
netbios name = MYSERVER
– 设置 Samba 服务器的 NetBIOS 名称,以实现基于 NetBIOS 协议的网络标识和服务发现。需要注意名称不要把超过 15 个字符 -
server string = Samba Server Version %v
– Samba 服务器的名称,%v 是一个变量,用来显示 Samba 的版本 -
interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
– 设置监听的网络接口以及 IP 地址 -
hosts allow = 127. 192.168.12. 192.168.13.
– 运行访问 Samba 服务器的主机 -
log file = /var/log/samba/log.%m
– 日志文件路径,%m 是一个变量,表示客户端的主机名 -
max log size = 50
– 指定日志文件的最大大小,以 KB 为单位。若超过了指定的大小,则会重命名文件并添加 .old 后缀名。 -
map to guest = nerver
– 定义如何处理无效用户的登录请求- nerver – 拒绝所有使用无效密码的用户登录请求
- bad user – 仅当用户名不存在时,则会将用户名映射为 nobody。若用户名存在但密码错误,仍拒绝访问
- bad password – 用户名存在但密码错误时,仍然允许以游客身份访问
- bad uid – 当有 ad 域且 security = domain 或者 security = ads ,才开启这项参数。
共享设置
comment = Home Directories
– 共享文件夹的说明path = /var/spool/samba
– 指定共享的文件夹guest ok = no
– 是否允许无密码访问共享目录,相当于security = share
read only = yes
– 如果为 no,表示允许在共享目录中创建和修改文件writeable = yes
– 是否允许在共享目录中创建或修改文件。在同一个共享目录的设置中,read only
和writeable
只能出现一次。若两个配置项都写入,则谁写在文件内容的最后面,谁就是生效的write list = +staff
– 拥有写权限的用户列表或组列表,多个用户或组用逗号隔开,组需要有 "@" 前缀。假设guest ok = yes
、path = /var/spool/samba
、writeable = yes
,这表示所有的人都能访问目录且所有人可写。如果添加了wrtite list
,那么只有这些用户列表可写,而其他人仅只读。browseable = no
– 共享目录对于客户端而言是否可见。设置为 no,客户端没办法直接看见共享目录但可以手动加上共享路径进行访问valid users = %S, %D%w%S
– 允许登录 Samba 服务器的用户列表或组列表,多个用户或组用逗号隔开,组需要有 "@" 前缀。若列表为空,则表示任何用户都可以登录。inherit acls = yes
– 用于控制访问控制列表(ACL)继承行为。当设置为 yes 时,新创建的文件/目录会自动继承父目录的 ACL 权限规则,从而无需手动为每个子项设置 ACL
通常而言,共享设置是需要管理员来手动配置的。
常见变量
%v
– Samba 服务器的版本号%S
– 目录的共享名称%m
– 客户端机器的主机名(NetBIOS 名称)%L
– 服务器端的主机名(NetBIOS 名称)%u
– 当前登录用户的名称%g
– 当前登录用户的主组名%D
– 当前用户的域或工作组的名称%w
– winbind 分隔符
Samba 的基本使用
游客访问
所谓游客访问,即任何用户都会被映射为 GNU/Linux 上的 nobody 用户,相当于不需要密码就访问 Samba 服务器。
明确权限:
- 任何用户都可以自由访问共享目录
- 任何用户都可写
- 共享目录对所有用户都可见
# 新建要共享的目录
Shell > mkdir /samba-pub/
Shell > vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
server string = Samba Server %v
log file = /var/log/samba/log.%m
max log size = 50
security = user
map to guest = bad user
passdb backend = tdbsam
[public]
comment = samba test
path = /samba-pub/
browseable = yes
writable = yes
guest ok = yes
# 因为任何用户都会映射为 nobody,要让 nobody 拥有 w 权限,需要改变共享文件夹的所有者以及权限
## 能否有写权限,不仅要让服务的权限允许(writable = yes),文件的权限也需要允许(w)
Shell > chown nobody:root /samba-pub/
Shell > chmod u+w /samba-pub/
Shell > ls -ld /samba-pub/
drwxr-xr-x 2 nobody root 4096 May 9 14:22 /samba-pub/
# 测试配置文件语法
Shell > testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
...
Shell > systemctl start smb.service nmb.service
# 查阅端口占用
## 137、138、139、445
Shell > ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 192.168.100.255:137 0.0.0.0:* users:(("nmbd",pid=2200,fd=17))
udp UNCONN 0 0 192.168.100.20:137 0.0.0.0:* users:(("nmbd",pid=2200,fd=16))
udp UNCONN 0 0 0.0.0.0:137 0.0.0.0:* users:(("nmbd",pid=2200,fd=14))
udp UNCONN 0 0 192.168.100.255:138 0.0.0.0:* users:(("nmbd",pid=2200,fd=19))
udp UNCONN 0 0 192.168.100.20:138 0.0.0.0:* users:(("nmbd",pid=2200,fd=18))
udp UNCONN 0 0 0.0.0.0:138 0.0.0.0:* users:(("nmbd",pid=2200,fd=15))
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=730,fd=5))
udp UNCONN 0 0 [::1]:323 [::]:* users:(("chronyd",pid=730,fd=6))
tcp LISTEN 0 50 0.0.0.0:139 0.0.0.0:* users:(("smbd",pid=2199,fd=32))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=741,fd=3))
tcp LISTEN 0 50 0.0.0.0:445 0.0.0.0:* users:(("smbd",pid=2199,fd=31))
tcp LISTEN 0 50 [::]:139 [::]:* users:(("smbd",pid=2199,fd=30))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=741,fd=4))
tcp LISTEN 0 50 [::]:445 [::]:* users:(("smbd",pid=2199,fd=29))
# 写入文本内容到一个文件
Shell > echo "hello! world" >> /samba-pub/test.txt
客户端使用的是 Windows 10 的 PowerShell:
# 仅浏览共享
## 这里没有弹出身份认证的窗口
PS > cd \\192.168.100.20\public
PS > ls
Directory: \\192.168.100.20\public
Mode LastWriteTime Length Name
---- ------------- ------ ----
----- 2025/5/9 14:40 13 test.txt
# 在共享目录中新创建文件
PS > echo "2025-05-09" > .\client-file.txt
PS > ls
Directory: \\192.168.100.20\public
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2025/5/9 14:52 12 client-file.txt
----- 2025/5/9 14:40 13 test.txt
# 在 Samba 服务器端浏览该文件的权限情况,确定是映射为 nobody
Shell > ls -l /samba-pub/client-file.txt
-rwxr--r-- 1 nobody nobody 12 May 9 14:52 /samba-pub/client-file.txt
Samba 客户端
-
Windows 图形化操作
Windows + r 两个按键唤出「运行」窗口,键入您的共享路径即可,例如
\\192.168.100.20\
或\\192.168.100.20\public
-
Windows 命令行操作
在 PowerShell 中直接使用
cd
或start
命令即可# cd 命令适合不需要密码交互的文件共享 PS > cd \\192.168.100.20\public # start 命令适合有密码交互的文件共享,这会弹出登录窗口。注意 start 命令后面是主机的 IP 地址 PS > start \\192.168.100.20
net use * /delete
,或者在 PowerShell(非管理员) 中执行 net use * /delete
-
GNU/Linux 客户端
# 这里会提示你输入密码,直接键入回车跳过即可 ## 在命令行中加入 -N 选项可跳过密码交互 Fedora > smbclient -L //192.168.100.20 Password for [SAMBA\root]: Sharename Type Comment --------- ---- ------- public Disk samba test IPC$ IPC IPC Service (Samba Server 4.19.4) SMB1 disabled -- no workgroup available Fedora > smbclient //192.168.100.20/public Password for [SAMBA\root]: Try "help" to get a list of possible commands. smb: \> ls . D 0 Fri May 9 14:52:18 2025 .. D 0 Fri May 9 14:52:18 2025 client-file.txt A 12 Fri May 9 14:52:18 2025 test.txt N 13 Fri May 9 14:40:14 2025 48193236 blocks of size 1024. 43202460 blocks available
Samba 命令行客户端 与 FTP 命令行客户端类似,常用有:
get
– 下载文件(不支持目录),smbclient
命令在何处路径运行则下载到那个路径下put
– 上传文件(不支持目录)rename
– 文件改名,支持对目录的改名del
– 删除文件mkdir
– 创建目录rmdir
– 删除目录cd
– 切换工作目录quit
– 退出 samba 命令行客户端
用户级别访问
这里演示使用操作系统中的用户以及 Samba 密码对 Samba 服务器进行访问。
Shell > vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
server string = Samba Server %v
log file = /var/log/samba/log.%m
max log size = 50
security = user
# map to guest = bad user
passdb backend = tdbsam
[homes]
comment = home dir
browseable = no
writable = yes
[public]
comment = samba test
path = /samba-pub/
browseable = yes
writable = yes
write list = pubtest
valid users = pubtest
Shell > useradd pubtest
Shell > passwd pubtest
# 变更所有者以及所有者的权限
Shell > chown pubtest:root /samba-pub/
Shell > chmod u+w /samba-pub/
Shell > ls -ld /samba-pub/
drwxr-xr-x 2 pubtest root 4096 May 9 15:30 /samba-pub/
# 设置 Samba 密码
Shell > smbpasswd -a pubtest
New SMB password:
Retype new SMB password:
Added user pubtest.
# 测试配置文件
Shell > testparm
Shell > systemctl restart smb.service nmb.service
使用 Windows 的 PowerShell 进行测试:
PS > start \\192.168.100.20
# 弹出窗口,键入对应的用户以及 Samba 密码即可
界面如下:
如您所见,用户的家目录不可见,您可以在地址栏手动加入路径 —— \\192.168.100.20\pubtest
对于新文件或目录,无论是用户的家目录还是共享目录,其上传、下载、重命名、修改文件内容等功能均无问题,若共享目录中存在以前的文件,pubtest 用户可能没有权限操作,您需要在 Samba 服务器那边查阅文件的权限然后执行相应的修改即可。
Q:如果现在新创建用户,能否访问 Samba 服务器的 public 目录?
不能,因为 public 共享目录只允许了 pubtest 用户登录(valid users = pubtest
)。假设您现在需要 frank 用户登录到该目录且拥有 w 权限:
Shell > useradd frank
Shell > passwd frank
Shell > smbpasswd -a frank
Shell > pdbedit -L
pubtest:1000:
frank:1001:
Shell > vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
server string = Samba Server %v
log file = /var/log/samba/log.%m
max log size = 50
security = user
passdb backend = tdbsam
[homes]
comment = home dir
browseable = no
writable = yes
[public]
comment = samba test
path = /samba-pub/
browseable = yes
writable = yes
write list = pubtest,frank
valid users = pubtest,frank
Shell > systemctl restart smb.service nmb.service
另外一边,文件权限也需要正确,这样才能保证 frank 用户对该共享目录是可写的:
Shell > chown pubtest:pubtest /samba-pub/
Shell > chmod 775 /samba-pub/
# 将 frank 用户加入到 pubtest 组中,此时 pubtest 组即 frank 用户的附加组
Shell > gpasswd -a frank pubtest
Adding user frank to group pubtest
Shell > id frank
uid=1001(frank) gid=1001(frank) groups=1001(frank),1000(pubtest)
经过测试,证明 frank 对该共享目录确实有 w 权限。
Samba 用户管理
前面我们将 pubtest 和 frank 用户添加到了 Samba 服务器中,且这两个用户都有密码。现在我们需要将 Samba 中的这两个用户删除:
Shell > pdbedit -L
pubtest:1000:
frank:1001:
Shell > smbpasswd -x pubtest
Shell > smbpasswd -x frank
Shell > vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
server string = Samba Server %v
log file = /var/log/samba/log.%m
max log size = 50
security = user
passdb backend = tdbsam
[homes]
comment = home dir
browseable = no
writable = yes
[public]
comment = samba test
path = /samba-pub/
browseable = yes
writable = yes
Shell > systemctl restart smb.service nmb.service
复杂权限设置
在实际的企业环境中,需要有更加复杂的权限设置,单靠 Samba 配置文件中的简单权限控制是做不到的。试想下在企业环境中,共享目录众多、用户众多、权限交叉,那怎么办呢?使用 GNU/Linux 的 ACL 权限。
ACL (Access Control List,访问控制列表),其目的是为了解决 GNU/Linux 下三种身份(u、g、o)不能满足资源权限分配的问题。具体的配置思路就是先把共享目录配置好,不论有多少数量的共享目录,先按照下面的模板写入到配置文件:
[public]
comment = public dir
path = /public/
browseable = yes
writeable = yes
[net]
comment = network dir
path = /net/
browseable = yes
writeable = yes
接着对每一个单独的用户设置 ACL 权限,比如针对 public 共享目录, tom 用户需要有读写权限,而 jack 只能读取该目录的文件:
Shell > setfacl -m u:tom:rwx /public/
Shell > setfacl -m u:jack:rx /public/
具体操作细节如下:
# 先将前面的演示环境删除
Shell > rm -rf /samba-pub/
Shell > gpasswd -d frank pubtest
Shell > userdel -r pubtest ; userdel -r frank
# 开始操作
Shell > mkdir /public/
Shell > vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
server string = Samba Server %v
log file = /var/log/samba/log.%m
max log size = 50
security = user
passdb backend = tdbsam
[homes]
comment = home dir
browseable = no
writable = yes
[public]
comment = public dir
path = /public/
browseable = yes
writable = yes
Shell > testparm
Shell > systemctl restart smb.service nmb.service
# 添加操作系统用户 tom 并将用户添加到 Samba 中
Shell > useradd tom
Shell > passwd tom
Shell > smbpasswd -a tom
# 添加操作系统用户 jack 并将用户添加到 Samba 中
Shell > useradd jack
Shell > passwd jack
Shell > smbpasswd -a jack
Shell > pdbedit -L
tom:1000:
jack:1001:
# 设置 ACL 权限
Shell > setfacl -m u:tom:rwx /public/
Shell > setfacl -m u:jack:rx /public/
# "+" 表示 ACL 权限
Shell > ls -ld /public/
drwxrwxr-x+ 2 root root 4096 May 10 13:42 /public/
Shell > getfacl /public/
getfacl: Removing leading '/' from absolute path names
# file: public/
# owner: root
# group: root
user::rwx
user:tom:rwx
user:jack:r-x
group::r-x
mask::rwx
other::r-x
使用 Windows 客户端测试成功,针对该共享目录,tom 用户确实有读写权限,而 jack 仅有读权限。
挂载(Windows 当中称为映射网络驱动器)
在前面的文字中,我们介绍了 GNU/Linux 的命令行客户端 smbclient
,这种命令行方式只是临时使用 Samba,若您需要长期使用 Samba 的共享资源,则需要进行挂载,例如:
# 将共享目录 public 挂载到本地的 /samba-public/ 目录中,请注意!这只是临时挂载
## -t 指定文件系统,-o 指定挂载的选项,username 指定登录的用户
Fedora > mkdir /samba-public
Fedora > mount -t cifs -o username=tom //192.168.100.20/public /samba-public
Password for tom@//192.168.100.20/public:
Fedora > df -hT
Filesystem Type Size Used Avail Use% Mounted on
...
//192.168.100.20/public cifs 46G 4.8G 42G 11% /samba-public
# 进入到挂载的目录中即操作共享目录
Fedora > cd /samba-public/ ; ls -l
# 卸载,卸载时请注意工作目录不要在 /samba-public/ 中
Fedora > umount /samba-public
Fedora > df -hT
Filesystem Type Size Used Avail Use% Mounted on
...
若您需要让挂载永久生效,则需要写入到 /etc/fstab 中,例如:
//192.168.100.20/public /samba-public cifs defaults,username=tom,password=Google404 1 2
针对 Windows 客户端,GNU/Linux 的挂载操作在 Windows 中称为 「映射网络驱动器」,需要挂载到具体的盘符:
用户别名
GNU/Linux的用户如 root、nobody 在 Windows 中对应的是 administrator、guest 用户,Samba 本身是跨平台的,为了照顾在不同操作系统的使用习惯,于是当初开发的时候想到了用户别名。
需要在 /etc/samba/smb.conf 配置文件中加入 username map = /etc/samba/smbusers
参数,smbusers 文件需要手动创建,其内容格式示例:
root = administrator admin
这样就可以用 administrator 或 admin 这两个用户来代替 root 登陆 Samba Server,更贴近 Windows 平台的使用习惯。
